diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index 62e54e02fe..aaf81fe9f3 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -2,11 +2,19 @@
current_version = 2023.10.7
tag = True
commit = True
-parse = (?P\d+)\.(?P\d+)\.(?P\d+)
-serialize = {major}.{minor}.{patch}
+parse = (?P\d+)\.(?P\d+)\.(?P\d+)(?:-(?P[a-zA-Z-]+)(?P[1-9]\\d*))?
+serialize =
+ {major}.{minor}.{patch}-{rc_t}{rc_n}
+ {major}.{minor}.{patch}
message = release: {new_version}
tag_name = version/{new_version}
+[bumpversion:part:rc_t]
+values =
+ rc
+ final
+optional_value = final
+
[bumpversion:file:pyproject.toml]
[bumpversion:file:docker-compose.yml]
diff --git a/.github/actions/comment-pr-instructions/action.yml b/.github/actions/comment-pr-instructions/action.yml
index b8fb31eaaa..f74a99fafb 100644
--- a/.github/actions/comment-pr-instructions/action.yml
+++ b/.github/actions/comment-pr-instructions/action.yml
@@ -9,9 +9,6 @@ inputs:
runs:
using: "composite"
steps:
- - name: Generate config
- id: ev
- uses: ./.github/actions/docker-push-variables
- name: Find Comment
uses: peter-evans/find-comment@v2
id: fc
diff --git a/.github/actions/docker-push-variables/action.yml b/.github/actions/docker-push-variables/action.yml
index 7ae3d1adf9..b0671bd966 100644
--- a/.github/actions/docker-push-variables/action.yml
+++ b/.github/actions/docker-push-variables/action.yml
@@ -1,31 +1,33 @@
+---
name: "Prepare docker environment variables"
description: "Prepare docker environment variables"
+inputs:
+ image-name:
+ required: true
+ description: "Docker image prefix"
+ image-arch:
+ required: false
+ description: "Docker image arch"
+
outputs:
- shouldBuild:
- description: "Whether to build image or not"
- value: ${{ steps.ev.outputs.shouldBuild }}
- branchName:
- description: "Branch name"
- value: ${{ steps.ev.outputs.branchName }}
- branchNameContainer:
- description: "Branch name (for containers)"
- value: ${{ steps.ev.outputs.branchNameContainer }}
- timestamp:
- description: "Timestamp"
- value: ${{ steps.ev.outputs.timestamp }}
sha:
description: "sha"
value: ${{ steps.ev.outputs.sha }}
- shortHash:
- description: "shortHash"
- value: ${{ steps.ev.outputs.shortHash }}
+
version:
- description: "version"
+ description: "Version"
value: ${{ steps.ev.outputs.version }}
- versionFamily:
- description: "versionFamily"
- value: ${{ steps.ev.outputs.versionFamily }}
+ prerelease:
+ description: "Prerelease"
+ value: ${{ steps.ev.outputs.prerelease }}
+
+ imageTags:
+ description: "Docker image tags"
+ value: ${{ steps.ev.outputs.imageTags }}
+ imageMainTag:
+ description: "Docker image main tag"
+ value: ${{ steps.ev.outputs.imageMainTag }}
runs:
using: "composite"
@@ -45,20 +47,47 @@ runs:
branch_name = os.environ["GITHUB_REF"]
if os.environ.get("GITHUB_HEAD_REF", "") != "":
branch_name = os.environ["GITHUB_HEAD_REF"]
-
- should_build = str(os.environ.get("DOCKER_USERNAME", "") != "").lower()
- version = parser.get("bumpversion", "current_version")
- version_family = ".".join(version.split(".")[:-1])
safe_branch_name = branch_name.replace("refs/heads/", "").replace("/", "-")
- sha = os.environ["GITHUB_SHA"] if not "${{ github.event.pull_request.head.sha }}" else "${{ github.event.pull_request.head.sha }}"
+ image_names = "${{ inputs.image-name }}".split(",")
+ image_arch = "${{ inputs.image-arch }}" or None
+
+ is_pull_request = bool("${{ github.event.pull_request.head.sha }}")
+ is_release = "dev" not in image_names[0]
+
+ sha = os.environ["GITHUB_SHA"] if not is_pull_request else "${{ github.event.pull_request.head.sha }}"
+
+ # 2042.1.0 or 2042.1.0-rc1
+ version = parser.get("bumpversion", "current_version")
+ # 2042.1
+ version_family = ".".join(version.split("-", 1)[0].split(".")[:-1])
+ prerelease = "-" in version
+
+ image_tags = []
+ if is_release:
+ for name in image_names:
+ image_tags += [
+ f"{name}:{version}",
+ f"{name}:{version_family}",
+ ]
+ if not prerelease:
+ image_tags += [f"{name}:latest"]
+ else:
+ suffix = ""
+ if image_arch and image_arch != "amd64":
+ suffix = f"-{image_arch}"
+ for name in image_names:
+ image_tags += [
+ f"{name}:gh-{sha}{suffix}",
+ f"{name}:gh-{safe_branch_name}{suffix}",
+ ]
+
+ image_main_tag = image_tags[0]
+ image_tags_rendered = ",".join(image_tags)
with open(os.environ["GITHUB_OUTPUT"], "a+", encoding="utf-8") as _output:
- print("branchName=%s" % branch_name, file=_output)
- print("branchNameContainer=%s" % safe_branch_name, file=_output)
- print("timestamp=%s" % int(time()), file=_output)
print("sha=%s" % sha, file=_output)
- print("shortHash=%s" % sha[:7], file=_output)
- print("shouldBuild=%s" % should_build, file=_output)
print("version=%s" % version, file=_output)
- print("versionFamily=%s" % version_family, file=_output)
+ print("prerelease=%s" % prerelease, file=_output)
+ print("imageTags=%s" % image_tags_rendered, file=_output)
+ print("imageMainTag=%s" % image_main_tag, file=_output)
diff --git a/.github/codespell-words.txt b/.github/codespell-words.txt
index 29fb248325..dd00fd8e3e 100644
--- a/.github/codespell-words.txt
+++ b/.github/codespell-words.txt
@@ -3,3 +3,4 @@ keypairs
hass
warmup
ontext
+singed
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 9deccbc2ec..54e9b8b5b0 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -27,7 +27,6 @@ If an API change has been made
If changes to the frontend have been made
- [ ] The code has been formatted (`make web`)
-- [ ] The translation files have been updated (`make i18n-extract`)
If applicable
diff --git a/.github/workflows/ci-main.yml b/.github/workflows/ci-main.yml
index 24d4f71e9f..a52a8b9279 100644
--- a/.github/workflows/ci-main.yml
+++ b/.github/workflows/ci-main.yml
@@ -1,3 +1,4 @@
+---
name: authentik-ci-main
on:
@@ -7,7 +8,7 @@ on:
- next
- version-*
paths-ignore:
- - website
+ - website/**
pull_request:
branches:
- main
@@ -29,7 +30,7 @@ jobs:
- codespell
- isort
- pending-migrations
- - pylint
+ # - pylint
- pyright
- ruff
runs-on: ubuntu-latest
@@ -122,9 +123,10 @@ jobs:
poetry run make test
poetry run coverage xml
- if: ${{ always() }}
- uses: codecov/codecov-action@v3
+ uses: codecov/codecov-action@v4
with:
flags: unit
+ token: ${{ secrets.CODECOV_TOKEN }}
test-integration:
runs-on: ubuntu-latest
timeout-minutes: 30
@@ -133,15 +135,16 @@ jobs:
- name: Setup authentik env
uses: ./.github/actions/setup
- name: Create k8s Kind Cluster
- uses: helm/kind-action@v1.8.0
+ uses: helm/kind-action@v1.9.0
- name: run integration
run: |
poetry run coverage run manage.py test tests/integration
poetry run coverage xml
- if: ${{ always() }}
- uses: codecov/codecov-action@v3
+ uses: codecov/codecov-action@v4
with:
flags: integration
+ token: ${{ secrets.CODECOV_TOKEN }}
test-e2e:
name: test-e2e (${{ matrix.job.name }})
runs-on: ubuntu-latest
@@ -188,9 +191,10 @@ jobs:
poetry run coverage run manage.py test ${{ matrix.job.glob }}
poetry run coverage xml
- if: ${{ always() }}
- uses: codecov/codecov-action@v3
+ uses: codecov/codecov-action@v4
with:
flags: e2e
+ token: ${{ secrets.CODECOV_TOKEN }}
ci-core-mark:
needs:
- lint
@@ -203,12 +207,19 @@ jobs:
steps:
- run: echo mark
build:
+ strategy:
+ fail-fast: false
+ matrix:
+ arch:
+ - amd64
+ - arm64
needs: ci-core-mark
runs-on: ubuntu-latest
permissions:
# Needed to upload contianer images to ghcr.io
packages: write
timeout-minutes: 120
+ if: "github.repository == 'goauthentik/authentik'"
steps:
- uses: actions/checkout@v4
with:
@@ -220,11 +231,11 @@ jobs:
- name: prepare variables
uses: ./.github/actions/docker-push-variables
id: ev
- env:
- DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
+ with:
+ image-name: ghcr.io/goauthentik/dev-server
+ image-arch: ${{ matrix.arch }}
- name: Login to Container Registry
uses: docker/login-action@v3
- if: ${{ steps.ev.outputs.shouldBuild == 'true' }}
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -238,69 +249,16 @@ jobs:
secrets: |
GEOIPUPDATE_ACCOUNT_ID=${{ secrets.GEOIPUPDATE_ACCOUNT_ID }}
GEOIPUPDATE_LICENSE_KEY=${{ secrets.GEOIPUPDATE_LICENSE_KEY }}
- push: ${{ steps.ev.outputs.shouldBuild == 'true' }}
- tags: |
- ghcr.io/goauthentik/dev-server:gh-${{ steps.ev.outputs.branchNameContainer }}
- ghcr.io/goauthentik/dev-server:gh-${{ steps.ev.outputs.sha }}
- ghcr.io/goauthentik/dev-server:gh-${{ steps.ev.outputs.branchNameContainer }}-${{ steps.ev.outputs.timestamp }}-${{ steps.ev.outputs.shortHash }}
+ tags: ${{ steps.ev.outputs.imageTags }}
+ push: true
build-args: |
GIT_BUILD_HASH=${{ steps.ev.outputs.sha }}
- VERSION=${{ steps.ev.outputs.version }}
- VERSION_FAMILY=${{ steps.ev.outputs.versionFamily }}
- cache-from: type=gha
- cache-to: type=gha,mode=max
- build-arm64:
- needs: ci-core-mark
- runs-on: ubuntu-latest
- permissions:
- # Needed to upload contianer images to ghcr.io
- packages: write
- timeout-minutes: 120
- steps:
- - uses: actions/checkout@v4
- with:
- ref: ${{ github.event.pull_request.head.sha }}
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v3.0.0
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
- - name: prepare variables
- uses: ./.github/actions/docker-push-variables
- id: ev
- env:
- DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
- - name: Login to Container Registry
- uses: docker/login-action@v3
- if: ${{ steps.ev.outputs.shouldBuild == 'true' }}
- with:
- registry: ghcr.io
- username: ${{ github.repository_owner }}
- password: ${{ secrets.GITHUB_TOKEN }}
- - name: generate ts client
- run: make gen-client-ts
- - name: Build Docker Image
- uses: docker/build-push-action@v5
- with:
- context: .
- secrets: |
- GEOIPUPDATE_ACCOUNT_ID=${{ secrets.GEOIPUPDATE_ACCOUNT_ID }}
- GEOIPUPDATE_LICENSE_KEY=${{ secrets.GEOIPUPDATE_LICENSE_KEY }}
- push: ${{ steps.ev.outputs.shouldBuild == 'true' }}
- tags: |
- ghcr.io/goauthentik/dev-server:gh-${{ steps.ev.outputs.branchNameContainer }}-arm64
- ghcr.io/goauthentik/dev-server:gh-${{ steps.ev.outputs.sha }}-arm64
- ghcr.io/goauthentik/dev-server:gh-${{ steps.ev.outputs.branchNameContainer }}-${{ steps.ev.outputs.timestamp }}-${{ steps.ev.outputs.shortHash }}-arm64
- build-args: |
- GIT_BUILD_HASH=${{ steps.ev.outputs.sha }}
- VERSION=${{ steps.ev.outputs.version }}
- VERSION_FAMILY=${{ steps.ev.outputs.versionFamily }}
- platforms: linux/arm64
cache-from: type=gha
cache-to: type=gha,mode=max
+ platforms: linux/${{ matrix.arch }}
pr-comment:
needs:
- build
- - build-arm64
runs-on: ubuntu-latest
if: ${{ github.event_name == 'pull_request' }}
permissions:
@@ -314,9 +272,9 @@ jobs:
- name: prepare variables
uses: ./.github/actions/docker-push-variables
id: ev
- env:
- DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
+ with:
+ image-name: ghcr.io/goauthentik/dev-server
- name: Comment on PR
uses: ./.github/actions/comment-pr-instructions
with:
- tag: gh-${{ steps.ev.outputs.branchNameContainer }}-${{ steps.ev.outputs.timestamp }}-${{ steps.ev.outputs.shortHash }}
+ tag: gh-${{ steps.ev.outputs.imageMainTag }}
diff --git a/.github/workflows/ci-outpost.yml b/.github/workflows/ci-outpost.yml
index 35c83ac860..2ef9277cbb 100644
--- a/.github/workflows/ci-outpost.yml
+++ b/.github/workflows/ci-outpost.yml
@@ -1,3 +1,4 @@
+---
name: authentik-ci-outpost
on:
@@ -28,7 +29,7 @@ jobs:
- name: Generate API
run: make gen-client-go
- name: golangci-lint
- uses: golangci/golangci-lint-action@v3
+ uses: golangci/golangci-lint-action@v4
with:
version: v1.54.2
args: --timeout 5000s --verbose
@@ -70,6 +71,7 @@ jobs:
permissions:
# Needed to upload contianer images to ghcr.io
packages: write
+ if: "github.repository == 'goauthentik/authentik'"
steps:
- uses: actions/checkout@v4
with:
@@ -81,11 +83,10 @@ jobs:
- name: prepare variables
uses: ./.github/actions/docker-push-variables
id: ev
- env:
- DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
+ with:
+ image-name: ghcr.io/goauthentik/dev-${{ matrix.type }}
- name: Login to Container Registry
uses: docker/login-action@v3
- if: ${{ steps.ev.outputs.shouldBuild == 'true' }}
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -95,15 +96,11 @@ jobs:
- name: Build Docker Image
uses: docker/build-push-action@v5
with:
- push: ${{ steps.ev.outputs.shouldBuild == 'true' }}
- tags: |
- ghcr.io/goauthentik/dev-${{ matrix.type }}:gh-${{ steps.ev.outputs.branchNameContainer }}
- ghcr.io/goauthentik/dev-${{ matrix.type }}:gh-${{ steps.ev.outputs.sha }}
+ tags: ${{ steps.ev.outputs.imageTags }}
file: ${{ matrix.type }}.Dockerfile
+ push: true
build-args: |
GIT_BUILD_HASH=${{ steps.ev.outputs.sha }}
- VERSION=${{ steps.ev.outputs.version }}
- VERSION_FAMILY=${{ steps.ev.outputs.versionFamily }}
platforms: linux/amd64,linux/arm64
context: .
cache-from: type=gha
diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml
index c002ab8a54..c6d0ec87bf 100644
--- a/.github/workflows/release-publish.yml
+++ b/.github/workflows/release-publish.yml
@@ -1,3 +1,4 @@
+---
name: authentik-on-release
on:
@@ -19,6 +20,8 @@ jobs:
- name: prepare variables
uses: ./.github/actions/docker-push-variables
id: ev
+ with:
+ image-name: ghcr.io/goauthentik/server,beryju/authentik
- name: Docker Login Registry
uses: docker/login-action@v3
with:
@@ -38,21 +41,12 @@ jobs:
uses: docker/build-push-action@v5
with:
context: .
- push: ${{ github.event_name == 'release' }}
+ push: true
secrets: |
GEOIPUPDATE_ACCOUNT_ID=${{ secrets.GEOIPUPDATE_ACCOUNT_ID }}
GEOIPUPDATE_LICENSE_KEY=${{ secrets.GEOIPUPDATE_LICENSE_KEY }}
- tags: |
- beryju/authentik:${{ steps.ev.outputs.version }},
- beryju/authentik:${{ steps.ev.outputs.versionFamily }},
- beryju/authentik:latest,
- ghcr.io/goauthentik/server:${{ steps.ev.outputs.version }},
- ghcr.io/goauthentik/server:${{ steps.ev.outputs.versionFamily }},
- ghcr.io/goauthentik/server:latest
+ tags: ${{ steps.ev.outputs.imageTags }}
platforms: linux/amd64,linux/arm64
- build-args: |
- VERSION=${{ steps.ev.outputs.version }}
- VERSION_FAMILY=${{ steps.ev.outputs.versionFamily }}
build-outpost:
runs-on: ubuntu-latest
permissions:
@@ -78,6 +72,8 @@ jobs:
- name: prepare variables
uses: ./.github/actions/docker-push-variables
id: ev
+ with:
+ image-name: ghcr.io/goauthentik/${{ matrix.type }},beryju/authentik-${{ matrix.type }}
- name: make empty clients
run: |
mkdir -p ./gen-ts-api
@@ -96,20 +92,11 @@ jobs:
- name: Build Docker Image
uses: docker/build-push-action@v5
with:
- push: ${{ github.event_name == 'release' }}
- tags: |
- beryju/authentik-${{ matrix.type }}:${{ steps.ev.outputs.version }},
- beryju/authentik-${{ matrix.type }}:${{ steps.ev.outputs.versionFamily }},
- beryju/authentik-${{ matrix.type }}:latest,
- ghcr.io/goauthentik/${{ matrix.type }}:${{ steps.ev.outputs.version }},
- ghcr.io/goauthentik/${{ matrix.type }}:${{ steps.ev.outputs.versionFamily }},
- ghcr.io/goauthentik/${{ matrix.type }}:latest
+ push: true
+ tags: ${{ steps.ev.outputs.imageTags }}
file: ${{ matrix.type }}.Dockerfile
platforms: linux/amd64,linux/arm64
context: .
- build-args: |
- VERSION=${{ steps.ev.outputs.version }}
- VERSION_FAMILY=${{ steps.ev.outputs.versionFamily }}
build-outpost-binary:
timeout-minutes: 120
runs-on: ubuntu-latest
@@ -181,15 +168,16 @@ jobs:
- name: prepare variables
uses: ./.github/actions/docker-push-variables
id: ev
+ with:
+ image-name: ghcr.io/goauthentik/server
- name: Get static files from docker image
run: |
- docker pull ghcr.io/goauthentik/server:latest
- container=$(docker container create ghcr.io/goauthentik/server:latest)
+ docker pull ghcr.io/goauthentik/server:${{ steps.ev.outputs.imageMainTag }}
+ container=$(docker container create ghcr.io/goauthentik/server:${{ steps.ev.outputs.imageMainTag }})
docker cp ${container}:web/ .
- name: Create a Sentry.io release
uses: getsentry/action-release@v1
continue-on-error: true
- if: ${{ github.event_name == 'release' }}
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: authentik-security-inc
diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml
index a0b896a92b..9f3a280851 100644
--- a/.github/workflows/release-tag.yml
+++ b/.github/workflows/release-tag.yml
@@ -1,3 +1,4 @@
+---
name: authentik-on-tag
on:
@@ -28,13 +29,11 @@ jobs:
with:
app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_PRIVATE_KEY }}
- - name: Extract version number
- id: get_version
- uses: actions/github-script@v7
+ - name: prepare variables
+ uses: ./.github/actions/docker-push-variables
+ id: ev
with:
- github-token: ${{ steps.generate_token.outputs.token }}
- script: |
- return context.payload.ref.replace(/\/refs\/tags\/version\//, '');
+ image-name: ghcr.io/goauthentik/server
- name: Create Release
id: create_release
uses: actions/create-release@v1.1.4
@@ -42,6 +41,6 @@ jobs:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
with:
tag_name: ${{ github.ref }}
- release_name: Release ${{ steps.get_version.outputs.result }}
+ release_name: Release ${{ steps.ev.outputs.version }}
draft: true
- prerelease: false
+ prerelease: ${{ steps.ev.outputs.prerelease == 'true' }}
diff --git a/.github/workflows/translation-compile.yml b/.github/workflows/translation-extract-compile.yml
similarity index 61%
rename from .github/workflows/translation-compile.yml
rename to .github/workflows/translation-extract-compile.yml
index 1d5e7873d0..eee769ff2e 100644
--- a/.github/workflows/translation-compile.yml
+++ b/.github/workflows/translation-extract-compile.yml
@@ -1,9 +1,8 @@
-name: authentik-backend-translate-compile
+---
+name: authentik-backend-translate-extract-compile
on:
- push:
- branches: [main]
- paths:
- - "locale/**"
+ schedule:
+ - cron: "0 0 * * *" # every day at midnight
workflow_dispatch:
env:
@@ -25,16 +24,20 @@ jobs:
token: ${{ steps.generate_token.outputs.token }}
- name: Setup authentik env
uses: ./.github/actions/setup
+ - name: run extract
+ run: |
+ poetry run make i18n-extract
- name: run compile
- run: poetry run ak compilemessages
+ run: |
+ poetry run ak compilemessages
+ make web-check-compile
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
- id: cpr
with:
token: ${{ steps.generate_token.outputs.token }}
- branch: compile-backend-translation
- commit-message: "core: compile backend translations"
- title: "core: compile backend translations"
- body: "core: compile backend translations"
+ branch: extract-compile-backend-translation
+ commit-message: "core, web: update translations"
+ title: "core, web: update translations"
+ body: "core, web: update translations"
delete-branch: true
signoff: true
diff --git a/Dockerfile b/Dockerfile
index 780e9ce3db..5d85a1d3f5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -37,7 +37,7 @@ COPY ./gen-ts-api /work/web/node_modules/@goauthentik/api
RUN npm run build
# Stage 3: Build go proxy
-FROM --platform=${BUILDPLATFORM} docker.io/golang:1.21.6-bookworm AS go-builder
+FROM --platform=${BUILDPLATFORM} docker.io/golang:1.22.0-bookworm AS go-builder
ARG TARGETOS
ARG TARGETARCH
@@ -83,7 +83,7 @@ RUN --mount=type=secret,id=GEOIPUPDATE_ACCOUNT_ID \
/bin/sh -c "/usr/bin/entry.sh || echo 'Failed to get GeoIP database, disabling'; exit 0"
# Stage 5: Python dependencies
-FROM docker.io/python:3.12.1-slim-bookworm AS python-deps
+FROM docker.io/python:3.12.2-slim-bookworm AS python-deps
WORKDIR /ak-root/poetry
@@ -108,7 +108,7 @@ RUN --mount=type=bind,target=./pyproject.toml,src=./pyproject.toml \
poetry install --only=main --no-ansi --no-interaction
# Stage 6: Run
-FROM docker.io/python:3.12.1-slim-bookworm AS final-image
+FROM docker.io/python:3.12.2-slim-bookworm AS final-image
ARG GIT_BUILD_HASH
ARG VERSION
diff --git a/Makefile b/Makefile
index e72db46279..0cffb452af 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,9 @@ NPM_VERSION = $(shell python -m scripts.npm_version)
PY_SOURCES = authentik tests scripts lifecycle
DOCKER_IMAGE ?= "authentik:test"
+GEN_API_TS = "gen-ts-api"
+GEN_API_GO = "gen-go-api"
+
pg_user := $(shell python -m authentik.lib.config postgresql.user 2>/dev/null)
pg_host := $(shell python -m authentik.lib.config postgresql.host 2>/dev/null)
pg_name := $(shell python -m authentik.lib.config postgresql.name 2>/dev/null)
@@ -76,7 +79,15 @@ migrate: ## Run the Authentik Django server's migrations
i18n-extract: core-i18n-extract web-i18n-extract ## Extract strings that require translation into files to send to a translation service
core-i18n-extract:
- ak makemessages --ignore web --ignore internal --ignore web --ignore web-api --ignore website -l en
+ ak makemessages \
+ --add-location file \
+ --no-obsolete \
+ --ignore web \
+ --ignore internal \
+ --ignore ${GEN_API_TS} \
+ --ignore ${GEN_API_GO} \
+ --ignore website \
+ -l en
install: web-install website-install core-install ## Install all requires dependencies for `web`, `website` and `core`
@@ -114,7 +125,7 @@ gen-diff: ## (Release) generate the changelog diff between the current schema a
docker run \
--rm -v ${PWD}:/local \
--user ${UID}:${GID} \
- docker.io/openapitools/openapi-diff:2.1.0-beta.6 \
+ docker.io/openapitools/openapi-diff:2.1.0-beta.8 \
--markdown /local/diff.md \
/local/old_schema.yml /local/schema.yml
rm old_schema.yml
@@ -123,11 +134,11 @@ gen-diff: ## (Release) generate the changelog diff between the current schema a
npx prettier --write diff.md
gen-clean-ts: ## Remove generated API client for Typescript
- rm -rf gen-ts-api/
- rm -rf web/node_modules/@goauthentik/api/
+ rm -rf ./${GEN_API_TS}/
+ rm -rf ./web/node_modules/@goauthentik/api/
gen-clean-go: ## Remove generated API client for Go
- rm -rf gen-go-api/
+ rm -rf ./${GEN_API_GO}/
gen-clean: gen-clean-ts gen-clean-go ## Remove generated API clients
@@ -138,31 +149,31 @@ gen-client-ts: gen-clean-ts ## Build and install the authentik API for Typescri
docker.io/openapitools/openapi-generator-cli:v6.5.0 generate \
-i /local/schema.yml \
-g typescript-fetch \
- -o /local/gen-ts-api \
+ -o /local/${GEN_API_TS} \
-c /local/scripts/api-ts-config.yaml \
--additional-properties=npmVersion=${NPM_VERSION} \
--git-repo-id authentik \
--git-user-id goauthentik
mkdir -p web/node_modules/@goauthentik/api
- cd gen-ts-api && npm i
- \cp -rfv gen-ts-api/* web/node_modules/@goauthentik/api
+ cd ./${GEN_API_TS} && npm i
+ \cp -rf ./${GEN_API_TS}/* web/node_modules/@goauthentik/api
gen-client-go: gen-clean-go ## Build and install the authentik API for Golang
- mkdir -p ./gen-go-api ./gen-go-api/templates
- wget https://raw.githubusercontent.com/goauthentik/client-go/main/config.yaml -O ./gen-go-api/config.yaml
- wget https://raw.githubusercontent.com/goauthentik/client-go/main/templates/README.mustache -O ./gen-go-api/templates/README.mustache
- wget https://raw.githubusercontent.com/goauthentik/client-go/main/templates/go.mod.mustache -O ./gen-go-api/templates/go.mod.mustache
- cp schema.yml ./gen-go-api/
+ mkdir -p ./${GEN_API_GO} ./${GEN_API_GO}/templates
+ wget https://raw.githubusercontent.com/goauthentik/client-go/main/config.yaml -O ./${GEN_API_GO}/config.yaml
+ wget https://raw.githubusercontent.com/goauthentik/client-go/main/templates/README.mustache -O ./${GEN_API_GO}/templates/README.mustache
+ wget https://raw.githubusercontent.com/goauthentik/client-go/main/templates/go.mod.mustache -O ./${GEN_API_GO}/templates/go.mod.mustache
+ cp schema.yml ./${GEN_API_GO}/
docker run \
- --rm -v ${PWD}/gen-go-api:/local \
+ --rm -v ${PWD}/${GEN_API_GO}:/local \
--user ${UID}:${GID} \
docker.io/openapitools/openapi-generator-cli:v6.5.0 generate \
-i /local/schema.yml \
-g go \
-o /local/ \
-c /local/config.yaml
- go mod edit -replace goauthentik.io/api/v3=./gen-go-api
- rm -rf ./gen-go-api/config.yaml ./gen-go-api/templates/
+ go mod edit -replace goauthentik.io/api/v3=./${GEN_API_GO}
+ rm -rf ./${GEN_API_GO}/config.yaml ./${GEN_API_GO}/templates/
gen-dev-config: ## Generate a local development config file
python -m scripts.generate_config
@@ -176,7 +187,7 @@ gen: gen-build gen-client-ts
web-build: web-install ## Build the Authentik UI
cd web && npm run build
-web: web-lint-fix web-lint web-check-compile web-i18n-extract ## Automatically fix formatting issues in the Authentik UI source code, lint the code, and compile it
+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-install: ## Install the necessary libraries to build the Authentik UI
cd web && npm ci
diff --git a/authentik/admin/apps.py b/authentik/admin/apps.py
index 91d087365b..d151a6f953 100644
--- a/authentik/admin/apps.py
+++ b/authentik/admin/apps.py
@@ -15,7 +15,3 @@ class AuthentikAdminConfig(ManagedAppConfig):
label = "authentik_admin"
verbose_name = "authentik Admin"
default = True
-
- def reconcile_global_load_admin_signals(self):
- """Load admin signals"""
- self.import_module("authentik.admin.signals")
diff --git a/authentik/blueprints/apps.py b/authentik/blueprints/apps.py
index 0d31f42335..695bc68ce1 100644
--- a/authentik/blueprints/apps.py
+++ b/authentik/blueprints/apps.py
@@ -21,10 +21,27 @@ class ManagedAppConfig(AppConfig):
self.logger = get_logger().bind(app_name=app_name)
def ready(self) -> None:
+ self.import_related()
self.reconcile_global()
self.reconcile_tenant()
return super().ready()
+ def import_related(self):
+ """Automatically import related modules which rely on just being imported
+ to register themselves (mainly django signals and celery tasks)"""
+
+ def import_relative(rel_module: str):
+ try:
+ module_name = f"{self.name}.{rel_module}"
+ import_module(module_name)
+ self.logger.info("Imported related module", module=module_name)
+ except ModuleNotFoundError:
+ pass
+
+ import_relative("checks")
+ import_relative("tasks")
+ import_relative("signals")
+
def import_module(self, path: str):
"""Load module"""
import_module(path)
diff --git a/authentik/blueprints/v1/importer.py b/authentik/blueprints/v1/importer.py
index 1e935c4d6b..21127ec00e 100644
--- a/authentik/blueprints/v1/importer.py
+++ b/authentik/blueprints/v1/importer.py
@@ -39,7 +39,8 @@ from authentik.core.models import (
Source,
UserSourceConnection,
)
-from authentik.enterprise.models import LicenseKey, LicenseUsage
+from authentik.enterprise.license import LicenseKey
+from authentik.enterprise.models import LicenseUsage
from authentik.enterprise.providers.rac.models import ConnectionToken
from authentik.events.models import SystemTask
from authentik.events.utils import cleanse_dict
diff --git a/authentik/blueprints/v1/tasks.py b/authentik/blueprints/v1/tasks.py
index c6b78a4e83..6d12c28d1d 100644
--- a/authentik/blueprints/v1/tasks.py
+++ b/authentik/blueprints/v1/tasks.py
@@ -3,6 +3,7 @@
from dataclasses import asdict, dataclass, field
from hashlib import sha512
from pathlib import Path
+from sys import platform
from typing import Optional
from dacite.core import from_dict
@@ -60,7 +61,12 @@ def start_blueprint_watcher():
if _file_watcher_started:
return
observer = Observer()
- observer.schedule(BlueprintEventHandler(), CONFIG.get("blueprints_dir"), recursive=True)
+ kwargs = {}
+ if platform.startswith("linux"):
+ kwargs["event_filter"] = (FileCreatedEvent, FileModifiedEvent)
+ observer.schedule(
+ BlueprintEventHandler(), CONFIG.get("blueprints_dir"), recursive=True, **kwargs
+ )
observer.start()
_file_watcher_started = True
@@ -68,26 +74,36 @@ def start_blueprint_watcher():
class BlueprintEventHandler(FileSystemEventHandler):
"""Event handler for blueprint events"""
- def on_any_event(self, event: FileSystemEvent):
- if not isinstance(event, (FileCreatedEvent, FileModifiedEvent)):
- return
+ # We only ever get creation and modification events.
+ # See the creation of the Observer instance above for the event filtering.
+
+ # Even though we filter to only get file events, we might still get
+ # directory events as some implementations such as inotify do not support
+ # filtering on file/directory.
+
+ def dispatch(self, event: FileSystemEvent) -> None:
+ """Call specific event handler method. Ignores directory changes."""
if event.is_directory:
- return
+ return None
+ return super().dispatch(event)
+
+ def on_created(self, event: FileSystemEvent):
+ """Process file creation"""
+ LOGGER.debug("new blueprint file created, starting discovery")
+ for tenant in Tenant.objects.filter(ready=True):
+ with tenant:
+ blueprints_discovery.delay()
+
+ def on_modified(self, event: FileSystemEvent):
+ """Process file modification"""
+ path = Path(event.src_path)
root = Path(CONFIG.get("blueprints_dir")).absolute()
- path = Path(event.src_path).absolute()
rel_path = str(path.relative_to(root))
for tenant in Tenant.objects.filter(ready=True):
with tenant:
- root = Path(CONFIG.get("blueprints_dir")).absolute()
- path = Path(event.src_path).absolute()
- rel_path = str(path.relative_to(root))
- if isinstance(event, FileCreatedEvent):
- LOGGER.debug("new blueprint file created, starting discovery", path=rel_path)
- blueprints_discovery.delay(rel_path)
- if isinstance(event, FileModifiedEvent):
- for instance in BlueprintInstance.objects.filter(path=rel_path, enabled=True):
- LOGGER.debug("modified blueprint file, starting apply", instance=instance)
- apply_blueprint.delay(instance.pk.hex)
+ for instance in BlueprintInstance.objects.filter(path=rel_path, enabled=True):
+ LOGGER.debug("modified blueprint file, starting apply", instance=instance)
+ apply_blueprint.delay(instance.pk.hex)
@CELERY_APP.task(
diff --git a/authentik/core/api/applications.py b/authentik/core/api/applications.py
index bb8532e368..2c8a37c304 100644
--- a/authentik/core/api/applications.py
+++ b/authentik/core/api/applications.py
@@ -2,7 +2,7 @@
from copy import copy
from datetime import timedelta
-from typing import Optional
+from typing import Iterator, Optional
from django.core.cache import cache
from django.db.models import QuerySet
@@ -131,14 +131,14 @@ class ApplicationViewSet(UsedByMixin, ModelViewSet):
return queryset
def _get_allowed_applications(
- self, queryset: QuerySet, user: Optional[User] = None
+ self, pagined_apps: Iterator[Application], user: Optional[User] = None
) -> list[Application]:
applications = []
request = self.request._request
if user:
request = copy(request)
request.user = user
- for application in queryset:
+ for application in pagined_apps:
engine = PolicyEngine(application, request.user, request)
engine.build()
if engine.passing:
@@ -215,7 +215,7 @@ class ApplicationViewSet(UsedByMixin, ModelViewSet):
return super().list(request)
queryset = self._filter_queryset_for_list(self.get_queryset())
- self.paginate_queryset(queryset)
+ pagined_apps = self.paginate_queryset(queryset)
if "for_user" in request.query_params:
try:
@@ -229,18 +229,18 @@ class ApplicationViewSet(UsedByMixin, ModelViewSet):
raise ValidationError({"for_user": "User not found"})
except ValueError as exc:
raise ValidationError from exc
- allowed_applications = self._get_allowed_applications(queryset, user=for_user)
+ allowed_applications = self._get_allowed_applications(pagined_apps, user=for_user)
serializer = self.get_serializer(allowed_applications, many=True)
return self.get_paginated_response(serializer.data)
allowed_applications = []
if not should_cache:
- allowed_applications = self._get_allowed_applications(queryset)
+ allowed_applications = self._get_allowed_applications(pagined_apps)
if should_cache:
allowed_applications = cache.get(user_app_cache_key(self.request.user.pk))
if not allowed_applications:
LOGGER.debug("Caching allowed application list")
- allowed_applications = self._get_allowed_applications(queryset)
+ allowed_applications = self._get_allowed_applications(pagined_apps)
cache.set(
user_app_cache_key(self.request.user.pk),
allowed_applications,
diff --git a/authentik/core/api/propertymappings.py b/authentik/core/api/propertymappings.py
index 8382e0ac02..55f6b3f704 100644
--- a/authentik/core/api/propertymappings.py
+++ b/authentik/core/api/propertymappings.py
@@ -118,7 +118,11 @@ class PropertyMappingViewSet(
@action(detail=True, pagination_class=None, filter_backends=[], methods=["POST"])
def test(self, request: Request, pk: str) -> Response:
"""Test Property Mapping"""
- mapping: PropertyMapping = self.get_object()
+ _mapping: PropertyMapping = self.get_object()
+ # Use `get_subclass` to get correct class and correct `.evaluate` implementation
+ mapping = PropertyMapping.objects.get_subclass(pk=_mapping.pk)
+ # FIXME: when we separate policy mappings between ones for sources
+ # and ones for providers, we need to make the user field optional for the source mapping
test_params = PolicyTestSerializer(data=request.data)
if not test_params.is_valid():
return Response(test_params.errors, status=400)
diff --git a/authentik/core/apps.py b/authentik/core/apps.py
index b0b8595b6a..866405327c 100644
--- a/authentik/core/apps.py
+++ b/authentik/core/apps.py
@@ -14,10 +14,6 @@ class AuthentikCoreConfig(ManagedAppConfig):
mountpoint = ""
default = True
- def reconcile_global_load_core_signals(self):
- """Load core signals"""
- self.import_module("authentik.core.signals")
-
def reconcile_global_debug_worker_hook(self):
"""Dispatch startup tasks inline when debugging"""
if settings.DEBUG:
diff --git a/authentik/core/auth.py b/authentik/core/auth.py
index a4ede1387d..c73a3802a5 100644
--- a/authentik/core/auth.py
+++ b/authentik/core/auth.py
@@ -43,7 +43,9 @@ class TokenBackend(InbuiltBackend):
self, request: HttpRequest, username: Optional[str], password: Optional[str], **kwargs: Any
) -> Optional[User]:
try:
+ # pylint: disable=no-member
user = User._default_manager.get_by_natural_key(username)
+ # pylint: disable=no-member
except User.DoesNotExist:
# Run the default password hasher once to reduce the timing
# difference between an existing and a nonexistent user (#20760).
diff --git a/authentik/core/tasks.py b/authentik/core/tasks.py
index 4d66aaa4f8..61ac773d6d 100644
--- a/authentik/core/tasks.py
+++ b/authentik/core/tasks.py
@@ -37,6 +37,7 @@ def clean_expired_models(self: SystemTask):
messages.append(f"Expired {amount} {cls._meta.verbose_name_plural}")
# Special case
amount = 0
+ # pylint: disable=no-member
for session in AuthenticatedSession.objects.all():
cache_key = f"{KEY_PREFIX}{session.session_key}"
value = None
@@ -49,6 +50,7 @@ def clean_expired_models(self: SystemTask):
session.delete()
amount += 1
LOGGER.debug("Expired sessions", model=AuthenticatedSession, amount=amount)
+ # pylint: disable=no-member
messages.append(f"Expired {amount} {AuthenticatedSession._meta.verbose_name_plural}")
self.set_status(TaskStatus.SUCCESSFUL, *messages)
diff --git a/authentik/crypto/apps.py b/authentik/crypto/apps.py
index 2afb4c579e..d80076657c 100644
--- a/authentik/crypto/apps.py
+++ b/authentik/crypto/apps.py
@@ -1,6 +1,6 @@
"""authentik crypto app config"""
-from datetime import datetime
+from datetime import datetime, timezone
from typing import Optional
from authentik.blueprints.apps import ManagedAppConfig
@@ -17,10 +17,6 @@ class AuthentikCryptoConfig(ManagedAppConfig):
verbose_name = "authentik Crypto"
default = True
- def reconcile_global_load_crypto_tasks(self):
- """Load crypto tasks"""
- self.import_module("authentik.crypto.tasks")
-
def _create_update_cert(self):
from authentik.crypto.builder import CertificateBuilder
from authentik.crypto.models import CertificateKeyPair
@@ -47,9 +43,9 @@ class AuthentikCryptoConfig(ManagedAppConfig):
cert: Optional[CertificateKeyPair] = CertificateKeyPair.objects.filter(
managed=MANAGED_KEY
).first()
- now = datetime.now()
+ now = datetime.now(tz=timezone.utc)
if not cert or (
- now < cert.certificate.not_valid_before or now > cert.certificate.not_valid_after
+ now < cert.certificate.not_valid_after_utc or now > cert.certificate.not_valid_after_utc
):
self._create_update_cert()
diff --git a/authentik/enterprise/api.py b/authentik/enterprise/api.py
index b7a91d7649..3835c85610 100644
--- a/authentik/enterprise/api.py
+++ b/authentik/enterprise/api.py
@@ -1,6 +1,7 @@
"""Enterprise API Views"""
-from datetime import datetime, timedelta
+from dataclasses import asdict
+from datetime import timedelta
from django.utils.timezone import now
from django.utils.translation import gettext as _
@@ -8,7 +9,7 @@ from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema, inline_serializer
from rest_framework.decorators import action
from rest_framework.exceptions import ValidationError
-from rest_framework.fields import BooleanField, CharField, DateTimeField, IntegerField
+from rest_framework.fields import CharField, IntegerField
from rest_framework.permissions import IsAuthenticated
from rest_framework.request import Request
from rest_framework.response import Response
@@ -19,18 +20,18 @@ from authentik.api.decorators import permission_required
from authentik.core.api.used_by import UsedByMixin
from authentik.core.api.utils import PassiveSerializer
from authentik.core.models import User, UserTypes
-from authentik.enterprise.models import License, LicenseKey
+from authentik.enterprise.license import LicenseKey, LicenseSummarySerializer
+from authentik.enterprise.models import License
from authentik.root.install_id import get_install_id
class EnterpriseRequiredMixin:
"""Mixin to validate that a valid enterprise license
- exists before allowing to safe the object"""
+ exists before allowing to save the object"""
def validate(self, attrs: dict) -> dict:
"""Check that a valid license exists"""
- total = LicenseKey.get_total()
- if not total.is_valid():
+ if not LicenseKey.cached_summary().valid:
raise ValidationError(_("Enterprise is required to create/update this object."))
return super().validate(attrs)
@@ -61,19 +62,6 @@ class LicenseSerializer(ModelSerializer):
}
-class LicenseSummary(PassiveSerializer):
- """Serializer for license status"""
-
- internal_users = IntegerField(required=True)
- external_users = IntegerField(required=True)
- valid = BooleanField()
- show_admin_warning = BooleanField()
- show_user_warning = BooleanField()
- read_only = BooleanField()
- latest_valid = DateTimeField()
- has_license = BooleanField()
-
-
class LicenseForecastSerializer(PassiveSerializer):
"""Serializer for license forecast"""
@@ -111,31 +99,13 @@ class LicenseViewSet(UsedByMixin, ModelViewSet):
@extend_schema(
request=OpenApiTypes.NONE,
responses={
- 200: LicenseSummary(),
+ 200: LicenseSummarySerializer(),
},
)
@action(detail=False, methods=["GET"], permission_classes=[IsAuthenticated])
def summary(self, request: Request) -> Response:
"""Get the total license status"""
- total = LicenseKey.get_total()
- last_valid = LicenseKey.last_valid_date()
- # TODO: move this to a different place?
- show_admin_warning = last_valid < now() - timedelta(weeks=2)
- show_user_warning = last_valid < now() - timedelta(weeks=4)
- read_only = last_valid < now() - timedelta(weeks=6)
- latest_valid = datetime.fromtimestamp(total.exp)
- response = LicenseSummary(
- data={
- "internal_users": total.internal_users,
- "external_users": total.external_users,
- "valid": total.is_valid(),
- "show_admin_warning": show_admin_warning,
- "show_user_warning": show_user_warning,
- "read_only": read_only,
- "latest_valid": latest_valid,
- "has_license": License.objects.all().count() > 0,
- }
- )
+ response = LicenseSummarySerializer(data=asdict(LicenseKey.cached_summary()))
response.is_valid(raise_exception=True)
return Response(response.data)
diff --git a/authentik/enterprise/apps.py b/authentik/enterprise/apps.py
index ae979dac77..83dbefa06a 100644
--- a/authentik/enterprise/apps.py
+++ b/authentik/enterprise/apps.py
@@ -17,16 +17,12 @@ class AuthentikEnterpriseConfig(EnterpriseConfig):
verbose_name = "authentik Enterprise"
default = True
- def reconcile_global_load_enterprise_signals(self):
- """Load enterprise signals"""
- self.import_module("authentik.enterprise.signals")
-
def enabled(self):
"""Return true if enterprise is enabled and valid"""
return self.check_enabled() or settings.TEST
def check_enabled(self):
"""Actual enterprise check, cached"""
- from authentik.enterprise.models import LicenseKey
+ from authentik.enterprise.license import LicenseKey
- return LicenseKey.get_total().is_valid()
+ return LicenseKey.cached_summary().valid
diff --git a/authentik/enterprise/audit/middleware.py b/authentik/enterprise/audit/middleware.py
index cca240b96f..ad649d1a04 100644
--- a/authentik/enterprise/audit/middleware.py
+++ b/authentik/enterprise/audit/middleware.py
@@ -19,14 +19,10 @@ from authentik.events.utils import cleanse_dict, sanitize_item
class EnterpriseAuditMiddleware(AuditMiddleware):
"""Enterprise audit middleware"""
- _enabled = None
-
@property
def enabled(self):
- """Lazy check if audit logging is enabled"""
- if self._enabled is None:
- self._enabled = apps.get_app_config("authentik_enterprise").enabled()
- return self._enabled
+ """Check if audit logging is enabled"""
+ return apps.get_app_config("authentik_enterprise").enabled()
def connect(self, request: HttpRequest):
super().connect(request)
diff --git a/authentik/enterprise/license.py b/authentik/enterprise/license.py
new file mode 100644
index 0000000000..7baa1b378a
--- /dev/null
+++ b/authentik/enterprise/license.py
@@ -0,0 +1,213 @@
+"""Enterprise license"""
+
+from base64 import b64decode
+from binascii import Error
+from dataclasses import asdict, dataclass, field
+from datetime import datetime, timedelta
+from enum import Enum
+from functools import lru_cache
+from time import mktime
+
+from cryptography.exceptions import InvalidSignature
+from cryptography.x509 import Certificate, load_der_x509_certificate, load_pem_x509_certificate
+from dacite import from_dict
+from django.core.cache import cache
+from django.db.models.query import QuerySet
+from django.utils.timezone import now
+from jwt import PyJWTError, decode, get_unverified_header
+from rest_framework.exceptions import ValidationError
+from rest_framework.fields import BooleanField, DateTimeField, IntegerField
+
+from authentik.core.api.utils import PassiveSerializer
+from authentik.core.models import User, UserTypes
+from authentik.enterprise.models import License, LicenseUsage
+from authentik.root.install_id import get_install_id
+
+CACHE_KEY_ENTERPRISE_LICENSE = "goauthentik.io/enterprise/license"
+CACHE_EXPIRY_ENTERPRISE_LICENSE = 3 * 60 * 60 # 2 Hours
+
+
+@lru_cache()
+def get_licensing_key() -> Certificate:
+ """Get Root CA PEM"""
+ with open("authentik/enterprise/public.pem", "rb") as _key:
+ return load_pem_x509_certificate(_key.read())
+
+
+def get_license_aud() -> str:
+ """Get the JWT audience field"""
+ return f"enterprise.goauthentik.io/license/{get_install_id()}"
+
+
+class LicenseFlags(Enum):
+ """License flags"""
+
+
+@dataclass
+class LicenseSummary:
+ """Internal representation of a license summary"""
+
+ internal_users: int
+ external_users: int
+ valid: bool
+ show_admin_warning: bool
+ show_user_warning: bool
+ read_only: bool
+ latest_valid: datetime
+ has_license: bool
+
+
+class LicenseSummarySerializer(PassiveSerializer):
+ """Serializer for license status"""
+
+ internal_users = IntegerField(required=True)
+ external_users = IntegerField(required=True)
+ valid = BooleanField()
+ show_admin_warning = BooleanField()
+ show_user_warning = BooleanField()
+ read_only = BooleanField()
+ latest_valid = DateTimeField()
+ has_license = BooleanField()
+
+
+@dataclass
+class LicenseKey:
+ """License JWT claims"""
+
+ aud: str
+ exp: int
+
+ name: str
+ internal_users: int = 0
+ external_users: int = 0
+ flags: list[LicenseFlags] = field(default_factory=list)
+
+ @staticmethod
+ def validate(jwt: str) -> "LicenseKey":
+ """Validate the license from a given JWT"""
+ try:
+ headers = get_unverified_header(jwt)
+ except PyJWTError:
+ raise ValidationError("Unable to verify license")
+ x5c: list[str] = headers.get("x5c", [])
+ if len(x5c) < 1:
+ raise ValidationError("Unable to verify license")
+ try:
+ our_cert = load_der_x509_certificate(b64decode(x5c[0]))
+ intermediate = load_der_x509_certificate(b64decode(x5c[1]))
+ our_cert.verify_directly_issued_by(intermediate)
+ intermediate.verify_directly_issued_by(get_licensing_key())
+ except (InvalidSignature, TypeError, ValueError, Error):
+ raise ValidationError("Unable to verify license")
+ try:
+ body = from_dict(
+ LicenseKey,
+ decode(
+ jwt,
+ our_cert.public_key(),
+ algorithms=["ES512"],
+ audience=get_license_aud(),
+ ),
+ )
+ except PyJWTError:
+ raise ValidationError("Unable to verify license")
+ return body
+
+ @staticmethod
+ def get_total() -> "LicenseKey":
+ """Get a summarized version of all (not expired) licenses"""
+ active_licenses = License.objects.filter(expiry__gte=now())
+ total = LicenseKey(get_license_aud(), 0, "Summarized license", 0, 0)
+ for lic in active_licenses:
+ total.internal_users += lic.internal_users
+ total.external_users += lic.external_users
+ exp_ts = int(mktime(lic.expiry.timetuple()))
+ if total.exp == 0:
+ total.exp = exp_ts
+ if exp_ts <= total.exp:
+ total.exp = exp_ts
+ total.flags.extend(lic.status.flags)
+ return total
+
+ @staticmethod
+ def base_user_qs() -> QuerySet:
+ """Base query set for all users"""
+ return User.objects.all().exclude_anonymous().exclude(is_active=False)
+
+ @staticmethod
+ def get_default_user_count():
+ """Get current default user count"""
+ return LicenseKey.base_user_qs().filter(type=UserTypes.INTERNAL).count()
+
+ @staticmethod
+ def get_external_user_count():
+ """Get current external user count"""
+ # Count since start of the month
+ last_month = now().replace(day=1)
+ return (
+ LicenseKey.base_user_qs()
+ .filter(type=UserTypes.EXTERNAL, last_login__gte=last_month)
+ .count()
+ )
+
+ def is_valid(self) -> bool:
+ """Check if the given license body covers all users
+
+ Only checks the current count, no historical data is checked"""
+ default_users = self.get_default_user_count()
+ if default_users > self.internal_users:
+ return False
+ active_users = self.get_external_user_count()
+ if active_users > self.external_users:
+ return False
+ return True
+
+ def record_usage(self):
+ """Capture the current validity status and metrics and save them"""
+ threshold = now() - timedelta(hours=8)
+ if not LicenseUsage.objects.filter(record_date__gte=threshold).exists():
+ LicenseUsage.objects.create(
+ user_count=self.get_default_user_count(),
+ external_user_count=self.get_external_user_count(),
+ within_limits=self.is_valid(),
+ )
+ summary = asdict(self.summary())
+ # Also cache the latest summary for the middleware
+ cache.set(CACHE_KEY_ENTERPRISE_LICENSE, summary, timeout=CACHE_EXPIRY_ENTERPRISE_LICENSE)
+ return summary
+
+ @staticmethod
+ def last_valid_date() -> datetime:
+ """Get the last date the license was valid"""
+ usage: LicenseUsage = (
+ LicenseUsage.filter_not_expired(within_limits=True).order_by("-record_date").first()
+ )
+ if not usage:
+ return now()
+ return usage.record_date
+
+ def summary(self) -> LicenseSummary:
+ """Summary of license status"""
+ last_valid = LicenseKey.last_valid_date()
+ show_admin_warning = last_valid < now() - timedelta(weeks=2)
+ show_user_warning = last_valid < now() - timedelta(weeks=4)
+ read_only = last_valid < now() - timedelta(weeks=6)
+ latest_valid = datetime.fromtimestamp(self.exp)
+ return LicenseSummary(
+ show_admin_warning=show_admin_warning,
+ show_user_warning=show_user_warning,
+ read_only=read_only,
+ latest_valid=latest_valid,
+ internal_users=self.internal_users,
+ external_users=self.external_users,
+ valid=self.is_valid(),
+ has_license=License.objects.all().count() > 0,
+ )
+
+ @staticmethod
+ def cached_summary() -> LicenseSummary:
+ """Helper method which looks up the last summary"""
+ summary = cache.get(CACHE_KEY_ENTERPRISE_LICENSE)
+ if not summary:
+ return LicenseKey.get_total().summary()
+ return from_dict(LicenseSummary, summary)
diff --git a/authentik/enterprise/middleware.py b/authentik/enterprise/middleware.py
new file mode 100644
index 0000000000..83ff8af05f
--- /dev/null
+++ b/authentik/enterprise/middleware.py
@@ -0,0 +1,64 @@
+"""Enterprise middleware"""
+
+from collections.abc import Callable
+
+from django.http import HttpRequest, HttpResponse, JsonResponse
+from django.urls import resolve
+from structlog.stdlib import BoundLogger, get_logger
+
+from authentik.enterprise.api import LicenseViewSet
+from authentik.enterprise.license import LicenseKey
+from authentik.flows.views.executor import FlowExecutorView
+from authentik.lib.utils.reflection import class_to_path
+
+
+class EnterpriseMiddleware:
+ """Enterprise middleware"""
+
+ get_response: Callable[[HttpRequest], HttpResponse]
+ logger: BoundLogger
+
+ def __init__(self, get_response: Callable[[HttpRequest], HttpResponse]):
+ self.get_response = get_response
+ self.logger = get_logger().bind()
+
+ def __call__(self, request: HttpRequest) -> HttpResponse:
+ resolver_match = resolve(request.path_info)
+ request.resolver_match = resolver_match
+ if not self.is_request_allowed(request):
+ self.logger.warning("Refusing request due to expired/invalid license")
+ return JsonResponse(
+ {
+ "detail": "Request denied due to expired/invalid license.",
+ "code": "denied_license",
+ },
+ status=400,
+ )
+ return self.get_response(request)
+
+ def is_request_allowed(self, request: HttpRequest) -> bool:
+ """Check if a specific request is allowed"""
+ if self.is_request_always_allowed(request):
+ return True
+ cached_status = LicenseKey.cached_summary()
+ if not cached_status:
+ return True
+ if cached_status.read_only:
+ return False
+ return True
+
+ def is_request_always_allowed(self, request: HttpRequest):
+ """Check if a request is always allowed"""
+ # Always allow "safe" methods
+ if request.method.lower() in ["get", "head", "options", "trace"]:
+ return True
+ # Always allow requests to manage licenses
+ if class_to_path(request.resolver_match.func) == class_to_path(LicenseViewSet):
+ return True
+ # Flow executor is mounted as an API path but explicitly allowed
+ if class_to_path(request.resolver_match.func) == class_to_path(FlowExecutorView):
+ return True
+ # Only apply these restrictions to the API
+ if "authentik_api" not in request.resolver_match.app_names:
+ return True
+ return False
diff --git a/authentik/enterprise/models.py b/authentik/enterprise/models.py
index 2c20169fbd..6600e5c07a 100644
--- a/authentik/enterprise/models.py
+++ b/authentik/enterprise/models.py
@@ -1,159 +1,20 @@
"""Enterprise models"""
-from base64 import b64decode
-from binascii import Error
-from dataclasses import dataclass, field
-from datetime import datetime, timedelta
-from enum import Enum
-from functools import lru_cache
-from time import mktime
+from datetime import timedelta
+from typing import TYPE_CHECKING
from uuid import uuid4
-from cryptography.exceptions import InvalidSignature
-from cryptography.x509 import Certificate, load_der_x509_certificate, load_pem_x509_certificate
-from dacite import from_dict
from django.contrib.postgres.indexes import HashIndex
from django.db import models
-from django.db.models.query import QuerySet
from django.utils.timezone import now
from django.utils.translation import gettext as _
-from jwt import PyJWTError, decode, get_unverified_header
-from rest_framework.exceptions import ValidationError
from rest_framework.serializers import BaseSerializer
-from authentik.core.models import ExpiringModel, User, UserTypes
+from authentik.core.models import ExpiringModel
from authentik.lib.models import SerializerModel
-from authentik.root.install_id import get_install_id
-
-@lru_cache()
-def get_licensing_key() -> Certificate:
- """Get Root CA PEM"""
- with open("authentik/enterprise/public.pem", "rb") as _key:
- return load_pem_x509_certificate(_key.read())
-
-
-def get_license_aud() -> str:
- """Get the JWT audience field"""
- return f"enterprise.goauthentik.io/license/{get_install_id()}"
-
-
-class LicenseFlags(Enum):
- """License flags"""
-
-
-@dataclass
-class LicenseKey:
- """License JWT claims"""
-
- aud: str
- exp: int
-
- name: str
- internal_users: int = 0
- external_users: int = 0
- flags: list[LicenseFlags] = field(default_factory=list)
-
- @staticmethod
- def validate(jwt: str) -> "LicenseKey":
- """Validate the license from a given JWT"""
- try:
- headers = get_unverified_header(jwt)
- except PyJWTError:
- raise ValidationError("Unable to verify license")
- x5c: list[str] = headers.get("x5c", [])
- if len(x5c) < 1:
- raise ValidationError("Unable to verify license")
- try:
- our_cert = load_der_x509_certificate(b64decode(x5c[0]))
- intermediate = load_der_x509_certificate(b64decode(x5c[1]))
- our_cert.verify_directly_issued_by(intermediate)
- intermediate.verify_directly_issued_by(get_licensing_key())
- except (InvalidSignature, TypeError, ValueError, Error):
- raise ValidationError("Unable to verify license")
- try:
- body = from_dict(
- LicenseKey,
- decode(
- jwt,
- our_cert.public_key(),
- algorithms=["ES512"],
- audience=get_license_aud(),
- ),
- )
- except PyJWTError:
- raise ValidationError("Unable to verify license")
- return body
-
- @staticmethod
- def get_total() -> "LicenseKey":
- """Get a summarized version of all (not expired) licenses"""
- active_licenses = License.objects.filter(expiry__gte=now())
- total = LicenseKey(get_license_aud(), 0, "Summarized license", 0, 0)
- for lic in active_licenses:
- total.internal_users += lic.internal_users
- total.external_users += lic.external_users
- exp_ts = int(mktime(lic.expiry.timetuple()))
- if total.exp == 0:
- total.exp = exp_ts
- if exp_ts <= total.exp:
- total.exp = exp_ts
- total.flags.extend(lic.status.flags)
- return total
-
- @staticmethod
- def base_user_qs() -> QuerySet:
- """Base query set for all users"""
- return User.objects.all().exclude_anonymous().exclude(is_active=False)
-
- @staticmethod
- def get_default_user_count():
- """Get current default user count"""
- return LicenseKey.base_user_qs().filter(type=UserTypes.INTERNAL).count()
-
- @staticmethod
- def get_external_user_count():
- """Get current external user count"""
- # Count since start of the month
- last_month = now().replace(day=1)
- return (
- LicenseKey.base_user_qs()
- .filter(type=UserTypes.EXTERNAL, last_login__gte=last_month)
- .count()
- )
-
- def is_valid(self) -> bool:
- """Check if the given license body covers all users
-
- Only checks the current count, no historical data is checked"""
- default_users = self.get_default_user_count()
- if default_users > self.internal_users:
- return False
- active_users = self.get_external_user_count()
- if active_users > self.external_users:
- return False
- return True
-
- def record_usage(self):
- """Capture the current validity status and metrics and save them"""
- threshold = now() - timedelta(hours=8)
- if LicenseUsage.objects.filter(record_date__gte=threshold).exists():
- return
- LicenseUsage.objects.create(
- user_count=self.get_default_user_count(),
- external_user_count=self.get_external_user_count(),
- within_limits=self.is_valid(),
- )
-
- @staticmethod
- def last_valid_date() -> datetime:
- """Get the last date the license was valid"""
- usage: LicenseUsage = (
- LicenseUsage.filter_not_expired(within_limits=True).order_by("-record_date").first()
- )
- if not usage:
- return now()
- return usage.record_date
+if TYPE_CHECKING:
+ from authentik.enterprise.license import LicenseKey
class License(SerializerModel):
@@ -174,8 +35,10 @@ class License(SerializerModel):
return LicenseSerializer
@property
- def status(self) -> LicenseKey:
+ def status(self) -> "LicenseKey":
"""Get parsed license status"""
+ from authentik.enterprise.license import LicenseKey
+
return LicenseKey.validate(self.key)
class Meta:
diff --git a/authentik/enterprise/policy.py b/authentik/enterprise/policy.py
index a448c087c5..2e2535de0c 100644
--- a/authentik/enterprise/policy.py
+++ b/authentik/enterprise/policy.py
@@ -5,7 +5,7 @@ from typing import Optional
from django.utils.translation import gettext_lazy as _
from authentik.core.models import User, UserTypes
-from authentik.enterprise.models import LicenseKey
+from authentik.enterprise.license import LicenseKey
from authentik.policies.types import PolicyRequest, PolicyResult
from authentik.policies.views import PolicyAccessView
diff --git a/authentik/enterprise/providers/rac/api/connection_tokens.py b/authentik/enterprise/providers/rac/api/connection_tokens.py
new file mode 100644
index 0000000000..9b5ff10743
--- /dev/null
+++ b/authentik/enterprise/providers/rac/api/connection_tokens.py
@@ -0,0 +1,53 @@
+"""RAC Provider API Views"""
+
+from django_filters.rest_framework.backends import DjangoFilterBackend
+from rest_framework import mixins
+from rest_framework.filters import OrderingFilter, SearchFilter
+from rest_framework.serializers import ModelSerializer
+from rest_framework.viewsets import GenericViewSet
+
+from authentik.api.authorization import OwnerFilter, OwnerPermissions
+from authentik.core.api.groups import GroupMemberSerializer
+from authentik.core.api.used_by import UsedByMixin
+from authentik.enterprise.api import EnterpriseRequiredMixin
+from authentik.enterprise.providers.rac.api.endpoints import EndpointSerializer
+from authentik.enterprise.providers.rac.api.providers import RACProviderSerializer
+from authentik.enterprise.providers.rac.models import ConnectionToken, Endpoint
+
+
+class ConnectionTokenSerializer(EnterpriseRequiredMixin, ModelSerializer):
+ """ConnectionToken Serializer"""
+
+ provider_obj = RACProviderSerializer(source="provider", read_only=True)
+ endpoint_obj = EndpointSerializer(source="endpoint", read_only=True)
+ user = GroupMemberSerializer(source="session.user", read_only=True)
+
+ class Meta:
+ model = Endpoint
+ fields = [
+ "pk",
+ "provider",
+ "provider_obj",
+ "endpoint",
+ "endpoint_obj",
+ "user",
+ ]
+
+
+class ConnectionTokenViewSet(
+ mixins.RetrieveModelMixin,
+ mixins.UpdateModelMixin,
+ mixins.DestroyModelMixin,
+ UsedByMixin,
+ mixins.ListModelMixin,
+ GenericViewSet,
+):
+ """ConnectionToken Viewset"""
+
+ queryset = ConnectionToken.objects.all().select_related("session", "endpoint")
+ serializer_class = ConnectionTokenSerializer
+ filterset_fields = ["endpoint", "session__user", "provider"]
+ search_fields = ["endpoint__name", "provider__name"]
+ ordering = ["endpoint__name", "provider__name"]
+ permission_classes = [OwnerPermissions]
+ filter_backends = [OwnerFilter, DjangoFilterBackend, OrderingFilter, SearchFilter]
diff --git a/authentik/enterprise/providers/rac/api/providers.py b/authentik/enterprise/providers/rac/api/providers.py
index 25df75789c..892e081c96 100644
--- a/authentik/enterprise/providers/rac/api/providers.py
+++ b/authentik/enterprise/providers/rac/api/providers.py
@@ -16,7 +16,12 @@ class RACProviderSerializer(EnterpriseRequiredMixin, ProviderSerializer):
class Meta:
model = RACProvider
- fields = ProviderSerializer.Meta.fields + ["settings", "outpost_set", "connection_expiry"]
+ fields = ProviderSerializer.Meta.fields + [
+ "settings",
+ "outpost_set",
+ "connection_expiry",
+ "delete_token_on_disconnect",
+ ]
extra_kwargs = ProviderSerializer.Meta.extra_kwargs
diff --git a/authentik/enterprise/providers/rac/apps.py b/authentik/enterprise/providers/rac/apps.py
index d5ad27b6d5..6359c5594b 100644
--- a/authentik/enterprise/providers/rac/apps.py
+++ b/authentik/enterprise/providers/rac/apps.py
@@ -12,7 +12,3 @@ class AuthentikEnterpriseProviderRAC(EnterpriseConfig):
default = True
mountpoint = ""
ws_mountpoint = "authentik.enterprise.providers.rac.urls"
-
- def reconcile_global_load_rac_signals(self):
- """Load rac signals"""
- self.import_module("authentik.enterprise.providers.rac.signals")
diff --git a/authentik/enterprise/providers/rac/consumer_client.py b/authentik/enterprise/providers/rac/consumer_client.py
index 5bfc176b95..b6331ca563 100644
--- a/authentik/enterprise/providers/rac/consumer_client.py
+++ b/authentik/enterprise/providers/rac/consumer_client.py
@@ -43,6 +43,7 @@ class RACClientConsumer(AsyncWebsocketConsumer):
logger: BoundLogger
async def connect(self):
+ self.logger = get_logger()
await self.accept("guacamole")
await self.channel_layer.group_add(RAC_CLIENT_GROUP, self.channel_name)
await self.channel_layer.group_add(
@@ -64,9 +65,11 @@ class RACClientConsumer(AsyncWebsocketConsumer):
@database_sync_to_async
def init_outpost_connection(self):
"""Initialize guac connection settings"""
- self.token = ConnectionToken.filter_not_expired(
- token=self.scope["url_route"]["kwargs"]["token"]
- ).first()
+ self.token = (
+ ConnectionToken.filter_not_expired(token=self.scope["url_route"]["kwargs"]["token"])
+ .select_related("endpoint", "provider", "session", "session__user")
+ .first()
+ )
if not self.token:
raise DenyConnection()
self.provider = self.token.provider
@@ -107,6 +110,9 @@ class RACClientConsumer(AsyncWebsocketConsumer):
OUTPOST_GROUP_INSTANCE % {"outpost_pk": str(outpost.pk), "instance": states[0].uid},
msg,
)
+ if self.provider and self.provider.delete_token_on_disconnect:
+ self.logger.info("Deleting connection token to prevent reconnect", token=self.token)
+ self.token.delete()
async def receive(self, text_data=None, bytes_data=None):
"""Mirror data received from client to the dest_channel_id
diff --git a/authentik/enterprise/providers/rac/migrations/0001_squashed_0003_alter_connectiontoken_options_and_more.py b/authentik/enterprise/providers/rac/migrations/0001_squashed_0003_alter_connectiontoken_options_and_more.py
new file mode 100644
index 0000000000..3c6626f1a7
--- /dev/null
+++ b/authentik/enterprise/providers/rac/migrations/0001_squashed_0003_alter_connectiontoken_options_and_more.py
@@ -0,0 +1,181 @@
+# Generated by Django 5.0.1 on 2024-02-11 19:04
+
+import uuid
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+import authentik.core.models
+import authentik.lib.utils.time
+
+
+class Migration(migrations.Migration):
+
+ replaces = [
+ ("authentik_providers_rac", "0001_initial"),
+ ("authentik_providers_rac", "0002_endpoint_maximum_connections"),
+ ("authentik_providers_rac", "0003_alter_connectiontoken_options_and_more"),
+ ]
+
+ initial = True
+
+ dependencies = [
+ ("authentik_core", "0032_group_roles"),
+ ("authentik_policies", "0011_policybinding_failure_result_and_more"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="RACPropertyMapping",
+ fields=[
+ (
+ "propertymapping_ptr",
+ models.OneToOneField(
+ auto_created=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ parent_link=True,
+ primary_key=True,
+ serialize=False,
+ to="authentik_core.propertymapping",
+ ),
+ ),
+ ("static_settings", models.JSONField(default=dict)),
+ ],
+ options={
+ "verbose_name": "RAC Property Mapping",
+ "verbose_name_plural": "RAC Property Mappings",
+ },
+ bases=("authentik_core.propertymapping",),
+ ),
+ migrations.CreateModel(
+ name="RACProvider",
+ fields=[
+ (
+ "provider_ptr",
+ models.OneToOneField(
+ auto_created=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ parent_link=True,
+ primary_key=True,
+ serialize=False,
+ to="authentik_core.provider",
+ ),
+ ),
+ ("settings", models.JSONField(default=dict)),
+ (
+ "auth_mode",
+ models.TextField(
+ choices=[("static", "Static"), ("prompt", "Prompt")], default="prompt"
+ ),
+ ),
+ (
+ "connection_expiry",
+ models.TextField(
+ default="hours=8",
+ help_text="Determines how long a session lasts. Default of 0 means that the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)",
+ validators=[authentik.lib.utils.time.timedelta_string_validator],
+ ),
+ ),
+ (
+ "delete_token_on_disconnect",
+ models.BooleanField(
+ default=False,
+ help_text="When set to true, connection tokens will be deleted upon disconnect.",
+ ),
+ ),
+ ],
+ options={
+ "verbose_name": "RAC Provider",
+ "verbose_name_plural": "RAC Providers",
+ },
+ bases=("authentik_core.provider",),
+ ),
+ migrations.CreateModel(
+ name="Endpoint",
+ fields=[
+ (
+ "policybindingmodel_ptr",
+ models.OneToOneField(
+ auto_created=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ parent_link=True,
+ primary_key=True,
+ serialize=False,
+ to="authentik_policies.policybindingmodel",
+ ),
+ ),
+ ("name", models.TextField()),
+ ("host", models.TextField()),
+ (
+ "protocol",
+ models.TextField(choices=[("rdp", "Rdp"), ("vnc", "Vnc"), ("ssh", "Ssh")]),
+ ),
+ ("settings", models.JSONField(default=dict)),
+ (
+ "auth_mode",
+ models.TextField(choices=[("static", "Static"), ("prompt", "Prompt")]),
+ ),
+ (
+ "property_mappings",
+ models.ManyToManyField(
+ blank=True, default=None, to="authentik_core.propertymapping"
+ ),
+ ),
+ (
+ "provider",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to="authentik_providers_rac.racprovider",
+ ),
+ ),
+ ("maximum_connections", models.IntegerField(default=1)),
+ ],
+ options={
+ "verbose_name": "RAC Endpoint",
+ "verbose_name_plural": "RAC Endpoints",
+ },
+ bases=("authentik_policies.policybindingmodel", models.Model),
+ ),
+ migrations.CreateModel(
+ name="ConnectionToken",
+ fields=[
+ (
+ "expires",
+ models.DateTimeField(default=authentik.core.models.default_token_duration),
+ ),
+ ("expiring", models.BooleanField(default=True)),
+ (
+ "connection_token_uuid",
+ models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False),
+ ),
+ ("token", models.TextField(default=authentik.core.models.default_token_key)),
+ ("settings", models.JSONField(default=dict)),
+ (
+ "endpoint",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to="authentik_providers_rac.endpoint",
+ ),
+ ),
+ (
+ "provider",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to="authentik_providers_rac.racprovider",
+ ),
+ ),
+ (
+ "session",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to="authentik_core.authenticatedsession",
+ ),
+ ),
+ ],
+ options={
+ "abstract": False,
+ "verbose_name": "RAC Connection token",
+ "verbose_name_plural": "RAC Connection tokens",
+ },
+ ),
+ ]
diff --git a/authentik/enterprise/providers/rac/migrations/0003_alter_connectiontoken_options_and_more.py b/authentik/enterprise/providers/rac/migrations/0003_alter_connectiontoken_options_and_more.py
new file mode 100644
index 0000000000..c333fedadd
--- /dev/null
+++ b/authentik/enterprise/providers/rac/migrations/0003_alter_connectiontoken_options_and_more.py
@@ -0,0 +1,28 @@
+# Generated by Django 5.0.1 on 2024-02-11 19:04
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("authentik_providers_rac", "0002_endpoint_maximum_connections"),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name="connectiontoken",
+ options={
+ "verbose_name": "RAC Connection token",
+ "verbose_name_plural": "RAC Connection tokens",
+ },
+ ),
+ migrations.AddField(
+ model_name="racprovider",
+ name="delete_token_on_disconnect",
+ field=models.BooleanField(
+ default=False,
+ help_text="When set to true, connection tokens will be deleted upon disconnect.",
+ ),
+ ),
+ ]
diff --git a/authentik/enterprise/providers/rac/models.py b/authentik/enterprise/providers/rac/models.py
index d1645efc5a..c5f866bfd6 100644
--- a/authentik/enterprise/providers/rac/models.py
+++ b/authentik/enterprise/providers/rac/models.py
@@ -1,17 +1,18 @@
"""RAC Models"""
-from typing import Optional
+from typing import Any, Optional
from uuid import uuid4
from deepmerge import always_merger
from django.db import models
from django.db.models import QuerySet
+from django.http import HttpRequest
from django.utils.translation import gettext as _
from rest_framework.serializers import Serializer
from structlog.stdlib import get_logger
from authentik.core.exceptions import PropertyMappingExpressionException
-from authentik.core.models import ExpiringModel, PropertyMapping, Provider, default_token_key
+from authentik.core.models import ExpiringModel, PropertyMapping, Provider, User, default_token_key
from authentik.events.models import Event, EventAction
from authentik.lib.models import SerializerModel
from authentik.lib.utils.time import timedelta_string_validator
@@ -51,6 +52,10 @@ class RACProvider(Provider):
"(Format: hours=-1;minutes=-2;seconds=-3)"
),
)
+ delete_token_on_disconnect = models.BooleanField(
+ default=False,
+ help_text=_("When set to true, connection tokens will be deleted upon disconnect."),
+ )
@property
def launch_url(self) -> Optional[str]:
@@ -107,6 +112,12 @@ class RACPropertyMapping(PropertyMapping):
static_settings = models.JSONField(default=dict)
+ def evaluate(self, user: Optional[User], request: Optional[HttpRequest], **kwargs) -> Any:
+ """Evaluate `self.expression` using `**kwargs` as Context."""
+ if len(self.static_settings) > 0:
+ return self.static_settings
+ return super().evaluate(user, request, **kwargs)
+
@property
def component(self) -> str:
return "ak-property-mapping-rac-form"
@@ -155,9 +166,6 @@ class ConnectionToken(ExpiringModel):
def mapping_evaluator(mappings: QuerySet):
for mapping in mappings:
mapping: RACPropertyMapping
- if len(mapping.static_settings) > 0:
- always_merger.merge(settings, mapping.static_settings)
- continue
try:
mapping_settings = mapping.evaluate(
self.session.user, None, endpoint=self.endpoint, provider=self.provider
@@ -191,3 +199,13 @@ class ConnectionToken(ExpiringModel):
continue
settings[key] = str(value)
return settings
+
+ def __str__(self):
+ return (
+ f"RAC Connection token {self.session.user} to "
+ f"{self.endpoint.provider.name}/{self.endpoint.name}"
+ )
+
+ class Meta:
+ verbose_name = _("RAC Connection token")
+ verbose_name_plural = _("RAC Connection tokens")
diff --git a/authentik/enterprise/providers/rac/signals.py b/authentik/enterprise/providers/rac/signals.py
index 20e967ddb3..28cece00ab 100644
--- a/authentik/enterprise/providers/rac/signals.py
+++ b/authentik/enterprise/providers/rac/signals.py
@@ -45,8 +45,8 @@ def pre_delete_connection_token_disconnect(sender, instance: ConnectionToken, **
@receiver(post_save, sender=Endpoint)
-def post_save_application(sender: type[Model], instance, created: bool, **_):
- """Clear user's application cache upon application creation"""
+def post_save_endpoint(sender: type[Model], instance, created: bool, **_):
+ """Clear user's endpoint cache upon endpoint creation"""
if not created: # pragma: no cover
return
diff --git a/authentik/enterprise/providers/rac/tests/test_endpoints_api.py b/authentik/enterprise/providers/rac/tests/test_endpoints_api.py
index 3000b345ce..1ad9b70daf 100644
--- a/authentik/enterprise/providers/rac/tests/test_endpoints_api.py
+++ b/authentik/enterprise/providers/rac/tests/test_endpoints_api.py
@@ -70,6 +70,7 @@ class TestEndpointsAPI(APITestCase):
"authorization_flow": None,
"property_mappings": [],
"connection_expiry": "hours=8",
+ "delete_token_on_disconnect": False,
"component": "ak-provider-rac-form",
"assigned_application_slug": self.app.slug,
"assigned_application_name": self.app.name,
@@ -124,6 +125,7 @@ class TestEndpointsAPI(APITestCase):
"assigned_application_slug": self.app.slug,
"assigned_application_name": self.app.name,
"connection_expiry": "hours=8",
+ "delete_token_on_disconnect": False,
"verbose_name": "RAC Provider",
"verbose_name_plural": "RAC Providers",
"meta_model_name": "authentik_providers_rac.racprovider",
@@ -152,6 +154,7 @@ class TestEndpointsAPI(APITestCase):
"assigned_application_slug": self.app.slug,
"assigned_application_name": self.app.name,
"connection_expiry": "hours=8",
+ "delete_token_on_disconnect": False,
"verbose_name": "RAC Provider",
"verbose_name_plural": "RAC Providers",
"meta_model_name": "authentik_providers_rac.racprovider",
diff --git a/authentik/enterprise/providers/rac/tests/test_views.py b/authentik/enterprise/providers/rac/tests/test_views.py
index 380b925a76..a63f27fba0 100644
--- a/authentik/enterprise/providers/rac/tests/test_views.py
+++ b/authentik/enterprise/providers/rac/tests/test_views.py
@@ -11,7 +11,8 @@ from rest_framework.test import APITestCase
from authentik.core.models import Application
from authentik.core.tests.utils import create_test_admin_user, create_test_flow
-from authentik.enterprise.models import License, LicenseKey
+from authentik.enterprise.license import LicenseKey
+from authentik.enterprise.models import License
from authentik.enterprise.providers.rac.models import Endpoint, Protocols, RACProvider
from authentik.lib.generators import generate_id
from authentik.policies.denied import AccessDeniedResponse
@@ -39,7 +40,7 @@ class TestRACViews(APITestCase):
)
@patch(
- "authentik.enterprise.models.LicenseKey.validate",
+ "authentik.enterprise.license.LicenseKey.validate",
MagicMock(
return_value=LicenseKey(
aud="",
@@ -70,7 +71,7 @@ class TestRACViews(APITestCase):
self.assertEqual(final_response.status_code, 200)
@patch(
- "authentik.enterprise.models.LicenseKey.validate",
+ "authentik.enterprise.license.LicenseKey.validate",
MagicMock(
return_value=LicenseKey(
aud="",
@@ -99,7 +100,7 @@ class TestRACViews(APITestCase):
self.assertIsInstance(response, AccessDeniedResponse)
@patch(
- "authentik.enterprise.models.LicenseKey.validate",
+ "authentik.enterprise.license.LicenseKey.validate",
MagicMock(
return_value=LicenseKey(
aud="",
diff --git a/authentik/enterprise/providers/rac/urls.py b/authentik/enterprise/providers/rac/urls.py
index b36eb998d5..8ee5e32089 100644
--- a/authentik/enterprise/providers/rac/urls.py
+++ b/authentik/enterprise/providers/rac/urls.py
@@ -6,6 +6,7 @@ from django.urls import path
from django.views.decorators.csrf import ensure_csrf_cookie
from authentik.core.channels import TokenOutpostMiddleware
+from authentik.enterprise.providers.rac.api.connection_tokens import ConnectionTokenViewSet
from authentik.enterprise.providers.rac.api.endpoints import EndpointViewSet
from authentik.enterprise.providers.rac.api.property_mappings import RACPropertyMappingViewSet
from authentik.enterprise.providers.rac.api.providers import RACProviderViewSet
@@ -45,4 +46,5 @@ api_urlpatterns = [
("providers/rac", RACProviderViewSet),
("propertymappings/rac", RACPropertyMappingViewSet),
("rac/endpoints", EndpointViewSet),
+ ("rac/connection_tokens", ConnectionTokenViewSet),
]
diff --git a/authentik/enterprise/providers/rac/views.py b/authentik/enterprise/providers/rac/views.py
index b6de8b89e8..1028c1cf70 100644
--- a/authentik/enterprise/providers/rac/views.py
+++ b/authentik/enterprise/providers/rac/views.py
@@ -104,14 +104,15 @@ class RACFinalStage(RedirectStage):
# Check if we're already at the maximum connection limit
all_tokens = ConnectionToken.filter_not_expired(
endpoint=self.endpoint,
- ).exclude(endpoint__maximum_connections__lte=-1)
- if all_tokens.count() >= self.endpoint.maximum_connections:
- msg = [_("Maximum connection limit reached.")]
- # Check if any other tokens exist for the current user, and inform them
- # they are already connected
- if all_tokens.filter(session__user=self.request.user).exists():
- msg.append(_("(You are already connected in another tab/window)"))
- return self.executor.stage_invalid(" ".join(msg))
+ )
+ if self.endpoint.maximum_connections > -1:
+ if all_tokens.count() >= self.endpoint.maximum_connections:
+ msg = [_("Maximum connection limit reached.")]
+ # Check if any other tokens exist for the current user, and inform them
+ # they are already connected
+ if all_tokens.filter(session__user=self.request.user).exists():
+ msg.append(_("(You are already connected in another tab/window)"))
+ return self.executor.stage_invalid(" ".join(msg))
return super().dispatch(request, *args, **kwargs)
def get_challenge(self, *args, **kwargs) -> RedirectChallenge:
diff --git a/authentik/enterprise/settings.py b/authentik/enterprise/settings.py
index fb91d7f444..7eb238a831 100644
--- a/authentik/enterprise/settings.py
+++ b/authentik/enterprise/settings.py
@@ -5,9 +5,9 @@ from celery.schedules import crontab
from authentik.lib.utils.time import fqdn_rand
CELERY_BEAT_SCHEDULE = {
- "enterprise_calculate_license": {
- "task": "authentik.enterprise.tasks.calculate_license",
- "schedule": crontab(minute=fqdn_rand("calculate_license"), hour="*/2"),
+ "enterprise_update_usage": {
+ "task": "authentik.enterprise.tasks.enterprise_update_usage",
+ "schedule": crontab(minute=fqdn_rand("enterprise_update_usage"), hour="*/2"),
"options": {"queue": "authentik_scheduled"},
}
}
@@ -16,3 +16,5 @@ TENANT_APPS = [
"authentik.enterprise.audit",
"authentik.enterprise.providers.rac",
]
+
+MIDDLEWARE = ["authentik.enterprise.middleware.EnterpriseMiddleware"]
diff --git a/authentik/enterprise/tasks.py b/authentik/enterprise/tasks.py
index 2e46bd8b3b..a55ab5e13d 100644
--- a/authentik/enterprise/tasks.py
+++ b/authentik/enterprise/tasks.py
@@ -1,10 +1,14 @@
"""Enterprise tasks"""
-from authentik.enterprise.models import LicenseKey
+from authentik.enterprise.license import LicenseKey
+from authentik.events.models import TaskStatus
+from authentik.events.system_tasks import SystemTask, prefill_task
from authentik.root.celery import CELERY_APP
-@CELERY_APP.task()
-def calculate_license():
- """Calculate licensing status"""
+@CELERY_APP.task(bind=True, base=SystemTask)
+@prefill_task
+def enterprise_update_usage(self: SystemTask):
+ """Update enterprise license status"""
LicenseKey.get_total().record_usage()
+ self.set_status(TaskStatus.SUCCESSFUL)
diff --git a/authentik/enterprise/tests/test_license.py b/authentik/enterprise/tests/test_license.py
index a972d961b7..efa45e0eb6 100644
--- a/authentik/enterprise/tests/test_license.py
+++ b/authentik/enterprise/tests/test_license.py
@@ -8,7 +8,8 @@ from django.test import TestCase
from django.utils.timezone import now
from rest_framework.exceptions import ValidationError
-from authentik.enterprise.models import License, LicenseKey
+from authentik.enterprise.license import LicenseKey
+from authentik.enterprise.models import License
from authentik.lib.generators import generate_id
_exp = int(mktime((now() + timedelta(days=3000)).timetuple()))
@@ -18,7 +19,7 @@ class TestEnterpriseLicense(TestCase):
"""Enterprise license tests"""
@patch(
- "authentik.enterprise.models.LicenseKey.validate",
+ "authentik.enterprise.license.LicenseKey.validate",
MagicMock(
return_value=LicenseKey(
aud="",
@@ -41,7 +42,7 @@ class TestEnterpriseLicense(TestCase):
License.objects.create(key=generate_id())
@patch(
- "authentik.enterprise.models.LicenseKey.validate",
+ "authentik.enterprise.license.LicenseKey.validate",
MagicMock(
return_value=LicenseKey(
aud="",
diff --git a/authentik/events/api/tasks.py b/authentik/events/api/tasks.py
index a0d303b958..ec7b1aaa88 100644
--- a/authentik/events/api/tasks.py
+++ b/authentik/events/api/tasks.py
@@ -1,6 +1,5 @@
"""Tasks API"""
-from datetime import datetime, timezone
from importlib import import_module
from django.contrib import messages
@@ -8,7 +7,14 @@ from django.utils.translation import gettext_lazy as _
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import OpenApiResponse, extend_schema
from rest_framework.decorators import action
-from rest_framework.fields import CharField, ChoiceField, ListField, SerializerMethodField
+from rest_framework.fields import (
+ CharField,
+ ChoiceField,
+ DateTimeField,
+ FloatField,
+ ListField,
+ SerializerMethodField,
+)
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.serializers import ModelSerializer
@@ -28,9 +34,9 @@ class SystemTaskSerializer(ModelSerializer):
full_name = SerializerMethodField()
uid = CharField(required=False)
description = CharField()
- start_timestamp = SerializerMethodField()
- finish_timestamp = SerializerMethodField()
- duration = SerializerMethodField()
+ start_timestamp = DateTimeField(read_only=True)
+ finish_timestamp = DateTimeField(read_only=True)
+ duration = FloatField(read_only=True)
status = ChoiceField(choices=[(x.value, x.name) for x in TaskStatus])
messages = ListField(child=CharField())
@@ -41,18 +47,6 @@ class SystemTaskSerializer(ModelSerializer):
return f"{instance.name}:{instance.uid}"
return instance.name
- def get_start_timestamp(self, instance: SystemTask) -> datetime:
- """Timestamp when the task started"""
- return datetime.fromtimestamp(instance.start_timestamp, tz=timezone.utc)
-
- def get_finish_timestamp(self, instance: SystemTask) -> datetime:
- """Timestamp when the task finished"""
- return datetime.fromtimestamp(instance.finish_timestamp, tz=timezone.utc)
-
- def get_duration(self, instance: SystemTask) -> float:
- """Get the duration a task took to run"""
- return max(instance.finish_timestamp - instance.start_timestamp, 0)
-
class Meta:
model = SystemTask
fields = [
diff --git a/authentik/events/apps.py b/authentik/events/apps.py
index 5948d43d2f..fdad4f9aa3 100644
--- a/authentik/events/apps.py
+++ b/authentik/events/apps.py
@@ -1,9 +1,12 @@
"""authentik events app"""
+from celery.schedules import crontab
from prometheus_client import Gauge, Histogram
from authentik.blueprints.apps import ManagedAppConfig
from authentik.lib.config import CONFIG, ENV_PREFIX
+from authentik.lib.utils.reflection import path_to_class
+from authentik.root.celery import CELERY_APP
# TODO: Deprecated metric - remove in 2024.2 or later
GAUGE_TASKS = Gauge(
@@ -15,7 +18,7 @@ GAUGE_TASKS = Gauge(
SYSTEM_TASK_TIME = Histogram(
"authentik_system_tasks_time_seconds",
"Runtime of system tasks",
- ["tenant"],
+ ["tenant", "task_name", "task_uid"],
)
SYSTEM_TASK_STATUS = Gauge(
"authentik_system_tasks_status",
@@ -32,10 +35,6 @@ class AuthentikEventsConfig(ManagedAppConfig):
verbose_name = "authentik Events"
default = True
- def reconcile_global_load_events_signals(self):
- """Load events signals"""
- self.import_module("authentik.events.signals")
-
def reconcile_global_check_deprecations(self):
"""Check for config deprecations"""
from authentik.events.models import Event, EventAction
@@ -57,7 +56,7 @@ class AuthentikEventsConfig(ManagedAppConfig):
message=msg,
).save()
- def reconcile_prefill_tasks(self):
+ def reconcile_tenant_prefill_tasks(self):
"""Prefill tasks"""
from authentik.events.models import SystemTask
from authentik.events.system_tasks import _prefill_tasks
@@ -67,3 +66,28 @@ class AuthentikEventsConfig(ManagedAppConfig):
continue
task.save()
self.logger.debug("prefilled task", task_name=task.name)
+
+ def reconcile_tenant_run_scheduled_tasks(self):
+ """Run schedule tasks which are behind schedule (only applies
+ to tasks of which we keep metrics)"""
+ from authentik.events.models import TaskStatus
+ from authentik.events.system_tasks import SystemTask as CelerySystemTask
+
+ for task in CELERY_APP.conf["beat_schedule"].values():
+ schedule = task["schedule"]
+ if not isinstance(schedule, crontab):
+ continue
+ task_class: CelerySystemTask = path_to_class(task["task"])
+ if not isinstance(task_class, CelerySystemTask):
+ continue
+ db_task = task_class.db()
+ if not db_task:
+ continue
+ due, _ = schedule.is_due(db_task.finish_timestamp)
+ if due or db_task.status == TaskStatus.UNKNOWN:
+ self.logger.debug("Running past-due scheduled task", task=task["task"])
+ task_class.apply_async(
+ args=task.get("args", None),
+ kwargs=task.get("kwargs", None),
+ **task.get("options", {}),
+ )
diff --git a/authentik/events/migrations/0004_systemtask_squashed_0005_remove_systemtask_finish_timestamp_and_more.py b/authentik/events/migrations/0004_systemtask_squashed_0005_remove_systemtask_finish_timestamp_and_more.py
new file mode 100644
index 0000000000..b66db2af63
--- /dev/null
+++ b/authentik/events/migrations/0004_systemtask_squashed_0005_remove_systemtask_finish_timestamp_and_more.py
@@ -0,0 +1,68 @@
+# Generated by Django 5.0.1 on 2024-02-07 15:42
+
+import uuid
+
+import django.utils.timezone
+from django.db import migrations, models
+
+import authentik.core.models
+
+
+class Migration(migrations.Migration):
+
+ replaces = [
+ ("authentik_events", "0004_systemtask"),
+ ("authentik_events", "0005_remove_systemtask_finish_timestamp_and_more"),
+ ]
+
+ dependencies = [
+ ("authentik_events", "0003_rename_tenant_event_brand"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="SystemTask",
+ fields=[
+ (
+ "expires",
+ models.DateTimeField(default=authentik.core.models.default_token_duration),
+ ),
+ ("expiring", models.BooleanField(default=True)),
+ (
+ "uuid",
+ models.UUIDField(
+ default=uuid.uuid4, editable=False, primary_key=True, serialize=False
+ ),
+ ),
+ ("name", models.TextField()),
+ ("uid", models.TextField(null=True)),
+ (
+ "status",
+ models.TextField(
+ choices=[
+ ("unknown", "Unknown"),
+ ("successful", "Successful"),
+ ("warning", "Warning"),
+ ("error", "Error"),
+ ]
+ ),
+ ),
+ ("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)),
+ ("duration", models.FloatField(default=0)),
+ ("finish_timestamp", models.DateTimeField(default=django.utils.timezone.now)),
+ ("start_timestamp", models.DateTimeField(default=django.utils.timezone.now)),
+ ],
+ options={
+ "verbose_name": "System Task",
+ "verbose_name_plural": "System Tasks",
+ "permissions": [("run_task", "Run task")],
+ "default_permissions": ["view"],
+ "unique_together": {("name", "uid")},
+ },
+ ),
+ ]
diff --git a/authentik/events/migrations/0005_remove_systemtask_finish_timestamp_and_more.py b/authentik/events/migrations/0005_remove_systemtask_finish_timestamp_and_more.py
new file mode 100644
index 0000000000..8871965b7f
--- /dev/null
+++ b/authentik/events/migrations/0005_remove_systemtask_finish_timestamp_and_more.py
@@ -0,0 +1,37 @@
+# Generated by Django 5.0.1 on 2024-02-06 18:02
+
+import django.utils.timezone
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("authentik_events", "0004_systemtask"),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name="systemtask",
+ name="finish_timestamp",
+ ),
+ migrations.RemoveField(
+ model_name="systemtask",
+ name="start_timestamp",
+ ),
+ migrations.AddField(
+ model_name="systemtask",
+ name="duration",
+ field=models.FloatField(default=0),
+ ),
+ migrations.AddField(
+ model_name="systemtask",
+ name="finish_timestamp",
+ field=models.DateTimeField(default=django.utils.timezone.now),
+ ),
+ migrations.AddField(
+ model_name="systemtask",
+ name="start_timestamp",
+ field=models.DateTimeField(default=django.utils.timezone.now),
+ ),
+ ]
diff --git a/authentik/events/models.py b/authentik/events/models.py
index a2e7d71190..3bb2ff1458 100644
--- a/authentik/events/models.py
+++ b/authentik/events/models.py
@@ -620,8 +620,9 @@ class SystemTask(SerializerModel, ExpiringModel):
name = models.TextField()
uid = models.TextField(null=True)
- start_timestamp = models.FloatField()
- finish_timestamp = models.FloatField()
+ start_timestamp = models.DateTimeField(default=now)
+ finish_timestamp = models.DateTimeField(default=now)
+ duration = models.FloatField(default=0)
status = models.TextField(choices=TaskStatus.choices)
@@ -641,17 +642,18 @@ class SystemTask(SerializerModel, ExpiringModel):
def update_metrics(self):
"""Update prometheus metrics"""
- duration = max(self.finish_timestamp - self.start_timestamp, 0)
# TODO: Deprecated metric - remove in 2024.2 or later
GAUGE_TASKS.labels(
tenant=connection.schema_name,
task_name=self.name,
task_uid=self.uid or "",
status=self.status.lower(),
- ).set(duration)
+ ).set(self.duration)
SYSTEM_TASK_TIME.labels(
tenant=connection.schema_name,
- ).observe(duration)
+ task_name=self.name,
+ task_uid=self.uid or "",
+ ).observe(self.duration)
SYSTEM_TASK_STATUS.labels(
tenant=connection.schema_name,
task_name=self.name,
diff --git a/authentik/events/system_tasks.py b/authentik/events/system_tasks.py
index a4bc60d569..26535da80c 100644
--- a/authentik/events/system_tasks.py
+++ b/authentik/events/system_tasks.py
@@ -1,7 +1,7 @@
"""Monitored tasks"""
-from datetime import timedelta
-from timeit import default_timer
+from datetime import datetime, timedelta
+from time import perf_counter
from typing import Any, Optional
from django.utils.timezone import now
@@ -24,14 +24,17 @@ class SystemTask(TenantTask):
# For tasks that should only be listed if they failed, set this to False
save_on_success: bool
- _status: Optional[TaskStatus]
+ _status: TaskStatus
_messages: list[str]
_uid: Optional[str]
- _start: Optional[float] = None
+ # Precise start time from perf_counter
+ _start_precise: Optional[float] = None
+ _start: Optional[datetime] = None
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
+ self._status = TaskStatus.SUCCESSFUL
self.save_on_success = True
self._uid = None
self._status = None
@@ -53,9 +56,17 @@ class SystemTask(TenantTask):
self._messages = [exception_to_string(exception)]
def before_start(self, task_id, args, kwargs):
- self._start = default_timer()
+ self._start_precise = perf_counter()
+ self._start = now()
return super().before_start(task_id, args, kwargs)
+ def db(self) -> Optional[DBSystemTask]:
+ """Get DB object for latest task"""
+ return DBSystemTask.objects.filter(
+ name=self.__name__,
+ uid=self._uid,
+ ).first()
+
# pylint: disable=too-many-arguments
def after_return(self, status, retval, task_id, args: list[Any], kwargs: dict[str, Any], einfo):
super().after_return(status, retval, task_id, args, kwargs, einfo=einfo)
@@ -72,8 +83,9 @@ class SystemTask(TenantTask):
uid=self._uid,
defaults={
"description": self.__doc__,
- "start_timestamp": self._start or default_timer(),
- "finish_timestamp": default_timer(),
+ "start_timestamp": self._start or now(),
+ "finish_timestamp": now(),
+ "duration": max(perf_counter() - self._start_precise, 0),
"task_call_module": self.__module__,
"task_call_func": self.__name__,
"task_call_args": args,
@@ -96,8 +108,9 @@ class SystemTask(TenantTask):
uid=self._uid,
defaults={
"description": self.__doc__,
- "start_timestamp": self._start or default_timer(),
- "finish_timestamp": default_timer(),
+ "start_timestamp": self._start or now(),
+ "finish_timestamp": now(),
+ "duration": max(perf_counter() - self._start_precise, 0),
"task_call_module": self.__module__,
"task_call_func": self.__name__,
"task_call_args": args,
@@ -123,11 +136,14 @@ def prefill_task(func):
DBSystemTask(
name=func.__name__,
description=func.__doc__,
+ start_timestamp=now(),
+ finish_timestamp=now(),
status=TaskStatus.UNKNOWN,
messages=sanitize_item([_("Task has not been run yet.")]),
task_call_module=func.__module__,
task_call_func=func.__name__,
expiring=False,
+ duration=0,
)
)
return func
diff --git a/authentik/flows/apps.py b/authentik/flows/apps.py
index b0ffff2c70..976dec2e28 100644
--- a/authentik/flows/apps.py
+++ b/authentik/flows/apps.py
@@ -31,10 +31,6 @@ class AuthentikFlowsConfig(ManagedAppConfig):
verbose_name = "authentik Flows"
default = True
- def reconcile_global_load_flows_signals(self):
- """Load flows signals"""
- self.import_module("authentik.flows.signals")
-
def reconcile_global_load_stages(self):
"""Ensure all stages are loaded"""
from authentik.flows.models import Stage
diff --git a/authentik/outposts/apps.py b/authentik/outposts/apps.py
index 8cf7874c78..f07b8297c4 100644
--- a/authentik/outposts/apps.py
+++ b/authentik/outposts/apps.py
@@ -30,10 +30,6 @@ class AuthentikOutpostConfig(ManagedAppConfig):
verbose_name = "authentik Outpost"
default = True
- def reconcile_global_load_outposts_signals(self):
- """Load outposts signals"""
- self.import_module("authentik.outposts.signals")
-
def reconcile_tenant_embedded_outpost(self):
"""Ensure embedded outpost"""
from authentik.outposts.models import (
diff --git a/authentik/policies/apps.py b/authentik/policies/apps.py
index 7d70dc5a0e..107a801295 100644
--- a/authentik/policies/apps.py
+++ b/authentik/policies/apps.py
@@ -35,7 +35,3 @@ class AuthentikPoliciesConfig(ManagedAppConfig):
label = "authentik_policies"
verbose_name = "authentik Policies"
default = True
-
- def reconcile_global_load_policies_signals(self):
- """Load policies signals"""
- self.import_module("authentik.policies.signals")
diff --git a/authentik/policies/engine.py b/authentik/policies/engine.py
index 76610d626d..7b786ea4cb 100644
--- a/authentik/policies/engine.py
+++ b/authentik/policies/engine.py
@@ -2,7 +2,7 @@
from multiprocessing import Pipe, current_process
from multiprocessing.connection import Connection
-from timeit import default_timer
+from time import perf_counter
from typing import Iterator, Optional
from django.core.cache import cache
@@ -84,10 +84,10 @@ class PolicyEngine:
def _check_cache(self, binding: PolicyBinding):
if not self.use_cache:
return False
- before = default_timer()
+ before = perf_counter()
key = cache_key(binding, self.request)
cached_policy = cache.get(key, None)
- duration = max(default_timer() - before, 0)
+ duration = max(perf_counter() - before, 0)
if not cached_policy:
return False
self.logger.debug(
diff --git a/authentik/policies/reputation/apps.py b/authentik/policies/reputation/apps.py
index 4c3628ac71..60b2c77b05 100644
--- a/authentik/policies/reputation/apps.py
+++ b/authentik/policies/reputation/apps.py
@@ -2,6 +2,8 @@
from authentik.blueprints.apps import ManagedAppConfig
+CACHE_KEY_PREFIX = "goauthentik.io/policies/reputation/scores/"
+
class AuthentikPolicyReputationConfig(ManagedAppConfig):
"""Authentik reputation app config"""
@@ -10,11 +12,3 @@ class AuthentikPolicyReputationConfig(ManagedAppConfig):
label = "authentik_policies_reputation"
verbose_name = "authentik Policies.Reputation"
default = True
-
- def reconcile_global_load_policies_reputation_signals(self):
- """Load policies.reputation signals"""
- self.import_module("authentik.policies.reputation.signals")
-
- def reconcile_global_load_policies_reputation_tasks(self):
- """Load policies.reputation tasks"""
- self.import_module("authentik.policies.reputation.tasks")
diff --git a/authentik/policies/reputation/models.py b/authentik/policies/reputation/models.py
index 8326124571..abcddac2cc 100644
--- a/authentik/policies/reputation/models.py
+++ b/authentik/policies/reputation/models.py
@@ -19,7 +19,6 @@ from authentik.policies.types import PolicyRequest, PolicyResult
from authentik.root.middleware import ClientIPMiddleware
LOGGER = get_logger()
-CACHE_KEY_PREFIX = "goauthentik.io/policies/reputation/scores/"
def reputation_expiry():
diff --git a/authentik/policies/reputation/signals.py b/authentik/policies/reputation/signals.py
index 354b8492db..5830143372 100644
--- a/authentik/policies/reputation/signals.py
+++ b/authentik/policies/reputation/signals.py
@@ -8,7 +8,7 @@ from structlog.stdlib import get_logger
from authentik.core.signals import login_failed
from authentik.lib.config import CONFIG
-from authentik.policies.reputation.models import CACHE_KEY_PREFIX
+from authentik.policies.reputation.apps import CACHE_KEY_PREFIX
from authentik.policies.reputation.tasks import save_reputation
from authentik.root.middleware import ClientIPMiddleware
from authentik.stages.identification.signals import identification_failed
diff --git a/authentik/policies/reputation/tasks.py b/authentik/policies/reputation/tasks.py
index f04ccac99a..fcdceaa7e4 100644
--- a/authentik/policies/reputation/tasks.py
+++ b/authentik/policies/reputation/tasks.py
@@ -7,8 +7,8 @@ from authentik.events.context_processors.asn import ASN_CONTEXT_PROCESSOR
from authentik.events.context_processors.geoip import GEOIP_CONTEXT_PROCESSOR
from authentik.events.models import TaskStatus
from authentik.events.system_tasks import SystemTask, prefill_task
+from authentik.policies.reputation.apps import CACHE_KEY_PREFIX
from authentik.policies.reputation.models import Reputation
-from authentik.policies.reputation.signals import CACHE_KEY_PREFIX
from authentik.root.celery import CELERY_APP
LOGGER = get_logger()
diff --git a/authentik/policies/reputation/tests.py b/authentik/policies/reputation/tests.py
index 96429f5fa6..534d808bf7 100644
--- a/authentik/policies/reputation/tests.py
+++ b/authentik/policies/reputation/tests.py
@@ -6,7 +6,8 @@ from django.test import RequestFactory, TestCase
from authentik.core.models import User
from authentik.lib.generators import generate_id
from authentik.policies.reputation.api import ReputationPolicySerializer
-from authentik.policies.reputation.models import CACHE_KEY_PREFIX, Reputation, ReputationPolicy
+from authentik.policies.reputation.apps import CACHE_KEY_PREFIX
+from authentik.policies.reputation.models import Reputation, ReputationPolicy
from authentik.policies.reputation.tasks import save_reputation
from authentik.policies.types import PolicyRequest
from authentik.stages.password import BACKEND_INBUILT
diff --git a/authentik/providers/proxy/apps.py b/authentik/providers/proxy/apps.py
index a5c0af761c..c5a384f748 100644
--- a/authentik/providers/proxy/apps.py
+++ b/authentik/providers/proxy/apps.py
@@ -10,7 +10,3 @@ class AuthentikProviderProxyConfig(ManagedAppConfig):
label = "authentik_providers_proxy"
verbose_name = "authentik Providers.Proxy"
default = True
-
- def reconcile_global_load_providers_proxy_signals(self):
- """Load proxy signals"""
- self.import_module("authentik.providers.proxy.signals")
diff --git a/authentik/providers/scim/apps.py b/authentik/providers/scim/apps.py
index efba40a977..9e6f3836f2 100644
--- a/authentik/providers/scim/apps.py
+++ b/authentik/providers/scim/apps.py
@@ -10,7 +10,3 @@ class AuthentikProviderSCIMConfig(ManagedAppConfig):
label = "authentik_providers_scim"
verbose_name = "authentik Providers.SCIM"
default = True
-
- def reconcile_global_load_signals(self):
- """Load signals"""
- self.import_module("authentik.providers.scim.signals")
diff --git a/authentik/rbac/apps.py b/authentik/rbac/apps.py
index e04979bce3..72424c244a 100644
--- a/authentik/rbac/apps.py
+++ b/authentik/rbac/apps.py
@@ -10,7 +10,3 @@ class AuthentikRBACConfig(ManagedAppConfig):
label = "authentik_rbac"
verbose_name = "authentik RBAC"
default = True
-
- def reconcile_global_load_rbac_signals(self):
- """Load rbac signals"""
- self.import_module("authentik.rbac.signals")
diff --git a/authentik/root/celery.py b/authentik/root/celery.py
index 48645673b2..33c4b99a70 100644
--- a/authentik/root/celery.py
+++ b/authentik/root/celery.py
@@ -91,13 +91,10 @@ def _get_startup_tasks_default_tenant() -> list[Callable]:
def _get_startup_tasks_all_tenants() -> list[Callable]:
"""Get all tasks to be run on startup for all tenants"""
from authentik.admin.tasks import clear_update_notifications
- from authentik.outposts.tasks import outpost_connection_discovery, outpost_controller_all
from authentik.providers.proxy.tasks import proxy_set_defaults
return [
clear_update_notifications,
- outpost_connection_discovery,
- outpost_controller_all,
proxy_set_defaults,
]
diff --git a/authentik/root/middleware.py b/authentik/root/middleware.py
index d61ed5510d..0c91a2d08a 100644
--- a/authentik/root/middleware.py
+++ b/authentik/root/middleware.py
@@ -1,8 +1,7 @@
"""Dynamically set SameSite depending if the upstream connection is TLS or not"""
from hashlib import sha512
-from time import time
-from timeit import default_timer
+from time import perf_counter, time
from typing import Any, Callable, Optional
from django.conf import settings
@@ -294,14 +293,14 @@ class LoggingMiddleware:
self.get_response = get_response
def __call__(self, request: HttpRequest) -> HttpResponse:
- start = default_timer()
+ start = perf_counter()
response = self.get_response(request)
status_code = response.status_code
kwargs = {
"request_id": getattr(request, "request_id", None),
}
kwargs.update(getattr(response, "ak_context", {}))
- self.log(request, status_code, int((default_timer() - start) * 1000), **kwargs)
+ self.log(request, status_code, int((perf_counter() - start) * 1000), **kwargs)
return response
def log(self, request: HttpRequest, status_code: int, runtime: int, **kwargs):
diff --git a/authentik/root/settings.py b/authentik/root/settings.py
index 5aabaa62f5..902825f377 100644
--- a/authentik/root/settings.py
+++ b/authentik/root/settings.py
@@ -69,7 +69,6 @@ TENANT_APPS = [
"authentik.admin",
"authentik.api",
"authentik.crypto",
- "authentik.events",
"authentik.flows",
"authentik.outposts",
"authentik.policies.dummy",
@@ -509,5 +508,9 @@ try:
except ImportError:
pass
+# Import events after other apps since it relies on tasks and other things from all apps
+# being imported for @prefill_task
+TENANT_APPS.append("authentik.events")
+
SHARED_APPS = list(OrderedDict.fromkeys(SHARED_APPS + TENANT_APPS))
INSTALLED_APPS = list(OrderedDict.fromkeys(SHARED_APPS + TENANT_APPS))
diff --git a/authentik/sources/ldap/apps.py b/authentik/sources/ldap/apps.py
index a7380f4f70..808a048a25 100644
--- a/authentik/sources/ldap/apps.py
+++ b/authentik/sources/ldap/apps.py
@@ -10,7 +10,3 @@ class AuthentikSourceLDAPConfig(ManagedAppConfig):
label = "authentik_sources_ldap"
verbose_name = "authentik Sources.LDAP"
default = True
-
- def reconcile_global_load_sources_ldap_signals(self):
- """Load sources.ldap signals"""
- self.import_module("authentik.sources.ldap.signals")
diff --git a/authentik/sources/saml/apps.py b/authentik/sources/saml/apps.py
index 53d35f8eae..4d6feb54b5 100644
--- a/authentik/sources/saml/apps.py
+++ b/authentik/sources/saml/apps.py
@@ -11,7 +11,3 @@ class AuthentikSourceSAMLConfig(ManagedAppConfig):
verbose_name = "authentik Sources.SAML"
mountpoint = "source/saml/"
default = True
-
- def reconcile_global_load_sources_saml_signals(self):
- """Load sources.saml signals"""
- self.import_module("authentik.sources.saml.signals")
diff --git a/authentik/stages/authenticator_duo/apps.py b/authentik/stages/authenticator_duo/apps.py
index 0e0e5d9271..3e9ceb3b1c 100644
--- a/authentik/stages/authenticator_duo/apps.py
+++ b/authentik/stages/authenticator_duo/apps.py
@@ -10,7 +10,3 @@ class AuthentikStageAuthenticatorDuoConfig(ManagedAppConfig):
label = "authentik_stages_authenticator_duo"
verbose_name = "authentik Stages.Authenticator.Duo"
default = True
-
- def reconcile_global_load_tasks(self):
- """Load tasks"""
- self.import_module("authentik.stages.authenticator_duo.tasks")
diff --git a/authentik/stages/authenticator_static/apps.py b/authentik/stages/authenticator_static/apps.py
index 9cbcd5b372..02dc8af690 100644
--- a/authentik/stages/authenticator_static/apps.py
+++ b/authentik/stages/authenticator_static/apps.py
@@ -10,7 +10,3 @@ class AuthentikStageAuthenticatorStaticConfig(ManagedAppConfig):
label = "authentik_stages_authenticator_static"
verbose_name = "authentik Stages.Authenticator.Static"
default = True
-
- def reconcile_global_load_stages_authenticator_static_signals(self):
- """Load stages.authenticator_static signals"""
- self.import_module("authentik.stages.authenticator_static.signals")
diff --git a/authentik/stages/authenticator_validate/stage.py b/authentik/stages/authenticator_validate/stage.py
index 10c3466c2d..f7f62a6d1b 100644
--- a/authentik/stages/authenticator_validate/stage.py
+++ b/authentik/stages/authenticator_validate/stage.py
@@ -14,7 +14,7 @@ from authentik.core.api.utils import JSONDictField, PassiveSerializer
from authentik.core.models import User
from authentik.events.models import Event, EventAction
from authentik.flows.challenge import ChallengeResponse, ChallengeTypes, WithUserInfoChallenge
-from authentik.flows.exceptions import FlowSkipStageException
+from authentik.flows.exceptions import FlowSkipStageException, StageInvalidException
from authentik.flows.models import FlowDesignation, NotConfiguredAction, Stage
from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER
from authentik.flows.stage import ChallengeStageView
@@ -154,6 +154,16 @@ class AuthenticatorValidateStageView(ChallengeStageView):
def get_device_challenges(self) -> list[dict]:
"""Get a list of all device challenges applicable for the current stage"""
challenges = []
+ pending_user = self.get_pending_user()
+ if pending_user.is_anonymous:
+ # We shouldn't get here without any kind of authentication data
+ raise StageInvalidException()
+ # When `pretend_user_exists` is enabled in the identification stage,
+ # `pending_user` will be a user model that isn't save to the DB
+ # hence it doesn't have a PK. In that case we just return an empty list of
+ # authenticators
+ if not pending_user.pk:
+ return []
# Convert to a list to have usable log output instead of just
user_devices = list(devices_for_user(self.get_pending_user()))
self.logger.debug("Got devices for user", devices=user_devices)
diff --git a/authentik/stages/consent/api.py b/authentik/stages/consent/api.py
index 8c22a2d250..7b4b2f886b 100644
--- a/authentik/stages/consent/api.py
+++ b/authentik/stages/consent/api.py
@@ -40,7 +40,7 @@ class UserConsentSerializer(StageSerializer):
class Meta:
model = UserConsent
- fields = ["pk", "expires", "user", "application", "permissions"]
+ fields = ["pk", "expires", "expiring", "user", "application", "permissions"]
class UserConsentViewSet(
diff --git a/authentik/stages/email/apps.py b/authentik/stages/email/apps.py
index cc1c4fb97b..007ca8ac5d 100644
--- a/authentik/stages/email/apps.py
+++ b/authentik/stages/email/apps.py
@@ -1,11 +1,7 @@
"""authentik email stage config"""
-from structlog.stdlib import get_logger
-
from authentik.blueprints.apps import ManagedAppConfig
-LOGGER = get_logger()
-
class AuthentikStageEmailConfig(ManagedAppConfig):
"""authentik email stage config"""
@@ -14,7 +10,3 @@ class AuthentikStageEmailConfig(ManagedAppConfig):
label = "authentik_stages_email"
verbose_name = "authentik Stages.Email"
default = True
-
- def reconcile_global_load_stages_emails_tasks(self):
- """Load stages.emails tasks"""
- self.import_module("authentik.stages.email.tasks")
diff --git a/authentik/stages/identification/stage.py b/authentik/stages/identification/stage.py
index f8d0928531..2e5de86f8b 100644
--- a/authentik/stages/identification/stage.py
+++ b/authentik/stages/identification/stage.py
@@ -123,7 +123,7 @@ class IdentificationChallengeResponse(ChallengeResponse):
if not current_stage.show_matched_user:
self.stage.executor.plan.context[PLAN_CONTEXT_PENDING_USER_IDENTIFIER] = uid_field
# when `pretend` is enabled, continue regardless
- if current_stage.pretend_user_exists:
+ if current_stage.pretend_user_exists and not current_stage.password_stage:
return attrs
raise ValidationError("Failed to authenticate.")
self.pre_user = pre_user
diff --git a/authentik/stages/identification/tests.py b/authentik/stages/identification/tests.py
index 469da0eae5..671d5aab6c 100644
--- a/authentik/stages/identification/tests.py
+++ b/authentik/stages/identification/tests.py
@@ -100,6 +100,42 @@ class TestIdentificationStage(FlowTestCase):
user_fields=["email"],
)
+ def test_invalid_with_password_pretend(self):
+ """Test with invalid email and invalid password in single step (with pretend_user_exists)"""
+ self.stage.pretend_user_exists = True
+ pw_stage = PasswordStage.objects.create(name="password", backends=[BACKEND_INBUILT])
+ self.stage.password_stage = pw_stage
+ self.stage.save()
+ form_data = {
+ "uid_field": self.user.email + "test",
+ "password": self.user.username + "test",
+ }
+ url = reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug})
+ response = self.client.post(url, form_data)
+ self.assertStageResponse(
+ response,
+ self.flow,
+ component="ak-stage-identification",
+ password_fields=True,
+ primary_action="Log in",
+ response_errors={
+ "non_field_errors": [{"code": "invalid", "string": "Failed to authenticate."}]
+ },
+ sources=[
+ {
+ "challenge": {
+ "component": "xak-flow-redirect",
+ "to": "/source/oauth/login/test/",
+ "type": ChallengeTypes.REDIRECT.value,
+ },
+ "icon_url": "/static/authentik/sources/default.svg",
+ "name": "test",
+ }
+ ],
+ show_source_labels=False,
+ user_fields=["email"],
+ )
+
def test_invalid_with_username(self):
"""Test invalid with username (user exists but stage only allows email)"""
form_data = {"uid_field": self.user.username}
diff --git a/authentik/tenants/apps.py b/authentik/tenants/apps.py
index 9322d33180..3ae4f3014a 100644
--- a/authentik/tenants/apps.py
+++ b/authentik/tenants/apps.py
@@ -28,10 +28,6 @@ class AuthentikTenantsConfig(ManagedAppConfig):
verbose_name = "authentik Tenants"
default = True
- def reconcile_global_load_checks(self):
- """Load tenant checks"""
- self.import_module("authentik.tenants.checks")
-
def reconcile_global_default_tenant(self):
"""Make sure default tenant exists, especially after a migration"""
post_migrate.connect(ensure_default_tenant)
diff --git a/blueprints/schema.json b/blueprints/schema.json
index e54530a04f..bd3c1cd29f 100644
--- a/blueprints/schema.json
+++ b/blueprints/schema.json
@@ -115,191 +115,6 @@
}
}
},
- {
- "type": "object",
- "required": [
- "model",
- "identifiers"
- ],
- "properties": {
- "model": {
- "const": "authentik_events.event"
- },
- "id": {
- "type": "string"
- },
- "state": {
- "type": "string",
- "enum": [
- "absent",
- "present",
- "created",
- "must_created"
- ],
- "default": "present"
- },
- "conditions": {
- "type": "array",
- "items": {
- "type": "boolean"
- }
- },
- "attrs": {
- "$ref": "#/$defs/model_authentik_events.event"
- },
- "identifiers": {
- "$ref": "#/$defs/model_authentik_events.event"
- }
- }
- },
- {
- "type": "object",
- "required": [
- "model",
- "identifiers"
- ],
- "properties": {
- "model": {
- "const": "authentik_events.notificationtransport"
- },
- "id": {
- "type": "string"
- },
- "state": {
- "type": "string",
- "enum": [
- "absent",
- "present",
- "created",
- "must_created"
- ],
- "default": "present"
- },
- "conditions": {
- "type": "array",
- "items": {
- "type": "boolean"
- }
- },
- "attrs": {
- "$ref": "#/$defs/model_authentik_events.notificationtransport"
- },
- "identifiers": {
- "$ref": "#/$defs/model_authentik_events.notificationtransport"
- }
- }
- },
- {
- "type": "object",
- "required": [
- "model",
- "identifiers"
- ],
- "properties": {
- "model": {
- "const": "authentik_events.notification"
- },
- "id": {
- "type": "string"
- },
- "state": {
- "type": "string",
- "enum": [
- "absent",
- "present",
- "created",
- "must_created"
- ],
- "default": "present"
- },
- "conditions": {
- "type": "array",
- "items": {
- "type": "boolean"
- }
- },
- "attrs": {
- "$ref": "#/$defs/model_authentik_events.notification"
- },
- "identifiers": {
- "$ref": "#/$defs/model_authentik_events.notification"
- }
- }
- },
- {
- "type": "object",
- "required": [
- "model",
- "identifiers"
- ],
- "properties": {
- "model": {
- "const": "authentik_events.notificationrule"
- },
- "id": {
- "type": "string"
- },
- "state": {
- "type": "string",
- "enum": [
- "absent",
- "present",
- "created",
- "must_created"
- ],
- "default": "present"
- },
- "conditions": {
- "type": "array",
- "items": {
- "type": "boolean"
- }
- },
- "attrs": {
- "$ref": "#/$defs/model_authentik_events.notificationrule"
- },
- "identifiers": {
- "$ref": "#/$defs/model_authentik_events.notificationrule"
- }
- }
- },
- {
- "type": "object",
- "required": [
- "model",
- "identifiers"
- ],
- "properties": {
- "model": {
- "const": "authentik_events.notificationwebhookmapping"
- },
- "id": {
- "type": "string"
- },
- "state": {
- "type": "string",
- "enum": [
- "absent",
- "present",
- "created",
- "must_created"
- ],
- "default": "present"
- },
- "conditions": {
- "type": "array",
- "items": {
- "type": "boolean"
- }
- },
- "attrs": {
- "$ref": "#/$defs/model_authentik_events.notificationwebhookmapping"
- },
- "identifiers": {
- "$ref": "#/$defs/model_authentik_events.notificationwebhookmapping"
- }
- }
- },
{
"type": "object",
"required": [
@@ -2779,6 +2594,191 @@
}
}
},
+ {
+ "type": "object",
+ "required": [
+ "model",
+ "identifiers"
+ ],
+ "properties": {
+ "model": {
+ "const": "authentik_events.event"
+ },
+ "id": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string",
+ "enum": [
+ "absent",
+ "present",
+ "created",
+ "must_created"
+ ],
+ "default": "present"
+ },
+ "conditions": {
+ "type": "array",
+ "items": {
+ "type": "boolean"
+ }
+ },
+ "attrs": {
+ "$ref": "#/$defs/model_authentik_events.event"
+ },
+ "identifiers": {
+ "$ref": "#/$defs/model_authentik_events.event"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "model",
+ "identifiers"
+ ],
+ "properties": {
+ "model": {
+ "const": "authentik_events.notificationtransport"
+ },
+ "id": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string",
+ "enum": [
+ "absent",
+ "present",
+ "created",
+ "must_created"
+ ],
+ "default": "present"
+ },
+ "conditions": {
+ "type": "array",
+ "items": {
+ "type": "boolean"
+ }
+ },
+ "attrs": {
+ "$ref": "#/$defs/model_authentik_events.notificationtransport"
+ },
+ "identifiers": {
+ "$ref": "#/$defs/model_authentik_events.notificationtransport"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "model",
+ "identifiers"
+ ],
+ "properties": {
+ "model": {
+ "const": "authentik_events.notification"
+ },
+ "id": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string",
+ "enum": [
+ "absent",
+ "present",
+ "created",
+ "must_created"
+ ],
+ "default": "present"
+ },
+ "conditions": {
+ "type": "array",
+ "items": {
+ "type": "boolean"
+ }
+ },
+ "attrs": {
+ "$ref": "#/$defs/model_authentik_events.notification"
+ },
+ "identifiers": {
+ "$ref": "#/$defs/model_authentik_events.notification"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "model",
+ "identifiers"
+ ],
+ "properties": {
+ "model": {
+ "const": "authentik_events.notificationrule"
+ },
+ "id": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string",
+ "enum": [
+ "absent",
+ "present",
+ "created",
+ "must_created"
+ ],
+ "default": "present"
+ },
+ "conditions": {
+ "type": "array",
+ "items": {
+ "type": "boolean"
+ }
+ },
+ "attrs": {
+ "$ref": "#/$defs/model_authentik_events.notificationrule"
+ },
+ "identifiers": {
+ "$ref": "#/$defs/model_authentik_events.notificationrule"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "model",
+ "identifiers"
+ ],
+ "properties": {
+ "model": {
+ "const": "authentik_events.notificationwebhookmapping"
+ },
+ "id": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string",
+ "enum": [
+ "absent",
+ "present",
+ "created",
+ "must_created"
+ ],
+ "default": "present"
+ },
+ "conditions": {
+ "type": "array",
+ "items": {
+ "type": "boolean"
+ }
+ },
+ "attrs": {
+ "$ref": "#/$defs/model_authentik_events.notificationwebhookmapping"
+ },
+ "identifiers": {
+ "$ref": "#/$defs/model_authentik_events.notificationwebhookmapping"
+ }
+ }
+ },
{
"type": "object",
"required": [
@@ -2863,249 +2863,6 @@
},
"required": []
},
- "model_authentik_events.event": {
- "type": "object",
- "properties": {
- "user": {
- "type": "object",
- "additionalProperties": true,
- "title": "User"
- },
- "action": {
- "type": "string",
- "enum": [
- "login",
- "login_failed",
- "logout",
- "user_write",
- "suspicious_request",
- "password_set",
- "secret_view",
- "secret_rotate",
- "invitation_used",
- "authorize_application",
- "source_linked",
- "impersonation_started",
- "impersonation_ended",
- "flow_execution",
- "policy_execution",
- "policy_exception",
- "property_mapping_exception",
- "system_task_execution",
- "system_task_exception",
- "system_exception",
- "configuration_error",
- "model_created",
- "model_updated",
- "model_deleted",
- "email_sent",
- "update_available",
- "custom_"
- ],
- "title": "Action"
- },
- "app": {
- "type": "string",
- "minLength": 1,
- "title": "App"
- },
- "context": {
- "type": "object",
- "additionalProperties": true,
- "title": "Context"
- },
- "client_ip": {
- "type": [
- "string",
- "null"
- ],
- "minLength": 1,
- "title": "Client ip"
- },
- "expires": {
- "type": "string",
- "format": "date-time",
- "title": "Expires"
- },
- "brand": {
- "type": "object",
- "additionalProperties": true,
- "title": "Brand"
- }
- },
- "required": []
- },
- "model_authentik_events.notificationtransport": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 1,
- "title": "Name"
- },
- "mode": {
- "type": "string",
- "enum": [
- "local",
- "webhook",
- "webhook_slack",
- "email"
- ],
- "title": "Mode"
- },
- "webhook_url": {
- "type": "string",
- "title": "Webhook url"
- },
- "webhook_mapping": {
- "type": "integer",
- "title": "Webhook mapping"
- },
- "send_once": {
- "type": "boolean",
- "title": "Send once",
- "description": "Only send notification once, for example when sending a webhook into a chat channel."
- }
- },
- "required": []
- },
- "model_authentik_events.notification": {
- "type": "object",
- "properties": {
- "event": {
- "type": "object",
- "properties": {
- "user": {
- "type": "object",
- "additionalProperties": true,
- "title": "User"
- },
- "action": {
- "type": "string",
- "enum": [
- "login",
- "login_failed",
- "logout",
- "user_write",
- "suspicious_request",
- "password_set",
- "secret_view",
- "secret_rotate",
- "invitation_used",
- "authorize_application",
- "source_linked",
- "impersonation_started",
- "impersonation_ended",
- "flow_execution",
- "policy_execution",
- "policy_exception",
- "property_mapping_exception",
- "system_task_execution",
- "system_task_exception",
- "system_exception",
- "configuration_error",
- "model_created",
- "model_updated",
- "model_deleted",
- "email_sent",
- "update_available",
- "custom_"
- ],
- "title": "Action"
- },
- "app": {
- "type": "string",
- "minLength": 1,
- "title": "App"
- },
- "context": {
- "type": "object",
- "additionalProperties": true,
- "title": "Context"
- },
- "client_ip": {
- "type": [
- "string",
- "null"
- ],
- "minLength": 1,
- "title": "Client ip"
- },
- "expires": {
- "type": "string",
- "format": "date-time",
- "title": "Expires"
- },
- "brand": {
- "type": "object",
- "additionalProperties": true,
- "title": "Brand"
- }
- },
- "required": [
- "action",
- "app"
- ],
- "title": "Event"
- },
- "seen": {
- "type": "boolean",
- "title": "Seen"
- }
- },
- "required": []
- },
- "model_authentik_events.notificationrule": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 1,
- "title": "Name"
- },
- "transports": {
- "type": "array",
- "items": {
- "type": "integer",
- "description": "Select which transports should be used to notify the user. If none are selected, the notification will only be shown in the authentik UI."
- },
- "title": "Transports",
- "description": "Select which transports should be used to notify the user. If none are selected, the notification will only be shown in the authentik UI."
- },
- "severity": {
- "type": "string",
- "enum": [
- "notice",
- "warning",
- "alert"
- ],
- "title": "Severity",
- "description": "Controls which severity level the created notifications will have."
- },
- "group": {
- "type": "integer",
- "title": "Group",
- "description": "Define which group of users this notification should be sent and shown to. If left empty, Notification won't ben sent."
- }
- },
- "required": []
- },
- "model_authentik_events.notificationwebhookmapping": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "minLength": 1,
- "title": "Name"
- },
- "expression": {
- "type": "string",
- "minLength": 1,
- "title": "Expression"
- }
- },
- "required": []
- },
"model_authentik_flows.flow": {
"type": "object",
"properties": {
@@ -3453,7 +3210,6 @@
"authentik.admin",
"authentik.api",
"authentik.crypto",
- "authentik.events",
"authentik.flows",
"authentik.outposts",
"authentik.policies.dummy",
@@ -3500,7 +3256,8 @@
"authentik.core",
"authentik.enterprise",
"authentik.enterprise.audit",
- "authentik.enterprise.providers.rac"
+ "authentik.enterprise.providers.rac",
+ "authentik.events"
],
"title": "App",
"description": "Match events created by selected application. When left empty, all applications are matched."
@@ -3514,11 +3271,6 @@
null,
"authentik_tenants.domain",
"authentik_crypto.certificatekeypair",
- "authentik_events.event",
- "authentik_events.notificationtransport",
- "authentik_events.notification",
- "authentik_events.notificationrule",
- "authentik_events.notificationwebhookmapping",
"authentik_flows.flow",
"authentik_flows.flowstagebinding",
"authentik_outposts.dockerserviceconnection",
@@ -3585,7 +3337,12 @@
"authentik_enterprise.license",
"authentik_providers_rac.racprovider",
"authentik_providers_rac.endpoint",
- "authentik_providers_rac.racpropertymapping"
+ "authentik_providers_rac.racpropertymapping",
+ "authentik_events.event",
+ "authentik_events.notificationtransport",
+ "authentik_events.notification",
+ "authentik_events.notificationrule",
+ "authentik_events.notificationwebhookmapping"
],
"title": "Model",
"description": "Match events created by selected model. When left empty, all models are matched. When an app is selected, all the application's models are matched."
@@ -6168,6 +5925,10 @@
"format": "date-time",
"title": "Expires"
},
+ "expiring": {
+ "type": "boolean",
+ "title": "Expiring"
+ },
"user": {
"type": "object",
"properties": {
@@ -8163,6 +7924,11 @@
"minLength": 1,
"title": "Connection expiry",
"description": "Determines how long a session lasts. Default of 0 means that the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)"
+ },
+ "delete_token_on_disconnect": {
+ "type": "boolean",
+ "title": "Delete token on disconnect",
+ "description": "When set to true, connection tokens will be deleted upon disconnect."
}
},
"required": []
@@ -8251,6 +8017,249 @@
},
"required": []
},
+ "model_authentik_events.event": {
+ "type": "object",
+ "properties": {
+ "user": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "User"
+ },
+ "action": {
+ "type": "string",
+ "enum": [
+ "login",
+ "login_failed",
+ "logout",
+ "user_write",
+ "suspicious_request",
+ "password_set",
+ "secret_view",
+ "secret_rotate",
+ "invitation_used",
+ "authorize_application",
+ "source_linked",
+ "impersonation_started",
+ "impersonation_ended",
+ "flow_execution",
+ "policy_execution",
+ "policy_exception",
+ "property_mapping_exception",
+ "system_task_execution",
+ "system_task_exception",
+ "system_exception",
+ "configuration_error",
+ "model_created",
+ "model_updated",
+ "model_deleted",
+ "email_sent",
+ "update_available",
+ "custom_"
+ ],
+ "title": "Action"
+ },
+ "app": {
+ "type": "string",
+ "minLength": 1,
+ "title": "App"
+ },
+ "context": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Context"
+ },
+ "client_ip": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "minLength": 1,
+ "title": "Client ip"
+ },
+ "expires": {
+ "type": "string",
+ "format": "date-time",
+ "title": "Expires"
+ },
+ "brand": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Brand"
+ }
+ },
+ "required": []
+ },
+ "model_authentik_events.notificationtransport": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Name"
+ },
+ "mode": {
+ "type": "string",
+ "enum": [
+ "local",
+ "webhook",
+ "webhook_slack",
+ "email"
+ ],
+ "title": "Mode"
+ },
+ "webhook_url": {
+ "type": "string",
+ "title": "Webhook url"
+ },
+ "webhook_mapping": {
+ "type": "integer",
+ "title": "Webhook mapping"
+ },
+ "send_once": {
+ "type": "boolean",
+ "title": "Send once",
+ "description": "Only send notification once, for example when sending a webhook into a chat channel."
+ }
+ },
+ "required": []
+ },
+ "model_authentik_events.notification": {
+ "type": "object",
+ "properties": {
+ "event": {
+ "type": "object",
+ "properties": {
+ "user": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "User"
+ },
+ "action": {
+ "type": "string",
+ "enum": [
+ "login",
+ "login_failed",
+ "logout",
+ "user_write",
+ "suspicious_request",
+ "password_set",
+ "secret_view",
+ "secret_rotate",
+ "invitation_used",
+ "authorize_application",
+ "source_linked",
+ "impersonation_started",
+ "impersonation_ended",
+ "flow_execution",
+ "policy_execution",
+ "policy_exception",
+ "property_mapping_exception",
+ "system_task_execution",
+ "system_task_exception",
+ "system_exception",
+ "configuration_error",
+ "model_created",
+ "model_updated",
+ "model_deleted",
+ "email_sent",
+ "update_available",
+ "custom_"
+ ],
+ "title": "Action"
+ },
+ "app": {
+ "type": "string",
+ "minLength": 1,
+ "title": "App"
+ },
+ "context": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Context"
+ },
+ "client_ip": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "minLength": 1,
+ "title": "Client ip"
+ },
+ "expires": {
+ "type": "string",
+ "format": "date-time",
+ "title": "Expires"
+ },
+ "brand": {
+ "type": "object",
+ "additionalProperties": true,
+ "title": "Brand"
+ }
+ },
+ "required": [
+ "action",
+ "app"
+ ],
+ "title": "Event"
+ },
+ "seen": {
+ "type": "boolean",
+ "title": "Seen"
+ }
+ },
+ "required": []
+ },
+ "model_authentik_events.notificationrule": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Name"
+ },
+ "transports": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "description": "Select which transports should be used to notify the user. If none are selected, the notification will only be shown in the authentik UI."
+ },
+ "title": "Transports",
+ "description": "Select which transports should be used to notify the user. If none are selected, the notification will only be shown in the authentik UI."
+ },
+ "severity": {
+ "type": "string",
+ "enum": [
+ "notice",
+ "warning",
+ "alert"
+ ],
+ "title": "Severity",
+ "description": "Controls which severity level the created notifications will have."
+ },
+ "group": {
+ "type": "integer",
+ "title": "Group",
+ "description": "Define which group of users this notification should be sent and shown to. If left empty, Notification won't ben sent."
+ }
+ },
+ "required": []
+ },
+ "model_authentik_events.notificationwebhookmapping": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Name"
+ },
+ "expression": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Expression"
+ }
+ },
+ "required": []
+ },
"model_authentik_blueprints.metaapplyblueprint": {
"type": "object",
"properties": {
diff --git a/blueprints/system/providers-rac.yaml b/blueprints/system/providers-rac.yaml
index 63a568673f..ef530cea20 100644
--- a/blueprints/system/providers-rac.yaml
+++ b/blueprints/system/providers-rac.yaml
@@ -23,6 +23,8 @@ entries:
enable-full-window-drag: "true"
enable-desktop-composition: "true"
enable-menu-animations: "true"
+ enable-wallpaper: "true"
+ enable-font-smoothing: "true"
- identifiers:
managed: goauthentik.io/providers/rac/ssh-default
model: authentik_providers_rac.racpropertymapping
diff --git a/go.mod b/go.mod
index 0cb1ef1812..7b551478e9 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.21
require (
beryju.io/ldap v0.1.0
github.com/coreos/go-oidc v2.2.1+incompatible
- github.com/getsentry/sentry-go v0.26.0
+ github.com/getsentry/sentry-go v0.27.0
github.com/go-http-utils/etag v0.0.0-20161124023236-513ea8f21eb1
github.com/go-ldap/ldap/v3 v3.4.6
github.com/go-openapi/runtime v0.27.1
@@ -28,9 +28,9 @@ require (
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.8.4
github.com/wwt/guac v1.3.2
- goauthentik.io/api/v3 v3.2023106.5
+ goauthentik.io/api/v3 v3.2023107.2
golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab
- golang.org/x/oauth2 v0.16.0
+ golang.org/x/oauth2 v0.17.0
golang.org/x/sync v0.6.0
gopkg.in/yaml.v2 v2.4.0
layeh.com/radius v0.0.0-20210819152912-ad72663a72ab
@@ -74,9 +74,9 @@ require (
go.opentelemetry.io/otel v1.17.0 // indirect
go.opentelemetry.io/otel/metric v1.17.0 // indirect
go.opentelemetry.io/otel/trace v1.17.0 // indirect
- golang.org/x/crypto v0.18.0 // indirect
- golang.org/x/net v0.20.0 // indirect
- golang.org/x/sys v0.16.0 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
+ golang.org/x/net v0.21.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.31.0 // indirect
diff --git a/go.sum b/go.sum
index 18b5dec5bb..5685ccc336 100644
--- a/go.sum
+++ b/go.sum
@@ -69,8 +69,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-github.com/getsentry/sentry-go v0.26.0 h1:IX3++sF6/4B5JcevhdZfdKIHfyvMmAq/UnqcyT2H6mA=
-github.com/getsentry/sentry-go v0.26.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
+github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
+github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA=
github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
@@ -290,8 +290,8 @@ go.opentelemetry.io/otel/trace v1.17.0 h1:/SWhSRHmDPOImIAetP1QAeMnZYiQXrTy4fMMYO
go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY=
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
-goauthentik.io/api/v3 v3.2023106.5 h1:ogldINBGXP0J+8DALdqVtHvqhh5ePDMFe22WYczUIks=
-goauthentik.io/api/v3 v3.2023106.5/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw=
+goauthentik.io/api/v3 v3.2023107.2 h1:rarOk6JVi2o+VYi/PxynbpbLaMZbQZw5Lbw4EHqxoJI=
+goauthentik.io/api/v3 v3.2023107.2/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -301,8 +301,8 @@ golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
-golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -368,16 +368,16 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
-golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ=
-golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=
+golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ=
+golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -425,8 +425,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
-golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
diff --git a/ldap.Dockerfile b/ldap.Dockerfile
index 6efe55e3bf..6aa045ca9f 100644
--- a/ldap.Dockerfile
+++ b/ldap.Dockerfile
@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:1
# Stage 1: Build
-FROM --platform=${BUILDPLATFORM} docker.io/golang:1.21.6-bookworm AS builder
+FROM --platform=${BUILDPLATFORM} docker.io/golang:1.22.0-bookworm AS builder
ARG TARGETOS
ARG TARGETARCH
diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po
index 396163a3a4..effd6f223a 100644
--- a/locale/en/LC_MESSAGES/django.po
+++ b/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-01-26 17:26+0000\n"
+"POT-Creation-Date: 2024-02-14 18:51+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,32 +18,32 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: authentik/api/schema.py:25
+#: authentik/api/schema.py
msgid "Generic API Error"
msgstr ""
-#: authentik/api/schema.py:33
+#: authentik/api/schema.py
msgid "Validation Error"
msgstr ""
-#: authentik/blueprints/api.py:43
+#: authentik/blueprints/api.py
msgid "Blueprint file does not exist"
msgstr ""
-#: authentik/blueprints/api.py:54
+#: authentik/blueprints/api.py
#, python-format
msgid "Failed to validate blueprint: %(logs)s"
msgstr ""
-#: authentik/blueprints/api.py:59
+#: authentik/blueprints/api.py
msgid "Either path or content must be set."
msgstr ""
-#: authentik/blueprints/models.py:30
+#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr ""
-#: authentik/blueprints/models.py:32
+#: authentik/blueprints/models.py
msgid ""
"Objects that are managed by authentik. These objects are created and updated "
"automatically. This flag only indicates that an object can be overwritten by "
@@ -51,255 +51,262 @@ msgid ""
"to be overwritten in a later update."
msgstr ""
-#: authentik/blueprints/models.py:112
+#: authentik/blueprints/models.py
msgid "Blueprint Instance"
msgstr ""
-#: authentik/blueprints/models.py:113
+#: authentik/blueprints/models.py
msgid "Blueprint Instances"
msgstr ""
-#: authentik/blueprints/v1/exporter.py:62
+#: authentik/blueprints/v1/exporter.py
#, python-format
msgid "authentik Export - %(date)s"
msgstr ""
-#: authentik/blueprints/v1/tasks.py:145 authentik/crypto/tasks.py:87
+#: authentik/blueprints/v1/tasks.py authentik/crypto/tasks.py
#, python-format
msgid "Successfully imported %(count)d files."
msgstr ""
-#: authentik/brands/models.py:22
+#: authentik/brands/models.py
msgid ""
"Domain that activates this brand. Can be a superset, i.e. `a.b` for `aa.b` "
"and `ba.b`"
msgstr ""
-#: authentik/brands/models.py:58
+#: authentik/brands/models.py
msgid "Web Certificate used by the authentik Core webserver."
msgstr ""
-#: authentik/brands/models.py:84
+#: authentik/brands/models.py
msgid "Brand"
msgstr ""
-#: authentik/brands/models.py:85
+#: authentik/brands/models.py
msgid "Brands"
msgstr ""
-#: authentik/core/api/providers.py:122
+#: authentik/core/api/providers.py
msgid "SAML Provider from Metadata"
msgstr ""
-#: authentik/core/api/providers.py:123
+#: authentik/core/api/providers.py
msgid "Create a SAML Provider by importing its Metadata."
msgstr ""
-#: authentik/core/api/users.py:149
+#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
msgstr ""
-#: authentik/core/api/users.py:152
+#: authentik/core/api/users.py
msgid "No empty segments in user path allowed."
msgstr ""
-#: authentik/core/models.py:92
+#: authentik/core/models.py
msgid "name"
msgstr ""
-#: authentik/core/models.py:94
+#: authentik/core/models.py
msgid "Users added to this group will be superusers."
msgstr ""
-#: authentik/core/models.py:168
+#: authentik/core/models.py
msgid "Group"
msgstr ""
-#: authentik/core/models.py:169
+#: authentik/core/models.py
msgid "Groups"
msgstr ""
-#: authentik/core/models.py:184
+#: authentik/core/models.py
msgid "User's display name."
msgstr ""
-#: authentik/core/models.py:280 authentik/providers/oauth2/models.py:295
+#: authentik/core/models.py authentik/providers/oauth2/models.py
msgid "User"
msgstr ""
-#: authentik/core/models.py:281
+#: authentik/core/models.py
msgid "Users"
msgstr ""
-#: authentik/core/models.py:283
-#: authentik/stages/email/templates/email/password_reset.html:28
+#: authentik/core/models.py
+#: authentik/stages/email/templates/email/password_reset.html
msgid "Reset Password"
msgstr ""
-#: authentik/core/models.py:284
+#: authentik/core/models.py
msgid "Can impersonate other users"
msgstr ""
-#: authentik/core/models.py:285 authentik/rbac/models.py:54
+#: authentik/core/models.py authentik/rbac/models.py
msgid "Can assign permissions to users"
msgstr ""
-#: authentik/core/models.py:286 authentik/rbac/models.py:55
+#: authentik/core/models.py authentik/rbac/models.py
msgid "Can unassign permissions from users"
msgstr ""
-#: authentik/core/models.py:308
+#: authentik/core/models.py
+msgid "Can preview user data sent to providers"
+msgstr ""
+
+#: authentik/core/models.py
+msgid "View applications the user has access to"
+msgstr ""
+
+#: authentik/core/models.py
msgid ""
"Flow used for authentication when the associated application is accessed by "
"an un-authenticated user."
msgstr ""
-#: authentik/core/models.py:318
+#: authentik/core/models.py
msgid "Flow used when authorizing this provider."
msgstr ""
-#: authentik/core/models.py:330
+#: authentik/core/models.py
msgid ""
"Accessed from applications; optional backchannel providers for protocols "
"like LDAP and SCIM."
msgstr ""
-#: authentik/core/models.py:385
+#: authentik/core/models.py
msgid "Application's display Name."
msgstr ""
-#: authentik/core/models.py:386
+#: authentik/core/models.py
msgid "Internal application name, used in URLs."
msgstr ""
-#: authentik/core/models.py:398
+#: authentik/core/models.py
msgid "Open launch URL in a new browser tab or window."
msgstr ""
-#: authentik/core/models.py:462
+#: authentik/core/models.py
msgid "Application"
msgstr ""
-#: authentik/core/models.py:463
+#: authentik/core/models.py
msgid "Applications"
msgstr ""
-#: authentik/core/models.py:469
+#: authentik/core/models.py
msgid "Use the source-specific identifier"
msgstr ""
-#: authentik/core/models.py:471
+#: authentik/core/models.py
msgid ""
"Link to a user with identical email address. Can have security implications "
"when a source doesn't validate email addresses."
msgstr ""
-#: authentik/core/models.py:475
+#: authentik/core/models.py
msgid ""
"Use the user's email address, but deny enrollment when the email address "
"already exists."
msgstr ""
-#: authentik/core/models.py:478
+#: authentik/core/models.py
msgid ""
"Link to a user with identical username. Can have security implications when "
"a username is used with another source."
msgstr ""
-#: authentik/core/models.py:482
+#: authentik/core/models.py
msgid ""
"Use the user's username, but deny enrollment when the username already "
"exists."
msgstr ""
-#: authentik/core/models.py:489
+#: authentik/core/models.py
msgid "Source's display Name."
msgstr ""
-#: authentik/core/models.py:490
+#: authentik/core/models.py
msgid "Internal source name, used in URLs."
msgstr ""
-#: authentik/core/models.py:509
+#: authentik/core/models.py
msgid "Flow to use when authenticating existing users."
msgstr ""
-#: authentik/core/models.py:518
+#: authentik/core/models.py
msgid "Flow to use when enrolling new users."
msgstr ""
-#: authentik/core/models.py:526
+#: authentik/core/models.py
msgid ""
"How the source determines if an existing user should be authenticated or a "
"new user enrolled."
msgstr ""
-#: authentik/core/models.py:698
+#: authentik/core/models.py
msgid "Token"
msgstr ""
-#: authentik/core/models.py:699
+#: authentik/core/models.py
msgid "Tokens"
msgstr ""
-#: authentik/core/models.py:704
+#: authentik/core/models.py
msgid "View token's key"
msgstr ""
-#: authentik/core/models.py:740
+#: authentik/core/models.py
msgid "Property Mapping"
msgstr ""
-#: authentik/core/models.py:741
+#: authentik/core/models.py
msgid "Property Mappings"
msgstr ""
-#: authentik/core/models.py:778
+#: authentik/core/models.py
msgid "Authenticated Session"
msgstr ""
-#: authentik/core/models.py:779
+#: authentik/core/models.py
msgid "Authenticated Sessions"
msgstr ""
-#: authentik/core/sources/flow_manager.py:190
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid ""
"Request to authenticate with %(source)s has been denied. Please authenticate "
"with the source you've previously signed up with."
msgstr ""
-#: authentik/core/sources/flow_manager.py:242
+#: authentik/core/sources/flow_manager.py
msgid "Configured flow does not exist."
msgstr ""
-#: authentik/core/sources/flow_manager.py:272
-#: authentik/core/sources/flow_manager.py:324
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid "Successfully authenticated with %(source)s!"
msgstr ""
-#: authentik/core/sources/flow_manager.py:296
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid "Successfully linked %(source)s!"
msgstr ""
-#: authentik/core/sources/flow_manager.py:315
+#: authentik/core/sources/flow_manager.py
msgid "Source is not configured for enrollment."
msgstr ""
-#: authentik/core/templates/if/end_session.html:7
+#: authentik/core/templates/if/end_session.html
msgid "End session"
msgstr ""
-#: authentik/core/templates/if/end_session.html:11
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
"You've logged out of %(application)s.\n"
msgstr ""
-#: authentik/core/templates/if/end_session.html:19
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -309,11 +316,11 @@ msgid ""
" "
msgstr ""
-#: authentik/core/templates/if/end_session.html:25
+#: authentik/core/templates/if/end_session.html
msgid "Go back to overview"
msgstr ""
-#: authentik/core/templates/if/end_session.html:29
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -321,7 +328,7 @@ msgid ""
" "
msgstr ""
-#: authentik/core/templates/if/end_session.html:36
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -329,361 +336,367 @@ msgid ""
" "
msgstr ""
-#: authentik/core/templates/if/error.html:18
+#: authentik/core/templates/if/error.html
msgid "Go home"
msgstr ""
-#: authentik/core/templates/login/base_full.html:75
+#: authentik/core/templates/login/base_full.html
msgid "Powered by authentik"
msgstr ""
-#: authentik/core/views/apps.py:53
-#: authentik/providers/oauth2/views/authorize.py:434
-#: authentik/providers/oauth2/views/device_init.py:70
-#: authentik/providers/saml/views/sso.py:70
+#: authentik/core/views/apps.py authentik/providers/oauth2/views/authorize.py
+#: authentik/providers/oauth2/views/device_init.py
+#: authentik/providers/saml/views/sso.py
#, python-format
msgid "You're about to sign into %(application)s."
msgstr ""
-#: authentik/crypto/api.py:179
+#: authentik/crypto/api.py
msgid "Subject-alt name"
msgstr ""
-#: authentik/crypto/models.py:30
+#: authentik/crypto/models.py
msgid "PEM-encoded Certificate data"
msgstr ""
-#: authentik/crypto/models.py:33
+#: authentik/crypto/models.py
msgid ""
"Optional Private Key. If this is set, you can use this keypair for "
"encryption."
msgstr ""
-#: authentik/crypto/models.py:101
+#: authentik/crypto/models.py
msgid "Certificate-Key Pair"
msgstr ""
-#: authentik/crypto/models.py:102
+#: authentik/crypto/models.py
msgid "Certificate-Key Pairs"
msgstr ""
-#: authentik/enterprise/api.py:33
+#: authentik/enterprise/api.py
msgid "Enterprise is required to create/update this object."
msgstr ""
-#: authentik/enterprise/models.py:183
+#: authentik/enterprise/models.py
msgid "License"
msgstr ""
-#: authentik/enterprise/models.py:184
+#: authentik/enterprise/models.py
msgid "Licenses"
msgstr ""
-#: authentik/enterprise/models.py:206
+#: authentik/enterprise/models.py
msgid "License Usage"
msgstr ""
-#: authentik/enterprise/models.py:207
+#: authentik/enterprise/models.py
msgid "License Usage Records"
msgstr ""
-#: authentik/enterprise/policy.py:18
+#: authentik/enterprise/policy.py
msgid "Enterprise required to access this feature."
msgstr ""
-#: authentik/enterprise/policy.py:20
+#: authentik/enterprise/policy.py
msgid "Feature only accessible for internal users."
msgstr ""
-#: authentik/enterprise/providers/rac/models.py:48
-#: authentik/stages/user_login/models.py:39
+#: authentik/enterprise/providers/rac/models.py
+#: authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
"lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)"
msgstr ""
-#: authentik/enterprise/providers/rac/models.py:71
+#: authentik/enterprise/providers/rac/models.py
+msgid "When set to true, connection tokens will be deleted upon disconnect."
+msgstr ""
+
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Provider"
msgstr ""
-#: authentik/enterprise/providers/rac/models.py:72
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Providers"
msgstr ""
-#: authentik/enterprise/providers/rac/models.py:100
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Endpoint"
msgstr ""
-#: authentik/enterprise/providers/rac/models.py:101
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Endpoints"
msgstr ""
-#: authentik/enterprise/providers/rac/models.py:122
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Property Mapping"
msgstr ""
-#: authentik/enterprise/providers/rac/models.py:123
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Property Mappings"
msgstr ""
-#: authentik/enterprise/providers/rac/views.py:108
+#: authentik/enterprise/providers/rac/models.py
+msgid "RAC Connection token"
+msgstr ""
+
+#: authentik/enterprise/providers/rac/models.py
+msgid "RAC Connection tokens"
+msgstr ""
+
+#: authentik/enterprise/providers/rac/views.py
msgid "Maximum connection limit reached."
msgstr ""
-#: authentik/enterprise/providers/rac/views.py:112
+#: authentik/enterprise/providers/rac/views.py
msgid "(You are already connected in another tab/window)"
msgstr ""
-#: authentik/events/api/tasks.py:100
+#: authentik/events/api/tasks.py
#, python-format
msgid "Successfully started task %(name)s."
msgstr ""
-#: authentik/events/models.py:304
+#: authentik/events/models.py
msgid "Event"
msgstr ""
-#: authentik/events/models.py:305
+#: authentik/events/models.py
msgid "Events"
msgstr ""
-#: authentik/events/models.py:311
+#: authentik/events/models.py
msgid "authentik inbuilt notifications"
msgstr ""
-#: authentik/events/models.py:312
+#: authentik/events/models.py
msgid "Generic Webhook"
msgstr ""
-#: authentik/events/models.py:313
+#: authentik/events/models.py
msgid "Slack Webhook (Slack/Discord)"
msgstr ""
-#: authentik/events/models.py:314
+#: authentik/events/models.py
msgid "Email"
msgstr ""
-#: authentik/events/models.py:332
+#: authentik/events/models.py
msgid ""
"Only send notification once, for example when sending a webhook into a chat "
"channel."
msgstr ""
-#: authentik/events/models.py:397
+#: authentik/events/models.py
msgid "Severity"
msgstr ""
-#: authentik/events/models.py:402
+#: authentik/events/models.py
msgid "Dispatched for user"
msgstr ""
-#: authentik/events/models.py:411
+#: authentik/events/models.py
msgid "Event user"
msgstr ""
-#: authentik/events/models.py:505
+#: authentik/events/models.py
msgid "Notification Transport"
msgstr ""
-#: authentik/events/models.py:506
+#: authentik/events/models.py
msgid "Notification Transports"
msgstr ""
-#: authentik/events/models.py:512
+#: authentik/events/models.py
msgid "Notice"
msgstr ""
-#: authentik/events/models.py:513
+#: authentik/events/models.py
msgid "Warning"
msgstr ""
-#: authentik/events/models.py:514
+#: authentik/events/models.py
msgid "Alert"
msgstr ""
-#: authentik/events/models.py:539
+#: authentik/events/models.py
msgid "Notification"
msgstr ""
-#: authentik/events/models.py:540
+#: authentik/events/models.py
msgid "Notifications"
msgstr ""
-#: authentik/events/models.py:550
+#: authentik/events/models.py
msgid ""
"Select which transports should be used to notify the user. If none are "
"selected, the notification will only be shown in the authentik UI."
msgstr ""
-#: authentik/events/models.py:558
+#: authentik/events/models.py
msgid "Controls which severity level the created notifications will have."
msgstr ""
-#: authentik/events/models.py:563
+#: authentik/events/models.py
msgid ""
"Define which group of users this notification should be sent and shown to. "
"If left empty, Notification won't ben sent."
msgstr ""
-#: authentik/events/models.py:581
+#: authentik/events/models.py
msgid "Notification Rule"
msgstr ""
-#: authentik/events/models.py:582
+#: authentik/events/models.py
msgid "Notification Rules"
msgstr ""
-#: authentik/events/models.py:602
+#: authentik/events/models.py
msgid "Webhook Mapping"
msgstr ""
-#: authentik/events/models.py:603
+#: authentik/events/models.py
msgid "Webhook Mappings"
msgstr ""
-#: authentik/events/models.py:668
+#: authentik/events/models.py
msgid "Run task"
msgstr ""
-#: authentik/events/models.py:669
+#: authentik/events/models.py
msgid "System Task"
msgstr ""
-#: authentik/events/models.py:670
+#: authentik/events/models.py
msgid "System Tasks"
msgstr ""
-#: authentik/events/system_tasks.py:126
+#: authentik/events/system_tasks.py
msgid "Task has not been run yet."
msgstr ""
-#: authentik/flows/api/flows.py:295
+#: authentik/flows/api/flows.py
#, python-format
msgid "Flow not applicable to current user/request: %(messages)s"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:68
-#: authentik/flows/api/flows_diagram.py:94
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Policy (%(type)s)"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:71
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Binding %(order)d"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:118
+#: authentik/flows/api/flows_diagram.py
msgid "Policy passed"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:122
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Stage (%(type)s)"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:146
-#: authentik/flows/api/flows_diagram.py:206
+#: authentik/flows/api/flows_diagram.py
msgid "Policy denied"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:156
-#: authentik/flows/api/flows_diagram.py:168
-#: authentik/flows/api/flows_diagram.py:205
-#: authentik/flows/api/flows_diagram.py:227
+#: authentik/flows/api/flows_diagram.py
msgid "End of the flow"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:169
+#: authentik/flows/api/flows_diagram.py
msgid "Requirement not fulfilled"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:177
+#: authentik/flows/api/flows_diagram.py
msgid "Flow authentication requirement"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:183
+#: authentik/flows/api/flows_diagram.py
msgid "Requirement fulfilled"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:196
+#: authentik/flows/api/flows_diagram.py
msgid "Pre-flow policies"
msgstr ""
-#: authentik/flows/api/flows_diagram.py:214 authentik/flows/models.py:194
+#: authentik/flows/api/flows_diagram.py authentik/flows/models.py
msgid "Flow"
msgstr ""
-#: authentik/flows/exceptions.py:19
+#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr ""
-#: authentik/flows/models.py:115
+#: authentik/flows/models.py
#, python-format
msgid "Dynamic In-memory stage: %(doc)s"
msgstr ""
-#: authentik/flows/models.py:130
+#: authentik/flows/models.py
msgid "Visible in the URL."
msgstr ""
-#: authentik/flows/models.py:132
+#: authentik/flows/models.py
msgid "Shown as the Title in Flow pages."
msgstr ""
-#: authentik/flows/models.py:139
+#: authentik/flows/models.py
msgid ""
"Decides what this Flow is used for. For example, the Authentication flow is "
"redirect to when an un-authenticated user visits authentik."
msgstr ""
-#: authentik/flows/models.py:148
+#: authentik/flows/models.py
msgid "Background shown during execution"
msgstr ""
-#: authentik/flows/models.py:155
+#: authentik/flows/models.py
msgid ""
"Enable compatibility mode, increases compatibility with password managers on "
"mobile devices."
msgstr ""
-#: authentik/flows/models.py:163
+#: authentik/flows/models.py
msgid "Configure what should happen when a flow denies access to a user."
msgstr ""
-#: authentik/flows/models.py:169
+#: authentik/flows/models.py
msgid "Required level of authentication and authorization to access a flow."
msgstr ""
-#: authentik/flows/models.py:195
+#: authentik/flows/models.py
msgid "Flows"
msgstr ""
-#: authentik/flows/models.py:198
+#: authentik/flows/models.py
msgid "Can export a Flow"
msgstr ""
-#: authentik/flows/models.py:199
+#: authentik/flows/models.py
msgid "Can inspect a Flow's execution"
msgstr ""
-#: authentik/flows/models.py:200
+#: authentik/flows/models.py
msgid "View Flow's cache metrics"
msgstr ""
-#: authentik/flows/models.py:201
+#: authentik/flows/models.py
msgid "Clear Flow's cache metrics"
msgstr ""
-#: authentik/flows/models.py:217
+#: authentik/flows/models.py
msgid "Evaluate policies during the Flow planning process."
msgstr ""
-#: authentik/flows/models.py:221
+#: authentik/flows/models.py
msgid "Evaluate policies when the Stage is present to the user."
msgstr ""
-#: authentik/flows/models.py:228
+#: authentik/flows/models.py
msgid ""
"Configure how the flow executor should handle an invalid response to a "
"challenge. RETRY returns the error message and a similar challenge to the "
@@ -691,332 +704,331 @@ msgid ""
"RESTART_WITH_CONTEXT restarts the flow while keeping the current context."
msgstr ""
-#: authentik/flows/models.py:251
+#: authentik/flows/models.py
msgid "Flow Stage Binding"
msgstr ""
-#: authentik/flows/models.py:252
+#: authentik/flows/models.py
msgid "Flow Stage Bindings"
msgstr ""
-#: authentik/flows/models.py:267
+#: authentik/flows/models.py
msgid ""
"Flow used by an authenticated user to configure this Stage. If empty, user "
"will not be able to configure this stage."
msgstr ""
-#: authentik/flows/models.py:307
+#: authentik/flows/models.py
msgid "Flow Token"
msgstr ""
-#: authentik/flows/models.py:308
+#: authentik/flows/models.py
msgid "Flow Tokens"
msgstr ""
-#: authentik/lib/utils/time.py:27
+#: authentik/lib/utils/time.py
#, python-format
msgid "%(value)s is not in the correct format of 'hours=3;minutes=1'."
msgstr ""
-#: authentik/lib/validators.py:16
+#: authentik/lib/validators.py
#, python-brace-format
msgid "The fields {field_names} must be used together."
msgstr ""
-#: authentik/outposts/api/service_connections.py:127
+#: authentik/outposts/api/service_connections.py
msgid ""
"You can only use an empty kubeconfig when connecting to a local cluster."
msgstr ""
-#: authentik/outposts/api/service_connections.py:135
+#: authentik/outposts/api/service_connections.py
msgid "Invalid kubeconfig"
msgstr ""
-#: authentik/outposts/models.py:123
+#: authentik/outposts/models.py
msgid ""
"If enabled, use the local connection. Required Docker socket/Kubernetes "
"Integration"
msgstr ""
-#: authentik/outposts/models.py:153
+#: authentik/outposts/models.py
msgid "Outpost Service-Connection"
msgstr ""
-#: authentik/outposts/models.py:154
+#: authentik/outposts/models.py
msgid "Outpost Service-Connections"
msgstr ""
-#: authentik/outposts/models.py:162
+#: authentik/outposts/models.py
msgid ""
"Can be in the format of 'unix://' when connecting to a local docker "
"daemon, or 'https://:2376' when connecting to a remote system."
msgstr ""
-#: authentik/outposts/models.py:174
+#: authentik/outposts/models.py
msgid ""
"CA which the endpoint's Certificate is verified against. Can be left empty "
"for no validation."
msgstr ""
-#: authentik/outposts/models.py:186
+#: authentik/outposts/models.py
msgid ""
"Certificate/Key used for authentication. Can be left empty for no "
"authentication."
msgstr ""
-#: authentik/outposts/models.py:204
+#: authentik/outposts/models.py
msgid "Docker Service-Connection"
msgstr ""
-#: authentik/outposts/models.py:205
+#: authentik/outposts/models.py
msgid "Docker Service-Connections"
msgstr ""
-#: authentik/outposts/models.py:213
+#: authentik/outposts/models.py
msgid ""
"Paste your kubeconfig here. authentik will automatically use the currently "
"selected context."
msgstr ""
-#: authentik/outposts/models.py:219
+#: authentik/outposts/models.py
msgid "Verify SSL Certificates of the Kubernetes API endpoint"
msgstr ""
-#: authentik/outposts/models.py:236
+#: authentik/outposts/models.py
msgid "Kubernetes Service-Connection"
msgstr ""
-#: authentik/outposts/models.py:237
+#: authentik/outposts/models.py
msgid "Kubernetes Service-Connections"
msgstr ""
-#: authentik/outposts/models.py:253
+#: authentik/outposts/models.py
msgid ""
"Select Service-Connection authentik should use to manage this outpost. Leave "
"empty if authentik should not handle the deployment."
msgstr ""
-#: authentik/outposts/models.py:420
+#: authentik/outposts/models.py
msgid "Outpost"
msgstr ""
-#: authentik/outposts/models.py:421
+#: authentik/outposts/models.py
msgid "Outposts"
msgstr ""
-#: authentik/policies/denied.py:24
+#: authentik/policies/denied.py
msgid "Access denied"
msgstr ""
-#: authentik/policies/dummy/models.py:44
+#: authentik/policies/dummy/models.py
msgid "Dummy Policy"
msgstr ""
-#: authentik/policies/dummy/models.py:45
+#: authentik/policies/dummy/models.py
msgid "Dummy Policies"
msgstr ""
-#: authentik/policies/event_matcher/api.py:20
-#: authentik/policies/event_matcher/models.py:56
+#: authentik/policies/event_matcher/api.py
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match events created by selected application. When left empty, all "
"applications are matched."
msgstr ""
-#: authentik/policies/event_matcher/api.py:29
-#: authentik/policies/event_matcher/models.py:64
+#: authentik/policies/event_matcher/api.py
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match events created by selected model. When left empty, all models are "
"matched. When an app is selected, all the application's models are matched."
msgstr ""
-#: authentik/policies/event_matcher/api.py:42
+#: authentik/policies/event_matcher/api.py
msgid "At least one criteria must be set."
msgstr ""
-#: authentik/policies/event_matcher/models.py:48
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match created events with this action type. When left empty, all action "
"types will be matched."
msgstr ""
-#: authentik/policies/event_matcher/models.py:73
+#: authentik/policies/event_matcher/models.py
msgid ""
"Matches Event's Client IP (strict matching, for network matching use an "
"Expression Policy)"
msgstr ""
-#: authentik/policies/event_matcher/models.py:143
+#: authentik/policies/event_matcher/models.py
msgid "Event Matcher Policy"
msgstr ""
-#: authentik/policies/event_matcher/models.py:144
+#: authentik/policies/event_matcher/models.py
msgid "Event Matcher Policies"
msgstr ""
-#: authentik/policies/expiry/models.py:45
+#: authentik/policies/expiry/models.py
#, python-format
msgid "Password expired %(days)d days ago. Please update your password."
msgstr ""
-#: authentik/policies/expiry/models.py:49
+#: authentik/policies/expiry/models.py
msgid "Password has expired."
msgstr ""
-#: authentik/policies/expiry/models.py:53
+#: authentik/policies/expiry/models.py
msgid "Password Expiry Policy"
msgstr ""
-#: authentik/policies/expiry/models.py:54
+#: authentik/policies/expiry/models.py
msgid "Password Expiry Policies"
msgstr ""
-#: authentik/policies/expression/models.py:40
+#: authentik/policies/expression/models.py
msgid "Expression Policy"
msgstr ""
-#: authentik/policies/expression/models.py:41
+#: authentik/policies/expression/models.py
msgid "Expression Policies"
msgstr ""
-#: authentik/policies/models.py:22
+#: authentik/policies/models.py
msgid "all, all policies must pass"
msgstr ""
-#: authentik/policies/models.py:23
+#: authentik/policies/models.py
msgid "any, any policy must pass"
msgstr ""
-#: authentik/policies/models.py:46
+#: authentik/policies/models.py
msgid "Policy Binding Model"
msgstr ""
-#: authentik/policies/models.py:47
+#: authentik/policies/models.py
msgid "Policy Binding Models"
msgstr ""
-#: authentik/policies/models.py:86
+#: authentik/policies/models.py
msgid "Negates the outcome of the policy. Messages are unaffected."
msgstr ""
-#: authentik/policies/models.py:89
+#: authentik/policies/models.py
msgid "Timeout after which Policy execution is terminated."
msgstr ""
-#: authentik/policies/models.py:92
+#: authentik/policies/models.py
msgid "Result if the Policy execution fails."
msgstr ""
-#: authentik/policies/models.py:145
+#: authentik/policies/models.py
msgid "Policy Binding"
msgstr ""
-#: authentik/policies/models.py:146
+#: authentik/policies/models.py
msgid "Policy Bindings"
msgstr ""
-#: authentik/policies/models.py:167
+#: authentik/policies/models.py
msgid ""
"When this option is enabled, all executions of this policy will be logged. "
"By default, only execution errors are logged."
msgstr ""
-#: authentik/policies/models.py:189
+#: authentik/policies/models.py
msgid "Policy"
msgstr ""
-#: authentik/policies/models.py:190
+#: authentik/policies/models.py
msgid "Policies"
msgstr ""
-#: authentik/policies/models.py:193
+#: authentik/policies/models.py
msgid "View Policy's cache metrics"
msgstr ""
-#: authentik/policies/models.py:194
+#: authentik/policies/models.py
msgid "Clear Policy's cache metrics"
msgstr ""
-#: authentik/policies/password/models.py:27
+#: authentik/policies/password/models.py
msgid "Field key to check, field keys defined in Prompt stages are available."
msgstr ""
-#: authentik/policies/password/models.py:44
+#: authentik/policies/password/models.py
msgid "How many times the password hash is allowed to be on haveibeenpwned"
msgstr ""
-#: authentik/policies/password/models.py:49
+#: authentik/policies/password/models.py
msgid ""
"If the zxcvbn score is equal or less than this value, the policy will fail."
msgstr ""
-#: authentik/policies/password/models.py:72
+#: authentik/policies/password/models.py
msgid "Password not set in context"
msgstr ""
-#: authentik/policies/password/models.py:134
+#: authentik/policies/password/models.py
#, python-format
msgid "Password exists on %(count)d online lists."
msgstr ""
-#: authentik/policies/password/models.py:154
+#: authentik/policies/password/models.py
msgid "Password is too weak."
msgstr ""
-#: authentik/policies/password/models.py:162
+#: authentik/policies/password/models.py
msgid "Password Policy"
msgstr ""
-#: authentik/policies/password/models.py:163
+#: authentik/policies/password/models.py
msgid "Password Policies"
msgstr ""
-#: authentik/policies/reputation/api.py:18
+#: authentik/policies/reputation/api.py
msgid "Either IP or Username must be checked"
msgstr ""
-#: authentik/policies/reputation/models.py:67
+#: authentik/policies/reputation/models.py
msgid "Reputation Policy"
msgstr ""
-#: authentik/policies/reputation/models.py:68
+#: authentik/policies/reputation/models.py
msgid "Reputation Policies"
msgstr ""
-#: authentik/policies/reputation/models.py:96
+#: authentik/policies/reputation/models.py
msgid "Reputation Score"
msgstr ""
-#: authentik/policies/reputation/models.py:97
+#: authentik/policies/reputation/models.py
msgid "Reputation Scores"
msgstr ""
-#: authentik/policies/templates/policies/denied.html:7
-#: authentik/policies/templates/policies/denied.html:11
+#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr ""
-#: authentik/policies/templates/policies/denied.html:21
+#: authentik/policies/templates/policies/denied.html
msgid "User's avatar"
msgstr ""
-#: authentik/policies/templates/policies/denied.html:25
+#: authentik/policies/templates/policies/denied.html
msgid "Not you?"
msgstr ""
-#: authentik/policies/templates/policies/denied.html:33
+#: authentik/policies/templates/policies/denied.html
msgid "Request has been denied."
msgstr ""
-#: authentik/policies/templates/policies/denied.html:44
+#: authentik/policies/templates/policies/denied.html
msgid "Messages:"
msgstr ""
-#: authentik/policies/templates/policies/denied.html:54
+#: authentik/policies/templates/policies/denied.html
msgid "Explanation:"
msgstr ""
-#: authentik/policies/templates/policies/denied.html:58
+#: authentik/policies/templates/policies/denied.html
#, python-format
msgid ""
"\n"
@@ -1024,28 +1036,28 @@ msgid ""
" "
msgstr ""
-#: authentik/policies/views.py:68
+#: authentik/policies/views.py
msgid "Failed to resolve application"
msgstr ""
-#: authentik/providers/ldap/models.py:25
+#: authentik/providers/ldap/models.py
msgid "DN under which objects are accessible."
msgstr ""
-#: authentik/providers/ldap/models.py:34
+#: authentik/providers/ldap/models.py
msgid ""
"Users in this group can do search queries. If not set, every user can "
"execute search queries."
msgstr ""
-#: authentik/providers/ldap/models.py:53
+#: authentik/providers/ldap/models.py
msgid ""
"The start for uidNumbers, this number is added to the user.pk to make sure "
"that the numbers aren't too low for POSIX users. Default is 2000 to ensure "
"that we don't collide with local users uidNumber"
msgstr ""
-#: authentik/providers/ldap/models.py:62
+#: authentik/providers/ldap/models.py
msgid ""
"The start for gidNumbers, this number is added to a number generated from "
"the group.pk to make sure that the numbers aren't too low for POSIX groups. "
@@ -1053,8 +1065,7 @@ msgid ""
"primary groups gidNumber"
msgstr ""
-#: authentik/providers/ldap/models.py:76
-#: authentik/providers/radius/models.py:34
+#: authentik/providers/ldap/models.py authentik/providers/radius/models.py
msgid ""
"When enabled, code-based multi-factor authentication can be used by "
"appending a semicolon and the TOTP code to the password. This should only be "
@@ -1063,1274 +1074,1270 @@ msgid ""
"contains a semicolon."
msgstr ""
-#: authentik/providers/ldap/models.py:108
+#: authentik/providers/ldap/models.py
msgid "LDAP Provider"
msgstr ""
-#: authentik/providers/ldap/models.py:109
+#: authentik/providers/ldap/models.py
msgid "LDAP Providers"
msgstr ""
-#: authentik/providers/oauth2/id_token.py:27
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the Hashed User ID"
msgstr ""
-#: authentik/providers/oauth2/id_token.py:28
+#: authentik/providers/oauth2/id_token.py
msgid "Based on user ID"
msgstr ""
-#: authentik/providers/oauth2/id_token.py:29
+#: authentik/providers/oauth2/id_token.py
msgid "Based on user UUID"
msgstr ""
-#: authentik/providers/oauth2/id_token.py:30
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the username"
msgstr ""
-#: authentik/providers/oauth2/id_token.py:33
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the User's Email. This is recommended over the UPN method."
msgstr ""
-#: authentik/providers/oauth2/id_token.py:38
+#: authentik/providers/oauth2/id_token.py
msgid ""
"Based on the User's UPN, only works if user has a 'upn' attribute set. Use "
"this method only if you have different UPN and Mail domains."
msgstr ""
-#: authentik/providers/oauth2/models.py:43
+#: authentik/providers/oauth2/models.py
msgid "Confidential"
msgstr ""
-#: authentik/providers/oauth2/models.py:44
+#: authentik/providers/oauth2/models.py
msgid "Public"
msgstr ""
-#: authentik/providers/oauth2/models.py:66
+#: authentik/providers/oauth2/models.py
msgid "Same identifier is used for all providers"
msgstr ""
-#: authentik/providers/oauth2/models.py:68
+#: authentik/providers/oauth2/models.py
msgid "Each provider has a different issuer, based on the application slug."
msgstr ""
-#: authentik/providers/oauth2/models.py:75
+#: authentik/providers/oauth2/models.py
msgid "code (Authorization Code Flow)"
msgstr ""
-#: authentik/providers/oauth2/models.py:76
+#: authentik/providers/oauth2/models.py
msgid "id_token (Implicit Flow)"
msgstr ""
-#: authentik/providers/oauth2/models.py:77
+#: authentik/providers/oauth2/models.py
msgid "id_token token (Implicit Flow)"
msgstr ""
-#: authentik/providers/oauth2/models.py:78
+#: authentik/providers/oauth2/models.py
msgid "code token (Hybrid Flow)"
msgstr ""
-#: authentik/providers/oauth2/models.py:79
+#: authentik/providers/oauth2/models.py
msgid "code id_token (Hybrid Flow)"
msgstr ""
-#: authentik/providers/oauth2/models.py:80
+#: authentik/providers/oauth2/models.py
msgid "code id_token token (Hybrid Flow)"
msgstr ""
-#: authentik/providers/oauth2/models.py:86
+#: authentik/providers/oauth2/models.py
msgid "HS256 (Symmetric Encryption)"
msgstr ""
-#: authentik/providers/oauth2/models.py:87
+#: authentik/providers/oauth2/models.py
msgid "RS256 (Asymmetric Encryption)"
msgstr ""
-#: authentik/providers/oauth2/models.py:88
+#: authentik/providers/oauth2/models.py
msgid "ES256 (Asymmetric Encryption)"
msgstr ""
-#: authentik/providers/oauth2/models.py:94
+#: authentik/providers/oauth2/models.py
msgid "Scope used by the client"
msgstr ""
-#: authentik/providers/oauth2/models.py:98
+#: authentik/providers/oauth2/models.py
msgid ""
"Description shown to the user when consenting. If left empty, the user won't "
"be informed."
msgstr ""
-#: authentik/providers/oauth2/models.py:117
+#: authentik/providers/oauth2/models.py
msgid "Scope Mapping"
msgstr ""
-#: authentik/providers/oauth2/models.py:118
+#: authentik/providers/oauth2/models.py
msgid "Scope Mappings"
msgstr ""
-#: authentik/providers/oauth2/models.py:128
+#: authentik/providers/oauth2/models.py
msgid "Client Type"
msgstr ""
-#: authentik/providers/oauth2/models.py:130
+#: authentik/providers/oauth2/models.py
msgid ""
"Confidential clients are capable of maintaining the confidentiality of their "
"credentials. Public clients are incapable"
msgstr ""
-#: authentik/providers/oauth2/models.py:137
+#: authentik/providers/oauth2/models.py
msgid "Client ID"
msgstr ""
-#: authentik/providers/oauth2/models.py:143
+#: authentik/providers/oauth2/models.py
msgid "Client Secret"
msgstr ""
-#: authentik/providers/oauth2/models.py:149
+#: authentik/providers/oauth2/models.py
msgid "Redirect URIs"
msgstr ""
-#: authentik/providers/oauth2/models.py:150
+#: authentik/providers/oauth2/models.py
msgid "Enter each URI on a new line."
msgstr ""
-#: authentik/providers/oauth2/models.py:155
+#: authentik/providers/oauth2/models.py
msgid "Include claims in id_token"
msgstr ""
-#: authentik/providers/oauth2/models.py:157
+#: authentik/providers/oauth2/models.py
msgid ""
"Include User claims from scopes in the id_token, for applications that don't "
"access the userinfo endpoint."
msgstr ""
-#: authentik/providers/oauth2/models.py:166
+#: authentik/providers/oauth2/models.py
msgid ""
"Access codes not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
msgstr ""
-#: authentik/providers/oauth2/models.py:174
-#: authentik/providers/oauth2/models.py:182
+#: authentik/providers/oauth2/models.py
msgid ""
"Tokens not valid on or after current time + this value (Format: hours=1;"
"minutes=2;seconds=3)."
msgstr ""
-#: authentik/providers/oauth2/models.py:191
+#: authentik/providers/oauth2/models.py
msgid ""
"Configure what data should be used as unique User Identifier. For most "
"cases, the default should be fine."
msgstr ""
-#: authentik/providers/oauth2/models.py:198
+#: authentik/providers/oauth2/models.py
msgid "Configure how the issuer field of the ID Token should be filled."
msgstr ""
-#: authentik/providers/oauth2/models.py:203
+#: authentik/providers/oauth2/models.py
msgid "Signing Key"
msgstr ""
-#: authentik/providers/oauth2/models.py:207
+#: authentik/providers/oauth2/models.py
msgid ""
"Key used to sign the tokens. Only required when JWT Algorithm is set to "
"RS256."
msgstr ""
-#: authentik/providers/oauth2/models.py:214
+#: authentik/providers/oauth2/models.py
msgid ""
"Any JWT signed by the JWK of the selected source can be used to authenticate."
msgstr ""
-#: authentik/providers/oauth2/models.py:287
+#: authentik/providers/oauth2/models.py
msgid "OAuth2/OpenID Provider"
msgstr ""
-#: authentik/providers/oauth2/models.py:288
+#: authentik/providers/oauth2/models.py
msgid "OAuth2/OpenID Providers"
msgstr ""
-#: authentik/providers/oauth2/models.py:297
-#: authentik/providers/oauth2/models.py:430
+#: authentik/providers/oauth2/models.py
msgid "Scopes"
msgstr ""
-#: authentik/providers/oauth2/models.py:317
+#: authentik/providers/oauth2/models.py
msgid "Code"
msgstr ""
-#: authentik/providers/oauth2/models.py:318
+#: authentik/providers/oauth2/models.py
msgid "Nonce"
msgstr ""
-#: authentik/providers/oauth2/models.py:319
+#: authentik/providers/oauth2/models.py
msgid "Code Challenge"
msgstr ""
-#: authentik/providers/oauth2/models.py:321
+#: authentik/providers/oauth2/models.py
msgid "Code Challenge Method"
msgstr ""
-#: authentik/providers/oauth2/models.py:341
+#: authentik/providers/oauth2/models.py
msgid "Authorization Code"
msgstr ""
-#: authentik/providers/oauth2/models.py:342
+#: authentik/providers/oauth2/models.py
msgid "Authorization Codes"
msgstr ""
-#: authentik/providers/oauth2/models.py:384
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Access Token"
msgstr ""
-#: authentik/providers/oauth2/models.py:385
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Access Tokens"
msgstr ""
-#: authentik/providers/oauth2/models.py:395
+#: authentik/providers/oauth2/models.py
msgid "ID Token"
msgstr ""
-#: authentik/providers/oauth2/models.py:414
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Refresh Token"
msgstr ""
-#: authentik/providers/oauth2/models.py:415
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Refresh Tokens"
msgstr ""
-#: authentik/providers/oauth2/models.py:442
+#: authentik/providers/oauth2/models.py
msgid "Device Token"
msgstr ""
-#: authentik/providers/oauth2/models.py:443
+#: authentik/providers/oauth2/models.py
msgid "Device Tokens"
msgstr ""
-#: authentik/providers/oauth2/views/authorize.py:489
-#: authentik/providers/saml/views/flows.py:87
+#: authentik/providers/oauth2/views/authorize.py
+#: authentik/providers/saml/views/flows.py
#, python-format
msgid "Redirecting to %(app)s..."
msgstr ""
-#: authentik/providers/oauth2/views/device_init.py:151
+#: authentik/providers/oauth2/views/device_init.py
msgid "Invalid code"
msgstr ""
-#: authentik/providers/oauth2/views/userinfo.py:55
-#: authentik/providers/oauth2/views/userinfo.py:56
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access your User Information"
msgstr ""
-#: authentik/providers/oauth2/views/userinfo.py:57
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access you Email addresses"
msgstr ""
-#: authentik/providers/oauth2/views/userinfo.py:58
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access your Groups"
msgstr ""
-#: authentik/providers/oauth2/views/userinfo.py:59
+#: authentik/providers/oauth2/views/userinfo.py
msgid "authentik API Access on behalf of your user"
msgstr ""
-#: authentik/providers/proxy/api.py:52
+#: authentik/providers/proxy/api.py
msgid "User and password attributes must be set when basic auth is enabled."
msgstr ""
-#: authentik/providers/proxy/api.py:63
+#: authentik/providers/proxy/api.py
msgid "Internal host cannot be empty when forward auth is disabled."
msgstr ""
-#: authentik/providers/proxy/models.py:54
+#: authentik/providers/proxy/models.py
msgid "Validate SSL Certificates of upstream servers"
msgstr ""
-#: authentik/providers/proxy/models.py:55
+#: authentik/providers/proxy/models.py
msgid "Internal host SSL Validation"
msgstr ""
-#: authentik/providers/proxy/models.py:61
+#: authentik/providers/proxy/models.py
msgid ""
"Enable support for forwardAuth in traefik and nginx auth_request. Exclusive "
"with internal_host."
msgstr ""
-#: authentik/providers/proxy/models.py:70
+#: authentik/providers/proxy/models.py
msgid ""
"Regular expressions for which authentication is not required. Each new line "
"is interpreted as a new Regular Expression."
msgstr ""
-#: authentik/providers/proxy/models.py:78
+#: authentik/providers/proxy/models.py
msgid ""
"When enabled, this provider will intercept the authorization header and "
"authenticate requests based on its value."
msgstr ""
-#: authentik/providers/proxy/models.py:84
+#: authentik/providers/proxy/models.py
msgid "Set HTTP-Basic Authentication"
msgstr ""
-#: authentik/providers/proxy/models.py:86
+#: authentik/providers/proxy/models.py
msgid ""
"Set a custom HTTP-Basic Authentication header based on values from authentik."
msgstr ""
-#: authentik/providers/proxy/models.py:91
+#: authentik/providers/proxy/models.py
msgid "HTTP-Basic Username Key"
msgstr ""
-#: authentik/providers/proxy/models.py:93
+#: authentik/providers/proxy/models.py
msgid ""
"User/Group Attribute used for the user part of the HTTP-Basic Header. If not "
"set, the user's Email address is used."
msgstr ""
-#: authentik/providers/proxy/models.py:99
+#: authentik/providers/proxy/models.py
msgid "HTTP-Basic Password Key"
msgstr ""
-#: authentik/providers/proxy/models.py:100
+#: authentik/providers/proxy/models.py
msgid ""
"User/Group Attribute used for the password part of the HTTP-Basic Header."
msgstr ""
-#: authentik/providers/proxy/models.py:154
+#: authentik/providers/proxy/models.py
msgid "Proxy Provider"
msgstr ""
-#: authentik/providers/proxy/models.py:155
+#: authentik/providers/proxy/models.py
msgid "Proxy Providers"
msgstr ""
-#: authentik/providers/radius/models.py:18
+#: authentik/providers/radius/models.py
msgid "Shared secret between clients and server to hash packets."
msgstr ""
-#: authentik/providers/radius/models.py:24
+#: authentik/providers/radius/models.py
msgid ""
"List of CIDRs (comma-separated) that clients can connect from. A more "
"specific CIDR will match before a looser one. Clients connecting from a non-"
"specified CIDR will be dropped."
msgstr ""
-#: authentik/providers/radius/models.py:60
+#: authentik/providers/radius/models.py
msgid "Radius Provider"
msgstr ""
-#: authentik/providers/radius/models.py:61
+#: authentik/providers/radius/models.py
msgid "Radius Providers"
msgstr ""
-#: authentik/providers/saml/api/providers.py:258
+#: authentik/providers/saml/api/providers.py
msgid "Invalid XML Syntax"
msgstr ""
-#: authentik/providers/saml/api/providers.py:268
+#: authentik/providers/saml/api/providers.py
#, python-format
msgid "Failed to import Metadata: %(message)s"
msgstr ""
-#: authentik/providers/saml/models.py:38
+#: authentik/providers/saml/models.py
msgid "ACS URL"
msgstr ""
-#: authentik/providers/saml/models.py:43
+#: authentik/providers/saml/models.py
msgid ""
"Value of the audience restriction field of the assertion. When left empty, "
"no audience restriction will be added."
msgstr ""
-#: authentik/providers/saml/models.py:47
+#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr ""
-#: authentik/providers/saml/models.py:51
+#: authentik/providers/saml/models.py
msgid "Service Provider Binding"
msgstr ""
-#: authentik/providers/saml/models.py:53
+#: authentik/providers/saml/models.py
msgid ""
"This determines how authentik sends the response back to the Service "
"Provider."
msgstr ""
-#: authentik/providers/saml/models.py:63
+#: authentik/providers/saml/models.py
msgid "NameID Property Mapping"
msgstr ""
-#: authentik/providers/saml/models.py:65
+#: authentik/providers/saml/models.py
msgid ""
"Configure how the NameID value will be created. When left empty, the "
"NameIDPolicy of the incoming request will be considered"
msgstr ""
-#: authentik/providers/saml/models.py:74
+#: authentik/providers/saml/models.py
msgid ""
"Assertion valid not before current time + this value (Format: hours=-1;"
"minutes=-2;seconds=-3)."
msgstr ""
-#: authentik/providers/saml/models.py:82
+#: authentik/providers/saml/models.py
msgid ""
"Assertion not valid on or after current time + this value (Format: hours=1;"
"minutes=2;seconds=3)."
msgstr ""
-#: authentik/providers/saml/models.py:91
+#: authentik/providers/saml/models.py
msgid ""
"Session not valid on or after current time + this value (Format: hours=1;"
"minutes=2;seconds=3)."
msgstr ""
-#: authentik/providers/saml/models.py:99 authentik/sources/saml/models.py:150
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA1"
msgstr ""
-#: authentik/providers/saml/models.py:100 authentik/sources/saml/models.py:151
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA256"
msgstr ""
-#: authentik/providers/saml/models.py:101 authentik/sources/saml/models.py:152
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA384"
msgstr ""
-#: authentik/providers/saml/models.py:102 authentik/sources/saml/models.py:153
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA512"
msgstr ""
-#: authentik/providers/saml/models.py:109 authentik/sources/saml/models.py:160
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA1"
msgstr ""
-#: authentik/providers/saml/models.py:110 authentik/sources/saml/models.py:161
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA256"
msgstr ""
-#: authentik/providers/saml/models.py:111 authentik/sources/saml/models.py:162
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA384"
msgstr ""
-#: authentik/providers/saml/models.py:112 authentik/sources/saml/models.py:163
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA512"
msgstr ""
-#: authentik/providers/saml/models.py:113 authentik/sources/saml/models.py:164
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "DSA-SHA1"
msgstr ""
-#: authentik/providers/saml/models.py:124 authentik/sources/saml/models.py:130
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid ""
"When selected, incoming assertion's Signatures will be validated against "
"this certificate. To allow unsigned Requests, leave on default."
msgstr ""
-#: authentik/providers/saml/models.py:128 authentik/sources/saml/models.py:134
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "Verification Certificate"
msgstr ""
-#: authentik/providers/saml/models.py:136
+#: authentik/providers/saml/models.py
msgid "Keypair used to sign outgoing Responses going to the Service Provider."
msgstr ""
-#: authentik/providers/saml/models.py:138 authentik/sources/saml/models.py:144
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "Signing Keypair"
msgstr ""
-#: authentik/providers/saml/models.py:142
+#: authentik/providers/saml/models.py
msgid "Default relay_state value for IDP-initiated logins"
msgstr ""
-#: authentik/providers/saml/models.py:171
+#: authentik/providers/saml/models.py
msgid "SAML Provider"
msgstr ""
-#: authentik/providers/saml/models.py:172
+#: authentik/providers/saml/models.py
msgid "SAML Providers"
msgstr ""
-#: authentik/providers/saml/models.py:196
+#: authentik/providers/saml/models.py
msgid "SAML Property Mapping"
msgstr ""
-#: authentik/providers/saml/models.py:197
+#: authentik/providers/saml/models.py
msgid "SAML Property Mappings"
msgstr ""
-#: authentik/providers/scim/models.py:23
+#: authentik/providers/scim/models.py
msgid "Base URL to SCIM requests, usually ends in /v2"
msgstr ""
-#: authentik/providers/scim/models.py:24
+#: authentik/providers/scim/models.py
msgid "Authentication token"
msgstr ""
-#: authentik/providers/scim/models.py:30 authentik/sources/ldap/models.py:98
+#: authentik/providers/scim/models.py authentik/sources/ldap/models.py
msgid "Property mappings used for group creation/updating."
msgstr ""
-#: authentik/providers/scim/models.py:72
+#: authentik/providers/scim/models.py
msgid "SCIM Provider"
msgstr ""
-#: authentik/providers/scim/models.py:73
+#: authentik/providers/scim/models.py
msgid "SCIM Providers"
msgstr ""
-#: authentik/providers/scim/models.py:93
+#: authentik/providers/scim/models.py
msgid "SCIM Mapping"
msgstr ""
-#: authentik/providers/scim/models.py:94
+#: authentik/providers/scim/models.py
msgid "SCIM Mappings"
msgstr ""
-#: authentik/providers/scim/tasks.py:57
+#: authentik/providers/scim/tasks.py
msgid "Starting full SCIM sync"
msgstr ""
-#: authentik/providers/scim/tasks.py:67
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Syncing page %(page)d of users"
msgstr ""
-#: authentik/providers/scim/tasks.py:71
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Syncing page %(page)d of groups"
msgstr ""
-#: authentik/providers/scim/tasks.py:103
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Failed to sync user %(user_name)s due to remote error: %(error)s"
msgstr ""
-#: authentik/providers/scim/tasks.py:114 authentik/providers/scim/tasks.py:155
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Stopping sync due to error: %(error)s"
msgstr ""
-#: authentik/providers/scim/tasks.py:144
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Failed to sync group %(group_name)s due to remote error: %(error)s"
msgstr ""
-#: authentik/rbac/models.py:51
+#: authentik/rbac/models.py
msgid "Role"
msgstr ""
-#: authentik/rbac/models.py:52
+#: authentik/rbac/models.py
msgid "Roles"
msgstr ""
-#: authentik/rbac/models.py:66
+#: authentik/rbac/models.py
msgid "System permission"
msgstr ""
-#: authentik/rbac/models.py:67
+#: authentik/rbac/models.py
msgid "System permissions"
msgstr ""
-#: authentik/rbac/models.py:69
+#: authentik/rbac/models.py
msgid "Can view system info"
msgstr ""
-#: authentik/rbac/models.py:70
+#: authentik/rbac/models.py
msgid "Can view system tasks"
msgstr ""
-#: authentik/rbac/models.py:71
+#: authentik/rbac/models.py
msgid "Can run system tasks"
msgstr ""
-#: authentik/rbac/models.py:72
+#: authentik/rbac/models.py
msgid "Can access admin interface"
msgstr ""
-#: authentik/rbac/models.py:73
+#: authentik/rbac/models.py
msgid "Can view system settings"
msgstr ""
-#: authentik/rbac/models.py:74
+#: authentik/rbac/models.py
msgid "Can edit system settings"
msgstr ""
-#: authentik/recovery/management/commands/create_admin_group.py:12
+#: authentik/recovery/management/commands/create_admin_group.py
msgid "Create admin group if the default group gets deleted."
msgstr ""
-#: authentik/recovery/management/commands/create_recovery_key.py:16
+#: authentik/recovery/management/commands/create_recovery_key.py
msgid "Create a Key which can be used to restore access to authentik."
msgstr ""
-#: authentik/recovery/views.py:24
+#: authentik/recovery/views.py
msgid "Used recovery-link to authenticate."
msgstr ""
-#: authentik/sources/ldap/models.py:41
+#: authentik/sources/ldap/models.py
msgid "Server URI"
msgstr ""
-#: authentik/sources/ldap/models.py:50
+#: authentik/sources/ldap/models.py
msgid ""
"Optionally verify the LDAP Server's Certificate against the CA Chain in this "
"keypair."
msgstr ""
-#: authentik/sources/ldap/models.py:59
+#: authentik/sources/ldap/models.py
msgid ""
"Client certificate to authenticate against the LDAP Server's Certificate."
msgstr ""
-#: authentik/sources/ldap/models.py:62
+#: authentik/sources/ldap/models.py
msgid "Bind CN"
msgstr ""
-#: authentik/sources/ldap/models.py:64
+#: authentik/sources/ldap/models.py
msgid "Enable Start TLS"
msgstr ""
-#: authentik/sources/ldap/models.py:65
+#: authentik/sources/ldap/models.py
msgid "Use Server URI for SNI verification"
msgstr ""
-#: authentik/sources/ldap/models.py:67
+#: authentik/sources/ldap/models.py
msgid "Base DN"
msgstr ""
-#: authentik/sources/ldap/models.py:69
+#: authentik/sources/ldap/models.py
msgid "Prepended to Base DN for User-queries."
msgstr ""
-#: authentik/sources/ldap/models.py:70
+#: authentik/sources/ldap/models.py
msgid "Addition User DN"
msgstr ""
-#: authentik/sources/ldap/models.py:74
+#: authentik/sources/ldap/models.py
msgid "Prepended to Base DN for Group-queries."
msgstr ""
-#: authentik/sources/ldap/models.py:75
+#: authentik/sources/ldap/models.py
msgid "Addition Group DN"
msgstr ""
-#: authentik/sources/ldap/models.py:81
+#: authentik/sources/ldap/models.py
msgid "Consider Objects matching this filter to be Users."
msgstr ""
-#: authentik/sources/ldap/models.py:84
+#: authentik/sources/ldap/models.py
msgid "Field which contains members of a group."
msgstr ""
-#: authentik/sources/ldap/models.py:88
+#: authentik/sources/ldap/models.py
msgid "Consider Objects matching this filter to be Groups."
msgstr ""
-#: authentik/sources/ldap/models.py:91
+#: authentik/sources/ldap/models.py
msgid "Field which contains a unique Identifier."
msgstr ""
-#: authentik/sources/ldap/models.py:105
+#: authentik/sources/ldap/models.py
msgid ""
"When a user changes their password, sync it back to LDAP. This can only be "
"enabled on a single LDAP source."
msgstr ""
-#: authentik/sources/ldap/models.py:248
+#: authentik/sources/ldap/models.py
msgid "LDAP Source"
msgstr ""
-#: authentik/sources/ldap/models.py:249
+#: authentik/sources/ldap/models.py
msgid "LDAP Sources"
msgstr ""
-#: authentik/sources/ldap/models.py:271
+#: authentik/sources/ldap/models.py
msgid "LDAP Property Mapping"
msgstr ""
-#: authentik/sources/ldap/models.py:272
+#: authentik/sources/ldap/models.py
msgid "LDAP Property Mappings"
msgstr ""
-#: authentik/sources/ldap/signals.py:52
+#: authentik/sources/ldap/signals.py
msgid "Password does not match Active Directory Complexity."
msgstr ""
-#: authentik/sources/oauth/clients/oauth2.py:68
+#: authentik/sources/oauth/clients/oauth2.py
msgid "No token received."
msgstr ""
-#: authentik/sources/oauth/models.py:24
+#: authentik/sources/oauth/models.py
msgid "Request Token URL"
msgstr ""
-#: authentik/sources/oauth/models.py:26
+#: authentik/sources/oauth/models.py
msgid ""
"URL used to request the initial token. This URL is only required for OAuth 1."
msgstr ""
-#: authentik/sources/oauth/models.py:32
+#: authentik/sources/oauth/models.py
msgid "Authorization URL"
msgstr ""
-#: authentik/sources/oauth/models.py:33
+#: authentik/sources/oauth/models.py
msgid "URL the user is redirect to to conest the flow."
msgstr ""
-#: authentik/sources/oauth/models.py:38
+#: authentik/sources/oauth/models.py
msgid "Access Token URL"
msgstr ""
-#: authentik/sources/oauth/models.py:39
+#: authentik/sources/oauth/models.py
msgid "URL used by authentik to retrieve tokens."
msgstr ""
-#: authentik/sources/oauth/models.py:44
+#: authentik/sources/oauth/models.py
msgid "Profile URL"
msgstr ""
-#: authentik/sources/oauth/models.py:45
+#: authentik/sources/oauth/models.py
msgid "URL used by authentik to get user information."
msgstr ""
-#: authentik/sources/oauth/models.py:48
+#: authentik/sources/oauth/models.py
msgid "Additional Scopes"
msgstr ""
-#: authentik/sources/oauth/models.py:107
+#: authentik/sources/oauth/models.py
msgid "OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:108
+#: authentik/sources/oauth/models.py
msgid "OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:116
+#: authentik/sources/oauth/models.py
msgid "GitHub OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:117
+#: authentik/sources/oauth/models.py
msgid "GitHub OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:125
+#: authentik/sources/oauth/models.py
msgid "Twitch OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:126
+#: authentik/sources/oauth/models.py
msgid "Twitch OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:134
+#: authentik/sources/oauth/models.py
msgid "Mailcow OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:135
+#: authentik/sources/oauth/models.py
msgid "Mailcow OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:143
+#: authentik/sources/oauth/models.py
msgid "Twitter OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:144
+#: authentik/sources/oauth/models.py
msgid "Twitter OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:152
+#: authentik/sources/oauth/models.py
msgid "Facebook OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:153
+#: authentik/sources/oauth/models.py
msgid "Facebook OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:161
+#: authentik/sources/oauth/models.py
msgid "Discord OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:162
+#: authentik/sources/oauth/models.py
msgid "Discord OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:170
+#: authentik/sources/oauth/models.py
msgid "Patreon OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:171
+#: authentik/sources/oauth/models.py
msgid "Patreon OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:179
+#: authentik/sources/oauth/models.py
msgid "Google OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:180
+#: authentik/sources/oauth/models.py
msgid "Google OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:188
+#: authentik/sources/oauth/models.py
msgid "Azure AD OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:189
+#: authentik/sources/oauth/models.py
msgid "Azure AD OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:197
+#: authentik/sources/oauth/models.py
msgid "OpenID OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:198
+#: authentik/sources/oauth/models.py
msgid "OpenID OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:206
+#: authentik/sources/oauth/models.py
msgid "Apple OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:207
+#: authentik/sources/oauth/models.py
msgid "Apple OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:215
+#: authentik/sources/oauth/models.py
msgid "Okta OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:216
+#: authentik/sources/oauth/models.py
msgid "Okta OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:224
+#: authentik/sources/oauth/models.py
msgid "Reddit OAuth Source"
msgstr ""
-#: authentik/sources/oauth/models.py:225
+#: authentik/sources/oauth/models.py
msgid "Reddit OAuth Sources"
msgstr ""
-#: authentik/sources/oauth/models.py:247
+#: authentik/sources/oauth/models.py
msgid "User OAuth Source Connection"
msgstr ""
-#: authentik/sources/oauth/models.py:248
+#: authentik/sources/oauth/models.py
msgid "User OAuth Source Connections"
msgstr ""
-#: authentik/sources/oauth/views/callback.py:100
+#: authentik/sources/oauth/views/callback.py
#, python-format
msgid "Authentication failed: %(reason)s"
msgstr ""
-#: authentik/sources/plex/models.py:37
+#: authentik/sources/plex/models.py
msgid "Client identifier used to talk to Plex."
msgstr ""
-#: authentik/sources/plex/models.py:44
+#: authentik/sources/plex/models.py
msgid ""
"Which servers a user has to be a member of to be granted access. Empty list "
"allows every server."
msgstr ""
-#: authentik/sources/plex/models.py:50
+#: authentik/sources/plex/models.py
msgid "Allow friends to authenticate, even if you don't share a server."
msgstr ""
-#: authentik/sources/plex/models.py:52
+#: authentik/sources/plex/models.py
msgid "Plex token used to check friends"
msgstr ""
-#: authentik/sources/plex/models.py:95
+#: authentik/sources/plex/models.py
msgid "Plex Source"
msgstr ""
-#: authentik/sources/plex/models.py:96
+#: authentik/sources/plex/models.py
msgid "Plex Sources"
msgstr ""
-#: authentik/sources/plex/models.py:112
+#: authentik/sources/plex/models.py
msgid "User Plex Source Connection"
msgstr ""
-#: authentik/sources/plex/models.py:113
+#: authentik/sources/plex/models.py
msgid "User Plex Source Connections"
msgstr ""
-#: authentik/sources/saml/models.py:40
+#: authentik/sources/saml/models.py
msgid "Redirect Binding"
msgstr ""
-#: authentik/sources/saml/models.py:41
+#: authentik/sources/saml/models.py
msgid "POST Binding"
msgstr ""
-#: authentik/sources/saml/models.py:42
+#: authentik/sources/saml/models.py
msgid "POST Binding with auto-confirmation"
msgstr ""
-#: authentik/sources/saml/models.py:70
+#: authentik/sources/saml/models.py
msgid "Flow used before authentication."
msgstr ""
-#: authentik/sources/saml/models.py:77
+#: authentik/sources/saml/models.py
msgid "Issuer"
msgstr ""
-#: authentik/sources/saml/models.py:78
+#: authentik/sources/saml/models.py
msgid "Also known as Entity ID. Defaults the Metadata URL."
msgstr ""
-#: authentik/sources/saml/models.py:82
+#: authentik/sources/saml/models.py
msgid "SSO URL"
msgstr ""
-#: authentik/sources/saml/models.py:83
+#: authentik/sources/saml/models.py
msgid "URL that the initial Login request is sent to."
msgstr ""
-#: authentik/sources/saml/models.py:89
+#: authentik/sources/saml/models.py
msgid "SLO URL"
msgstr ""
-#: authentik/sources/saml/models.py:90
+#: authentik/sources/saml/models.py
msgid "Optional URL if your IDP supports Single-Logout."
msgstr ""
-#: authentik/sources/saml/models.py:96
+#: authentik/sources/saml/models.py
msgid ""
"Allows authentication flows initiated by the IdP. This can be a security "
"risk, as no validation of the request ID is done."
msgstr ""
-#: authentik/sources/saml/models.py:104
+#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is sent."
msgstr ""
-#: authentik/sources/saml/models.py:115
+#: authentik/sources/saml/models.py
msgid "Delete temporary users after"
msgstr ""
-#: authentik/sources/saml/models.py:118
+#: authentik/sources/saml/models.py
msgid ""
"Time offset when temporary users should be deleted. This only applies if "
"your IDP uses the NameID Format 'transient', and the user doesn't log out "
"manually. (Format: hours=1;minutes=2;seconds=3)."
msgstr ""
-#: authentik/sources/saml/models.py:142
+#: authentik/sources/saml/models.py
msgid "Keypair used to sign outgoing Responses going to the Identity Provider."
msgstr ""
-#: authentik/sources/saml/models.py:226
+#: authentik/sources/saml/models.py
msgid "SAML Source"
msgstr ""
-#: authentik/sources/saml/models.py:227
+#: authentik/sources/saml/models.py
msgid "SAML Sources"
msgstr ""
-#: authentik/sources/saml/models.py:242
+#: authentik/sources/saml/models.py
msgid "User SAML Source Connection"
msgstr ""
-#: authentik/sources/saml/models.py:243
+#: authentik/sources/saml/models.py
msgid "User SAML Source Connections"
msgstr ""
-#: authentik/stages/authenticator_duo/models.py:79
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Authenticator Setup Stage"
msgstr ""
-#: authentik/stages/authenticator_duo/models.py:80
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Authenticator Setup Stages"
msgstr ""
-#: authentik/stages/authenticator_duo/models.py:103
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Device"
msgstr ""
-#: authentik/stages/authenticator_duo/models.py:104
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Devices"
msgstr ""
-#: authentik/stages/authenticator_sms/models.py:57
+#: authentik/stages/authenticator_sms/models.py
msgid ""
"When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is "
"not reused in the future."
msgstr ""
-#: authentik/stages/authenticator_sms/models.py:68
+#: authentik/stages/authenticator_sms/models.py
msgid "Optionally modify the payload being sent to custom providers."
msgstr ""
-#: authentik/stages/authenticator_sms/models.py:81
+#: authentik/stages/authenticator_sms/models.py
#, python-format
msgid "Use this code to authenticate in authentik: %(token)s"
msgstr ""
-#: authentik/stages/authenticator_sms/models.py:180
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Authenticator Setup Stage"
msgstr ""
-#: authentik/stages/authenticator_sms/models.py:181
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Authenticator Setup Stages"
msgstr ""
-#: authentik/stages/authenticator_sms/models.py:226
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Device"
msgstr ""
-#: authentik/stages/authenticator_sms/models.py:227
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Devices"
msgstr ""
-#: authentik/stages/authenticator_sms/stage.py:57
-#: authentik/stages/authenticator_totp/stage.py:41
-#: authentik/stages/authenticator_totp/stage.py:44
+#: authentik/stages/authenticator_sms/stage.py
+#: authentik/stages/authenticator_totp/stage.py
msgid "Code does not match"
msgstr ""
-#: authentik/stages/authenticator_sms/stage.py:73
+#: authentik/stages/authenticator_sms/stage.py
msgid "Invalid phone number"
msgstr ""
-#: authentik/stages/authenticator_static/models.py:52
+#: authentik/stages/authenticator_static/models.py
msgid "Static Authenticator Setup Stage"
msgstr ""
-#: authentik/stages/authenticator_static/models.py:53
+#: authentik/stages/authenticator_static/models.py
msgid "Static Authenticator Setup Stages"
msgstr ""
-#: authentik/stages/authenticator_static/models.py:98
+#: authentik/stages/authenticator_static/models.py
msgid "Static Device"
msgstr ""
-#: authentik/stages/authenticator_static/models.py:99
+#: authentik/stages/authenticator_static/models.py
msgid "Static Devices"
msgstr ""
-#: authentik/stages/authenticator_static/models.py:129
+#: authentik/stages/authenticator_static/models.py
msgid "Static Token"
msgstr ""
-#: authentik/stages/authenticator_static/models.py:130
+#: authentik/stages/authenticator_static/models.py
msgid "Static Tokens"
msgstr ""
-#: authentik/stages/authenticator_totp/models.py:25
+#: authentik/stages/authenticator_totp/models.py
msgid "6 digits, widely compatible"
msgstr ""
-#: authentik/stages/authenticator_totp/models.py:26
+#: authentik/stages/authenticator_totp/models.py
msgid "8 digits, not compatible with apps like Google Authenticator"
msgstr ""
-#: authentik/stages/authenticator_totp/models.py:62
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Authenticator Setup Stage"
msgstr ""
-#: authentik/stages/authenticator_totp/models.py:63
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Authenticator Setup Stages"
msgstr ""
-#: authentik/stages/authenticator_totp/models.py:244
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Device"
msgstr ""
-#: authentik/stages/authenticator_totp/models.py:245
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Devices"
msgstr ""
-#: authentik/stages/authenticator_validate/challenge.py:123
+#: authentik/stages/authenticator_validate/challenge.py
msgid "Invalid Token"
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:18
+#: authentik/stages/authenticator_validate/models.py
msgid "Static"
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:19
+#: authentik/stages/authenticator_validate/models.py
msgid "TOTP"
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:20
+#: authentik/stages/authenticator_validate/models.py
msgid "WebAuthn"
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:21
+#: authentik/stages/authenticator_validate/models.py
msgid "Duo"
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:22
+#: authentik/stages/authenticator_validate/models.py
msgid "SMS"
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:49
+#: authentik/stages/authenticator_validate/models.py
msgid ""
"Stages used to configure Authenticator when user doesn't have any compatible "
"devices. After this configuration Stage passes, the user is not prompted "
"again."
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:56
+#: authentik/stages/authenticator_validate/models.py
msgid "Device classes which can be used to authenticate"
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:64
+#: authentik/stages/authenticator_validate/models.py
msgid ""
"If any of the user's device has been used within this threshold, this stage "
"will be skipped"
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:70
+#: authentik/stages/authenticator_validate/models.py
msgid "Enforce user verification for WebAuthn devices."
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:92
+#: authentik/stages/authenticator_validate/models.py
msgid "Authenticator Validation Stage"
msgstr ""
-#: authentik/stages/authenticator_validate/models.py:93
+#: authentik/stages/authenticator_validate/models.py
msgid "Authenticator Validation Stages"
msgstr ""
-#: authentik/stages/authenticator_webauthn/models.py:112
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr ""
-#: authentik/stages/authenticator_webauthn/models.py:113
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stages"
msgstr ""
-#: authentik/stages/authenticator_webauthn/models.py:151
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Device"
msgstr ""
-#: authentik/stages/authenticator_webauthn/models.py:152
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Devices"
msgstr ""
-#: authentik/stages/captcha/models.py:14
+#: authentik/stages/captcha/models.py
msgid "Public key, acquired your captcha Provider."
msgstr ""
-#: authentik/stages/captcha/models.py:15
+#: authentik/stages/captcha/models.py
msgid "Private key, acquired your captcha Provider."
msgstr ""
-#: authentik/stages/captcha/models.py:37
+#: authentik/stages/captcha/models.py
msgid "Captcha Stage"
msgstr ""
-#: authentik/stages/captcha/models.py:38
+#: authentik/stages/captcha/models.py
msgid "Captcha Stages"
msgstr ""
-#: authentik/stages/consent/models.py:30
+#: authentik/stages/consent/models.py
msgid ""
"Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)."
msgstr ""
-#: authentik/stages/consent/models.py:50
+#: authentik/stages/consent/models.py
msgid "Consent Stage"
msgstr ""
-#: authentik/stages/consent/models.py:51
+#: authentik/stages/consent/models.py
msgid "Consent Stages"
msgstr ""
-#: authentik/stages/consent/models.py:72
+#: authentik/stages/consent/models.py
msgid "User Consent"
msgstr ""
-#: authentik/stages/consent/models.py:73
+#: authentik/stages/consent/models.py
msgid "User Consents"
msgstr ""
-#: authentik/stages/deny/models.py:32
+#: authentik/stages/deny/models.py
msgid "Deny Stage"
msgstr ""
-#: authentik/stages/deny/models.py:33
+#: authentik/stages/deny/models.py
msgid "Deny Stages"
msgstr ""
-#: authentik/stages/dummy/models.py:34
+#: authentik/stages/dummy/models.py
msgid "Dummy Stage"
msgstr ""
-#: authentik/stages/dummy/models.py:35
+#: authentik/stages/dummy/models.py
msgid "Dummy Stages"
msgstr ""
-#: authentik/stages/email/models.py:26
+#: authentik/stages/email/models.py
msgid "Password Reset"
msgstr ""
-#: authentik/stages/email/models.py:30
+#: authentik/stages/email/models.py
msgid "Account Confirmation"
msgstr ""
-#: authentik/stages/email/models.py:59
+#: authentik/stages/email/models.py
msgid ""
"When enabled, global Email connection settings will be used and connection "
"settings below will be ignored."
msgstr ""
-#: authentik/stages/email/models.py:74
+#: authentik/stages/email/models.py
msgid "Activate users upon completion of stage."
msgstr ""
-#: authentik/stages/email/models.py:78
+#: authentik/stages/email/models.py
msgid "Time in minutes the token sent is valid."
msgstr ""
-#: authentik/stages/email/models.py:132
+#: authentik/stages/email/models.py
msgid "Email Stage"
msgstr ""
-#: authentik/stages/email/models.py:133
+#: authentik/stages/email/models.py
msgid "Email Stages"
msgstr ""
-#: authentik/stages/email/stage.py:126
+#: authentik/stages/email/stage.py
msgid "Exception occurred while rendering E-mail template"
msgstr ""
-#: authentik/stages/email/stage.py:140
+#: authentik/stages/email/stage.py
msgid "Successfully verified Email."
msgstr ""
-#: authentik/stages/email/stage.py:147 authentik/stages/email/stage.py:173
+#: authentik/stages/email/stage.py
msgid "No pending user."
msgstr ""
-#: authentik/stages/email/stage.py:163
+#: authentik/stages/email/stage.py
msgid "Email sent."
msgstr ""
-#: authentik/stages/email/stage.py:176
+#: authentik/stages/email/stage.py
msgid "Email Successfully sent."
msgstr ""
-#: authentik/stages/email/templates/email/account_confirmation.html:10
-#: authentik/stages/email/templates/email/account_confirmation.txt:1
+#: authentik/stages/email/templates/email/account_confirmation.html
+#: authentik/stages/email/templates/email/account_confirmation.txt
msgid "Welcome!"
msgstr ""
-#: authentik/stages/email/templates/email/account_confirmation.html:19
+#: authentik/stages/email/templates/email/account_confirmation.html
msgid ""
"We're excited to have you get started. First, you need to confirm your "
"account. Just press the button below."
msgstr ""
-#: authentik/stages/email/templates/email/account_confirmation.html:24
+#: authentik/stages/email/templates/email/account_confirmation.html
msgid "Confirm Account"
msgstr ""
-#: authentik/stages/email/templates/email/account_confirmation.html:36
+#: authentik/stages/email/templates/email/account_confirmation.html
#, python-format
msgid ""
"\n"
@@ -2339,13 +2346,13 @@ msgid ""
" "
msgstr ""
-#: authentik/stages/email/templates/email/account_confirmation.txt:3
+#: authentik/stages/email/templates/email/account_confirmation.txt
msgid ""
"We're excited to have you get started. First, you need to confirm your "
"account. Just open the link below."
msgstr ""
-#: authentik/stages/email/templates/email/event_notification.html:46
+#: authentik/stages/email/templates/email/event_notification.html
#, python-format
msgid ""
"\n"
@@ -2354,26 +2361,26 @@ msgid ""
" "
msgstr ""
-#: authentik/stages/email/templates/email/event_notification.txt:1
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "Dear authentik user,"
msgstr ""
-#: authentik/stages/email/templates/email/event_notification.txt:3
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "The following notification was created:"
msgstr ""
-#: authentik/stages/email/templates/email/event_notification.txt:8
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "Additional attributes:"
msgstr ""
-#: authentik/stages/email/templates/email/event_notification.txt:13
+#: authentik/stages/email/templates/email/event_notification.txt
#, python-format
msgid ""
"\n"
"This email was sent from the notification transport %(name)s.\n"
msgstr ""
-#: authentik/stages/email/templates/email/password_reset.html:10
+#: authentik/stages/email/templates/email/password_reset.html
#, python-format
msgid ""
"\n"
@@ -2381,7 +2388,7 @@ msgid ""
" "
msgstr ""
-#: authentik/stages/email/templates/email/password_reset.html:21
+#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
" You recently requested to change your password for your authentik "
@@ -2389,7 +2396,7 @@ msgid ""
" "
msgstr ""
-#: authentik/stages/email/templates/email/password_reset.html:39
+#: authentik/stages/email/templates/email/password_reset.html
#, python-format
msgid ""
"\n"
@@ -2398,19 +2405,19 @@ msgid ""
" "
msgstr ""
-#: authentik/stages/email/templates/email/password_reset.txt:1
+#: authentik/stages/email/templates/email/password_reset.txt
#, python-format
msgid "Hi %(username)s,"
msgstr ""
-#: authentik/stages/email/templates/email/password_reset.txt:3
+#: authentik/stages/email/templates/email/password_reset.txt
msgid ""
"\n"
"You recently requested to change your password for your authentik account. "
"Use the link below to set a new password.\n"
msgstr ""
-#: authentik/stages/email/templates/email/password_reset.txt:7
+#: authentik/stages/email/templates/email/password_reset.txt
#, python-format
msgid ""
"\n"
@@ -2418,11 +2425,11 @@ msgid ""
"above is valid for %(expires)s.\n"
msgstr ""
-#: authentik/stages/email/templates/email/setup.html:9
+#: authentik/stages/email/templates/email/setup.html
msgid "authentik Test-Email"
msgstr ""
-#: authentik/stages/email/templates/email/setup.html:17
+#: authentik/stages/email/templates/email/setup.html
msgid ""
"\n"
" This is a test email to inform you, that you've "
@@ -2430,383 +2437,382 @@ msgid ""
" "
msgstr ""
-#: authentik/stages/email/templates/email/setup.txt:2
+#: authentik/stages/email/templates/email/setup.txt
msgid ""
"\n"
"This is a test email to inform you, that you've successfully configured "
"authentik emails.\n"
msgstr ""
-#: authentik/stages/identification/api.py:20
+#: authentik/stages/identification/api.py
msgid "When no user fields are selected, at least one source must be selected"
msgstr ""
-#: authentik/stages/identification/models.py:29
+#: authentik/stages/identification/models.py
msgid ""
"Fields of the user object to match against. (Hold shift to select multiple "
"options)"
msgstr ""
-#: authentik/stages/identification/models.py:47
+#: authentik/stages/identification/models.py
msgid "When enabled, user fields are matched regardless of their casing."
msgstr ""
-#: authentik/stages/identification/models.py:52
+#: authentik/stages/identification/models.py
msgid ""
"When a valid username/email has been entered, and this option is enabled, "
"the user's username and avatar will be shown. Otherwise, the text that the "
"user entered will be shown"
msgstr ""
-#: authentik/stages/identification/models.py:60
+#: authentik/stages/identification/models.py
msgid ""
"When enabled, the stage will succeed and continue even when incorrect user "
"info is entered."
msgstr ""
-#: authentik/stages/identification/models.py:72
+#: authentik/stages/identification/models.py
msgid "Optional enrollment flow, which is linked at the bottom of the page."
msgstr ""
-#: authentik/stages/identification/models.py:81
+#: authentik/stages/identification/models.py
msgid "Optional recovery flow, which is linked at the bottom of the page."
msgstr ""
-#: authentik/stages/identification/models.py:90
+#: authentik/stages/identification/models.py
msgid "Optional passwordless flow, which is linked at the bottom of the page."
msgstr ""
-#: authentik/stages/identification/models.py:94
+#: authentik/stages/identification/models.py
msgid "Specify which sources should be shown."
msgstr ""
-#: authentik/stages/identification/models.py:115
+#: authentik/stages/identification/models.py
msgid "Identification Stage"
msgstr ""
-#: authentik/stages/identification/models.py:116
+#: authentik/stages/identification/models.py
msgid "Identification Stages"
msgstr ""
-#: authentik/stages/identification/stage.py:188
+#: authentik/stages/identification/stage.py
msgid "Log in"
msgstr ""
-#: authentik/stages/identification/stage.py:189
+#: authentik/stages/identification/stage.py
msgid "Continue"
msgstr ""
-#: authentik/stages/invitation/models.py:21
+#: authentik/stages/invitation/models.py
msgid ""
"If this flag is set, this Stage will jump to the next Stage when no "
"Invitation is given. By default this Stage will cancel the Flow when no "
"invitation is given."
msgstr ""
-#: authentik/stages/invitation/models.py:44
+#: authentik/stages/invitation/models.py
msgid "Invitation Stage"
msgstr ""
-#: authentik/stages/invitation/models.py:45
+#: authentik/stages/invitation/models.py
msgid "Invitation Stages"
msgstr ""
-#: authentik/stages/invitation/models.py:60
+#: authentik/stages/invitation/models.py
msgid "When set, only the configured flow can use this invitation."
msgstr ""
-#: authentik/stages/invitation/models.py:64
+#: authentik/stages/invitation/models.py
msgid "When enabled, the invitation will be deleted after usage."
msgstr ""
-#: authentik/stages/invitation/models.py:71
+#: authentik/stages/invitation/models.py
msgid "Optional fixed data to enforce on user enrollment."
msgstr ""
-#: authentik/stages/invitation/models.py:84
+#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr ""
-#: authentik/stages/invitation/models.py:85
+#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr ""
-#: authentik/stages/invitation/stage.py:62
+#: authentik/stages/invitation/stage.py
msgid "Invalid invite/invite not found"
msgstr ""
-#: authentik/stages/password/models.py:20
+#: authentik/stages/password/models.py
msgid "User database + standard password"
msgstr ""
-#: authentik/stages/password/models.py:24
+#: authentik/stages/password/models.py
msgid "User database + app passwords"
msgstr ""
-#: authentik/stages/password/models.py:28
+#: authentik/stages/password/models.py
msgid "User database + LDAP password"
msgstr ""
-#: authentik/stages/password/models.py:38
+#: authentik/stages/password/models.py
msgid "Selection of backends to test the password against."
msgstr ""
-#: authentik/stages/password/models.py:43
+#: authentik/stages/password/models.py
msgid ""
"How many attempts a user has before the flow is canceled. To lock the user "
"out, use a reputation policy and a user_write stage."
msgstr ""
-#: authentik/stages/password/models.py:75
+#: authentik/stages/password/models.py
msgid "Password Stage"
msgstr ""
-#: authentik/stages/password/models.py:76
+#: authentik/stages/password/models.py
msgid "Password Stages"
msgstr ""
-#: authentik/stages/password/stage.py:124
+#: authentik/stages/password/stage.py
msgid "Invalid password"
msgstr ""
-#: authentik/stages/prompt/models.py:43
+#: authentik/stages/prompt/models.py
msgid "Text: Simple Text input"
msgstr ""
-#: authentik/stages/prompt/models.py:45
+#: authentik/stages/prompt/models.py
msgid "Text area: Multiline Text Input."
msgstr ""
-#: authentik/stages/prompt/models.py:48
+#: authentik/stages/prompt/models.py
msgid "Text (read-only): Simple Text input, but cannot be edited."
msgstr ""
-#: authentik/stages/prompt/models.py:52
+#: authentik/stages/prompt/models.py
msgid "Text area (read-only): Multiline Text input, but cannot be edited."
msgstr ""
-#: authentik/stages/prompt/models.py:58
+#: authentik/stages/prompt/models.py
msgid ""
"Username: Same as Text input, but checks for and prevents duplicate "
"usernames."
msgstr ""
-#: authentik/stages/prompt/models.py:60
+#: authentik/stages/prompt/models.py
msgid "Email: Text field with Email type."
msgstr ""
-#: authentik/stages/prompt/models.py:64
+#: authentik/stages/prompt/models.py
msgid ""
"Password: Masked input, multiple inputs of this type on the same prompt need "
"to be identical."
msgstr ""
-#: authentik/stages/prompt/models.py:71
+#: authentik/stages/prompt/models.py
msgid "Fixed choice field rendered as a group of radio buttons."
msgstr ""
-#: authentik/stages/prompt/models.py:73
+#: authentik/stages/prompt/models.py
msgid "Fixed choice field rendered as a dropdown."
msgstr ""
-#: authentik/stages/prompt/models.py:80
+#: authentik/stages/prompt/models.py
msgid ""
"File: File upload for arbitrary files. File content will be available in "
"flow context as data-URI"
msgstr ""
-#: authentik/stages/prompt/models.py:85
+#: authentik/stages/prompt/models.py
msgid "Separator: Static Separator Line"
msgstr ""
-#: authentik/stages/prompt/models.py:86
+#: authentik/stages/prompt/models.py
msgid "Hidden: Hidden field, can be used to insert data into form."
msgstr ""
-#: authentik/stages/prompt/models.py:87
+#: authentik/stages/prompt/models.py
msgid "Static: Static value, displayed as-is."
msgstr ""
-#: authentik/stages/prompt/models.py:89
+#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr ""
-#: authentik/stages/prompt/models.py:116
+#: authentik/stages/prompt/models.py
msgid "Name of the form field, also used to store the value"
msgstr ""
-#: authentik/stages/prompt/models.py:124
+#: authentik/stages/prompt/models.py
msgid ""
"Optionally provide a short hint that describes the expected input value. "
"When creating a fixed choice field, enable interpreting as expression and "
"return a list to return multiple choices."
msgstr ""
-#: authentik/stages/prompt/models.py:132
+#: authentik/stages/prompt/models.py
msgid ""
"Optionally pre-fill the input with an initial value. When creating a fixed "
"choice field, enable interpreting as expression and return a list to return "
"multiple default choices."
msgstr ""
-#: authentik/stages/prompt/models.py:321
+#: authentik/stages/prompt/models.py
msgid "Prompt"
msgstr ""
-#: authentik/stages/prompt/models.py:322
+#: authentik/stages/prompt/models.py
msgid "Prompts"
msgstr ""
-#: authentik/stages/prompt/models.py:349
+#: authentik/stages/prompt/models.py
msgid "Prompt Stage"
msgstr ""
-#: authentik/stages/prompt/models.py:350
+#: authentik/stages/prompt/models.py
msgid "Prompt Stages"
msgstr ""
-#: authentik/stages/prompt/stage.py:108
+#: authentik/stages/prompt/stage.py
msgid "Passwords don't match."
msgstr ""
-#: authentik/stages/user_delete/models.py:31
+#: authentik/stages/user_delete/models.py
msgid "User Delete Stage"
msgstr ""
-#: authentik/stages/user_delete/models.py:32
+#: authentik/stages/user_delete/models.py
msgid "User Delete Stages"
msgstr ""
-#: authentik/stages/user_delete/stage.py:18
+#: authentik/stages/user_delete/stage.py
msgid "No Pending User."
msgstr ""
-#: authentik/stages/user_login/models.py:47
+#: authentik/stages/user_login/models.py
msgid "Bind sessions created by this stage to the configured network"
msgstr ""
-#: authentik/stages/user_login/models.py:52
+#: authentik/stages/user_login/models.py
msgid "Bind sessions created by this stage to the configured GeoIP location"
msgstr ""
-#: authentik/stages/user_login/models.py:55
+#: authentik/stages/user_login/models.py
msgid "Terminate all other sessions of the user logging in."
msgstr ""
-#: authentik/stages/user_login/models.py:61
+#: authentik/stages/user_login/models.py
msgid ""
"Offset the session will be extended by when the user picks the remember me "
"option. Default of 0 means that the remember me option will not be shown. "
"(Format: hours=-1;minutes=-2;seconds=-3)"
msgstr ""
-#: authentik/stages/user_login/models.py:84
+#: authentik/stages/user_login/models.py
msgid "User Login Stage"
msgstr ""
-#: authentik/stages/user_login/models.py:85
+#: authentik/stages/user_login/models.py
msgid "User Login Stages"
msgstr ""
-#: authentik/stages/user_login/stage.py:85
+#: authentik/stages/user_login/stage.py
msgid "No Pending user to login."
msgstr ""
-#: authentik/stages/user_login/stage.py:112
+#: authentik/stages/user_login/stage.py
msgid "Successfully logged in!"
msgstr ""
-#: authentik/stages/user_logout/models.py:30
+#: authentik/stages/user_logout/models.py
msgid "User Logout Stage"
msgstr ""
-#: authentik/stages/user_logout/models.py:31
+#: authentik/stages/user_logout/models.py
msgid "User Logout Stages"
msgstr ""
-#: authentik/stages/user_write/models.py:31
+#: authentik/stages/user_write/models.py
msgid "When set, newly created users are inactive and cannot login."
msgstr ""
-#: authentik/stages/user_write/models.py:39
+#: authentik/stages/user_write/models.py
msgid "Optionally add newly created users to this group."
msgstr ""
-#: authentik/stages/user_write/models.py:68
+#: authentik/stages/user_write/models.py
msgid "User Write Stage"
msgstr ""
-#: authentik/stages/user_write/models.py:69
+#: authentik/stages/user_write/models.py
msgid "User Write Stages"
msgstr ""
-#: authentik/stages/user_write/stage.py:141
+#: authentik/stages/user_write/stage.py
msgid "No Pending data."
msgstr ""
-#: authentik/stages/user_write/stage.py:147
+#: authentik/stages/user_write/stage.py
msgid "No user found and can't create new user."
msgstr ""
-#: authentik/stages/user_write/stage.py:164
-#: authentik/stages/user_write/stage.py:178
+#: authentik/stages/user_write/stage.py
msgid "Failed to update user. Please try again later."
msgstr ""
-#: authentik/tenants/models.py:29
+#: authentik/tenants/models.py
msgid ""
"Schema name must start with t_, only contain lowercase letters and numbers "
"and be less than 63 characters."
msgstr ""
-#: authentik/tenants/models.py:49
+#: authentik/tenants/models.py
msgid "Configure how authentik should show avatars for users."
msgstr ""
-#: authentik/tenants/models.py:53
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their name."
msgstr ""
-#: authentik/tenants/models.py:56
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their email address."
msgstr ""
-#: authentik/tenants/models.py:59
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their username."
msgstr ""
-#: authentik/tenants/models.py:65
+#: authentik/tenants/models.py
msgid ""
"Events will be deleted after this duration.(Format: weeks=3;days=2;hours=3,"
"seconds=2)."
msgstr ""
-#: authentik/tenants/models.py:69
+#: authentik/tenants/models.py
msgid "The option configures the footer links on the flow executor pages."
msgstr ""
-#: authentik/tenants/models.py:75
+#: authentik/tenants/models.py
msgid ""
"When enabled, all the events caused by a user will be deleted upon the "
"user's deletion."
msgstr ""
-#: authentik/tenants/models.py:81
+#: authentik/tenants/models.py
msgid "Globally enable/disable impersonation."
msgstr ""
-#: authentik/tenants/models.py:104
+#: authentik/tenants/models.py
msgid "Tenant"
msgstr ""
-#: authentik/tenants/models.py:105
+#: authentik/tenants/models.py
msgid "Tenants"
msgstr ""
-#: authentik/tenants/models.py:125
+#: authentik/tenants/models.py
msgid "Domain"
msgstr ""
-#: authentik/tenants/models.py:126
+#: authentik/tenants/models.py
msgid "Domains"
msgstr ""
diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo
index ac13c057d2..77c682354e 100644
Binary files a/locale/fr/LC_MESSAGES/django.mo and b/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index 668fa97fc3..c853b1784d 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -19,7 +19,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-01-26 17:26+0000\n"
+"POT-Creation-Date: 2024-02-14 18:51+0000\n"
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
"Last-Translator: Marc Schmitt, 2024\n"
"Language-Team: French (https://app.transifex.com/authentik/teams/119923/fr/)\n"
@@ -29,32 +29,32 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
-#: authentik/api/schema.py:25
+#: authentik/api/schema.py
msgid "Generic API Error"
msgstr "Erreur d'API Générique"
-#: authentik/api/schema.py:33
+#: authentik/api/schema.py
msgid "Validation Error"
msgstr "Erreur de Validation"
-#: authentik/blueprints/api.py:43
+#: authentik/blueprints/api.py
msgid "Blueprint file does not exist"
msgstr "Le fichier de plan n'existe pas"
-#: authentik/blueprints/api.py:54
+#: authentik/blueprints/api.py
#, python-format
msgid "Failed to validate blueprint: %(logs)s"
msgstr "Échec de validation du plan: %(logs)s"
-#: authentik/blueprints/api.py:59
+#: authentik/blueprints/api.py
msgid "Either path or content must be set."
msgstr "Le chemin ou le contenu doit être défini."
-#: authentik/blueprints/models.py:30
+#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Géré par authentik"
-#: authentik/blueprints/models.py:32
+#: authentik/blueprints/models.py
msgid ""
"Objects that are managed by authentik. These objects are created and updated"
" automatically. This flag only indicates that an object can be overwritten "
@@ -67,25 +67,25 @@ msgstr ""
" attendez-vous à ce que ces changements soient écrasés par une mise-à-jour "
"ultérieure."
-#: authentik/blueprints/models.py:112
+#: authentik/blueprints/models.py
msgid "Blueprint Instance"
msgstr "Instance du plan"
-#: authentik/blueprints/models.py:113
+#: authentik/blueprints/models.py
msgid "Blueprint Instances"
msgstr "Instances du plan"
-#: authentik/blueprints/v1/exporter.py:62
+#: authentik/blueprints/v1/exporter.py
#, python-format
msgid "authentik Export - %(date)s"
msgstr "Export authentik - %(date)s"
-#: authentik/blueprints/v1/tasks.py:145 authentik/crypto/tasks.py:87
+#: authentik/blueprints/v1/tasks.py authentik/crypto/tasks.py
#, python-format
msgid "Successfully imported %(count)d files."
msgstr " %(count)d fichiers importés avec succès."
-#: authentik/brands/models.py:22
+#: authentik/brands/models.py
msgid ""
"Domain that activates this brand. Can be a superset, i.e. `a.b` for `aa.b` "
"and `ba.b`"
@@ -93,81 +93,90 @@ msgstr ""
"Domain qui active cette marque. Peut être un super-ensemble, c'est-à-dire "
"`a.b` pour `aa.b` et `ba.b`"
-#: authentik/brands/models.py:58
+#: authentik/brands/models.py
msgid "Web Certificate used by the authentik Core webserver."
msgstr "Certificate Web utilisé par le serveur web d'authentik core."
-#: authentik/brands/models.py:84
+#: authentik/brands/models.py
msgid "Brand"
msgstr "Marque"
-#: authentik/brands/models.py:85
+#: authentik/brands/models.py
msgid "Brands"
msgstr "Marques"
-#: authentik/core/api/providers.py:122
+#: authentik/core/api/providers.py
msgid "SAML Provider from Metadata"
msgstr "Fournisseur SAML depuis métadonnées"
-#: authentik/core/api/providers.py:123
+#: authentik/core/api/providers.py
msgid "Create a SAML Provider by importing its Metadata."
msgstr "Créer un fournisseur SAML en important ses métadonnées."
-#: authentik/core/api/users.py:149
+#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
msgstr ""
"Les barres obliques, ou slashes, de tête ou de queue ne sont pas autorisées."
-#: authentik/core/api/users.py:152
+#: authentik/core/api/users.py
msgid "No empty segments in user path allowed."
msgstr "Les segments vides dans le chemin utilisateur ne sont pas autorisés."
-#: authentik/core/models.py:92
+#: authentik/core/models.py
msgid "name"
msgstr "nom"
-#: authentik/core/models.py:94
+#: authentik/core/models.py
msgid "Users added to this group will be superusers."
msgstr "Les utilisateurs ajoutés à ce groupe seront des super-utilisateurs."
-#: authentik/core/models.py:168
+#: authentik/core/models.py
msgid "Group"
msgstr "Group"
-#: authentik/core/models.py:169
+#: authentik/core/models.py
msgid "Groups"
msgstr "Groupes"
-#: authentik/core/models.py:184
+#: authentik/core/models.py
msgid "User's display name."
msgstr "Nom d'affichage de l'utilisateur"
-#: authentik/core/models.py:280 authentik/providers/oauth2/models.py:295
+#: authentik/core/models.py authentik/providers/oauth2/models.py
msgid "User"
msgstr "Utilisateur"
-#: authentik/core/models.py:281
+#: authentik/core/models.py
msgid "Users"
msgstr "Utilisateurs"
-#: authentik/core/models.py:283
-#: authentik/stages/email/templates/email/password_reset.html:28
+#: authentik/core/models.py
+#: authentik/stages/email/templates/email/password_reset.html
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
-#: authentik/core/models.py:284
+#: authentik/core/models.py
msgid "Can impersonate other users"
msgstr "Peut se faire passer pour d'autres utilisateurs"
-#: authentik/core/models.py:285 authentik/rbac/models.py:54
+#: authentik/core/models.py authentik/rbac/models.py
msgid "Can assign permissions to users"
msgstr "Peut assigner des permissions aux utilisateurs"
-#: authentik/core/models.py:286 authentik/rbac/models.py:55
+#: authentik/core/models.py authentik/rbac/models.py
msgid "Can unassign permissions from users"
msgstr "Peut enlever des permissions aux utilisateurs"
-#: authentik/core/models.py:308
+#: authentik/core/models.py
+msgid "Can preview user data sent to providers"
+msgstr ""
+"Peut prévisualiser les données utilisateurs transmises aux fournisseurs"
+
+#: authentik/core/models.py
+msgid "View applications the user has access to"
+msgstr "Voir les applications auquel l'utilisateur a accès"
+
+#: authentik/core/models.py
msgid ""
"Flow used for authentication when the associated application is accessed by "
"an un-authenticated user."
@@ -175,11 +184,11 @@ msgstr ""
"Flux utilisé lors d'authentification quand l'application associée est "
"accédée par un utilisateur non-authentifié."
-#: authentik/core/models.py:318
+#: authentik/core/models.py
msgid "Flow used when authorizing this provider."
msgstr "Flux utilisé lors de l'autorisation de ce fournisseur."
-#: authentik/core/models.py:330
+#: authentik/core/models.py
msgid ""
"Accessed from applications; optional backchannel providers for protocols "
"like LDAP and SCIM."
@@ -187,32 +196,32 @@ msgstr ""
"Accès à partir d'applications ; fournisseurs optionnels de canaux de retour "
"pour des protocoles tels que LDAP et SCIM."
-#: authentik/core/models.py:385
+#: authentik/core/models.py
msgid "Application's display Name."
msgstr "Nom d'affichage de l'application"
-#: authentik/core/models.py:386
+#: authentik/core/models.py
msgid "Internal application name, used in URLs."
msgstr "Nom de l'application interne, utilisé dans les URLs."
-#: authentik/core/models.py:398
+#: authentik/core/models.py
msgid "Open launch URL in a new browser tab or window."
msgstr ""
"Ouvrir l'URL de lancement dans une nouvelle fenêtre ou un nouvel onglet."
-#: authentik/core/models.py:462
+#: authentik/core/models.py
msgid "Application"
msgstr "Application"
-#: authentik/core/models.py:463
+#: authentik/core/models.py
msgid "Applications"
msgstr "Applications"
-#: authentik/core/models.py:469
+#: authentik/core/models.py
msgid "Use the source-specific identifier"
msgstr "Utiliser l'identifiant spécifique à la source"
-#: authentik/core/models.py:471
+#: authentik/core/models.py
msgid ""
"Link to a user with identical email address. Can have security implications "
"when a source doesn't validate email addresses."
@@ -220,7 +229,7 @@ msgstr ""
"Lier à un utilisateur avec une adresse email identique. Peut avoir des "
"implications de sécurité lorsqu'une source ne valide pas les adresses email."
-#: authentik/core/models.py:475
+#: authentik/core/models.py
msgid ""
"Use the user's email address, but deny enrollment when the email address "
"already exists."
@@ -228,7 +237,7 @@ msgstr ""
"Utiliser l'adresse courriel de l'utilisateur, mais refuser l'inscription "
"lorsque celle-ci existe déjà."
-#: authentik/core/models.py:478
+#: authentik/core/models.py
msgid ""
"Link to a user with identical username. Can have security implications when "
"a username is used with another source."
@@ -237,7 +246,7 @@ msgstr ""
"problèmes de sécurité si ce nom d'utilisateur est partagé avec une autre "
"source."
-#: authentik/core/models.py:482
+#: authentik/core/models.py
msgid ""
"Use the user's username, but deny enrollment when the username already "
"exists."
@@ -245,23 +254,23 @@ msgstr ""
"Utiliser le nom d'utilisateur, mais refuser l'inscription si celui-ci existe"
" déjà."
-#: authentik/core/models.py:489
+#: authentik/core/models.py
msgid "Source's display Name."
msgstr "Nom d'affichage de la source."
-#: authentik/core/models.py:490
+#: authentik/core/models.py
msgid "Internal source name, used in URLs."
msgstr "Nom interne de la source, utilisé dans les URLs."
-#: authentik/core/models.py:509
+#: authentik/core/models.py
msgid "Flow to use when authenticating existing users."
msgstr "Flux à utiliser pour authentifier les utilisateurs existants."
-#: authentik/core/models.py:518
+#: authentik/core/models.py
msgid "Flow to use when enrolling new users."
msgstr "Flux à utiliser pour inscrire les nouveaux utilisateurs."
-#: authentik/core/models.py:526
+#: authentik/core/models.py
msgid ""
"How the source determines if an existing user should be authenticated or a "
"new user enrolled."
@@ -269,35 +278,35 @@ msgstr ""
"Comment la source détermine si un utilisateur existant doit être authentifié"
" ou un nouvelle utilisateur doit être inscrit."
-#: authentik/core/models.py:698
+#: authentik/core/models.py
msgid "Token"
msgstr "Jeton"
-#: authentik/core/models.py:699
+#: authentik/core/models.py
msgid "Tokens"
msgstr "Jetons"
-#: authentik/core/models.py:704
+#: authentik/core/models.py
msgid "View token's key"
msgstr "Voir la clé du jeton"
-#: authentik/core/models.py:740
+#: authentik/core/models.py
msgid "Property Mapping"
msgstr "Mappage de propriété"
-#: authentik/core/models.py:741
+#: authentik/core/models.py
msgid "Property Mappings"
msgstr "Mappages de propriété"
-#: authentik/core/models.py:778
+#: authentik/core/models.py
msgid "Authenticated Session"
msgstr "Session Authentifiée"
-#: authentik/core/models.py:779
+#: authentik/core/models.py
msgid "Authenticated Sessions"
msgstr "Sessions Authentifiées"
-#: authentik/core/sources/flow_manager.py:190
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid ""
"Request to authenticate with %(source)s has been denied. Please authenticate"
@@ -306,30 +315,29 @@ msgstr ""
"La requête d'authentification avec %(source)s a été refusée. Merci de vous "
"authentifier avec la source utilisée précédemment."
-#: authentik/core/sources/flow_manager.py:242
+#: authentik/core/sources/flow_manager.py
msgid "Configured flow does not exist."
msgstr "Le flux configuré n'existe pas."
-#: authentik/core/sources/flow_manager.py:272
-#: authentik/core/sources/flow_manager.py:324
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid "Successfully authenticated with %(source)s!"
msgstr "Authentifié avec succès avec %(source)s!"
-#: authentik/core/sources/flow_manager.py:296
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid "Successfully linked %(source)s!"
msgstr "%(source)s lié avec succès!"
-#: authentik/core/sources/flow_manager.py:315
+#: authentik/core/sources/flow_manager.py
msgid "Source is not configured for enrollment."
msgstr "La source n'est pas configurée pour l'inscription."
-#: authentik/core/templates/if/end_session.html:7
+#: authentik/core/templates/if/end_session.html
msgid "End session"
msgstr "Terminer la Session"
-#: authentik/core/templates/if/end_session.html:11
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -338,7 +346,7 @@ msgstr ""
"\n"
"Vous vous êtes déconnecté de %(application)s.\n"
-#: authentik/core/templates/if/end_session.html:19
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -349,11 +357,11 @@ msgstr ""
" Vous vous êtes déconnecté de %(application)s. Vous pouvez retourner à la vue d'ensemble pour lancer une autre application, ou vous déconnecter de votre compte %(branding_title)s .\n"
" "
-#: authentik/core/templates/if/end_session.html:25
+#: authentik/core/templates/if/end_session.html
msgid "Go back to overview"
msgstr "Retourner à la vue d'ensemble"
-#: authentik/core/templates/if/end_session.html:29
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -364,7 +372,7 @@ msgstr ""
" Déconnexion de %(branding_title)s\n"
" "
-#: authentik/core/templates/if/end_session.html:36
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -375,31 +383,30 @@ msgstr ""
" Reconnexion à %(application)s\n"
" "
-#: authentik/core/templates/if/error.html:18
+#: authentik/core/templates/if/error.html
msgid "Go home"
msgstr "Retourner à l'accueil"
-#: authentik/core/templates/login/base_full.html:75
+#: authentik/core/templates/login/base_full.html
msgid "Powered by authentik"
msgstr "Propulsé par authentik"
-#: authentik/core/views/apps.py:53
-#: authentik/providers/oauth2/views/authorize.py:434
-#: authentik/providers/oauth2/views/device_init.py:70
-#: authentik/providers/saml/views/sso.py:70
+#: authentik/core/views/apps.py authentik/providers/oauth2/views/authorize.py
+#: authentik/providers/oauth2/views/device_init.py
+#: authentik/providers/saml/views/sso.py
#, python-format
msgid "You're about to sign into %(application)s."
msgstr "Vous êtes sur le point de vous connecter à %(application)s."
-#: authentik/crypto/api.py:179
+#: authentik/crypto/api.py
msgid "Subject-alt name"
msgstr "Nom alternatif subject"
-#: authentik/crypto/models.py:30
+#: authentik/crypto/models.py
msgid "PEM-encoded Certificate data"
msgstr "Données du certificat au format PEM"
-#: authentik/crypto/models.py:33
+#: authentik/crypto/models.py
msgid ""
"Optional Private Key. If this is set, you can use this keypair for "
"encryption."
@@ -407,44 +414,44 @@ msgstr ""
"Clé privée optionnelle. Si définie, vous pouvez utiliser pour le "
"chiffrement."
-#: authentik/crypto/models.py:101
+#: authentik/crypto/models.py
msgid "Certificate-Key Pair"
msgstr "Paire de clé/certificat"
-#: authentik/crypto/models.py:102
+#: authentik/crypto/models.py
msgid "Certificate-Key Pairs"
msgstr "Paires de clé/certificat"
-#: authentik/enterprise/api.py:33
+#: authentik/enterprise/api.py
msgid "Enterprise is required to create/update this object."
msgstr "Entreprise est requis pour créer/mettre à jour cet objet."
-#: authentik/enterprise/models.py:183
+#: authentik/enterprise/models.py
msgid "License"
msgstr "Licence"
-#: authentik/enterprise/models.py:184
+#: authentik/enterprise/models.py
msgid "Licenses"
msgstr "Licences"
-#: authentik/enterprise/models.py:206
+#: authentik/enterprise/models.py
msgid "License Usage"
msgstr "Utilisation de la licence"
-#: authentik/enterprise/models.py:207
+#: authentik/enterprise/models.py
msgid "License Usage Records"
msgstr "Registre d'utilisation de la licence"
-#: authentik/enterprise/policy.py:18
+#: authentik/enterprise/policy.py
msgid "Enterprise required to access this feature."
msgstr "Entreprise est requis pour accéder à cette fonctionnalité."
-#: authentik/enterprise/policy.py:20
+#: authentik/enterprise/policy.py
msgid "Feature only accessible for internal users."
msgstr "Fonctionnalité accessible aux utilisateurs internes uniquement."
-#: authentik/enterprise/providers/rac/models.py:48
-#: authentik/stages/user_login/models.py:39
+#: authentik/enterprise/providers/rac/models.py
+#: authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
"lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)"
@@ -453,68 +460,81 @@ msgstr ""
"session dure jusqu'à la fermeture du navigateur. (Format : "
"hours=-1;minutes=-2;seconds=-3)"
-#: authentik/enterprise/providers/rac/models.py:71
+#: authentik/enterprise/providers/rac/models.py
+msgid "When set to true, connection tokens will be deleted upon disconnect."
+msgstr ""
+"Si activé, les jetons de connexion seront supprimés lors de la déconnexion."
+
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Provider"
msgstr "Fournisseur RAC"
-#: authentik/enterprise/providers/rac/models.py:72
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Providers"
msgstr "Fournisseurs RAC"
-#: authentik/enterprise/providers/rac/models.py:100
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Endpoint"
msgstr "Point de terminaison RAC"
-#: authentik/enterprise/providers/rac/models.py:101
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Endpoints"
msgstr "Points de terminaison RAC"
-#: authentik/enterprise/providers/rac/models.py:122
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Property Mapping"
msgstr "Mappage de propriété RAC"
-#: authentik/enterprise/providers/rac/models.py:123
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Property Mappings"
msgstr "Mappages de propriété RAC"
-#: authentik/enterprise/providers/rac/views.py:108
+#: authentik/enterprise/providers/rac/models.py
+msgid "RAC Connection token"
+msgstr "Jeton de connexion RAC"
+
+#: authentik/enterprise/providers/rac/models.py
+msgid "RAC Connection tokens"
+msgstr "Jeton de connexions RAC"
+
+#: authentik/enterprise/providers/rac/views.py
msgid "Maximum connection limit reached."
msgstr "Limite maximum de connection atteinte."
-#: authentik/enterprise/providers/rac/views.py:112
+#: authentik/enterprise/providers/rac/views.py
msgid "(You are already connected in another tab/window)"
msgstr "(Vous êtes déjà connecté dans un autre onglet/une autre fenêtre)"
-#: authentik/events/api/tasks.py:100
+#: authentik/events/api/tasks.py
#, python-format
msgid "Successfully started task %(name)s."
msgstr "La tâche %(name)s a été démarrée avec succès."
-#: authentik/events/models.py:304
+#: authentik/events/models.py
msgid "Event"
msgstr "Évènement"
-#: authentik/events/models.py:305
+#: authentik/events/models.py
msgid "Events"
msgstr "Évènements"
-#: authentik/events/models.py:311
+#: authentik/events/models.py
msgid "authentik inbuilt notifications"
msgstr "notifications intégrées à authentik"
-#: authentik/events/models.py:312
+#: authentik/events/models.py
msgid "Generic Webhook"
msgstr "Webhook Générique"
-#: authentik/events/models.py:313
+#: authentik/events/models.py
msgid "Slack Webhook (Slack/Discord)"
msgstr "Webhook Slack (ou Discord)"
-#: authentik/events/models.py:314
+#: authentik/events/models.py
msgid "Email"
msgstr "Courriel"
-#: authentik/events/models.py:332
+#: authentik/events/models.py
msgid ""
"Only send notification once, for example when sending a webhook into a chat "
"channel."
@@ -522,47 +542,47 @@ msgstr ""
"Envoyer une seule fois la notification, par exemple lors de l'envoi d'un "
"webhook dans un canal de discussion."
-#: authentik/events/models.py:397
+#: authentik/events/models.py
msgid "Severity"
msgstr "Sévérité"
-#: authentik/events/models.py:402
+#: authentik/events/models.py
msgid "Dispatched for user"
msgstr "Distribué pour l'utilisateur"
-#: authentik/events/models.py:411
+#: authentik/events/models.py
msgid "Event user"
msgstr "Évènement utilisateur"
-#: authentik/events/models.py:505
+#: authentik/events/models.py
msgid "Notification Transport"
msgstr "Transport de Notification"
-#: authentik/events/models.py:506
+#: authentik/events/models.py
msgid "Notification Transports"
msgstr "Transports de notification"
-#: authentik/events/models.py:512
+#: authentik/events/models.py
msgid "Notice"
msgstr "Note"
-#: authentik/events/models.py:513
+#: authentik/events/models.py
msgid "Warning"
msgstr "Avertissement"
-#: authentik/events/models.py:514
+#: authentik/events/models.py
msgid "Alert"
msgstr "Alerte"
-#: authentik/events/models.py:539
+#: authentik/events/models.py
msgid "Notification"
msgstr "Notification"
-#: authentik/events/models.py:540
+#: authentik/events/models.py
msgid "Notifications"
msgstr "Notifications"
-#: authentik/events/models.py:550
+#: authentik/events/models.py
msgid ""
"Select which transports should be used to notify the user. If none are "
"selected, the notification will only be shown in the authentik UI."
@@ -571,11 +591,11 @@ msgstr ""
"défaut, la notification sera simplement affichée dans l'interface "
"utilisateur authentik."
-#: authentik/events/models.py:558
+#: authentik/events/models.py
msgid "Controls which severity level the created notifications will have."
msgstr "Contrôle quel niveau de sévérité les notifications créées auront."
-#: authentik/events/models.py:563
+#: authentik/events/models.py
msgid ""
"Define which group of users this notification should be sent and shown to. "
"If left empty, Notification won't ben sent."
@@ -583,115 +603,110 @@ msgstr ""
"Définir à quel groupe d'utilisateur cette notification doit être envoyée et "
"affichée. Si laissé vide, les notifications ne seront pas envoyées."
-#: authentik/events/models.py:581
+#: authentik/events/models.py
msgid "Notification Rule"
msgstr "Règle de Notification"
-#: authentik/events/models.py:582
+#: authentik/events/models.py
msgid "Notification Rules"
msgstr "Règles de notification"
-#: authentik/events/models.py:602
+#: authentik/events/models.py
msgid "Webhook Mapping"
msgstr "Mappage de Webhook"
-#: authentik/events/models.py:603
+#: authentik/events/models.py
msgid "Webhook Mappings"
msgstr "Mappages de Webhook"
-#: authentik/events/models.py:668
+#: authentik/events/models.py
msgid "Run task"
msgstr "Lancer la tâche"
-#: authentik/events/models.py:669
+#: authentik/events/models.py
msgid "System Task"
msgstr "Tâches du système"
-#: authentik/events/models.py:670
+#: authentik/events/models.py
msgid "System Tasks"
msgstr "Tâches du système"
-#: authentik/events/system_tasks.py:126
+#: authentik/events/system_tasks.py
msgid "Task has not been run yet."
msgstr "Tâche pas encore exécutée."
-#: authentik/flows/api/flows.py:295
+#: authentik/flows/api/flows.py
#, python-format
msgid "Flow not applicable to current user/request: %(messages)s"
msgstr ""
"Ce flux n'est pas applicable à l'utilisateur ou à la requête courrante : "
"%(messages)s"
-#: authentik/flows/api/flows_diagram.py:68
-#: authentik/flows/api/flows_diagram.py:94
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Policy (%(type)s)"
msgstr "Politique (%(type)s)"
-#: authentik/flows/api/flows_diagram.py:71
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Binding %(order)d"
msgstr "Liaison %(order)d"
-#: authentik/flows/api/flows_diagram.py:118
+#: authentik/flows/api/flows_diagram.py
msgid "Policy passed"
msgstr "Politique acceptée"
-#: authentik/flows/api/flows_diagram.py:122
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Stage (%(type)s)"
msgstr "Étape (%(type)s)"
-#: authentik/flows/api/flows_diagram.py:146
-#: authentik/flows/api/flows_diagram.py:206
+#: authentik/flows/api/flows_diagram.py
msgid "Policy denied"
msgstr "Politique refusée"
-#: authentik/flows/api/flows_diagram.py:156
-#: authentik/flows/api/flows_diagram.py:168
-#: authentik/flows/api/flows_diagram.py:205
-#: authentik/flows/api/flows_diagram.py:227
+#: authentik/flows/api/flows_diagram.py
msgid "End of the flow"
msgstr "Fin du flux"
-#: authentik/flows/api/flows_diagram.py:169
+#: authentik/flows/api/flows_diagram.py
msgid "Requirement not fulfilled"
msgstr "Exigence non satisfaite"
-#: authentik/flows/api/flows_diagram.py:177
+#: authentik/flows/api/flows_diagram.py
msgid "Flow authentication requirement"
msgstr "Exigence d'authentification du flux"
-#: authentik/flows/api/flows_diagram.py:183
+#: authentik/flows/api/flows_diagram.py
msgid "Requirement fulfilled"
msgstr "Exigence satisfaite"
-#: authentik/flows/api/flows_diagram.py:196
+#: authentik/flows/api/flows_diagram.py
msgid "Pre-flow policies"
msgstr "Politiques pré-flux"
-#: authentik/flows/api/flows_diagram.py:214 authentik/flows/models.py:194
+#: authentik/flows/api/flows_diagram.py authentik/flows/models.py
msgid "Flow"
msgstr "Flux"
-#: authentik/flows/exceptions.py:19
+#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "Le flux ne s'applique pas à l'utilisateur actuel"
-#: authentik/flows/models.py:115
+#: authentik/flows/models.py
#, python-format
msgid "Dynamic In-memory stage: %(doc)s"
msgstr "Étape dynamique en mémoire : %(doc)s"
-#: authentik/flows/models.py:130
+#: authentik/flows/models.py
msgid "Visible in the URL."
msgstr "Visible dans l'URL"
-#: authentik/flows/models.py:132
+#: authentik/flows/models.py
msgid "Shown as the Title in Flow pages."
msgstr "Afficher comme Titre dans les pages de Flux."
-#: authentik/flows/models.py:139
+#: authentik/flows/models.py
msgid ""
"Decides what this Flow is used for. For example, the Authentication flow is "
"redirect to when an un-authenticated user visits authentik."
@@ -699,11 +714,11 @@ msgstr ""
"Détermine l'usage de ce flux. Par exemple, un flux d'authentification est la"
" destination d'un visiteur d'authentik non authentifié."
-#: authentik/flows/models.py:148
+#: authentik/flows/models.py
msgid "Background shown during execution"
msgstr "Fond d'écran affiché durant l'exécution"
-#: authentik/flows/models.py:155
+#: authentik/flows/models.py
msgid ""
"Enable compatibility mode, increases compatibility with password managers on"
" mobile devices."
@@ -711,47 +726,47 @@ msgstr ""
"Activer le mode de compatibilité, améliore la compatibilité avec les "
"gestionnaires de mot de passe sur les équipements mobiles."
-#: authentik/flows/models.py:163
+#: authentik/flows/models.py
msgid "Configure what should happen when a flow denies access to a user."
msgstr ""
"Configuration de ce qu'il se passe lorsqu'un flux refuse l'accès à un "
"utilisateur."
-#: authentik/flows/models.py:169
+#: authentik/flows/models.py
msgid "Required level of authentication and authorization to access a flow."
msgstr ""
"Niveau d'authentification et d'authorisation requis pour accéder à un flux."
-#: authentik/flows/models.py:195
+#: authentik/flows/models.py
msgid "Flows"
msgstr "Flux"
-#: authentik/flows/models.py:198
+#: authentik/flows/models.py
msgid "Can export a Flow"
msgstr "Peut exporter un flux"
-#: authentik/flows/models.py:199
+#: authentik/flows/models.py
msgid "Can inspect a Flow's execution"
msgstr "Peut inspecter l'exécution d'un flux"
-#: authentik/flows/models.py:200
+#: authentik/flows/models.py
msgid "View Flow's cache metrics"
msgstr "Voir les métriques de cache du flux"
-#: authentik/flows/models.py:201
+#: authentik/flows/models.py
msgid "Clear Flow's cache metrics"
msgstr "Nettoyer les métriques de cache du flux"
-#: authentik/flows/models.py:217
+#: authentik/flows/models.py
msgid "Evaluate policies during the Flow planning process."
msgstr "Évaluer les politiques durant la planification du flux."
-#: authentik/flows/models.py:221
+#: authentik/flows/models.py
msgid "Evaluate policies when the Stage is present to the user."
msgstr ""
"Évaluer les politiques lorsque l'étape est présentée est l'utilisateur."
-#: authentik/flows/models.py:228
+#: authentik/flows/models.py
msgid ""
"Configure how the flow executor should handle an invalid response to a "
"challenge. RETRY returns the error message and a similar challenge to the "
@@ -763,15 +778,15 @@ msgstr ""
"l'éxecuteur. RESTART redémarre le flux au début. RESTART_WITH_CONTEXT "
"redémarre le flux au début tout en conservant le contexte actuel."
-#: authentik/flows/models.py:251
+#: authentik/flows/models.py
msgid "Flow Stage Binding"
msgstr "Liaison de l'étape de flux"
-#: authentik/flows/models.py:252
+#: authentik/flows/models.py
msgid "Flow Stage Bindings"
msgstr "Liaisons d'étape de flux"
-#: authentik/flows/models.py:267
+#: authentik/flows/models.py
msgid ""
"Flow used by an authenticated user to configure this Stage. If empty, user "
"will not be able to configure this stage."
@@ -779,36 +794,36 @@ msgstr ""
"Flux utilisé par un utilisateur authentifié pour configurer cette étape. "
"S'il est vide, l'utilisateur ne sera pas en mesure de le configurer."
-#: authentik/flows/models.py:307
+#: authentik/flows/models.py
msgid "Flow Token"
msgstr "Jeton du flux"
-#: authentik/flows/models.py:308
+#: authentik/flows/models.py
msgid "Flow Tokens"
msgstr "Jetons du flux"
-#: authentik/lib/utils/time.py:27
+#: authentik/lib/utils/time.py
#, python-format
msgid "%(value)s is not in the correct format of 'hours=3;minutes=1'."
msgstr "%(value)sn'est pas dans le bon format de 'hours=3;minutes=1'."
-#: authentik/lib/validators.py:16
+#: authentik/lib/validators.py
#, python-brace-format
msgid "The fields {field_names} must be used together."
msgstr "Les champs {field_names} doivent être utilisés ensemble."
-#: authentik/outposts/api/service_connections.py:127
+#: authentik/outposts/api/service_connections.py
msgid ""
"You can only use an empty kubeconfig when connecting to a local cluster."
msgstr ""
"Vous pouvez seulement utiliser un kubeconfig vide quand vous vous connectez "
"à un cluster local."
-#: authentik/outposts/api/service_connections.py:135
+#: authentik/outposts/api/service_connections.py
msgid "Invalid kubeconfig"
msgstr "kubeconfig invalide"
-#: authentik/outposts/models.py:123
+#: authentik/outposts/models.py
msgid ""
"If enabled, use the local connection. Required Docker socket/Kubernetes "
"Integration"
@@ -816,15 +831,15 @@ msgstr ""
"Si activé, utilise la connexion locale. L'intégration Docker "
"socket/Kubernetes est requise"
-#: authentik/outposts/models.py:153
+#: authentik/outposts/models.py
msgid "Outpost Service-Connection"
msgstr "Connexion de service de l'avant-poste"
-#: authentik/outposts/models.py:154
+#: authentik/outposts/models.py
msgid "Outpost Service-Connections"
msgstr "Connexions de service de l'avant-poste"
-#: authentik/outposts/models.py:162
+#: authentik/outposts/models.py
msgid ""
"Can be in the format of 'unix://' when connecting to a local docker "
"daemon, or 'https://:2376' when connecting to a remote system."
@@ -833,7 +848,7 @@ msgstr ""
" local, ou \"https://:2376\" pour une connexion à un système "
"distant."
-#: authentik/outposts/models.py:174
+#: authentik/outposts/models.py
msgid ""
"CA which the endpoint's Certificate is verified against. Can be left empty "
"for no validation."
@@ -841,7 +856,7 @@ msgstr ""
"AC auprès de laquelle le certificat du terminal est vérifié. Peut être "
"laissé vide en l'absence de validation."
-#: authentik/outposts/models.py:186
+#: authentik/outposts/models.py
msgid ""
"Certificate/Key used for authentication. Can be left empty for no "
"authentication."
@@ -849,15 +864,15 @@ msgstr ""
"Certificat et clé utilisés pour l'authentification. Peut être laissé vide si"
" pas d'authentification."
-#: authentik/outposts/models.py:204
+#: authentik/outposts/models.py
msgid "Docker Service-Connection"
msgstr "Connexion de service Docker"
-#: authentik/outposts/models.py:205
+#: authentik/outposts/models.py
msgid "Docker Service-Connections"
msgstr "Connexions de service Docker"
-#: authentik/outposts/models.py:213
+#: authentik/outposts/models.py
msgid ""
"Paste your kubeconfig here. authentik will automatically use the currently "
"selected context."
@@ -865,19 +880,19 @@ msgstr ""
"Coller votre kubeconfig ici. authentik va automatiquement utiliseur le "
"contexte actuellement sélectionné."
-#: authentik/outposts/models.py:219
+#: authentik/outposts/models.py
msgid "Verify SSL Certificates of the Kubernetes API endpoint"
msgstr "Vérifier les certificats SSL de l'API Kubernetes"
-#: authentik/outposts/models.py:236
+#: authentik/outposts/models.py
msgid "Kubernetes Service-Connection"
msgstr "Connexion de service Kubernetes"
-#: authentik/outposts/models.py:237
+#: authentik/outposts/models.py
msgid "Kubernetes Service-Connections"
msgstr "Connexions de service Kubernetes"
-#: authentik/outposts/models.py:253
+#: authentik/outposts/models.py
msgid ""
"Select Service-Connection authentik should use to manage this outpost. Leave"
" empty if authentik should not handle the deployment."
@@ -885,28 +900,28 @@ msgstr ""
"Sélectionner la connexion de service qu'authentik doit utiliser pour gérer "
"cet avant-poste. Laisser vide si authentik ne doit pas gérer le déploiement."
-#: authentik/outposts/models.py:420
+#: authentik/outposts/models.py
msgid "Outpost"
msgstr "Avant-poste"
-#: authentik/outposts/models.py:421
+#: authentik/outposts/models.py
msgid "Outposts"
msgstr "Avant-postes"
-#: authentik/policies/denied.py:24
+#: authentik/policies/denied.py
msgid "Access denied"
msgstr "Accès refusé"
-#: authentik/policies/dummy/models.py:44
+#: authentik/policies/dummy/models.py
msgid "Dummy Policy"
msgstr "Politique Factice"
-#: authentik/policies/dummy/models.py:45
+#: authentik/policies/dummy/models.py
msgid "Dummy Policies"
msgstr "Politiques Factices"
-#: authentik/policies/event_matcher/api.py:20
-#: authentik/policies/event_matcher/models.py:56
+#: authentik/policies/event_matcher/api.py
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match events created by selected application. When left empty, all "
"applications are matched."
@@ -914,8 +929,8 @@ msgstr ""
"Inclure les évènements créés par cette application. S'il est laissé vide, "
"toutes les applications seront incluses."
-#: authentik/policies/event_matcher/api.py:29
-#: authentik/policies/event_matcher/models.py:64
+#: authentik/policies/event_matcher/api.py
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match events created by selected model. When left empty, all models are "
"matched. When an app is selected, all the application's models are matched."
@@ -924,11 +939,11 @@ msgstr ""
"laissé vide, tous les modèles sont pris en compte. Lorsqu'une application "
"est sélectionnée, tous les modèles de l'application sont pris en compte."
-#: authentik/policies/event_matcher/api.py:42
+#: authentik/policies/event_matcher/api.py
msgid "At least one criteria must be set."
msgstr "Au moins un critère doit être défini."
-#: authentik/policies/event_matcher/models.py:48
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match created events with this action type. When left empty, all action "
"types will be matched."
@@ -936,7 +951,7 @@ msgstr ""
"Inclure les événements créés avec ce type d'action. S'il est laissé vide, "
"tous les types d'action seront inclus."
-#: authentik/policies/event_matcher/models.py:73
+#: authentik/policies/event_matcher/models.py
msgid ""
"Matches Event's Client IP (strict matching, for network matching use an "
"Expression Policy)"
@@ -944,78 +959,78 @@ msgstr ""
"Inclure l'adresse IP du client de l'évènement (correspondante stricte, pour "
"un correspondance sur le réseau utiliser une politique d'expression)"
-#: authentik/policies/event_matcher/models.py:143
+#: authentik/policies/event_matcher/models.py
msgid "Event Matcher Policy"
msgstr "Politique d'association d'évènements"
-#: authentik/policies/event_matcher/models.py:144
+#: authentik/policies/event_matcher/models.py
msgid "Event Matcher Policies"
msgstr "Politiques d'association d'évènements"
-#: authentik/policies/expiry/models.py:45
+#: authentik/policies/expiry/models.py
#, python-format
msgid "Password expired %(days)d days ago. Please update your password."
msgstr ""
"Mot de passe expiré il y a %(days)d jours. Merci de mettre à jour votre mot "
"de passe."
-#: authentik/policies/expiry/models.py:49
+#: authentik/policies/expiry/models.py
msgid "Password has expired."
msgstr "Le Mot de Passe a expiré."
-#: authentik/policies/expiry/models.py:53
+#: authentik/policies/expiry/models.py
msgid "Password Expiry Policy"
msgstr "Politique d'expiration de Mot de Passe"
-#: authentik/policies/expiry/models.py:54
+#: authentik/policies/expiry/models.py
msgid "Password Expiry Policies"
msgstr "Politiques d'expiration de mot de passe"
-#: authentik/policies/expression/models.py:40
+#: authentik/policies/expression/models.py
msgid "Expression Policy"
msgstr "Politique d'Expression"
-#: authentik/policies/expression/models.py:41
+#: authentik/policies/expression/models.py
msgid "Expression Policies"
msgstr "Politiques d'expression"
-#: authentik/policies/models.py:22
+#: authentik/policies/models.py
msgid "all, all policies must pass"
msgstr "toutes, toutes les politiques doivent réussir"
-#: authentik/policies/models.py:23
+#: authentik/policies/models.py
msgid "any, any policy must pass"
msgstr "n'importe, n'importe quelle politique doit réussir"
-#: authentik/policies/models.py:46
+#: authentik/policies/models.py
msgid "Policy Binding Model"
msgstr "Liaison de modèle de politique"
-#: authentik/policies/models.py:47
+#: authentik/policies/models.py
msgid "Policy Binding Models"
msgstr "Liaison de modèles de politique"
-#: authentik/policies/models.py:86
+#: authentik/policies/models.py
msgid "Negates the outcome of the policy. Messages are unaffected."
msgstr "Inverse la sortie de la politique. Les messages ne sont pas affectés."
-#: authentik/policies/models.py:89
+#: authentik/policies/models.py
msgid "Timeout after which Policy execution is terminated."
msgstr "Expiration après que l'exécution de la politique soit terminée."
-#: authentik/policies/models.py:92
+#: authentik/policies/models.py
msgid "Result if the Policy execution fails."
msgstr "Résultat si l'éxecution de la Politique échoue."
-#: authentik/policies/models.py:145
+#: authentik/policies/models.py
msgid "Policy Binding"
msgstr "Liaison de politique"
-#: authentik/policies/models.py:146
+#: authentik/policies/models.py
msgid "Policy Bindings"
msgstr "Liaisons des politiques"
-#: authentik/policies/models.py:167
+#: authentik/policies/models.py
msgid ""
"When this option is enabled, all executions of this policy will be logged. "
"By default, only execution errors are logged."
@@ -1023,108 +1038,107 @@ msgstr ""
"Si activée, toutes les exécutions de cette politique seront enregistrées. "
"Par défaut, seules les erreurs d'exécution sont consignées."
-#: authentik/policies/models.py:189
+#: authentik/policies/models.py
msgid "Policy"
msgstr "Politique"
-#: authentik/policies/models.py:190
+#: authentik/policies/models.py
msgid "Policies"
msgstr "Politiques"
-#: authentik/policies/models.py:193
+#: authentik/policies/models.py
msgid "View Policy's cache metrics"
msgstr "Voir les métriques de cache de la politique"
-#: authentik/policies/models.py:194
+#: authentik/policies/models.py
msgid "Clear Policy's cache metrics"
msgstr "Nettoyer les métriques de cache de la politique"
-#: authentik/policies/password/models.py:27
+#: authentik/policies/password/models.py
msgid "Field key to check, field keys defined in Prompt stages are available."
msgstr ""
"Clé de champ à vérifier ; les clés de champ définies dans les étapes de "
"d'invite sont disponibles."
-#: authentik/policies/password/models.py:44
+#: authentik/policies/password/models.py
msgid "How many times the password hash is allowed to be on haveibeenpwned"
msgstr ""
"Combien de fois le hachage du mot de passe est-il autorisé sur "
"haveibeenpwned"
-#: authentik/policies/password/models.py:49
+#: authentik/policies/password/models.py
msgid ""
"If the zxcvbn score is equal or less than this value, the policy will fail."
msgstr ""
"Si le score zxcvbn est égal ou inférieur à cette valeur, la politique "
"échouera."
-#: authentik/policies/password/models.py:72
+#: authentik/policies/password/models.py
msgid "Password not set in context"
msgstr "Mot de passe non défini dans le contexte"
-#: authentik/policies/password/models.py:134
+#: authentik/policies/password/models.py
#, python-format
msgid "Password exists on %(count)d online lists."
msgstr "Le mot de passe existe sur %(count)d liste en ligne."
-#: authentik/policies/password/models.py:154
+#: authentik/policies/password/models.py
msgid "Password is too weak."
msgstr "Le mot de passe est trop faible."
-#: authentik/policies/password/models.py:162
+#: authentik/policies/password/models.py
msgid "Password Policy"
msgstr "Politique de Mots de Passe"
-#: authentik/policies/password/models.py:163
+#: authentik/policies/password/models.py
msgid "Password Policies"
msgstr "Politiques de Mot de Passe"
-#: authentik/policies/reputation/api.py:18
+#: authentik/policies/reputation/api.py
msgid "Either IP or Username must be checked"
msgstr "L'IP ou le nom d'utilisateur doit être vérifé"
-#: authentik/policies/reputation/models.py:67
+#: authentik/policies/reputation/models.py
msgid "Reputation Policy"
msgstr "Politique de Réputation"
-#: authentik/policies/reputation/models.py:68
+#: authentik/policies/reputation/models.py
msgid "Reputation Policies"
msgstr "Politiques de Réputation"
-#: authentik/policies/reputation/models.py:96
+#: authentik/policies/reputation/models.py
msgid "Reputation Score"
msgstr "Score de Réputation"
-#: authentik/policies/reputation/models.py:97
+#: authentik/policies/reputation/models.py
msgid "Reputation Scores"
msgstr "Scores de Réputation"
-#: authentik/policies/templates/policies/denied.html:7
-#: authentik/policies/templates/policies/denied.html:11
+#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "Permission refusée"
-#: authentik/policies/templates/policies/denied.html:21
+#: authentik/policies/templates/policies/denied.html
msgid "User's avatar"
msgstr "Avatar de l'utilisateu"
-#: authentik/policies/templates/policies/denied.html:25
+#: authentik/policies/templates/policies/denied.html
msgid "Not you?"
msgstr "Pas vous ?"
-#: authentik/policies/templates/policies/denied.html:33
+#: authentik/policies/templates/policies/denied.html
msgid "Request has been denied."
msgstr "La requête a été refusée."
-#: authentik/policies/templates/policies/denied.html:44
+#: authentik/policies/templates/policies/denied.html
msgid "Messages:"
msgstr "Messages:"
-#: authentik/policies/templates/policies/denied.html:54
+#: authentik/policies/templates/policies/denied.html
msgid "Explanation:"
msgstr "Explication :"
-#: authentik/policies/templates/policies/denied.html:58
+#: authentik/policies/templates/policies/denied.html
#, python-format
msgid ""
"\n"
@@ -1135,15 +1149,15 @@ msgstr ""
" L'association de politique '%(name)s' a renvoyé le résultat '%(result)s'\n"
" "
-#: authentik/policies/views.py:68
+#: authentik/policies/views.py
msgid "Failed to resolve application"
msgstr "Impossible de résoudre l'application"
-#: authentik/providers/ldap/models.py:25
+#: authentik/providers/ldap/models.py
msgid "DN under which objects are accessible."
msgstr "DN sous lequel les objets sont accessibles."
-#: authentik/providers/ldap/models.py:34
+#: authentik/providers/ldap/models.py
msgid ""
"Users in this group can do search queries. If not set, every user can "
"execute search queries."
@@ -1151,7 +1165,7 @@ msgstr ""
"Les utilisateurs dans ce groupe peuvent faire des requêtes de recherche. Si "
"laissé vide, tous les utilisateurs peuvent faire des requêtes de recherche."
-#: authentik/providers/ldap/models.py:53
+#: authentik/providers/ldap/models.py
msgid ""
"The start for uidNumbers, this number is added to the user.pk to make sure "
"that the numbers aren't too low for POSIX users. Default is 2000 to ensure "
@@ -1162,7 +1176,7 @@ msgstr ""
"défaut est 2000 pour s'assurer que nous n'entrons pas en collision avec les "
"uidNumber des utilisateurs locaux"
-#: authentik/providers/ldap/models.py:62
+#: authentik/providers/ldap/models.py
msgid ""
"The start for gidNumbers, this number is added to a number generated from "
"the group.pk to make sure that the numbers aren't too low for POSIX groups. "
@@ -1175,8 +1189,7 @@ msgstr ""
"n'entrons pas en collision avec les groupes locaux ou les gidNumber des "
"groupes primaires des utilisateurs"
-#: authentik/providers/ldap/models.py:76
-#: authentik/providers/radius/models.py:34
+#: authentik/providers/ldap/models.py authentik/providers/radius/models.py
msgid ""
"When enabled, code-based multi-factor authentication can be used by "
"appending a semicolon and the TOTP code to the password. This should only be"
@@ -1190,37 +1203,37 @@ msgstr ""
" se lieront à ce fournisseur ont un dispositif TOTP configuré, faute de quoi"
" un mot de passe peut être rejeté à tort s'il contient un point-virgule."
-#: authentik/providers/ldap/models.py:108
+#: authentik/providers/ldap/models.py
msgid "LDAP Provider"
msgstr "Fournisseur LDAP"
-#: authentik/providers/ldap/models.py:109
+#: authentik/providers/ldap/models.py
msgid "LDAP Providers"
msgstr "Fournisseurs LDAP"
-#: authentik/providers/oauth2/id_token.py:27
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the Hashed User ID"
msgstr "Basé sur le hash de l'ID utilisateur"
-#: authentik/providers/oauth2/id_token.py:28
+#: authentik/providers/oauth2/id_token.py
msgid "Based on user ID"
msgstr "Basé sur l'ID de l'utilisateur"
-#: authentik/providers/oauth2/id_token.py:29
+#: authentik/providers/oauth2/id_token.py
msgid "Based on user UUID"
msgstr "Basé sur le UUID de l'utilisateur"
-#: authentik/providers/oauth2/id_token.py:30
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the username"
msgstr "Basé sur le nom d'utilisateur"
-#: authentik/providers/oauth2/id_token.py:33
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the User's Email. This is recommended over the UPN method."
msgstr ""
"Basé sur le courriel utilisateur. Ceci est recommandé par rapport à la "
"méthode UPN."
-#: authentik/providers/oauth2/id_token.py:38
+#: authentik/providers/oauth2/id_token.py
msgid ""
"Based on the User's UPN, only works if user has a 'upn' attribute set. Use "
"this method only if you have different UPN and Mail domains."
@@ -1229,65 +1242,65 @@ msgstr ""
"attribut \"upn\" renseigné. Utiliser cette méthode seulement si les domaines"
" UPN et courriel sont différents."
-#: authentik/providers/oauth2/models.py:43
+#: authentik/providers/oauth2/models.py
msgid "Confidential"
msgstr "Confidentiel"
-#: authentik/providers/oauth2/models.py:44
+#: authentik/providers/oauth2/models.py
msgid "Public"
msgstr "Public"
-#: authentik/providers/oauth2/models.py:66
+#: authentik/providers/oauth2/models.py
msgid "Same identifier is used for all providers"
msgstr "Le même identifiant est utilisé pour tous les fournisseurs"
-#: authentik/providers/oauth2/models.py:68
+#: authentik/providers/oauth2/models.py
msgid "Each provider has a different issuer, based on the application slug."
msgstr ""
"Chaque fournisseur a un émetteur différent, basé sur le slug de "
"l'application."
-#: authentik/providers/oauth2/models.py:75
+#: authentik/providers/oauth2/models.py
msgid "code (Authorization Code Flow)"
msgstr "code (Authorization Code Flow)"
-#: authentik/providers/oauth2/models.py:76
+#: authentik/providers/oauth2/models.py
msgid "id_token (Implicit Flow)"
msgstr "id_token (Implicit Flow)"
-#: authentik/providers/oauth2/models.py:77
+#: authentik/providers/oauth2/models.py
msgid "id_token token (Implicit Flow)"
msgstr "id_token token (Implicit Flow)"
-#: authentik/providers/oauth2/models.py:78
+#: authentik/providers/oauth2/models.py
msgid "code token (Hybrid Flow)"
msgstr "code token (Hybrid Flow)"
-#: authentik/providers/oauth2/models.py:79
+#: authentik/providers/oauth2/models.py
msgid "code id_token (Hybrid Flow)"
msgstr "code id_token (Hybrid Flow)"
-#: authentik/providers/oauth2/models.py:80
+#: authentik/providers/oauth2/models.py
msgid "code id_token token (Hybrid Flow)"
msgstr "code id_token token (Hybrid Flow)"
-#: authentik/providers/oauth2/models.py:86
+#: authentik/providers/oauth2/models.py
msgid "HS256 (Symmetric Encryption)"
msgstr "HS256 (chiffrement symétrique)"
-#: authentik/providers/oauth2/models.py:87
+#: authentik/providers/oauth2/models.py
msgid "RS256 (Asymmetric Encryption)"
msgstr "RS256 (chiffrement asymétrique)"
-#: authentik/providers/oauth2/models.py:88
+#: authentik/providers/oauth2/models.py
msgid "ES256 (Asymmetric Encryption)"
msgstr "ES256 (Chiffrement Asymétrique)"
-#: authentik/providers/oauth2/models.py:94
+#: authentik/providers/oauth2/models.py
msgid "Scope used by the client"
msgstr "Portées utilisées par le client"
-#: authentik/providers/oauth2/models.py:98
+#: authentik/providers/oauth2/models.py
msgid ""
"Description shown to the user when consenting. If left empty, the user won't"
" be informed."
@@ -1295,19 +1308,19 @@ msgstr ""
"Description montrée à l'utilisateur lors de l'approbation. Aucune "
"information présentée à l'utilisateur si laissé vide."
-#: authentik/providers/oauth2/models.py:117
+#: authentik/providers/oauth2/models.py
msgid "Scope Mapping"
msgstr "Mappage de Portée"
-#: authentik/providers/oauth2/models.py:118
+#: authentik/providers/oauth2/models.py
msgid "Scope Mappings"
msgstr "Mappage de Portée"
-#: authentik/providers/oauth2/models.py:128
+#: authentik/providers/oauth2/models.py
msgid "Client Type"
msgstr "Type de Client"
-#: authentik/providers/oauth2/models.py:130
+#: authentik/providers/oauth2/models.py
msgid ""
"Confidential clients are capable of maintaining the confidentiality of their"
" credentials. Public clients are incapable"
@@ -1315,27 +1328,27 @@ msgstr ""
"Les clients confidentiels sont capable de maintenir la confidentialité de "
"leurs identifiants. Les clients publics n'en sont pas capables."
-#: authentik/providers/oauth2/models.py:137
+#: authentik/providers/oauth2/models.py
msgid "Client ID"
msgstr "ID client"
-#: authentik/providers/oauth2/models.py:143
+#: authentik/providers/oauth2/models.py
msgid "Client Secret"
msgstr "Secret du client"
-#: authentik/providers/oauth2/models.py:149
+#: authentik/providers/oauth2/models.py
msgid "Redirect URIs"
msgstr "URIs de redirection"
-#: authentik/providers/oauth2/models.py:150
+#: authentik/providers/oauth2/models.py
msgid "Enter each URI on a new line."
msgstr "Entrez chaque URI sur une nouvelle ligne."
-#: authentik/providers/oauth2/models.py:155
+#: authentik/providers/oauth2/models.py
msgid "Include claims in id_token"
msgstr "Include les demandes utilisateurs dans id_token"
-#: authentik/providers/oauth2/models.py:157
+#: authentik/providers/oauth2/models.py
msgid ""
"Include User claims from scopes in the id_token, for applications that don't"
" access the userinfo endpoint."
@@ -1343,7 +1356,7 @@ msgstr ""
"Inclure depuis la portée les demandes utilisateurs dans id_token, pour les "
"applications qui n'accèdent pas au point de terminaison userinfo."
-#: authentik/providers/oauth2/models.py:166
+#: authentik/providers/oauth2/models.py
msgid ""
"Access codes not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
@@ -1351,8 +1364,7 @@ msgstr ""
"Les codes d'accès ne seront plus valide à partir de l'heure actuelle + cette"
" valeur (Format : hours=1;minutes=2;seconds=3)."
-#: authentik/providers/oauth2/models.py:174
-#: authentik/providers/oauth2/models.py:182
+#: authentik/providers/oauth2/models.py
msgid ""
"Tokens not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
@@ -1360,7 +1372,7 @@ msgstr ""
"Les jetons ne seront plus valides à partir de l'heure actuelle + cette "
"valeur (Format: hours=1;minutes=2;seconds=3)."
-#: authentik/providers/oauth2/models.py:191
+#: authentik/providers/oauth2/models.py
msgid ""
"Configure what data should be used as unique User Identifier. For most "
"cases, the default should be fine."
@@ -1368,15 +1380,15 @@ msgstr ""
"Configure quelle donnée utiliser pour l'identifiant unique utilisateur. La "
"valeur par défaut devrait être correcte dans la plupart des cas."
-#: authentik/providers/oauth2/models.py:198
+#: authentik/providers/oauth2/models.py
msgid "Configure how the issuer field of the ID Token should be filled."
msgstr "Configure comment le champ émetteur du jeton ID sera rempli."
-#: authentik/providers/oauth2/models.py:203
+#: authentik/providers/oauth2/models.py
msgid "Signing Key"
msgstr "Clé de signature"
-#: authentik/providers/oauth2/models.py:207
+#: authentik/providers/oauth2/models.py
msgid ""
"Key used to sign the tokens. Only required when JWT Algorithm is set to "
"RS256."
@@ -1384,7 +1396,7 @@ msgstr ""
"Clé utilisée pour signer les jetons. Nécessaire uniquement lorsque "
"l'algorithme JWT est réglé sur RS256."
-#: authentik/providers/oauth2/models.py:214
+#: authentik/providers/oauth2/models.py
msgid ""
"Any JWT signed by the JWK of the selected source can be used to "
"authenticate."
@@ -1392,119 +1404,117 @@ msgstr ""
"Tout JWT signé par le JWK de la source sélectionnée peut être utilisé pour "
"s'authentifier."
-#: authentik/providers/oauth2/models.py:287
+#: authentik/providers/oauth2/models.py
msgid "OAuth2/OpenID Provider"
msgstr "Fournisseur OAuth2/OpenID"
-#: authentik/providers/oauth2/models.py:288
+#: authentik/providers/oauth2/models.py
msgid "OAuth2/OpenID Providers"
msgstr "Fournisseurs OAuth2/OpenID"
-#: authentik/providers/oauth2/models.py:297
-#: authentik/providers/oauth2/models.py:430
+#: authentik/providers/oauth2/models.py
msgid "Scopes"
msgstr "Portées"
-#: authentik/providers/oauth2/models.py:317
+#: authentik/providers/oauth2/models.py
msgid "Code"
msgstr "Code"
-#: authentik/providers/oauth2/models.py:318
+#: authentik/providers/oauth2/models.py
msgid "Nonce"
msgstr "Nonce"
-#: authentik/providers/oauth2/models.py:319
+#: authentik/providers/oauth2/models.py
msgid "Code Challenge"
msgstr "Challenge à code"
-#: authentik/providers/oauth2/models.py:321
+#: authentik/providers/oauth2/models.py
msgid "Code Challenge Method"
msgstr "Méthode de challenge à code"
-#: authentik/providers/oauth2/models.py:341
+#: authentik/providers/oauth2/models.py
msgid "Authorization Code"
msgstr "Code d'autorisation"
-#: authentik/providers/oauth2/models.py:342
+#: authentik/providers/oauth2/models.py
msgid "Authorization Codes"
msgstr "Codes d'autorisation"
-#: authentik/providers/oauth2/models.py:384
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Access Token"
msgstr "Jeton d'accès OAuth2"
-#: authentik/providers/oauth2/models.py:385
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Access Tokens"
msgstr "Jetons d'accès OAuth2"
-#: authentik/providers/oauth2/models.py:395
+#: authentik/providers/oauth2/models.py
msgid "ID Token"
msgstr "ID du jeton"
-#: authentik/providers/oauth2/models.py:414
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Refresh Token"
msgstr "Jeton de rafraîchissement OAuth2"
-#: authentik/providers/oauth2/models.py:415
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Refresh Tokens"
msgstr "Jetons de rafraîchissement OAuth2"
-#: authentik/providers/oauth2/models.py:442
+#: authentik/providers/oauth2/models.py
msgid "Device Token"
msgstr "Jeton d'équipement"
-#: authentik/providers/oauth2/models.py:443
+#: authentik/providers/oauth2/models.py
msgid "Device Tokens"
msgstr "Jetons d'équipement"
-#: authentik/providers/oauth2/views/authorize.py:489
-#: authentik/providers/saml/views/flows.py:87
+#: authentik/providers/oauth2/views/authorize.py
+#: authentik/providers/saml/views/flows.py
#, python-format
msgid "Redirecting to %(app)s..."
msgstr "Redirection vers %(app)s..."
-#: authentik/providers/oauth2/views/device_init.py:151
+#: authentik/providers/oauth2/views/device_init.py
msgid "Invalid code"
msgstr "Code invalide"
-#: authentik/providers/oauth2/views/userinfo.py:55
-#: authentik/providers/oauth2/views/userinfo.py:56
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access your User Information"
msgstr "Compatibilité GitHub : accès aux informations utilisateur"
-#: authentik/providers/oauth2/views/userinfo.py:57
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access you Email addresses"
msgstr "Compatibilité GitHub : accès aux adresses email"
-#: authentik/providers/oauth2/views/userinfo.py:58
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access your Groups"
msgstr "Compatibilité GitHub : accès aux groupes"
-#: authentik/providers/oauth2/views/userinfo.py:59
+#: authentik/providers/oauth2/views/userinfo.py
msgid "authentik API Access on behalf of your user"
msgstr "Accès à l'API authentik au nom des utilisateurs"
-#: authentik/providers/proxy/api.py:52
+#: authentik/providers/proxy/api.py
msgid "User and password attributes must be set when basic auth is enabled."
msgstr ""
"Les attributs utilisateur et mot de passe doivent être définis lorsque "
"l'authentification basique est activée."
-#: authentik/providers/proxy/api.py:63
+#: authentik/providers/proxy/api.py
msgid "Internal host cannot be empty when forward auth is disabled."
msgstr ""
"L'hôte interne ne peut pas être vide lorsque le transfert d'authentification"
" est désactivée."
-#: authentik/providers/proxy/models.py:54
+#: authentik/providers/proxy/models.py
msgid "Validate SSL Certificates of upstream servers"
msgstr "Valider les certificats SSL des serveurs en amont"
-#: authentik/providers/proxy/models.py:55
+#: authentik/providers/proxy/models.py
msgid "Internal host SSL Validation"
msgstr "Validation SSL de l'hôte interne"
-#: authentik/providers/proxy/models.py:61
+#: authentik/providers/proxy/models.py
msgid ""
"Enable support for forwardAuth in traefik and nginx auth_request. Exclusive "
"with internal_host."
@@ -1512,7 +1522,7 @@ msgstr ""
"Activer le support du transfert d'authentification dans traefik et nginx "
"auth_request. Exclusif avec internal_host."
-#: authentik/providers/proxy/models.py:70
+#: authentik/providers/proxy/models.py
msgid ""
"Regular expressions for which authentication is not required. Each new line "
"is interpreted as a new Regular Expression."
@@ -1521,7 +1531,7 @@ msgstr ""
"Chaque nouvelle ligne est interprétée comme une nouvelle expression "
"régulière."
-#: authentik/providers/proxy/models.py:78
+#: authentik/providers/proxy/models.py
msgid ""
"When enabled, this provider will intercept the authorization header and "
"authenticate requests based on its value."
@@ -1529,11 +1539,11 @@ msgstr ""
"Quand activé, ce fournisseur va intercepter l'en-tête d'authorisation et "
"authentifier les requêtes en fonction de sa valeur."
-#: authentik/providers/proxy/models.py:84
+#: authentik/providers/proxy/models.py
msgid "Set HTTP-Basic Authentication"
msgstr "Définir l'authentification HTTP-Basic"
-#: authentik/providers/proxy/models.py:86
+#: authentik/providers/proxy/models.py
msgid ""
"Set a custom HTTP-Basic Authentication header based on values from "
"authentik."
@@ -1541,11 +1551,11 @@ msgstr ""
"Définir un en-tête d'authentification HTTP-Basic personnalisé basé sur les "
"valeurs de authentik."
-#: authentik/providers/proxy/models.py:91
+#: authentik/providers/proxy/models.py
msgid "HTTP-Basic Username Key"
msgstr "Clé de l'utilisateur HTTP-Basic"
-#: authentik/providers/proxy/models.py:93
+#: authentik/providers/proxy/models.py
msgid ""
"User/Group Attribute used for the user part of the HTTP-Basic Header. If not"
" set, the user's Email address is used."
@@ -1554,31 +1564,31 @@ msgstr ""
" HTTP-Basic. S'il n'est pas défini, le courriel de l'utilisateur est "
"utilisée."
-#: authentik/providers/proxy/models.py:99
+#: authentik/providers/proxy/models.py
msgid "HTTP-Basic Password Key"
msgstr "Clé du mot de passe HTTP-Basic"
-#: authentik/providers/proxy/models.py:100
+#: authentik/providers/proxy/models.py
msgid ""
"User/Group Attribute used for the password part of the HTTP-Basic Header."
msgstr ""
"Attribut d'utilisateur/groupe utilisé pour la champ mot de passe de l'en-"
"tête HTTP-Basic."
-#: authentik/providers/proxy/models.py:154
+#: authentik/providers/proxy/models.py
msgid "Proxy Provider"
msgstr "Fournisseur Proxy"
-#: authentik/providers/proxy/models.py:155
+#: authentik/providers/proxy/models.py
msgid "Proxy Providers"
msgstr "Fournisseur de Proxy"
-#: authentik/providers/radius/models.py:18
+#: authentik/providers/radius/models.py
msgid "Shared secret between clients and server to hash packets."
msgstr ""
"Secret partagé entre les clients et le serveur pour hacher les paquets."
-#: authentik/providers/radius/models.py:24
+#: authentik/providers/radius/models.py
msgid ""
"List of CIDRs (comma-separated) that clients can connect from. A more "
"specific CIDR will match before a looser one. Clients connecting from a non-"
@@ -1589,28 +1599,28 @@ msgstr ""
"moins spécifique. Les clients se connectant depuis un CIDR non spécifié "
"seront rejetés."
-#: authentik/providers/radius/models.py:60
+#: authentik/providers/radius/models.py
msgid "Radius Provider"
msgstr "Fournisseur Radius"
-#: authentik/providers/radius/models.py:61
+#: authentik/providers/radius/models.py
msgid "Radius Providers"
msgstr "Fournisseurs Radius"
-#: authentik/providers/saml/api/providers.py:258
+#: authentik/providers/saml/api/providers.py
msgid "Invalid XML Syntax"
msgstr "Syntaxe XML Invalide"
-#: authentik/providers/saml/api/providers.py:268
+#: authentik/providers/saml/api/providers.py
#, python-format
msgid "Failed to import Metadata: %(message)s"
msgstr "Échec d'import des metadata : %(message)s"
-#: authentik/providers/saml/models.py:38
+#: authentik/providers/saml/models.py
msgid "ACS URL"
msgstr "ACS URL"
-#: authentik/providers/saml/models.py:43
+#: authentik/providers/saml/models.py
msgid ""
"Value of the audience restriction field of the assertion. When left empty, "
"no audience restriction will be added."
@@ -1618,15 +1628,15 @@ msgstr ""
"Valeur du champ de restriction d'audience de l'assertion. Si vide, aucune "
"restriction d'audience ne sera ajoutée."
-#: authentik/providers/saml/models.py:47
+#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Aussi appelé EntityID"
-#: authentik/providers/saml/models.py:51
+#: authentik/providers/saml/models.py
msgid "Service Provider Binding"
msgstr "Liaison du fournisseur de services"
-#: authentik/providers/saml/models.py:53
+#: authentik/providers/saml/models.py
msgid ""
"This determines how authentik sends the response back to the Service "
"Provider."
@@ -1634,11 +1644,11 @@ msgstr ""
"Cela détermine la manière dont authentik renvoie la réponse au fournisseur "
"de services."
-#: authentik/providers/saml/models.py:63
+#: authentik/providers/saml/models.py
msgid "NameID Property Mapping"
msgstr "Mappage de la propriété NameID"
-#: authentik/providers/saml/models.py:65
+#: authentik/providers/saml/models.py
msgid ""
"Configure how the NameID value will be created. When left empty, the "
"NameIDPolicy of the incoming request will be considered"
@@ -1646,7 +1656,7 @@ msgstr ""
"Configure la manière dont la valeur NameID sera créée. Si laissé vide, la "
"NameIDPolicy de la requête entrante sera prise en compte"
-#: authentik/providers/saml/models.py:74
+#: authentik/providers/saml/models.py
msgid ""
"Assertion valid not before current time + this value (Format: "
"hours=-1;minutes=-2;seconds=-3)."
@@ -1654,7 +1664,7 @@ msgstr ""
"L'assertion ne sera plus valide à partir de l'heure actuelle + cette valeur "
"(Format: hours=-1;minutes=-2;seconds=-3)."
-#: authentik/providers/saml/models.py:82
+#: authentik/providers/saml/models.py
msgid ""
"Assertion not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
@@ -1662,7 +1672,7 @@ msgstr ""
"Assertion non valide après écoulement de ce délai (format : "
"hours=1;minutes=2;seconds=3)"
-#: authentik/providers/saml/models.py:91
+#: authentik/providers/saml/models.py
msgid ""
"Session not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
@@ -1670,43 +1680,43 @@ msgstr ""
"La session n'est plus valide à partir de l'heure actuelle + cette valeur "
"(Format: hours=1;minutes=2;seconds=3)."
-#: authentik/providers/saml/models.py:99 authentik/sources/saml/models.py:150
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA1"
msgstr "SHA1"
-#: authentik/providers/saml/models.py:100 authentik/sources/saml/models.py:151
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA256"
msgstr "SHA256"
-#: authentik/providers/saml/models.py:101 authentik/sources/saml/models.py:152
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA384"
msgstr "SHA384"
-#: authentik/providers/saml/models.py:102 authentik/sources/saml/models.py:153
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA512"
msgstr "SHA512"
-#: authentik/providers/saml/models.py:109 authentik/sources/saml/models.py:160
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA1"
msgstr "RSA-SHA1"
-#: authentik/providers/saml/models.py:110 authentik/sources/saml/models.py:161
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA256"
msgstr "RSA-SHA256"
-#: authentik/providers/saml/models.py:111 authentik/sources/saml/models.py:162
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA384"
msgstr "RSA-SHA384"
-#: authentik/providers/saml/models.py:112 authentik/sources/saml/models.py:163
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA512"
msgstr "RSA-SHA512"
-#: authentik/providers/saml/models.py:113 authentik/sources/saml/models.py:164
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "DSA-SHA1"
msgstr "DSA-SHA1"
-#: authentik/providers/saml/models.py:124 authentik/sources/saml/models.py:130
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid ""
"When selected, incoming assertion's Signatures will be validated against "
"this certificate. To allow unsigned Requests, leave on default."
@@ -1715,161 +1725,161 @@ msgstr ""
"rapport à ce certificat. Pour autoriser les requêtes non signées, laissez la"
" valeur par défaut."
-#: authentik/providers/saml/models.py:128 authentik/sources/saml/models.py:134
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "Verification Certificate"
msgstr "Certificat de validation"
-#: authentik/providers/saml/models.py:136
+#: authentik/providers/saml/models.py
msgid "Keypair used to sign outgoing Responses going to the Service Provider."
msgstr ""
"Paire de clés utilisées pour signer les réponses sortantes allant vers le "
"fournisseur de services."
-#: authentik/providers/saml/models.py:138 authentik/sources/saml/models.py:144
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "Signing Keypair"
msgstr "Paire de clés de Signature"
-#: authentik/providers/saml/models.py:142
+#: authentik/providers/saml/models.py
msgid "Default relay_state value for IDP-initiated logins"
msgstr "Valeur par défaut de relay_state des connexions initiées par l'IdP"
-#: authentik/providers/saml/models.py:171
+#: authentik/providers/saml/models.py
msgid "SAML Provider"
msgstr "Fournisseur SAML"
-#: authentik/providers/saml/models.py:172
+#: authentik/providers/saml/models.py
msgid "SAML Providers"
msgstr "Fournisseurs SAML"
-#: authentik/providers/saml/models.py:196
+#: authentik/providers/saml/models.py
msgid "SAML Property Mapping"
msgstr "Mappages de propriétés SAML"
-#: authentik/providers/saml/models.py:197
+#: authentik/providers/saml/models.py
msgid "SAML Property Mappings"
msgstr "Mappages de propriétés SAML"
-#: authentik/providers/scim/models.py:23
+#: authentik/providers/scim/models.py
msgid "Base URL to SCIM requests, usually ends in /v2"
msgstr "URL de base pour les requêtes SCIM, se terminant généralement par /v2"
-#: authentik/providers/scim/models.py:24
+#: authentik/providers/scim/models.py
msgid "Authentication token"
msgstr "Jeton d'authentification"
-#: authentik/providers/scim/models.py:30 authentik/sources/ldap/models.py:98
+#: authentik/providers/scim/models.py authentik/sources/ldap/models.py
msgid "Property mappings used for group creation/updating."
msgstr ""
"Mappages de propriétés utilisés lors de la création et de la mise à jour des"
" groupes."
-#: authentik/providers/scim/models.py:72
+#: authentik/providers/scim/models.py
msgid "SCIM Provider"
msgstr "Fournisseur SCIM"
-#: authentik/providers/scim/models.py:73
+#: authentik/providers/scim/models.py
msgid "SCIM Providers"
msgstr "Fournisseurs SCIM"
-#: authentik/providers/scim/models.py:93
+#: authentik/providers/scim/models.py
msgid "SCIM Mapping"
msgstr "Mappage SCIM"
-#: authentik/providers/scim/models.py:94
+#: authentik/providers/scim/models.py
msgid "SCIM Mappings"
msgstr "Mappages SCIM"
-#: authentik/providers/scim/tasks.py:57
+#: authentik/providers/scim/tasks.py
msgid "Starting full SCIM sync"
msgstr "Démarrage d'une synchronisation SCIM complète"
-#: authentik/providers/scim/tasks.py:67
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Syncing page %(page)d of users"
msgstr "Synchronisation de la page %(page)d d'utilisateurs"
-#: authentik/providers/scim/tasks.py:71
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Syncing page %(page)d of groups"
msgstr "Synchronisation de la page %(page)d de groupes"
-#: authentik/providers/scim/tasks.py:103
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Failed to sync user %(user_name)s due to remote error: %(error)s"
msgstr ""
"Échec de synchronisation de l'utilisateur %(user_name)s dû à une erreur "
"distante : %(error)s"
-#: authentik/providers/scim/tasks.py:114 authentik/providers/scim/tasks.py:155
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Stopping sync due to error: %(error)s"
msgstr "Arrêt de la synchronisation due à l'erreur : %(error)s"
-#: authentik/providers/scim/tasks.py:144
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Failed to sync group %(group_name)s due to remote error: %(error)s"
msgstr ""
"Échec de synchronisation du group %(group_name)s dû à une erreur distante : "
"%(error)s"
-#: authentik/rbac/models.py:51
+#: authentik/rbac/models.py
msgid "Role"
msgstr "Rôle"
-#: authentik/rbac/models.py:52
+#: authentik/rbac/models.py
msgid "Roles"
msgstr "Rôles"
-#: authentik/rbac/models.py:66
+#: authentik/rbac/models.py
msgid "System permission"
msgstr "Permission système"
-#: authentik/rbac/models.py:67
+#: authentik/rbac/models.py
msgid "System permissions"
msgstr "Permissions système"
-#: authentik/rbac/models.py:69
+#: authentik/rbac/models.py
msgid "Can view system info"
msgstr "Peut voir les informations du système"
-#: authentik/rbac/models.py:70
+#: authentik/rbac/models.py
msgid "Can view system tasks"
msgstr "Peut voir les tâches du système"
-#: authentik/rbac/models.py:71
+#: authentik/rbac/models.py
msgid "Can run system tasks"
msgstr "Peut lancer des tâches système"
-#: authentik/rbac/models.py:72
+#: authentik/rbac/models.py
msgid "Can access admin interface"
msgstr "Peut accéder à l'interface d'administration"
-#: authentik/rbac/models.py:73
+#: authentik/rbac/models.py
msgid "Can view system settings"
msgstr "Peut voir les réglages système"
-#: authentik/rbac/models.py:74
+#: authentik/rbac/models.py
msgid "Can edit system settings"
msgstr "Peut modifier les réglages système"
-#: authentik/recovery/management/commands/create_admin_group.py:12
+#: authentik/recovery/management/commands/create_admin_group.py
msgid "Create admin group if the default group gets deleted."
msgstr "Crée le groupe adminstrateur si le groupe par défaut est supprimé."
-#: authentik/recovery/management/commands/create_recovery_key.py:16
+#: authentik/recovery/management/commands/create_recovery_key.py
msgid "Create a Key which can be used to restore access to authentik."
msgstr ""
"Crée une clé qui peut être utilisée pour restaurer l'accès à authentik."
-#: authentik/recovery/views.py:24
+#: authentik/recovery/views.py
msgid "Used recovery-link to authenticate."
msgstr "Utiliser un lien de récupération pour se connecter."
-#: authentik/sources/ldap/models.py:41
+#: authentik/sources/ldap/models.py
msgid "Server URI"
msgstr "URI du serveur"
-#: authentik/sources/ldap/models.py:50
+#: authentik/sources/ldap/models.py
msgid ""
"Optionally verify the LDAP Server's Certificate against the CA Chain in this"
" keypair."
@@ -1877,60 +1887,60 @@ msgstr ""
"Éventuellement vérifier le certificat du server LDAP par rapport à la chaine"
" d'autorité de certification de cette paire de clés."
-#: authentik/sources/ldap/models.py:59
+#: authentik/sources/ldap/models.py
msgid ""
"Client certificate to authenticate against the LDAP Server's Certificate."
msgstr "Certificat du client pour authentifier le certificat du serveur LDAP."
-#: authentik/sources/ldap/models.py:62
+#: authentik/sources/ldap/models.py
msgid "Bind CN"
msgstr "Bind DN"
-#: authentik/sources/ldap/models.py:64
+#: authentik/sources/ldap/models.py
msgid "Enable Start TLS"
msgstr "Activer Start TLS"
-#: authentik/sources/ldap/models.py:65
+#: authentik/sources/ldap/models.py
msgid "Use Server URI for SNI verification"
msgstr "Utiliser l'URI du serveur pour la vérification SNI"
-#: authentik/sources/ldap/models.py:67
+#: authentik/sources/ldap/models.py
msgid "Base DN"
msgstr "DN racine"
-#: authentik/sources/ldap/models.py:69
+#: authentik/sources/ldap/models.py
msgid "Prepended to Base DN for User-queries."
msgstr "Ajouté avant le DN de base pour les requêtes sur des utilisateurs."
-#: authentik/sources/ldap/models.py:70
+#: authentik/sources/ldap/models.py
msgid "Addition User DN"
msgstr "Préfixe DN utilisateurs"
-#: authentik/sources/ldap/models.py:74
+#: authentik/sources/ldap/models.py
msgid "Prepended to Base DN for Group-queries."
msgstr "Ajouté avant le DN de base pour les requêtes sur des groupes."
-#: authentik/sources/ldap/models.py:75
+#: authentik/sources/ldap/models.py
msgid "Addition Group DN"
msgstr "Préfixe DN groupes"
-#: authentik/sources/ldap/models.py:81
+#: authentik/sources/ldap/models.py
msgid "Consider Objects matching this filter to be Users."
msgstr "Les objets appliqués à ce filtre seront des utilisateurs."
-#: authentik/sources/ldap/models.py:84
+#: authentik/sources/ldap/models.py
msgid "Field which contains members of a group."
msgstr "Champ qui contient les membres d'un groupe."
-#: authentik/sources/ldap/models.py:88
+#: authentik/sources/ldap/models.py
msgid "Consider Objects matching this filter to be Groups."
msgstr "Les objets appliqués à ce filtre seront des groupes."
-#: authentik/sources/ldap/models.py:91
+#: authentik/sources/ldap/models.py
msgid "Field which contains a unique Identifier."
msgstr "Champ qui contient un identifiant unique."
-#: authentik/sources/ldap/models.py:105
+#: authentik/sources/ldap/models.py
msgid ""
"When a user changes their password, sync it back to LDAP. This can only be "
"enabled on a single LDAP source."
@@ -1938,35 +1948,35 @@ msgstr ""
"Lorsqu'un utilisateur change son mot de passe, le synchroniser à nouveau "
"vers LDAP. Ne peut être activé que sur une seule source LDAP."
-#: authentik/sources/ldap/models.py:248
+#: authentik/sources/ldap/models.py
msgid "LDAP Source"
msgstr "Source LDAP"
-#: authentik/sources/ldap/models.py:249
+#: authentik/sources/ldap/models.py
msgid "LDAP Sources"
msgstr "Sources LDAP"
-#: authentik/sources/ldap/models.py:271
+#: authentik/sources/ldap/models.py
msgid "LDAP Property Mapping"
msgstr "Mappage de propriété LDAP"
-#: authentik/sources/ldap/models.py:272
+#: authentik/sources/ldap/models.py
msgid "LDAP Property Mappings"
msgstr "Mappages de propriété LDAP"
-#: authentik/sources/ldap/signals.py:52
+#: authentik/sources/ldap/signals.py
msgid "Password does not match Active Directory Complexity."
msgstr "Le mot de passe ne correspond pas à la complexité d'Active Directory."
-#: authentik/sources/oauth/clients/oauth2.py:68
+#: authentik/sources/oauth/clients/oauth2.py
msgid "No token received."
msgstr "Pas de jeton reçu."
-#: authentik/sources/oauth/models.py:24
+#: authentik/sources/oauth/models.py
msgid "Request Token URL"
msgstr "URL du jeton de requête"
-#: authentik/sources/oauth/models.py:26
+#: authentik/sources/oauth/models.py
msgid ""
"URL used to request the initial token. This URL is only required for OAuth "
"1."
@@ -1974,165 +1984,165 @@ msgstr ""
"URL utilisée pour demander le jeton initial. Cette URL est uniquement "
"requise pour OAuth 1."
-#: authentik/sources/oauth/models.py:32
+#: authentik/sources/oauth/models.py
msgid "Authorization URL"
msgstr "URL d'autorisation"
-#: authentik/sources/oauth/models.py:33
+#: authentik/sources/oauth/models.py
msgid "URL the user is redirect to to conest the flow."
msgstr "URL vers laquelle l'utilisateur est redirigé pour consentir au flux."
-#: authentik/sources/oauth/models.py:38
+#: authentik/sources/oauth/models.py
msgid "Access Token URL"
msgstr "URL du jeton d'accès"
-#: authentik/sources/oauth/models.py:39
+#: authentik/sources/oauth/models.py
msgid "URL used by authentik to retrieve tokens."
msgstr "URL utilisée par authentik pour récupérer les jetons."
-#: authentik/sources/oauth/models.py:44
+#: authentik/sources/oauth/models.py
msgid "Profile URL"
msgstr "URL de profil"
-#: authentik/sources/oauth/models.py:45
+#: authentik/sources/oauth/models.py
msgid "URL used by authentik to get user information."
msgstr ""
"URL utilisée par authentik pour obtenir des informations sur l'utilisateur."
-#: authentik/sources/oauth/models.py:48
+#: authentik/sources/oauth/models.py
msgid "Additional Scopes"
msgstr "Portées additionnelles"
-#: authentik/sources/oauth/models.py:107
+#: authentik/sources/oauth/models.py
msgid "OAuth Source"
msgstr "Source OAuth"
-#: authentik/sources/oauth/models.py:108
+#: authentik/sources/oauth/models.py
msgid "OAuth Sources"
msgstr "Sources OAuth"
-#: authentik/sources/oauth/models.py:116
+#: authentik/sources/oauth/models.py
msgid "GitHub OAuth Source"
msgstr "Source d'OAuth GitHub"
-#: authentik/sources/oauth/models.py:117
+#: authentik/sources/oauth/models.py
msgid "GitHub OAuth Sources"
msgstr "Sources d'OAuth GitHub"
-#: authentik/sources/oauth/models.py:125
+#: authentik/sources/oauth/models.py
msgid "Twitch OAuth Source"
msgstr "Source d'OAuth Twitch"
-#: authentik/sources/oauth/models.py:126
+#: authentik/sources/oauth/models.py
msgid "Twitch OAuth Sources"
msgstr "Sources d'OAuth Twitch"
-#: authentik/sources/oauth/models.py:134
+#: authentik/sources/oauth/models.py
msgid "Mailcow OAuth Source"
msgstr "Source d'OAuth Mailcow"
-#: authentik/sources/oauth/models.py:135
+#: authentik/sources/oauth/models.py
msgid "Mailcow OAuth Sources"
msgstr "Sources d'OAuth Mailcow"
-#: authentik/sources/oauth/models.py:143
+#: authentik/sources/oauth/models.py
msgid "Twitter OAuth Source"
msgstr "Source d'OAuth Twitter"
-#: authentik/sources/oauth/models.py:144
+#: authentik/sources/oauth/models.py
msgid "Twitter OAuth Sources"
msgstr "Sources d'OAuth Twitter"
-#: authentik/sources/oauth/models.py:152
+#: authentik/sources/oauth/models.py
msgid "Facebook OAuth Source"
msgstr "Source d'OAuth Facebook"
-#: authentik/sources/oauth/models.py:153
+#: authentik/sources/oauth/models.py
msgid "Facebook OAuth Sources"
msgstr "Sources d'OAuth Facebook"
-#: authentik/sources/oauth/models.py:161
+#: authentik/sources/oauth/models.py
msgid "Discord OAuth Source"
msgstr "Source d'OAuth Discord"
-#: authentik/sources/oauth/models.py:162
+#: authentik/sources/oauth/models.py
msgid "Discord OAuth Sources"
msgstr "Sources d'OAuth Discord"
-#: authentik/sources/oauth/models.py:170
+#: authentik/sources/oauth/models.py
msgid "Patreon OAuth Source"
msgstr "Source d'OAuth Patreon"
-#: authentik/sources/oauth/models.py:171
+#: authentik/sources/oauth/models.py
msgid "Patreon OAuth Sources"
msgstr "Sources d'OAuth Patreon"
-#: authentik/sources/oauth/models.py:179
+#: authentik/sources/oauth/models.py
msgid "Google OAuth Source"
msgstr "Source d'OAuth Google"
-#: authentik/sources/oauth/models.py:180
+#: authentik/sources/oauth/models.py
msgid "Google OAuth Sources"
msgstr "Source d'OAuth Google"
-#: authentik/sources/oauth/models.py:188
+#: authentik/sources/oauth/models.py
msgid "Azure AD OAuth Source"
msgstr "Source d'OAuth Azure AD"
-#: authentik/sources/oauth/models.py:189
+#: authentik/sources/oauth/models.py
msgid "Azure AD OAuth Sources"
msgstr "Source d'OAuth Azure AD"
-#: authentik/sources/oauth/models.py:197
+#: authentik/sources/oauth/models.py
msgid "OpenID OAuth Source"
msgstr "Source d'OAuth OpenID"
-#: authentik/sources/oauth/models.py:198
+#: authentik/sources/oauth/models.py
msgid "OpenID OAuth Sources"
msgstr "Sources d'OAuth OpenID"
-#: authentik/sources/oauth/models.py:206
+#: authentik/sources/oauth/models.py
msgid "Apple OAuth Source"
msgstr "Source d'OAuth Apple"
-#: authentik/sources/oauth/models.py:207
+#: authentik/sources/oauth/models.py
msgid "Apple OAuth Sources"
msgstr "Sources d'OAuth Apple"
-#: authentik/sources/oauth/models.py:215
+#: authentik/sources/oauth/models.py
msgid "Okta OAuth Source"
msgstr "Source d'OAuth Okta"
-#: authentik/sources/oauth/models.py:216
+#: authentik/sources/oauth/models.py
msgid "Okta OAuth Sources"
msgstr "Sources d'OAuth Okta"
-#: authentik/sources/oauth/models.py:224
+#: authentik/sources/oauth/models.py
msgid "Reddit OAuth Source"
msgstr "Source d'OAuth Reddit"
-#: authentik/sources/oauth/models.py:225
+#: authentik/sources/oauth/models.py
msgid "Reddit OAuth Sources"
msgstr "Sources d'OAuth Reddit"
-#: authentik/sources/oauth/models.py:247
+#: authentik/sources/oauth/models.py
msgid "User OAuth Source Connection"
msgstr "Connexion de l'utilisateur à la source OAuth"
-#: authentik/sources/oauth/models.py:248
+#: authentik/sources/oauth/models.py
msgid "User OAuth Source Connections"
msgstr "Connexion de l'utilisateur aux sources OAuth"
-#: authentik/sources/oauth/views/callback.py:100
+#: authentik/sources/oauth/views/callback.py
#, python-format
msgid "Authentication failed: %(reason)s"
msgstr "Échec d'authentification : %(reason)s"
-#: authentik/sources/plex/models.py:37
+#: authentik/sources/plex/models.py
msgid "Client identifier used to talk to Plex."
msgstr "Identificateur client utilisé pour communiquer avec Plex."
-#: authentik/sources/plex/models.py:44
+#: authentik/sources/plex/models.py
msgid ""
"Which servers a user has to be a member of to be granted access. Empty list "
"allows every server."
@@ -2140,72 +2150,72 @@ msgstr ""
"De quels serveurs un utilisateur doit être membre afin d'être autorisé. Une "
"liste vide autorise tous les serveurs."
-#: authentik/sources/plex/models.py:50
+#: authentik/sources/plex/models.py
msgid "Allow friends to authenticate, even if you don't share a server."
msgstr ""
"Autoriser les amis à se connecter, même si vous ne partagez pas de serveur."
-#: authentik/sources/plex/models.py:52
+#: authentik/sources/plex/models.py
msgid "Plex token used to check friends"
msgstr "Jeton plex utilisé pour vérifier les amis"
-#: authentik/sources/plex/models.py:95
+#: authentik/sources/plex/models.py
msgid "Plex Source"
msgstr "Source Plex"
-#: authentik/sources/plex/models.py:96
+#: authentik/sources/plex/models.py
msgid "Plex Sources"
msgstr "Sources Plex"
-#: authentik/sources/plex/models.py:112
+#: authentik/sources/plex/models.py
msgid "User Plex Source Connection"
msgstr "Connexion de l'utilisateur à la source Plex"
-#: authentik/sources/plex/models.py:113
+#: authentik/sources/plex/models.py
msgid "User Plex Source Connections"
msgstr "Connexion de l'utilisateur aux sources Plex"
-#: authentik/sources/saml/models.py:40
+#: authentik/sources/saml/models.py
msgid "Redirect Binding"
msgstr "Liaison de Redirection"
-#: authentik/sources/saml/models.py:41
+#: authentik/sources/saml/models.py
msgid "POST Binding"
msgstr "Liaison POST"
-#: authentik/sources/saml/models.py:42
+#: authentik/sources/saml/models.py
msgid "POST Binding with auto-confirmation"
msgstr "Liaison POST avec auto confirmation"
-#: authentik/sources/saml/models.py:70
+#: authentik/sources/saml/models.py
msgid "Flow used before authentication."
msgstr "Flux à utiliser avant authentification."
-#: authentik/sources/saml/models.py:77
+#: authentik/sources/saml/models.py
msgid "Issuer"
msgstr "Émetteur"
-#: authentik/sources/saml/models.py:78
+#: authentik/sources/saml/models.py
msgid "Also known as Entity ID. Defaults the Metadata URL."
msgstr "Aussi appelé Entity ID. URL de métadonnée par défaut."
-#: authentik/sources/saml/models.py:82
+#: authentik/sources/saml/models.py
msgid "SSO URL"
msgstr "URL SSO"
-#: authentik/sources/saml/models.py:83
+#: authentik/sources/saml/models.py
msgid "URL that the initial Login request is sent to."
msgstr "URL de destination de la requête initiale de login."
-#: authentik/sources/saml/models.py:89
+#: authentik/sources/saml/models.py
msgid "SLO URL"
msgstr "URL SLO"
-#: authentik/sources/saml/models.py:90
+#: authentik/sources/saml/models.py
msgid "Optional URL if your IDP supports Single-Logout."
msgstr "URL optionnel si votre IDP supporte la déconnection unique."
-#: authentik/sources/saml/models.py:96
+#: authentik/sources/saml/models.py
msgid ""
"Allows authentication flows initiated by the IdP. This can be a security "
"risk, as no validation of the request ID is done."
@@ -2214,7 +2224,7 @@ msgstr ""
" un risque de sécurité, aucune validation de l'ID de la requête n'est "
"effectuée."
-#: authentik/sources/saml/models.py:104
+#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
"sent."
@@ -2222,11 +2232,11 @@ msgstr ""
"Politique NameID envoyée au fournisseur d'identité. Peut être vide, auquel "
"cas aucune politique n'est envoyée."
-#: authentik/sources/saml/models.py:115
+#: authentik/sources/saml/models.py
msgid "Delete temporary users after"
msgstr "Supprimer les utilisateurs temporaires après"
-#: authentik/sources/saml/models.py:118
+#: authentik/sources/saml/models.py
msgid ""
"Time offset when temporary users should be deleted. This only applies if "
"your IDP uses the NameID Format 'transient', and the user doesn't log out "
@@ -2237,46 +2247,46 @@ msgstr ""
"transitoire ('transient') et que l'utilisateur ne se déconnecte pas "
"manuellement. (Format : heures=1;minutes=2;secondes=3)."
-#: authentik/sources/saml/models.py:142
+#: authentik/sources/saml/models.py
msgid ""
"Keypair used to sign outgoing Responses going to the Identity Provider."
msgstr ""
"Paire de clés utilisées pour signer les réponses sortantes allant vers le "
"fournisseur d'identité."
-#: authentik/sources/saml/models.py:226
+#: authentik/sources/saml/models.py
msgid "SAML Source"
msgstr "Source SAML"
-#: authentik/sources/saml/models.py:227
+#: authentik/sources/saml/models.py
msgid "SAML Sources"
msgstr "Sources SAML"
-#: authentik/sources/saml/models.py:242
+#: authentik/sources/saml/models.py
msgid "User SAML Source Connection"
msgstr "Connexion de l'utilisateur à la source SAML"
-#: authentik/sources/saml/models.py:243
+#: authentik/sources/saml/models.py
msgid "User SAML Source Connections"
msgstr "Connexion de l'utilisateur aux sources SAML"
-#: authentik/stages/authenticator_duo/models.py:79
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Authenticator Setup Stage"
msgstr "Étape de configuration du Duo Authenticator"
-#: authentik/stages/authenticator_duo/models.py:80
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Authenticator Setup Stages"
msgstr "Étapes de configuration du Duo Authenticator"
-#: authentik/stages/authenticator_duo/models.py:103
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Device"
msgstr "Appareil Duo"
-#: authentik/stages/authenticator_duo/models.py:104
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Devices"
msgstr "Appareils Duo"
-#: authentik/stages/authenticator_sms/models.py:57
+#: authentik/stages/authenticator_sms/models.py
msgid ""
"When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is"
@@ -2287,117 +2297,116 @@ msgstr ""
"téléphone est enregistré pour assurer qu'il ne sera pas réutilisé dans le "
"futur."
-#: authentik/stages/authenticator_sms/models.py:68
+#: authentik/stages/authenticator_sms/models.py
msgid "Optionally modify the payload being sent to custom providers."
msgstr ""
"Éventuellement modifier le contenu envoyé aux fournisseurs personnalisés."
-#: authentik/stages/authenticator_sms/models.py:81
+#: authentik/stages/authenticator_sms/models.py
#, python-format
msgid "Use this code to authenticate in authentik: %(token)s"
msgstr "Utilisez ce code pour s'authentifier à authentik : %(token)s"
-#: authentik/stages/authenticator_sms/models.py:180
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Authenticator Setup Stage"
msgstr "Étape de configuration de l'authentificateur SMS"
-#: authentik/stages/authenticator_sms/models.py:181
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Authenticator Setup Stages"
msgstr "Étapes de configuration de l'authentificateur SMS"
-#: authentik/stages/authenticator_sms/models.py:226
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Device"
msgstr "Appareil SMS"
-#: authentik/stages/authenticator_sms/models.py:227
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Devices"
msgstr "Appareils SMS"
-#: authentik/stages/authenticator_sms/stage.py:57
-#: authentik/stages/authenticator_totp/stage.py:41
-#: authentik/stages/authenticator_totp/stage.py:44
+#: authentik/stages/authenticator_sms/stage.py
+#: authentik/stages/authenticator_totp/stage.py
msgid "Code does not match"
msgstr "Le Code ne correspond pas"
-#: authentik/stages/authenticator_sms/stage.py:73
+#: authentik/stages/authenticator_sms/stage.py
msgid "Invalid phone number"
msgstr "Numéro de téléphone invalide"
-#: authentik/stages/authenticator_static/models.py:52
+#: authentik/stages/authenticator_static/models.py
msgid "Static Authenticator Setup Stage"
msgstr "Étape de configuration de l'authentificateur statique"
-#: authentik/stages/authenticator_static/models.py:53
+#: authentik/stages/authenticator_static/models.py
msgid "Static Authenticator Setup Stages"
msgstr "Étapes de configuration de l'authentificateur statique"
-#: authentik/stages/authenticator_static/models.py:98
+#: authentik/stages/authenticator_static/models.py
msgid "Static Device"
msgstr "Équipement statique"
-#: authentik/stages/authenticator_static/models.py:99
+#: authentik/stages/authenticator_static/models.py
msgid "Static Devices"
msgstr "Équipements statiques"
-#: authentik/stages/authenticator_static/models.py:129
+#: authentik/stages/authenticator_static/models.py
msgid "Static Token"
msgstr "Jeton statique"
-#: authentik/stages/authenticator_static/models.py:130
+#: authentik/stages/authenticator_static/models.py
msgid "Static Tokens"
msgstr "Jetons statiques"
-#: authentik/stages/authenticator_totp/models.py:25
+#: authentik/stages/authenticator_totp/models.py
msgid "6 digits, widely compatible"
msgstr "6 chiffres, compatibilité large"
-#: authentik/stages/authenticator_totp/models.py:26
+#: authentik/stages/authenticator_totp/models.py
msgid "8 digits, not compatible with apps like Google Authenticator"
msgstr ""
"8 chiffres, incompatible avec certaines applications telles que Google "
"Authenticator"
-#: authentik/stages/authenticator_totp/models.py:62
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Authenticator Setup Stage"
msgstr "Étape de configuration de l'authentificateur TOTP"
-#: authentik/stages/authenticator_totp/models.py:63
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Authenticator Setup Stages"
msgstr "Étapes de configuration de l'authentificateur TOTP"
-#: authentik/stages/authenticator_totp/models.py:244
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Device"
msgstr "Équipement TOTP"
-#: authentik/stages/authenticator_totp/models.py:245
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Devices"
msgstr "Équipements TOTP"
-#: authentik/stages/authenticator_validate/challenge.py:123
+#: authentik/stages/authenticator_validate/challenge.py
msgid "Invalid Token"
msgstr "Jeton Invalide"
-#: authentik/stages/authenticator_validate/models.py:18
+#: authentik/stages/authenticator_validate/models.py
msgid "Static"
msgstr "Statique"
-#: authentik/stages/authenticator_validate/models.py:19
+#: authentik/stages/authenticator_validate/models.py
msgid "TOTP"
msgstr "TOTP"
-#: authentik/stages/authenticator_validate/models.py:20
+#: authentik/stages/authenticator_validate/models.py
msgid "WebAuthn"
msgstr "WebAuthn"
-#: authentik/stages/authenticator_validate/models.py:21
+#: authentik/stages/authenticator_validate/models.py
msgid "Duo"
msgstr "Duo"
-#: authentik/stages/authenticator_validate/models.py:22
+#: authentik/stages/authenticator_validate/models.py
msgid "SMS"
msgstr "SMS"
-#: authentik/stages/authenticator_validate/models.py:49
+#: authentik/stages/authenticator_validate/models.py
msgid ""
"Stages used to configure Authenticator when user doesn't have any compatible"
" devices. After this configuration Stage passes, the user is not prompted "
@@ -2407,11 +2416,11 @@ msgstr ""
"n'a pas d'appareil compatible. Une fois cette étape franchie, l'utilisateur "
"ne sera plus sollicité."
-#: authentik/stages/authenticator_validate/models.py:56
+#: authentik/stages/authenticator_validate/models.py
msgid "Device classes which can be used to authenticate"
msgstr "Classes d'appareils pouvant être utilisées pour se connecter"
-#: authentik/stages/authenticator_validate/models.py:64
+#: authentik/stages/authenticator_validate/models.py
msgid ""
"If any of the user's device has been used within this threshold, this stage "
"will be skipped"
@@ -2419,97 +2428,97 @@ msgstr ""
"Si l'un des appareils de l'utilisateur a été utilisé au sein de ce seuil, "
"cette étape sera sautée"
-#: authentik/stages/authenticator_validate/models.py:70
+#: authentik/stages/authenticator_validate/models.py
msgid "Enforce user verification for WebAuthn devices."
msgstr "Imposer la vérification de l'utilisateur pour les appareils WebAuthn."
-#: authentik/stages/authenticator_validate/models.py:92
+#: authentik/stages/authenticator_validate/models.py
msgid "Authenticator Validation Stage"
msgstr "Étape de validation de l'authentificateur"
-#: authentik/stages/authenticator_validate/models.py:93
+#: authentik/stages/authenticator_validate/models.py
msgid "Authenticator Validation Stages"
msgstr "Étapes de validation de l'authentificateur"
-#: authentik/stages/authenticator_webauthn/models.py:112
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "Étape de validation de l'authentificateur WebAuthn"
-#: authentik/stages/authenticator_webauthn/models.py:113
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stages"
msgstr "Étapes de validation de l'authentificateur WebAuthn"
-#: authentik/stages/authenticator_webauthn/models.py:151
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Device"
msgstr "Appareil WebAuthn"
-#: authentik/stages/authenticator_webauthn/models.py:152
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Devices"
msgstr "Équipements WebAuthn"
-#: authentik/stages/captcha/models.py:14
+#: authentik/stages/captcha/models.py
msgid "Public key, acquired your captcha Provider."
msgstr "Clé publique, acquise auprès de votre fournisseur captcha."
-#: authentik/stages/captcha/models.py:15
+#: authentik/stages/captcha/models.py
msgid "Private key, acquired your captcha Provider."
msgstr "Clé privée, acquise auprès de votre fournisseur captcha."
-#: authentik/stages/captcha/models.py:37
+#: authentik/stages/captcha/models.py
msgid "Captcha Stage"
msgstr "Étape de Captcha"
-#: authentik/stages/captcha/models.py:38
+#: authentik/stages/captcha/models.py
msgid "Captcha Stages"
msgstr "Étapes de Captcha"
-#: authentik/stages/consent/models.py:30
+#: authentik/stages/consent/models.py
msgid ""
"Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)."
msgstr ""
"Durée d'expiration du consentement (Format : hours=1;minutes=2;seconds=3)."
-#: authentik/stages/consent/models.py:50
+#: authentik/stages/consent/models.py
msgid "Consent Stage"
msgstr "Étape de Consentement"
-#: authentik/stages/consent/models.py:51
+#: authentik/stages/consent/models.py
msgid "Consent Stages"
msgstr "Étapes de Consentement"
-#: authentik/stages/consent/models.py:72
+#: authentik/stages/consent/models.py
msgid "User Consent"
msgstr "Consentement Utilisateur"
-#: authentik/stages/consent/models.py:73
+#: authentik/stages/consent/models.py
msgid "User Consents"
msgstr "Consentements Utilisateur"
-#: authentik/stages/deny/models.py:32
+#: authentik/stages/deny/models.py
msgid "Deny Stage"
msgstr "Étape de Refus"
-#: authentik/stages/deny/models.py:33
+#: authentik/stages/deny/models.py
msgid "Deny Stages"
msgstr "Étapes de Refus"
-#: authentik/stages/dummy/models.py:34
+#: authentik/stages/dummy/models.py
msgid "Dummy Stage"
msgstr "Étape factice"
-#: authentik/stages/dummy/models.py:35
+#: authentik/stages/dummy/models.py
msgid "Dummy Stages"
msgstr "Étapes factices"
-#: authentik/stages/email/models.py:26
+#: authentik/stages/email/models.py
msgid "Password Reset"
msgstr "Réinitialiser le Mot de Passe"
-#: authentik/stages/email/models.py:30
+#: authentik/stages/email/models.py
msgid "Account Confirmation"
msgstr "Confirmation du Compte"
-#: authentik/stages/email/models.py:59
+#: authentik/stages/email/models.py
msgid ""
"When enabled, global Email connection settings will be used and connection "
"settings below will be ignored."
@@ -2517,48 +2526,48 @@ msgstr ""
"Si activé, les paramètres globaux de connexion courriel seront utilisés et "
"les paramètres de connexion ci-dessous seront ignorés."
-#: authentik/stages/email/models.py:74
+#: authentik/stages/email/models.py
msgid "Activate users upon completion of stage."
msgstr "Activer les utilisateurs à la complétion de l'étape."
-#: authentik/stages/email/models.py:78
+#: authentik/stages/email/models.py
msgid "Time in minutes the token sent is valid."
msgstr "Temps en minutes durant lequel le jeton envoyé est valide."
-#: authentik/stages/email/models.py:132
+#: authentik/stages/email/models.py
msgid "Email Stage"
msgstr "Étape Email"
-#: authentik/stages/email/models.py:133
+#: authentik/stages/email/models.py
msgid "Email Stages"
msgstr "Étape Email"
-#: authentik/stages/email/stage.py:126
+#: authentik/stages/email/stage.py
msgid "Exception occurred while rendering E-mail template"
msgstr "Une erreur s'est produite lors de la modélisation du couriel"
-#: authentik/stages/email/stage.py:140
+#: authentik/stages/email/stage.py
msgid "Successfully verified Email."
msgstr "Email vérifié avec succès."
-#: authentik/stages/email/stage.py:147 authentik/stages/email/stage.py:173
+#: authentik/stages/email/stage.py
msgid "No pending user."
msgstr "Pas d'utilisateurs en attente."
-#: authentik/stages/email/stage.py:163
+#: authentik/stages/email/stage.py
msgid "Email sent."
msgstr "Email envoyé."
-#: authentik/stages/email/stage.py:176
+#: authentik/stages/email/stage.py
msgid "Email Successfully sent."
msgstr "Couriel envoyé avec succès."
-#: authentik/stages/email/templates/email/account_confirmation.html:10
-#: authentik/stages/email/templates/email/account_confirmation.txt:1
+#: authentik/stages/email/templates/email/account_confirmation.html
+#: authentik/stages/email/templates/email/account_confirmation.txt
msgid "Welcome!"
msgstr "Bienvenue !"
-#: authentik/stages/email/templates/email/account_confirmation.html:19
+#: authentik/stages/email/templates/email/account_confirmation.html
msgid ""
"We're excited to have you get started. First, you need to confirm your "
"account. Just press the button below."
@@ -2566,11 +2575,11 @@ msgstr ""
"Nous sommes ravis que vous puissiez commencer. Tout d'abord, vous devez "
"confirmer votre compte. Il vous suffit d'appuyer sur le bouton ci-dessous."
-#: authentik/stages/email/templates/email/account_confirmation.html:24
+#: authentik/stages/email/templates/email/account_confirmation.html
msgid "Confirm Account"
msgstr "Confirmer le Compte"
-#: authentik/stages/email/templates/email/account_confirmation.html:36
+#: authentik/stages/email/templates/email/account_confirmation.html
#, python-format
msgid ""
"\n"
@@ -2581,7 +2590,7 @@ msgstr ""
" Si cela ne fonctionne pas, copier et coller ce lien dans votre navigateur : %(url)s\n"
" "
-#: authentik/stages/email/templates/email/account_confirmation.txt:3
+#: authentik/stages/email/templates/email/account_confirmation.txt
msgid ""
"We're excited to have you get started. First, you need to confirm your "
"account. Just open the link below."
@@ -2589,7 +2598,7 @@ msgstr ""
"Nous sommes ravis que vous puissiez commencer. Tout d'abord, vous devez "
"confirmer votre compte. Il vous suffit d'ouvrir le lien ci-dessous."
-#: authentik/stages/email/templates/email/event_notification.html:46
+#: authentik/stages/email/templates/email/event_notification.html
#, python-format
msgid ""
"\n"
@@ -2600,19 +2609,19 @@ msgstr ""
" Cet email a été envoyé depuis le transport de notification %(name)s
.\n"
" "
-#: authentik/stages/email/templates/email/event_notification.txt:1
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "Dear authentik user,"
msgstr "Cher utilisateur d'authentik."
-#: authentik/stages/email/templates/email/event_notification.txt:3
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "The following notification was created:"
msgstr "La notification suivante a été créée :"
-#: authentik/stages/email/templates/email/event_notification.txt:8
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "Additional attributes:"
msgstr "Attributs additionnels"
-#: authentik/stages/email/templates/email/event_notification.txt:13
+#: authentik/stages/email/templates/email/event_notification.txt
#, python-format
msgid ""
"\n"
@@ -2621,7 +2630,7 @@ msgstr ""
"\n"
"Cet email a été envoyé depuis le transport de notification %(name)s.\n"
-#: authentik/stages/email/templates/email/password_reset.html:10
+#: authentik/stages/email/templates/email/password_reset.html
#, python-format
msgid ""
"\n"
@@ -2632,7 +2641,7 @@ msgstr ""
" Salut %(username)s,\n"
" "
-#: authentik/stages/email/templates/email/password_reset.html:21
+#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n"
@@ -2642,7 +2651,7 @@ msgstr ""
" Vous avez récemment demandé à changer le mot de passe de votre compte authentik. Utilisez le bouton ci-dessous pour définir un nouveau mot de passe.\n"
" "
-#: authentik/stages/email/templates/email/password_reset.html:39
+#: authentik/stages/email/templates/email/password_reset.html
#, python-format
msgid ""
"\n"
@@ -2653,12 +2662,12 @@ msgstr ""
" Si vous n'avez pas requis de changement de mot de passe, veuillez ignorer cet e-mail. Le lien ci-dessus est valide pendant %(expires)s.\n"
" "
-#: authentik/stages/email/templates/email/password_reset.txt:1
+#: authentik/stages/email/templates/email/password_reset.txt
#, python-format
msgid "Hi %(username)s,"
msgstr "Bonjour %(username)s,"
-#: authentik/stages/email/templates/email/password_reset.txt:3
+#: authentik/stages/email/templates/email/password_reset.txt
msgid ""
"\n"
"You recently requested to change your password for your authentik account. Use the link below to set a new password.\n"
@@ -2666,7 +2675,7 @@ msgstr ""
"\n"
"Vous avez récemment demandé à changer le mot de passe de votre compte authentik. Utilisez le lien ci-dessous pour définir un nouveau mot de passe.\n"
-#: authentik/stages/email/templates/email/password_reset.txt:7
+#: authentik/stages/email/templates/email/password_reset.txt
#, python-format
msgid ""
"\n"
@@ -2675,11 +2684,11 @@ msgstr ""
"\n"
"Si vous n'avez pas requis de changement de mot de passe, veuillez ignorer cet e-mail. Le lien ci-dessus est valide pendant %(expires)s.\n"
-#: authentik/stages/email/templates/email/setup.html:9
+#: authentik/stages/email/templates/email/setup.html
msgid "authentik Test-Email"
msgstr "Email de Test d'authentik"
-#: authentik/stages/email/templates/email/setup.html:17
+#: authentik/stages/email/templates/email/setup.html
msgid ""
"\n"
" This is a test email to inform you, that you've successfully configured authentik emails.\n"
@@ -2688,7 +2697,7 @@ msgstr ""
"\n"
"Ceci est un email de test pour vous informer que vous avez configuré les emails d'authentik avec succès."
-#: authentik/stages/email/templates/email/setup.txt:2
+#: authentik/stages/email/templates/email/setup.txt
msgid ""
"\n"
"This is a test email to inform you, that you've successfully configured authentik emails.\n"
@@ -2696,13 +2705,13 @@ msgstr ""
"\n"
"Ceci est un email de test pour vous informer que vous avez configuré les emails d'authentik avec succès.\n"
-#: authentik/stages/identification/api.py:20
+#: authentik/stages/identification/api.py
msgid "When no user fields are selected, at least one source must be selected"
msgstr ""
"Quand aucun champ utilisateur n'est sélectionné, au moins une source doit "
"être sélectionnée."
-#: authentik/stages/identification/models.py:29
+#: authentik/stages/identification/models.py
msgid ""
"Fields of the user object to match against. (Hold shift to select multiple "
"options)"
@@ -2710,13 +2719,13 @@ msgstr ""
"Champs de l'objet utilisateur contre lesquels faire correspondre. (Maintenir"
" Majuscule pour sélectionner plusieurs options)"
-#: authentik/stages/identification/models.py:47
+#: authentik/stages/identification/models.py
msgid "When enabled, user fields are matched regardless of their casing."
msgstr ""
"Si activé, les champs de l'utilisateur sont mis en correspondance en "
"ignorant leur casse."
-#: authentik/stages/identification/models.py:52
+#: authentik/stages/identification/models.py
msgid ""
"When a valid username/email has been entered, and this option is enabled, "
"the user's username and avatar will be shown. Otherwise, the text that the "
@@ -2726,7 +2735,7 @@ msgstr ""
"est active, le nom d'utilisateur et l'avatar de l'utilisateur seront "
"affichés. Sinon, le texte que l'utilisateur a saisi sera affiché."
-#: authentik/stages/identification/models.py:60
+#: authentik/stages/identification/models.py
msgid ""
"When enabled, the stage will succeed and continue even when incorrect user "
"info is entered."
@@ -2734,40 +2743,40 @@ msgstr ""
"Lorsqu'activé, l'étape réussira et continuera même lorsque les informations "
"utilisateurs entrées sont invalides."
-#: authentik/stages/identification/models.py:72
+#: authentik/stages/identification/models.py
msgid "Optional enrollment flow, which is linked at the bottom of the page."
msgstr "Flux d'inscription facultatif, qui sera accessible en bas de page."
-#: authentik/stages/identification/models.py:81
+#: authentik/stages/identification/models.py
msgid "Optional recovery flow, which is linked at the bottom of the page."
msgstr "Flux de récupération facultatif, qui sera accessible en bas de page."
-#: authentik/stages/identification/models.py:90
+#: authentik/stages/identification/models.py
msgid "Optional passwordless flow, which is linked at the bottom of the page."
msgstr ""
"Flux sans mot de passe facultatif, qui sera accessible en bas de page."
-#: authentik/stages/identification/models.py:94
+#: authentik/stages/identification/models.py
msgid "Specify which sources should be shown."
msgstr "Spécifie quelles sources doivent être affichées."
-#: authentik/stages/identification/models.py:115
+#: authentik/stages/identification/models.py
msgid "Identification Stage"
msgstr "Étape d'identification"
-#: authentik/stages/identification/models.py:116
+#: authentik/stages/identification/models.py
msgid "Identification Stages"
msgstr "Étapes d'identification"
-#: authentik/stages/identification/stage.py:188
+#: authentik/stages/identification/stage.py
msgid "Log in"
msgstr "Se connecter"
-#: authentik/stages/identification/stage.py:189
+#: authentik/stages/identification/stage.py
msgid "Continue"
msgstr "Continuer"
-#: authentik/stages/invitation/models.py:21
+#: authentik/stages/invitation/models.py
msgid ""
"If this flag is set, this Stage will jump to the next Stage when no "
"Invitation is given. By default this Stage will cancel the Flow when no "
@@ -2776,57 +2785,57 @@ msgstr ""
"Si activé, cette étape passera à l'étape suivante si aucune invitation n'est"
" donnée. Par défaut, cette étape annule le flux en l'absence d'invitation."
-#: authentik/stages/invitation/models.py:44
+#: authentik/stages/invitation/models.py
msgid "Invitation Stage"
msgstr "Étape d'invitation"
-#: authentik/stages/invitation/models.py:45
+#: authentik/stages/invitation/models.py
msgid "Invitation Stages"
msgstr "Étapes d'invitation"
-#: authentik/stages/invitation/models.py:60
+#: authentik/stages/invitation/models.py
msgid "When set, only the configured flow can use this invitation."
msgstr "Si activé, seul le flux configuré peut utilisé cette invitation."
-#: authentik/stages/invitation/models.py:64
+#: authentik/stages/invitation/models.py
msgid "When enabled, the invitation will be deleted after usage."
msgstr "Si activée, l'invitation sera supprimée après utilisation."
-#: authentik/stages/invitation/models.py:71
+#: authentik/stages/invitation/models.py
msgid "Optional fixed data to enforce on user enrollment."
msgstr ""
"Données statiques optionnelles à forcer lors de l'inscription des "
"utilisateurs."
-#: authentik/stages/invitation/models.py:84
+#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Invitation"
-#: authentik/stages/invitation/models.py:85
+#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Invitations"
-#: authentik/stages/invitation/stage.py:62
+#: authentik/stages/invitation/stage.py
msgid "Invalid invite/invite not found"
msgstr "Invitation invalide/invitation introuvable"
-#: authentik/stages/password/models.py:20
+#: authentik/stages/password/models.py
msgid "User database + standard password"
msgstr "Base de données utilisateurs + mots de passe standards"
-#: authentik/stages/password/models.py:24
+#: authentik/stages/password/models.py
msgid "User database + app passwords"
msgstr "Base de données utilisateurs + mots de passes applicatifs"
-#: authentik/stages/password/models.py:28
+#: authentik/stages/password/models.py
msgid "User database + LDAP password"
msgstr "Base de données utilisateurs + mot de passe LDAP"
-#: authentik/stages/password/models.py:38
+#: authentik/stages/password/models.py
msgid "Selection of backends to test the password against."
msgstr "Sélection de backends pour tester le mot de passe."
-#: authentik/stages/password/models.py:43
+#: authentik/stages/password/models.py
msgid ""
"How many attempts a user has before the flow is canceled. To lock the user "
"out, use a reputation policy and a user_write stage."
@@ -2835,37 +2844,37 @@ msgstr ""
"annulé. Pour verrouiller l'utilisateur, utilisez une politique de réputation"
" et une étape user_write."
-#: authentik/stages/password/models.py:75
+#: authentik/stages/password/models.py
msgid "Password Stage"
msgstr "Étape de mot de passe"
-#: authentik/stages/password/models.py:76
+#: authentik/stages/password/models.py
msgid "Password Stages"
msgstr "Étapes de mot de passe"
-#: authentik/stages/password/stage.py:124
+#: authentik/stages/password/stage.py
msgid "Invalid password"
msgstr "Mot de passe invalide"
-#: authentik/stages/prompt/models.py:43
+#: authentik/stages/prompt/models.py
msgid "Text: Simple Text input"
msgstr "Texte : simple champ texte"
-#: authentik/stages/prompt/models.py:45
+#: authentik/stages/prompt/models.py
msgid "Text area: Multiline Text Input."
msgstr "Champ texte : saisie de texte multiligne"
-#: authentik/stages/prompt/models.py:48
+#: authentik/stages/prompt/models.py
msgid "Text (read-only): Simple Text input, but cannot be edited."
msgstr "Texte (lecture seule): Texte Simple, mais ne peut être édité."
-#: authentik/stages/prompt/models.py:52
+#: authentik/stages/prompt/models.py
msgid "Text area (read-only): Multiline Text input, but cannot be edited."
msgstr ""
"Champ texte (lecture seule) : saise de texte multiligne, mais ne peut pas "
"être éditée."
-#: authentik/stages/prompt/models.py:58
+#: authentik/stages/prompt/models.py
msgid ""
"Username: Same as Text input, but checks for and prevents duplicate "
"usernames."
@@ -2873,11 +2882,11 @@ msgstr ""
"Nom d'utilisateur : Identique à la saisie de texte, mais vérifie et empêche "
"les noms d'utilisateur en double."
-#: authentik/stages/prompt/models.py:60
+#: authentik/stages/prompt/models.py
msgid "Email: Text field with Email type."
msgstr "Courriel : champ texte de type email"
-#: authentik/stages/prompt/models.py:64
+#: authentik/stages/prompt/models.py
msgid ""
"Password: Masked input, multiple inputs of this type on the same prompt need"
" to be identical."
@@ -2885,15 +2894,15 @@ msgstr ""
"Mot de passe : saisie de texte cachée, plusieurs champ de ce type sur la "
"même invite doivent être identiques."
-#: authentik/stages/prompt/models.py:71
+#: authentik/stages/prompt/models.py
msgid "Fixed choice field rendered as a group of radio buttons."
msgstr "Champ à choix fixes affiché comme un groupe de boutons radio."
-#: authentik/stages/prompt/models.py:73
+#: authentik/stages/prompt/models.py
msgid "Fixed choice field rendered as a dropdown."
msgstr "Champ à choix fixes affiché comme une liste déroulante."
-#: authentik/stages/prompt/models.py:80
+#: authentik/stages/prompt/models.py
msgid ""
"File: File upload for arbitrary files. File content will be available in "
"flow context as data-URI"
@@ -2901,29 +2910,29 @@ msgstr ""
"Fichier : Upload de fichier pour de fichiers arbitraires. Le contenu du "
"fichier sera disponible dans le contexte du flux comme un data-URI"
-#: authentik/stages/prompt/models.py:85
+#: authentik/stages/prompt/models.py
msgid "Separator: Static Separator Line"
msgstr "Séparateur : Ligne de séparation statique"
-#: authentik/stages/prompt/models.py:86
+#: authentik/stages/prompt/models.py
msgid "Hidden: Hidden field, can be used to insert data into form."
msgstr ""
"Caché : champ caché, peut être utilisé pour insérer des données dans le "
"formulaire."
-#: authentik/stages/prompt/models.py:87
+#: authentik/stages/prompt/models.py
msgid "Static: Static value, displayed as-is."
msgstr "Statique : valeur statique, affichée comme telle."
-#: authentik/stages/prompt/models.py:89
+#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik : sélection des locales prises en charges par authentik"
-#: authentik/stages/prompt/models.py:116
+#: authentik/stages/prompt/models.py
msgid "Name of the form field, also used to store the value"
msgstr "Nom du champ de formulaire, aussi utilisé pour enregistrer la valeur"
-#: authentik/stages/prompt/models.py:124
+#: authentik/stages/prompt/models.py
msgid ""
"Optionally provide a short hint that describes the expected input value. "
"When creating a fixed choice field, enable interpreting as expression and "
@@ -2933,7 +2942,7 @@ msgstr ""
" Lors de la création d'un champ à choix fixes, activer l'interprétation en "
"tant qu'expression et renvoyer une liste des choix."
-#: authentik/stages/prompt/models.py:132
+#: authentik/stages/prompt/models.py
msgid ""
"Optionally pre-fill the input with an initial value. When creating a fixed "
"choice field, enable interpreting as expression and return a list to return "
@@ -2943,53 +2952,53 @@ msgstr ""
"création d'un champ à choix fixes, activer l'interprétation en tant "
"qu'expression et renvoyer une liste des choix par défaut."
-#: authentik/stages/prompt/models.py:321
+#: authentik/stages/prompt/models.py
msgid "Prompt"
msgstr "Invite"
-#: authentik/stages/prompt/models.py:322
+#: authentik/stages/prompt/models.py
msgid "Prompts"
msgstr "Invites"
-#: authentik/stages/prompt/models.py:349
+#: authentik/stages/prompt/models.py
msgid "Prompt Stage"
msgstr "Étape invite"
-#: authentik/stages/prompt/models.py:350
+#: authentik/stages/prompt/models.py
msgid "Prompt Stages"
msgstr "Étapes invite"
-#: authentik/stages/prompt/stage.py:108
+#: authentik/stages/prompt/stage.py
msgid "Passwords don't match."
msgstr "Les mots de passe ne correspondent pas."
-#: authentik/stages/user_delete/models.py:31
+#: authentik/stages/user_delete/models.py
msgid "User Delete Stage"
msgstr "Étape de suppression utilisateur"
-#: authentik/stages/user_delete/models.py:32
+#: authentik/stages/user_delete/models.py
msgid "User Delete Stages"
msgstr "Étapes de suppression utilisateur"
-#: authentik/stages/user_delete/stage.py:18
+#: authentik/stages/user_delete/stage.py
msgid "No Pending User."
msgstr "Aucun utilisateur en attente."
-#: authentik/stages/user_login/models.py:47
+#: authentik/stages/user_login/models.py
msgid "Bind sessions created by this stage to the configured network"
msgstr "Sessions liées créées par cette étape au réseau configuré"
-#: authentik/stages/user_login/models.py:52
+#: authentik/stages/user_login/models.py
msgid "Bind sessions created by this stage to the configured GeoIP location"
msgstr ""
"Sessions liées créées par cette étape à la localisation GeoIP configurée"
-#: authentik/stages/user_login/models.py:55
+#: authentik/stages/user_login/models.py
msgid "Terminate all other sessions of the user logging in."
msgstr ""
"Mettre fin à toutes les autres sessions de l'utilisateur qui se connecte."
-#: authentik/stages/user_login/models.py:61
+#: authentik/stages/user_login/models.py
msgid ""
"Offset the session will be extended by when the user picks the remember me "
"option. Default of 0 means that the remember me option will not be shown. "
@@ -3000,63 +3009,62 @@ msgstr ""
"souvenir de moi ne sera pas proposée. (Format: "
"hours=-1;minutes=-2;seconds=-3)"
-#: authentik/stages/user_login/models.py:84
+#: authentik/stages/user_login/models.py
msgid "User Login Stage"
msgstr "Étape de connexion utlisateur"
-#: authentik/stages/user_login/models.py:85
+#: authentik/stages/user_login/models.py
msgid "User Login Stages"
msgstr "Étapes de connexion utilisateur"
-#: authentik/stages/user_login/stage.py:85
+#: authentik/stages/user_login/stage.py
msgid "No Pending user to login."
msgstr "Pas d'utilisateurs en attente à connecter."
-#: authentik/stages/user_login/stage.py:112
+#: authentik/stages/user_login/stage.py
msgid "Successfully logged in!"
msgstr "Connexion réussie !"
-#: authentik/stages/user_logout/models.py:30
+#: authentik/stages/user_logout/models.py
msgid "User Logout Stage"
msgstr "Étape de déconnexion utlisateur"
-#: authentik/stages/user_logout/models.py:31
+#: authentik/stages/user_logout/models.py
msgid "User Logout Stages"
msgstr "Étapes de déconnexion d'utilisateur"
-#: authentik/stages/user_write/models.py:31
+#: authentik/stages/user_write/models.py
msgid "When set, newly created users are inactive and cannot login."
msgstr ""
"Si défini, les nouveaux utilisateurs seront inactifs et ne pourront pas se "
"connecter."
-#: authentik/stages/user_write/models.py:39
+#: authentik/stages/user_write/models.py
msgid "Optionally add newly created users to this group."
msgstr "Optionnel, ajoute les nouveaux utilisateurs créés à ce groupe."
-#: authentik/stages/user_write/models.py:68
+#: authentik/stages/user_write/models.py
msgid "User Write Stage"
msgstr "Étapes d'écriture utilisateur"
-#: authentik/stages/user_write/models.py:69
+#: authentik/stages/user_write/models.py
msgid "User Write Stages"
msgstr "Étapes d'écriture utilisateur"
-#: authentik/stages/user_write/stage.py:141
+#: authentik/stages/user_write/stage.py
msgid "No Pending data."
msgstr "Aucune donnée en attente."
-#: authentik/stages/user_write/stage.py:147
+#: authentik/stages/user_write/stage.py
msgid "No user found and can't create new user."
msgstr "Utilisateur introuvable et impossible de créer un nouvel utilisateur."
-#: authentik/stages/user_write/stage.py:164
-#: authentik/stages/user_write/stage.py:178
+#: authentik/stages/user_write/stage.py
msgid "Failed to update user. Please try again later."
msgstr ""
"Échec de mise à jour de l'utilisateur. Merci de réessayer ultérieurement,"
-#: authentik/tenants/models.py:29
+#: authentik/tenants/models.py
msgid ""
"Schema name must start with t_, only contain lowercase letters and numbers "
"and be less than 63 characters."
@@ -3064,26 +3072,26 @@ msgstr ""
"Le nom du schema doit commencer par t_, contenir seulement des lettres "
"minuscules et nombre, et être inférieur à 63 caractères."
-#: authentik/tenants/models.py:49
+#: authentik/tenants/models.py
msgid "Configure how authentik should show avatars for users."
msgstr ""
"Configurer comment authentik doit afficher les avatars des utilisateurs."
-#: authentik/tenants/models.py:53
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their name."
msgstr "Activer la possibilité aux utilisateurs de changer leur nom."
-#: authentik/tenants/models.py:56
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their email address."
msgstr ""
"Activer la possibilité aux utilisateurs de changer leur adresse email."
-#: authentik/tenants/models.py:59
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their username."
msgstr ""
"Activer la possibilité aux utilisateurs de changer leur nom d'utilisateur."
-#: authentik/tenants/models.py:65
+#: authentik/tenants/models.py
msgid ""
"Events will be deleted after this duration.(Format: "
"weeks=3;days=2;hours=3,seconds=2)."
@@ -3091,13 +3099,13 @@ msgstr ""
"Les évènements seront supprimés après cet interval. (Format : "
"weeks=3;days=2;hours=3,seconds=2)"
-#: authentik/tenants/models.py:69
+#: authentik/tenants/models.py
msgid "The option configures the footer links on the flow executor pages."
msgstr ""
"Cette option configure les liens du pied de page sur les pages de "
"l'exécuteur de flux."
-#: authentik/tenants/models.py:75
+#: authentik/tenants/models.py
msgid ""
"When enabled, all the events caused by a user will be deleted upon the "
"user's deletion."
@@ -3105,22 +3113,22 @@ msgstr ""
"Lorsqu'activé, tous les évènements causés par un utilisateur seront "
"supprimés lors de la suppression de l'utilisateur."
-#: authentik/tenants/models.py:81
+#: authentik/tenants/models.py
msgid "Globally enable/disable impersonation."
msgstr "Activer/désactiver l'appropriation utilisateur de manière globale."
-#: authentik/tenants/models.py:104
+#: authentik/tenants/models.py
msgid "Tenant"
msgstr "Tenant"
-#: authentik/tenants/models.py:105
+#: authentik/tenants/models.py
msgid "Tenants"
msgstr "Tenants"
-#: authentik/tenants/models.py:125
+#: authentik/tenants/models.py
msgid "Domain"
msgstr "Domaine"
-#: authentik/tenants/models.py:126
+#: authentik/tenants/models.py
msgid "Domains"
msgstr "Domaines"
diff --git a/locale/zh-Hans/LC_MESSAGES/django.mo b/locale/zh-Hans/LC_MESSAGES/django.mo
index 210188f8b7..00317efbfb 100644
Binary files a/locale/zh-Hans/LC_MESSAGES/django.mo and b/locale/zh-Hans/LC_MESSAGES/django.mo differ
diff --git a/locale/zh-Hans/LC_MESSAGES/django.po b/locale/zh-Hans/LC_MESSAGES/django.po
index ffb21e292e..b2da4f46fa 100644
--- a/locale/zh-Hans/LC_MESSAGES/django.po
+++ b/locale/zh-Hans/LC_MESSAGES/django.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-01-26 17:26+0000\n"
+"POT-Creation-Date: 2024-02-14 18:51+0000\n"
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
"Last-Translator: deluxghost, 2024\n"
"Language-Team: Chinese Simplified (https://app.transifex.com/authentik/teams/119923/zh-Hans/)\n"
@@ -24,32 +24,32 @@ msgstr ""
"Language: zh-Hans\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentik/api/schema.py:25
+#: authentik/api/schema.py
msgid "Generic API Error"
msgstr "通用 API 错误"
-#: authentik/api/schema.py:33
+#: authentik/api/schema.py
msgid "Validation Error"
msgstr "校验错误"
-#: authentik/blueprints/api.py:43
+#: authentik/blueprints/api.py
msgid "Blueprint file does not exist"
msgstr "蓝图文件不存在"
-#: authentik/blueprints/api.py:54
+#: authentik/blueprints/api.py
#, python-format
msgid "Failed to validate blueprint: %(logs)s"
msgstr "验证蓝图失败:%(logs)s"
-#: authentik/blueprints/api.py:59
+#: authentik/blueprints/api.py
msgid "Either path or content must be set."
msgstr "必须设置路径或内容。"
-#: authentik/blueprints/models.py:30
+#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "由 authentik 管理"
-#: authentik/blueprints/models.py:32
+#: authentik/blueprints/models.py
msgid ""
"Objects that are managed by authentik. These objects are created and updated"
" automatically. This flag only indicates that an object can be overwritten "
@@ -59,248 +59,255 @@ msgstr ""
"由 authentik 管理的对象。这些对象会自动创建和更新。此标记仅仅表明对象可以被 Migration 覆盖。您仍然可以通过 API "
"修改对象,但这些修改可能会在之后的更新中被覆盖。"
-#: authentik/blueprints/models.py:112
+#: authentik/blueprints/models.py
msgid "Blueprint Instance"
msgstr "蓝图实例"
-#: authentik/blueprints/models.py:113
+#: authentik/blueprints/models.py
msgid "Blueprint Instances"
msgstr "蓝图实例"
-#: authentik/blueprints/v1/exporter.py:62
+#: authentik/blueprints/v1/exporter.py
#, python-format
msgid "authentik Export - %(date)s"
msgstr "authentik 导出 - %(date)s"
-#: authentik/blueprints/v1/tasks.py:145 authentik/crypto/tasks.py:87
+#: authentik/blueprints/v1/tasks.py authentik/crypto/tasks.py
#, python-format
msgid "Successfully imported %(count)d files."
msgstr "已成功导入 %(count)d 个文件。"
-#: authentik/brands/models.py:22
+#: authentik/brands/models.py
msgid ""
"Domain that activates this brand. Can be a superset, i.e. `a.b` for `aa.b` "
"and `ba.b`"
msgstr "激活此品牌的域。可以是超集,即 `a.b` 可以同时表示 `aa.b` 和 `ba.b`"
-#: authentik/brands/models.py:58
+#: authentik/brands/models.py
msgid "Web Certificate used by the authentik Core webserver."
msgstr "authentik 核心 Web 服务器使用的 Web 证书。"
-#: authentik/brands/models.py:84
+#: authentik/brands/models.py
msgid "Brand"
msgstr "品牌"
-#: authentik/brands/models.py:85
+#: authentik/brands/models.py
msgid "Brands"
msgstr "品牌"
-#: authentik/core/api/providers.py:122
+#: authentik/core/api/providers.py
msgid "SAML Provider from Metadata"
msgstr "来自元数据的 SAML 提供程序"
-#: authentik/core/api/providers.py:123
+#: authentik/core/api/providers.py
msgid "Create a SAML Provider by importing its Metadata."
msgstr "通过导入元数据来创建 SAML 提供程序。"
-#: authentik/core/api/users.py:149
+#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
msgstr "不允许前缀或后缀斜线。"
-#: authentik/core/api/users.py:152
+#: authentik/core/api/users.py
msgid "No empty segments in user path allowed."
msgstr "不允许用户路径包含空段。"
-#: authentik/core/models.py:92
+#: authentik/core/models.py
msgid "name"
msgstr "名称"
-#: authentik/core/models.py:94
+#: authentik/core/models.py
msgid "Users added to this group will be superusers."
msgstr "添加到该组的用户均为超级用户。"
-#: authentik/core/models.py:168
+#: authentik/core/models.py
msgid "Group"
msgstr "组"
-#: authentik/core/models.py:169
+#: authentik/core/models.py
msgid "Groups"
msgstr "组"
-#: authentik/core/models.py:184
+#: authentik/core/models.py
msgid "User's display name."
msgstr "用户的显示名称。"
-#: authentik/core/models.py:280 authentik/providers/oauth2/models.py:295
+#: authentik/core/models.py authentik/providers/oauth2/models.py
msgid "User"
msgstr "用户"
-#: authentik/core/models.py:281
+#: authentik/core/models.py
msgid "Users"
msgstr "用户"
-#: authentik/core/models.py:283
-#: authentik/stages/email/templates/email/password_reset.html:28
+#: authentik/core/models.py
+#: authentik/stages/email/templates/email/password_reset.html
msgid "Reset Password"
msgstr "重置密码"
-#: authentik/core/models.py:284
+#: authentik/core/models.py
msgid "Can impersonate other users"
msgstr "可以模拟其他用户的身份"
-#: authentik/core/models.py:285 authentik/rbac/models.py:54
+#: authentik/core/models.py authentik/rbac/models.py
msgid "Can assign permissions to users"
msgstr "可以为用户分配权限"
-#: authentik/core/models.py:286 authentik/rbac/models.py:55
+#: authentik/core/models.py authentik/rbac/models.py
msgid "Can unassign permissions from users"
msgstr "可以取消分配用户的权限"
-#: authentik/core/models.py:308
+#: authentik/core/models.py
+msgid "Can preview user data sent to providers"
+msgstr "可以预览发送给提供程序的用户数据"
+
+#: authentik/core/models.py
+msgid "View applications the user has access to"
+msgstr "查看用户有权访问的应用程序"
+
+#: authentik/core/models.py
msgid ""
"Flow used for authentication when the associated application is accessed by "
"an un-authenticated user."
msgstr "当关联应用程序被未验证身份的用户访问时,用于身份验证的流程。"
-#: authentik/core/models.py:318
+#: authentik/core/models.py
msgid "Flow used when authorizing this provider."
msgstr "授权此提供程序时使用的流程。"
-#: authentik/core/models.py:330
+#: authentik/core/models.py
msgid ""
"Accessed from applications; optional backchannel providers for protocols "
"like LDAP and SCIM."
msgstr "从应用程序访问;为类似 LDAP 和 SCIM 的协议提供的可选反向通道提供程序。"
-#: authentik/core/models.py:385
+#: authentik/core/models.py
msgid "Application's display Name."
msgstr "应用的显示名称。"
-#: authentik/core/models.py:386
+#: authentik/core/models.py
msgid "Internal application name, used in URLs."
msgstr "应用的内部名称,在 URL 中使用。"
-#: authentik/core/models.py:398
+#: authentik/core/models.py
msgid "Open launch URL in a new browser tab or window."
msgstr "在新浏览器标签页或窗口中打开启动 URL。"
-#: authentik/core/models.py:462
+#: authentik/core/models.py
msgid "Application"
msgstr "应用程序"
-#: authentik/core/models.py:463
+#: authentik/core/models.py
msgid "Applications"
msgstr "应用程序"
-#: authentik/core/models.py:469
+#: authentik/core/models.py
msgid "Use the source-specific identifier"
msgstr "使用源特定的标识符"
-#: authentik/core/models.py:471
+#: authentik/core/models.py
msgid ""
"Link to a user with identical email address. Can have security implications "
"when a source doesn't validate email addresses."
msgstr "链接到电子邮件地址相同的用户。当源不验证电子邮件地址时,可能会有安全隐患。"
-#: authentik/core/models.py:475
+#: authentik/core/models.py
msgid ""
"Use the user's email address, but deny enrollment when the email address "
"already exists."
msgstr "使用用户的电子邮件地址,但在电子邮件地址已存在时拒绝注册。"
-#: authentik/core/models.py:478
+#: authentik/core/models.py
msgid ""
"Link to a user with identical username. Can have security implications when "
"a username is used with another source."
msgstr "链接到用户名相同的用户。当其他源使用相同用户名时,可能会有安全隐患。"
-#: authentik/core/models.py:482
+#: authentik/core/models.py
msgid ""
"Use the user's username, but deny enrollment when the username already "
"exists."
msgstr "使用用户的用户名,但在用户名已存在时拒绝注册。"
-#: authentik/core/models.py:489
+#: authentik/core/models.py
msgid "Source's display Name."
msgstr "源的显示名称。"
-#: authentik/core/models.py:490
+#: authentik/core/models.py
msgid "Internal source name, used in URLs."
msgstr "源的内部名称,在 URL 中使用。"
-#: authentik/core/models.py:509
+#: authentik/core/models.py
msgid "Flow to use when authenticating existing users."
msgstr "认证已存在用户时所使用的流程。"
-#: authentik/core/models.py:518
+#: authentik/core/models.py
msgid "Flow to use when enrolling new users."
msgstr "新用户注册的流程。"
-#: authentik/core/models.py:526
+#: authentik/core/models.py
msgid ""
"How the source determines if an existing user should be authenticated or a "
"new user enrolled."
msgstr "源怎样确定应该验证已有用户的身份还是注册新用户。"
-#: authentik/core/models.py:698
+#: authentik/core/models.py
msgid "Token"
msgstr "令牌"
-#: authentik/core/models.py:699
+#: authentik/core/models.py
msgid "Tokens"
msgstr "令牌"
-#: authentik/core/models.py:704
+#: authentik/core/models.py
msgid "View token's key"
msgstr "查看令牌密钥"
-#: authentik/core/models.py:740
+#: authentik/core/models.py
msgid "Property Mapping"
msgstr "属性映射"
-#: authentik/core/models.py:741
+#: authentik/core/models.py
msgid "Property Mappings"
msgstr "属性映射"
-#: authentik/core/models.py:778
+#: authentik/core/models.py
msgid "Authenticated Session"
msgstr "已认证会话"
-#: authentik/core/models.py:779
+#: authentik/core/models.py
msgid "Authenticated Sessions"
msgstr "已认证会话"
-#: authentik/core/sources/flow_manager.py:190
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid ""
"Request to authenticate with %(source)s has been denied. Please authenticate"
" with the source you've previously signed up with."
msgstr "来自 %(source)s 的身份验证请求被拒绝。请用您注册时使用的方式验证身份。"
-#: authentik/core/sources/flow_manager.py:242
+#: authentik/core/sources/flow_manager.py
msgid "Configured flow does not exist."
msgstr "配置的流程不存在。"
-#: authentik/core/sources/flow_manager.py:272
-#: authentik/core/sources/flow_manager.py:324
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid "Successfully authenticated with %(source)s!"
msgstr "成功通过 %(source)s 认证!"
-#: authentik/core/sources/flow_manager.py:296
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid "Successfully linked %(source)s!"
msgstr "成功链接 %(source)s!"
-#: authentik/core/sources/flow_manager.py:315
+#: authentik/core/sources/flow_manager.py
msgid "Source is not configured for enrollment."
msgstr "源未被配置用于注册。"
-#: authentik/core/templates/if/end_session.html:7
+#: authentik/core/templates/if/end_session.html
msgid "End session"
msgstr "结束会话"
-#: authentik/core/templates/if/end_session.html:11
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -309,7 +316,7 @@ msgstr ""
"\n"
"您已登出 %(application)s。\n"
-#: authentik/core/templates/if/end_session.html:19
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -319,11 +326,11 @@ msgstr ""
"\n"
" 您已成功登出 %(application)s 。现在您可以返回总览页来启动其他应用,或者登出您的 %(branding_title)s 账户。"
-#: authentik/core/templates/if/end_session.html:25
+#: authentik/core/templates/if/end_session.html
msgid "Go back to overview"
msgstr "返回总览"
-#: authentik/core/templates/if/end_session.html:29
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -334,7 +341,7 @@ msgstr ""
" 登出 %(branding_title)s\n"
" "
-#: authentik/core/templates/if/end_session.html:36
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -345,361 +352,367 @@ msgstr ""
" 重新登录 %(application)s\n"
" "
-#: authentik/core/templates/if/error.html:18
+#: authentik/core/templates/if/error.html
msgid "Go home"
msgstr "前往首页"
-#: authentik/core/templates/login/base_full.html:75
+#: authentik/core/templates/login/base_full.html
msgid "Powered by authentik"
msgstr "由 authentik 强力驱动"
-#: authentik/core/views/apps.py:53
-#: authentik/providers/oauth2/views/authorize.py:434
-#: authentik/providers/oauth2/views/device_init.py:70
-#: authentik/providers/saml/views/sso.py:70
+#: authentik/core/views/apps.py authentik/providers/oauth2/views/authorize.py
+#: authentik/providers/oauth2/views/device_init.py
+#: authentik/providers/saml/views/sso.py
#, python-format
msgid "You're about to sign into %(application)s."
msgstr "您即将登录 %(application)s。"
-#: authentik/crypto/api.py:179
+#: authentik/crypto/api.py
msgid "Subject-alt name"
msgstr "替代名称"
-#: authentik/crypto/models.py:30
+#: authentik/crypto/models.py
msgid "PEM-encoded Certificate data"
msgstr "PEM 编码的证书数据"
-#: authentik/crypto/models.py:33
+#: authentik/crypto/models.py
msgid ""
"Optional Private Key. If this is set, you can use this keypair for "
"encryption."
msgstr "可选私钥。如果设置,则可以使用此密钥对来加密。"
-#: authentik/crypto/models.py:101
+#: authentik/crypto/models.py
msgid "Certificate-Key Pair"
msgstr "证书密钥对"
-#: authentik/crypto/models.py:102
+#: authentik/crypto/models.py
msgid "Certificate-Key Pairs"
msgstr "证书密钥对"
-#: authentik/enterprise/api.py:33
+#: authentik/enterprise/api.py
msgid "Enterprise is required to create/update this object."
msgstr "创建/更新此对象需要企业版。"
-#: authentik/enterprise/models.py:183
+#: authentik/enterprise/models.py
msgid "License"
msgstr "许可证"
-#: authentik/enterprise/models.py:184
+#: authentik/enterprise/models.py
msgid "Licenses"
msgstr "许可证"
-#: authentik/enterprise/models.py:206
+#: authentik/enterprise/models.py
msgid "License Usage"
msgstr "许可证使用情况"
-#: authentik/enterprise/models.py:207
+#: authentik/enterprise/models.py
msgid "License Usage Records"
msgstr "许可证使用情况记录"
-#: authentik/enterprise/policy.py:18
+#: authentik/enterprise/policy.py
msgid "Enterprise required to access this feature."
msgstr "访问此功能需要企业版。"
-#: authentik/enterprise/policy.py:20
+#: authentik/enterprise/policy.py
msgid "Feature only accessible for internal users."
msgstr "仅内部用户能访问此功能。"
-#: authentik/enterprise/providers/rac/models.py:48
-#: authentik/stages/user_login/models.py:39
+#: authentik/enterprise/providers/rac/models.py
+#: authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
"lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)"
msgstr "确定会话持续多长时间。默认值为 0 表示会话持续到浏览器关闭为止。(格式:hours=-1;minutes=-2;seconds=-3)"
-#: authentik/enterprise/providers/rac/models.py:71
+#: authentik/enterprise/providers/rac/models.py
+msgid "When set to true, connection tokens will be deleted upon disconnect."
+msgstr "启用时,连接令牌将会在断开连接时被删除。"
+
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Provider"
msgstr "RAC 提供程序"
-#: authentik/enterprise/providers/rac/models.py:72
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Providers"
msgstr "RAC 提供程序"
-#: authentik/enterprise/providers/rac/models.py:100
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Endpoint"
msgstr "RAC 端点"
-#: authentik/enterprise/providers/rac/models.py:101
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Endpoints"
msgstr "RAC 端点"
-#: authentik/enterprise/providers/rac/models.py:122
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Property Mapping"
msgstr "RAC 属性映射"
-#: authentik/enterprise/providers/rac/models.py:123
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Property Mappings"
msgstr "RAC 属性映射"
-#: authentik/enterprise/providers/rac/views.py:108
+#: authentik/enterprise/providers/rac/models.py
+msgid "RAC Connection token"
+msgstr "RAC 连接令牌"
+
+#: authentik/enterprise/providers/rac/models.py
+msgid "RAC Connection tokens"
+msgstr "RAC 连接令牌"
+
+#: authentik/enterprise/providers/rac/views.py
msgid "Maximum connection limit reached."
msgstr "已达到最大连接数。"
-#: authentik/enterprise/providers/rac/views.py:112
+#: authentik/enterprise/providers/rac/views.py
msgid "(You are already connected in another tab/window)"
msgstr "(您已经在另一个标签页/窗口连接了)"
-#: authentik/events/api/tasks.py:100
+#: authentik/events/api/tasks.py
#, python-format
msgid "Successfully started task %(name)s."
msgstr "已成功开始任务 %(name)s。"
-#: authentik/events/models.py:304
+#: authentik/events/models.py
msgid "Event"
msgstr "事件"
-#: authentik/events/models.py:305
+#: authentik/events/models.py
msgid "Events"
msgstr "事件"
-#: authentik/events/models.py:311
+#: authentik/events/models.py
msgid "authentik inbuilt notifications"
msgstr "authentik 内置通知"
-#: authentik/events/models.py:312
+#: authentik/events/models.py
msgid "Generic Webhook"
msgstr "通用 Webhook"
-#: authentik/events/models.py:313
+#: authentik/events/models.py
msgid "Slack Webhook (Slack/Discord)"
msgstr "Slack Webhook(Slack/Discord)"
-#: authentik/events/models.py:314
+#: authentik/events/models.py
msgid "Email"
msgstr "电子邮箱"
-#: authentik/events/models.py:332
+#: authentik/events/models.py
msgid ""
"Only send notification once, for example when sending a webhook into a chat "
"channel."
msgstr "仅发送一次通知,例如在向聊天频道发送 Webhook 时。"
-#: authentik/events/models.py:397
+#: authentik/events/models.py
msgid "Severity"
msgstr "严重程度"
-#: authentik/events/models.py:402
+#: authentik/events/models.py
msgid "Dispatched for user"
msgstr "为用户分派"
-#: authentik/events/models.py:411
+#: authentik/events/models.py
msgid "Event user"
msgstr "事件用户"
-#: authentik/events/models.py:505
+#: authentik/events/models.py
msgid "Notification Transport"
msgstr "通知传输"
-#: authentik/events/models.py:506
+#: authentik/events/models.py
msgid "Notification Transports"
msgstr "通知传输"
-#: authentik/events/models.py:512
+#: authentik/events/models.py
msgid "Notice"
msgstr "通知"
-#: authentik/events/models.py:513
+#: authentik/events/models.py
msgid "Warning"
msgstr "警告"
-#: authentik/events/models.py:514
+#: authentik/events/models.py
msgid "Alert"
msgstr "注意"
-#: authentik/events/models.py:539
+#: authentik/events/models.py
msgid "Notification"
msgstr "通知"
-#: authentik/events/models.py:540
+#: authentik/events/models.py
msgid "Notifications"
msgstr "通知"
-#: authentik/events/models.py:550
+#: authentik/events/models.py
msgid ""
"Select which transports should be used to notify the user. If none are "
"selected, the notification will only be shown in the authentik UI."
msgstr "选择应使用哪些传输方式来通知用户。如果未选择任何内容,则通知将仅显示在 authentik UI 中。"
-#: authentik/events/models.py:558
+#: authentik/events/models.py
msgid "Controls which severity level the created notifications will have."
msgstr "控制被创建的通知的严重性级别。"
-#: authentik/events/models.py:563
+#: authentik/events/models.py
msgid ""
"Define which group of users this notification should be sent and shown to. "
"If left empty, Notification won't ben sent."
msgstr "定义此通知应该发送到哪些用户组。如果留空,则不会发送通知。"
-#: authentik/events/models.py:581
+#: authentik/events/models.py
msgid "Notification Rule"
msgstr "通知规则"
-#: authentik/events/models.py:582
+#: authentik/events/models.py
msgid "Notification Rules"
msgstr "通知规则"
-#: authentik/events/models.py:602
+#: authentik/events/models.py
msgid "Webhook Mapping"
msgstr "Webhook 映射"
-#: authentik/events/models.py:603
+#: authentik/events/models.py
msgid "Webhook Mappings"
msgstr "Webhook 映射"
-#: authentik/events/models.py:668
+#: authentik/events/models.py
msgid "Run task"
msgstr "运行任务"
-#: authentik/events/models.py:669
+#: authentik/events/models.py
msgid "System Task"
msgstr "系统任务"
-#: authentik/events/models.py:670
+#: authentik/events/models.py
msgid "System Tasks"
msgstr "系统任务"
-#: authentik/events/system_tasks.py:126
+#: authentik/events/system_tasks.py
msgid "Task has not been run yet."
msgstr "任务尚未运行。"
-#: authentik/flows/api/flows.py:295
+#: authentik/flows/api/flows.py
#, python-format
msgid "Flow not applicable to current user/request: %(messages)s"
msgstr "流程不适用于当前用户/请求:%(messages)s"
-#: authentik/flows/api/flows_diagram.py:68
-#: authentik/flows/api/flows_diagram.py:94
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Policy (%(type)s)"
msgstr "策略(%(type)s)"
-#: authentik/flows/api/flows_diagram.py:71
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Binding %(order)d"
msgstr "绑定 %(order)d"
-#: authentik/flows/api/flows_diagram.py:118
+#: authentik/flows/api/flows_diagram.py
msgid "Policy passed"
msgstr "策略通过"
-#: authentik/flows/api/flows_diagram.py:122
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Stage (%(type)s)"
msgstr "阶段(%(type)s)"
-#: authentik/flows/api/flows_diagram.py:146
-#: authentik/flows/api/flows_diagram.py:206
+#: authentik/flows/api/flows_diagram.py
msgid "Policy denied"
msgstr "策略拒绝"
-#: authentik/flows/api/flows_diagram.py:156
-#: authentik/flows/api/flows_diagram.py:168
-#: authentik/flows/api/flows_diagram.py:205
-#: authentik/flows/api/flows_diagram.py:227
+#: authentik/flows/api/flows_diagram.py
msgid "End of the flow"
msgstr "流程结束"
-#: authentik/flows/api/flows_diagram.py:169
+#: authentik/flows/api/flows_diagram.py
msgid "Requirement not fulfilled"
msgstr "需求条件未达成"
-#: authentik/flows/api/flows_diagram.py:177
+#: authentik/flows/api/flows_diagram.py
msgid "Flow authentication requirement"
msgstr "流程身份验证需求"
-#: authentik/flows/api/flows_diagram.py:183
+#: authentik/flows/api/flows_diagram.py
msgid "Requirement fulfilled"
msgstr "需求条件已达成"
-#: authentik/flows/api/flows_diagram.py:196
+#: authentik/flows/api/flows_diagram.py
msgid "Pre-flow policies"
msgstr "流程前置策略"
-#: authentik/flows/api/flows_diagram.py:214 authentik/flows/models.py:194
+#: authentik/flows/api/flows_diagram.py authentik/flows/models.py
msgid "Flow"
msgstr "流程"
-#: authentik/flows/exceptions.py:19
+#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "流程不应用于当前用户。"
-#: authentik/flows/models.py:115
+#: authentik/flows/models.py
#, python-format
msgid "Dynamic In-memory stage: %(doc)s"
msgstr "动态内存中阶段:%(doc)s"
-#: authentik/flows/models.py:130
+#: authentik/flows/models.py
msgid "Visible in the URL."
msgstr "在 URL 中可见。"
-#: authentik/flows/models.py:132
+#: authentik/flows/models.py
msgid "Shown as the Title in Flow pages."
msgstr "显示为流程页面中的标题。"
-#: authentik/flows/models.py:139
+#: authentik/flows/models.py
msgid ""
"Decides what this Flow is used for. For example, the Authentication flow is "
"redirect to when an un-authenticated user visits authentik."
msgstr "决定此流程的用途。例如,当未经身份验证的用户访问 authentik 时,会重定向到身份验证流程。"
-#: authentik/flows/models.py:148
+#: authentik/flows/models.py
msgid "Background shown during execution"
msgstr "执行时的背景"
-#: authentik/flows/models.py:155
+#: authentik/flows/models.py
msgid ""
"Enable compatibility mode, increases compatibility with password managers on"
" mobile devices."
msgstr "启用兼容模式,增强与移动设备上密码管理器的兼容性。"
-#: authentik/flows/models.py:163
+#: authentik/flows/models.py
msgid "Configure what should happen when a flow denies access to a user."
msgstr "配置当流程拒绝访问一名用户时应该发生什么。"
-#: authentik/flows/models.py:169
+#: authentik/flows/models.py
msgid "Required level of authentication and authorization to access a flow."
msgstr "需要身份验证和授权等级以访问流程。"
-#: authentik/flows/models.py:195
+#: authentik/flows/models.py
msgid "Flows"
msgstr "流程"
-#: authentik/flows/models.py:198
+#: authentik/flows/models.py
msgid "Can export a Flow"
msgstr "可以导出流程"
-#: authentik/flows/models.py:199
+#: authentik/flows/models.py
msgid "Can inspect a Flow's execution"
msgstr "可以检视流程执行"
-#: authentik/flows/models.py:200
+#: authentik/flows/models.py
msgid "View Flow's cache metrics"
msgstr "查看流程缓存指标"
-#: authentik/flows/models.py:201
+#: authentik/flows/models.py
msgid "Clear Flow's cache metrics"
msgstr "清除流程缓存指标"
-#: authentik/flows/models.py:217
+#: authentik/flows/models.py
msgid "Evaluate policies during the Flow planning process."
msgstr "在流程规划过程中评估策略。"
-#: authentik/flows/models.py:221
+#: authentik/flows/models.py
msgid "Evaluate policies when the Stage is present to the user."
msgstr "在阶段呈现给用户时评估策略。"
-#: authentik/flows/models.py:228
+#: authentik/flows/models.py
msgid ""
"Configure how the flow executor should handle an invalid response to a "
"challenge. RETRY returns the error message and a similar challenge to the "
@@ -709,62 +722,62 @@ msgstr ""
"配置流程执行器应如何处理对质询的无效响应。RETRY 向执行器返回错误消息和类似的质询。RESTART "
"从头开始重新启动流程,RESTART_WITH_CONTEXT 在保留当前上下文的同时重新启动流程。"
-#: authentik/flows/models.py:251
+#: authentik/flows/models.py
msgid "Flow Stage Binding"
msgstr "流程阶段绑定"
-#: authentik/flows/models.py:252
+#: authentik/flows/models.py
msgid "Flow Stage Bindings"
msgstr "流程阶段绑定"
-#: authentik/flows/models.py:267
+#: authentik/flows/models.py
msgid ""
"Flow used by an authenticated user to configure this Stage. If empty, user "
"will not be able to configure this stage."
msgstr "经过身份验证的用户用来配置此阶段的流程。如果为空,用户将无法配置此阶段。"
-#: authentik/flows/models.py:307
+#: authentik/flows/models.py
msgid "Flow Token"
msgstr "流程令牌"
-#: authentik/flows/models.py:308
+#: authentik/flows/models.py
msgid "Flow Tokens"
msgstr "流程令牌"
-#: authentik/lib/utils/time.py:27
+#: authentik/lib/utils/time.py
#, python-format
msgid "%(value)s is not in the correct format of 'hours=3;minutes=1'."
msgstr "%(value)s 的格式不正确,应为 'hours=3;minutes=1'。"
-#: authentik/lib/validators.py:16
+#: authentik/lib/validators.py
#, python-brace-format
msgid "The fields {field_names} must be used together."
msgstr "字段 {field_names} 必须一同使用。"
-#: authentik/outposts/api/service_connections.py:127
+#: authentik/outposts/api/service_connections.py
msgid ""
"You can only use an empty kubeconfig when connecting to a local cluster."
msgstr "您只能在连接到本地集群时使用空的 kubeconfig。"
-#: authentik/outposts/api/service_connections.py:135
+#: authentik/outposts/api/service_connections.py
msgid "Invalid kubeconfig"
msgstr "无效 kubeconfig "
-#: authentik/outposts/models.py:123
+#: authentik/outposts/models.py
msgid ""
"If enabled, use the local connection. Required Docker socket/Kubernetes "
"Integration"
msgstr "如果启用,则使用本地连接。需要 Docker Socket / Kubernetes 集成"
-#: authentik/outposts/models.py:153
+#: authentik/outposts/models.py
msgid "Outpost Service-Connection"
msgstr "前哨服务连接"
-#: authentik/outposts/models.py:154
+#: authentik/outposts/models.py
msgid "Outpost Service-Connections"
msgstr "前哨服务连接"
-#: authentik/outposts/models.py:162
+#: authentik/outposts/models.py
msgid ""
"Can be in the format of 'unix://' when connecting to a local docker "
"daemon, or 'https://:2376' when connecting to a remote system."
@@ -772,271 +785,270 @@ msgstr ""
"当连接到本地 Docker "
"守护进程时,可以使用“unix://”格式,或者在连接远程系统时,使用“https://:2376”格式。"
-#: authentik/outposts/models.py:174
+#: authentik/outposts/models.py
msgid ""
"CA which the endpoint's Certificate is verified against. Can be left empty "
"for no validation."
msgstr "验证端点证书所依据的 CA。可以留空,表示不进行验证。"
-#: authentik/outposts/models.py:186
+#: authentik/outposts/models.py
msgid ""
"Certificate/Key used for authentication. Can be left empty for no "
"authentication."
msgstr "用于身份验证的证书/密钥。可以留空表示不验证。"
-#: authentik/outposts/models.py:204
+#: authentik/outposts/models.py
msgid "Docker Service-Connection"
msgstr "Docker 服务连接"
-#: authentik/outposts/models.py:205
+#: authentik/outposts/models.py
msgid "Docker Service-Connections"
msgstr "Docker 服务连接"
-#: authentik/outposts/models.py:213
+#: authentik/outposts/models.py
msgid ""
"Paste your kubeconfig here. authentik will automatically use the currently "
"selected context."
msgstr "在这里粘贴您的 kubeconfig。authentik 会自动使用当前选择的上下文。"
-#: authentik/outposts/models.py:219
+#: authentik/outposts/models.py
msgid "Verify SSL Certificates of the Kubernetes API endpoint"
msgstr "验证 Kubernetes API 端点的 SSL 证书"
-#: authentik/outposts/models.py:236
+#: authentik/outposts/models.py
msgid "Kubernetes Service-Connection"
msgstr "Kubernetes 服务连接"
-#: authentik/outposts/models.py:237
+#: authentik/outposts/models.py
msgid "Kubernetes Service-Connections"
msgstr "Kubernetes 服务连接"
-#: authentik/outposts/models.py:253
+#: authentik/outposts/models.py
msgid ""
"Select Service-Connection authentik should use to manage this outpost. Leave"
" empty if authentik should not handle the deployment."
msgstr "选择 authentik 在管理此前哨时需要使用的服务连接。如果 authentik 不应该处理此部署,则应该留空。"
-#: authentik/outposts/models.py:420
+#: authentik/outposts/models.py
msgid "Outpost"
msgstr "前哨"
-#: authentik/outposts/models.py:421
+#: authentik/outposts/models.py
msgid "Outposts"
msgstr "前哨"
-#: authentik/policies/denied.py:24
+#: authentik/policies/denied.py
msgid "Access denied"
msgstr "访问被拒绝"
-#: authentik/policies/dummy/models.py:44
+#: authentik/policies/dummy/models.py
msgid "Dummy Policy"
msgstr "虚拟策略"
-#: authentik/policies/dummy/models.py:45
+#: authentik/policies/dummy/models.py
msgid "Dummy Policies"
msgstr "虚拟策略"
-#: authentik/policies/event_matcher/api.py:20
-#: authentik/policies/event_matcher/models.py:56
+#: authentik/policies/event_matcher/api.py
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match events created by selected application. When left empty, all "
"applications are matched."
msgstr "匹配选定应用程序创建的事件。如果留空,则匹配所有应用程序。"
-#: authentik/policies/event_matcher/api.py:29
-#: authentik/policies/event_matcher/models.py:64
+#: authentik/policies/event_matcher/api.py
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match events created by selected model. When left empty, all models are "
"matched. When an app is selected, all the application's models are matched."
msgstr "匹配选定模型创建的事件。如果留空,则匹配所有模型。选择应用程序后,则匹配该应用程序的所有模型。"
-#: authentik/policies/event_matcher/api.py:42
+#: authentik/policies/event_matcher/api.py
msgid "At least one criteria must be set."
msgstr "必须至少设置一项标准。"
-#: authentik/policies/event_matcher/models.py:48
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match created events with this action type. When left empty, all action "
"types will be matched."
msgstr "将创建的事件与此操作类型匹配。留空时,所有操作类型都将匹配。"
-#: authentik/policies/event_matcher/models.py:73
+#: authentik/policies/event_matcher/models.py
msgid ""
"Matches Event's Client IP (strict matching, for network matching use an "
"Expression Policy)"
msgstr "匹配事件的客户端 IP(严格匹配,要匹配网段请使用表达式策略)"
-#: authentik/policies/event_matcher/models.py:143
+#: authentik/policies/event_matcher/models.py
msgid "Event Matcher Policy"
msgstr "事件匹配策略"
-#: authentik/policies/event_matcher/models.py:144
+#: authentik/policies/event_matcher/models.py
msgid "Event Matcher Policies"
msgstr "事件匹配策略"
-#: authentik/policies/expiry/models.py:45
+#: authentik/policies/expiry/models.py
#, python-format
msgid "Password expired %(days)d days ago. Please update your password."
msgstr "密码在 %(days)d 天前过期。请更新您的密码。"
-#: authentik/policies/expiry/models.py:49
+#: authentik/policies/expiry/models.py
msgid "Password has expired."
msgstr "密码已过期。"
-#: authentik/policies/expiry/models.py:53
+#: authentik/policies/expiry/models.py
msgid "Password Expiry Policy"
msgstr "密码过期策略"
-#: authentik/policies/expiry/models.py:54
+#: authentik/policies/expiry/models.py
msgid "Password Expiry Policies"
msgstr "密码过期策略"
-#: authentik/policies/expression/models.py:40
+#: authentik/policies/expression/models.py
msgid "Expression Policy"
msgstr "表达式策略"
-#: authentik/policies/expression/models.py:41
+#: authentik/policies/expression/models.py
msgid "Expression Policies"
msgstr "表达式策略"
-#: authentik/policies/models.py:22
+#: authentik/policies/models.py
msgid "all, all policies must pass"
msgstr "All,必须通过所有策略"
-#: authentik/policies/models.py:23
+#: authentik/policies/models.py
msgid "any, any policy must pass"
msgstr "Any,必须通过任意策略"
-#: authentik/policies/models.py:46
+#: authentik/policies/models.py
msgid "Policy Binding Model"
msgstr "策略绑定模型"
-#: authentik/policies/models.py:47
+#: authentik/policies/models.py
msgid "Policy Binding Models"
msgstr "策略绑定模型"
-#: authentik/policies/models.py:86
+#: authentik/policies/models.py
msgid "Negates the outcome of the policy. Messages are unaffected."
msgstr "反转策略的结果。消息不受影响。"
-#: authentik/policies/models.py:89
+#: authentik/policies/models.py
msgid "Timeout after which Policy execution is terminated."
msgstr "策略执行终止的超时时间。"
-#: authentik/policies/models.py:92
+#: authentik/policies/models.py
msgid "Result if the Policy execution fails."
msgstr "策略执行失败时的结果。"
-#: authentik/policies/models.py:145
+#: authentik/policies/models.py
msgid "Policy Binding"
msgstr "策略绑定"
-#: authentik/policies/models.py:146
+#: authentik/policies/models.py
msgid "Policy Bindings"
msgstr "策略绑定"
-#: authentik/policies/models.py:167
+#: authentik/policies/models.py
msgid ""
"When this option is enabled, all executions of this policy will be logged. "
"By default, only execution errors are logged."
msgstr "启用此选项后,将记录此策略的所有执行日志。默认情况下,只记录执行错误。"
-#: authentik/policies/models.py:189
+#: authentik/policies/models.py
msgid "Policy"
msgstr "策略"
-#: authentik/policies/models.py:190
+#: authentik/policies/models.py
msgid "Policies"
msgstr "策略"
-#: authentik/policies/models.py:193
+#: authentik/policies/models.py
msgid "View Policy's cache metrics"
msgstr "查看策略缓存指标"
-#: authentik/policies/models.py:194
+#: authentik/policies/models.py
msgid "Clear Policy's cache metrics"
msgstr "清除策略缓存指标"
-#: authentik/policies/password/models.py:27
+#: authentik/policies/password/models.py
msgid "Field key to check, field keys defined in Prompt stages are available."
msgstr "要检查的字段键,可以使用输入阶段中定义的字段键。"
-#: authentik/policies/password/models.py:44
+#: authentik/policies/password/models.py
msgid "How many times the password hash is allowed to be on haveibeenpwned"
msgstr "密码哈希允许出现在 HaveIBeenPwned 中多少次"
-#: authentik/policies/password/models.py:49
+#: authentik/policies/password/models.py
msgid ""
"If the zxcvbn score is equal or less than this value, the policy will fail."
msgstr "如果 zxcvbn 分数小于等于此值,则策略失败。"
-#: authentik/policies/password/models.py:72
+#: authentik/policies/password/models.py
msgid "Password not set in context"
msgstr "未在上下文中设置密码"
-#: authentik/policies/password/models.py:134
+#: authentik/policies/password/models.py
#, python-format
msgid "Password exists on %(count)d online lists."
msgstr "%(count)d 个在线列表中存在密码。"
-#: authentik/policies/password/models.py:154
+#: authentik/policies/password/models.py
msgid "Password is too weak."
msgstr "密码太弱。"
-#: authentik/policies/password/models.py:162
+#: authentik/policies/password/models.py
msgid "Password Policy"
msgstr "密码策略"
-#: authentik/policies/password/models.py:163
+#: authentik/policies/password/models.py
msgid "Password Policies"
msgstr "密码策略"
-#: authentik/policies/reputation/api.py:18
+#: authentik/policies/reputation/api.py
msgid "Either IP or Username must be checked"
msgstr "必须检查 IP 或用户名"
-#: authentik/policies/reputation/models.py:67
+#: authentik/policies/reputation/models.py
msgid "Reputation Policy"
msgstr "信誉策略"
-#: authentik/policies/reputation/models.py:68
+#: authentik/policies/reputation/models.py
msgid "Reputation Policies"
msgstr "信誉策略"
-#: authentik/policies/reputation/models.py:96
+#: authentik/policies/reputation/models.py
msgid "Reputation Score"
msgstr "信誉分数"
-#: authentik/policies/reputation/models.py:97
+#: authentik/policies/reputation/models.py
msgid "Reputation Scores"
msgstr "信誉分数"
-#: authentik/policies/templates/policies/denied.html:7
-#: authentik/policies/templates/policies/denied.html:11
+#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "权限被拒绝"
-#: authentik/policies/templates/policies/denied.html:21
+#: authentik/policies/templates/policies/denied.html
msgid "User's avatar"
msgstr "用户的头像"
-#: authentik/policies/templates/policies/denied.html:25
+#: authentik/policies/templates/policies/denied.html
msgid "Not you?"
msgstr "不是您?"
-#: authentik/policies/templates/policies/denied.html:33
+#: authentik/policies/templates/policies/denied.html
msgid "Request has been denied."
msgstr "请求被拒绝。"
-#: authentik/policies/templates/policies/denied.html:44
+#: authentik/policies/templates/policies/denied.html
msgid "Messages:"
msgstr "消息:"
-#: authentik/policies/templates/policies/denied.html:54
+#: authentik/policies/templates/policies/denied.html
msgid "Explanation:"
msgstr "解释:"
-#: authentik/policies/templates/policies/denied.html:58
+#: authentik/policies/templates/policies/denied.html
#, python-format
msgid ""
"\n"
@@ -1047,21 +1059,21 @@ msgstr ""
" 策略绑定 '%(name)s' 返回结果 '%(result)s'\n"
" "
-#: authentik/policies/views.py:68
+#: authentik/policies/views.py
msgid "Failed to resolve application"
msgstr "解析应用程序失败"
-#: authentik/providers/ldap/models.py:25
+#: authentik/providers/ldap/models.py
msgid "DN under which objects are accessible."
msgstr "可访问对象的 DN。"
-#: authentik/providers/ldap/models.py:34
+#: authentik/providers/ldap/models.py
msgid ""
"Users in this group can do search queries. If not set, every user can "
"execute search queries."
msgstr "该组中的用户可以执行搜索查询。如果未设置,则每个用户都可以执行搜索查询。"
-#: authentik/providers/ldap/models.py:53
+#: authentik/providers/ldap/models.py
msgid ""
"The start for uidNumbers, this number is added to the user.pk to make sure "
"that the numbers aren't too low for POSIX users. Default is 2000 to ensure "
@@ -1070,7 +1082,7 @@ msgstr ""
"起始 uidNumbers,这个数字会被添加到 user.pk 中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 "
"2000,以确保我们不会与本地用户的 uidNumber 发生冲突"
-#: authentik/providers/ldap/models.py:62
+#: authentik/providers/ldap/models.py
msgid ""
"The start for gidNumbers, this number is added to a number generated from "
"the group.pk to make sure that the numbers aren't too low for POSIX groups. "
@@ -1080,8 +1092,7 @@ msgstr ""
"起始 gidNumbers,这个数字会被添加到从 group.pk 生成的数字中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 "
"4000,以确保我们不会与本地群组或用户主组的 gidNumber 发生冲突"
-#: authentik/providers/ldap/models.py:76
-#: authentik/providers/radius/models.py:34
+#: authentik/providers/ldap/models.py authentik/providers/radius/models.py
msgid ""
"When enabled, code-based multi-factor authentication can be used by "
"appending a semicolon and the TOTP code to the password. This should only be"
@@ -1092,958 +1103,955 @@ msgstr ""
"启用时,可以通过在密码后添加分号和 TOTP 代码来使用基于代码的多因素身份验证。仅在所有绑定到此提供程序的用户都已配置 TOTP "
"设备的情况下才应该启用,否则密码可能会因为包含分号而被错误地拒绝。"
-#: authentik/providers/ldap/models.py:108
+#: authentik/providers/ldap/models.py
msgid "LDAP Provider"
msgstr "LDAP 提供程序"
-#: authentik/providers/ldap/models.py:109
+#: authentik/providers/ldap/models.py
msgid "LDAP Providers"
msgstr "LDAP 提供程序"
-#: authentik/providers/oauth2/id_token.py:27
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the Hashed User ID"
msgstr "基于经过哈希处理的用户 ID"
-#: authentik/providers/oauth2/id_token.py:28
+#: authentik/providers/oauth2/id_token.py
msgid "Based on user ID"
msgstr "基于用户 ID"
-#: authentik/providers/oauth2/id_token.py:29
+#: authentik/providers/oauth2/id_token.py
msgid "Based on user UUID"
msgstr "基于用户 UUID"
-#: authentik/providers/oauth2/id_token.py:30
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the username"
msgstr "基于用户名"
-#: authentik/providers/oauth2/id_token.py:33
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the User's Email. This is recommended over the UPN method."
msgstr "基于用户的电子邮箱。建议在 UPN 方法上使用。"
-#: authentik/providers/oauth2/id_token.py:38
+#: authentik/providers/oauth2/id_token.py
msgid ""
"Based on the User's UPN, only works if user has a 'upn' attribute set. Use "
"this method only if you have different UPN and Mail domains."
msgstr "基于用户的 UPN,仅当用户设置了 'upn' 属性时才有效。仅当您有不同的 UPN 和 Mail 域时才使用此方法。"
-#: authentik/providers/oauth2/models.py:43
+#: authentik/providers/oauth2/models.py
msgid "Confidential"
msgstr "机密"
-#: authentik/providers/oauth2/models.py:44
+#: authentik/providers/oauth2/models.py
msgid "Public"
msgstr "公开"
-#: authentik/providers/oauth2/models.py:66
+#: authentik/providers/oauth2/models.py
msgid "Same identifier is used for all providers"
msgstr "所有提供程序都使用相同的标识符"
-#: authentik/providers/oauth2/models.py:68
+#: authentik/providers/oauth2/models.py
msgid "Each provider has a different issuer, based on the application slug."
msgstr "根据应用程序 Slug,每个提供程序都有不同的颁发者。"
-#: authentik/providers/oauth2/models.py:75
+#: authentik/providers/oauth2/models.py
msgid "code (Authorization Code Flow)"
msgstr "code(授权码流程)"
-#: authentik/providers/oauth2/models.py:76
+#: authentik/providers/oauth2/models.py
msgid "id_token (Implicit Flow)"
msgstr "id_token(隐式流程)"
-#: authentik/providers/oauth2/models.py:77
+#: authentik/providers/oauth2/models.py
msgid "id_token token (Implicit Flow)"
msgstr "id_token token(隐式流程)"
-#: authentik/providers/oauth2/models.py:78
+#: authentik/providers/oauth2/models.py
msgid "code token (Hybrid Flow)"
msgstr "code token(混合流程)"
-#: authentik/providers/oauth2/models.py:79
+#: authentik/providers/oauth2/models.py
msgid "code id_token (Hybrid Flow)"
msgstr "code id_token(混合流程)"
-#: authentik/providers/oauth2/models.py:80
+#: authentik/providers/oauth2/models.py
msgid "code id_token token (Hybrid Flow)"
msgstr "code id_token token(混合流程)"
-#: authentik/providers/oauth2/models.py:86
+#: authentik/providers/oauth2/models.py
msgid "HS256 (Symmetric Encryption)"
msgstr "HS256(对称加密)"
-#: authentik/providers/oauth2/models.py:87
+#: authentik/providers/oauth2/models.py
msgid "RS256 (Asymmetric Encryption)"
msgstr "RS256(非对称加密)"
-#: authentik/providers/oauth2/models.py:88
+#: authentik/providers/oauth2/models.py
msgid "ES256 (Asymmetric Encryption)"
msgstr "ES256(非对称加密)"
-#: authentik/providers/oauth2/models.py:94
+#: authentik/providers/oauth2/models.py
msgid "Scope used by the client"
msgstr "客户端使用的作用域"
-#: authentik/providers/oauth2/models.py:98
+#: authentik/providers/oauth2/models.py
msgid ""
"Description shown to the user when consenting. If left empty, the user won't"
" be informed."
msgstr "同意授权时向用户显示的描述。如果留空,则不会告知用户。"
-#: authentik/providers/oauth2/models.py:117
+#: authentik/providers/oauth2/models.py
msgid "Scope Mapping"
msgstr "作用域映射"
-#: authentik/providers/oauth2/models.py:118
+#: authentik/providers/oauth2/models.py
msgid "Scope Mappings"
msgstr "作用域映射"
-#: authentik/providers/oauth2/models.py:128
+#: authentik/providers/oauth2/models.py
msgid "Client Type"
msgstr "客户端类型"
-#: authentik/providers/oauth2/models.py:130
+#: authentik/providers/oauth2/models.py
msgid ""
"Confidential clients are capable of maintaining the confidentiality of their"
" credentials. Public clients are incapable"
msgstr "机密客户端有能力维护其凭据的机密性。公开客户端无此能力。"
-#: authentik/providers/oauth2/models.py:137
+#: authentik/providers/oauth2/models.py
msgid "Client ID"
msgstr "客户端 ID"
-#: authentik/providers/oauth2/models.py:143
+#: authentik/providers/oauth2/models.py
msgid "Client Secret"
msgstr "客户端密钥"
-#: authentik/providers/oauth2/models.py:149
+#: authentik/providers/oauth2/models.py
msgid "Redirect URIs"
msgstr "重定向 URI"
-#: authentik/providers/oauth2/models.py:150
+#: authentik/providers/oauth2/models.py
msgid "Enter each URI on a new line."
msgstr "每行输入一个 URI。"
-#: authentik/providers/oauth2/models.py:155
+#: authentik/providers/oauth2/models.py
msgid "Include claims in id_token"
msgstr "在 id_token 中包含声明"
-#: authentik/providers/oauth2/models.py:157
+#: authentik/providers/oauth2/models.py
msgid ""
"Include User claims from scopes in the id_token, for applications that don't"
" access the userinfo endpoint."
msgstr "对于不访问 userinfo 端点的应用程序,将来自作用域的用户声明包含在 id_token 中。"
-#: authentik/providers/oauth2/models.py:166
+#: authentik/providers/oauth2/models.py
msgid ""
"Access codes not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
msgstr "从当前时间经过多久时或之后,访问代码无效(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/providers/oauth2/models.py:174
-#: authentik/providers/oauth2/models.py:182
+#: authentik/providers/oauth2/models.py
msgid ""
"Tokens not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
msgstr "从当前时间经过多久时或之后,令牌无效(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/providers/oauth2/models.py:191
+#: authentik/providers/oauth2/models.py
msgid ""
"Configure what data should be used as unique User Identifier. For most "
"cases, the default should be fine."
msgstr "配置应将哪些数据用作唯一用户标识符。在大多数情况下保持默认值即可。"
-#: authentik/providers/oauth2/models.py:198
+#: authentik/providers/oauth2/models.py
msgid "Configure how the issuer field of the ID Token should be filled."
msgstr "配置如何填写 ID 令牌的颁发者字段。"
-#: authentik/providers/oauth2/models.py:203
+#: authentik/providers/oauth2/models.py
msgid "Signing Key"
msgstr "签名密钥"
-#: authentik/providers/oauth2/models.py:207
+#: authentik/providers/oauth2/models.py
msgid ""
"Key used to sign the tokens. Only required when JWT Algorithm is set to "
"RS256."
msgstr "用于签名令牌的密钥。仅当 JWT 算法设置为 RS256 时才需要。"
-#: authentik/providers/oauth2/models.py:214
+#: authentik/providers/oauth2/models.py
msgid ""
"Any JWT signed by the JWK of the selected source can be used to "
"authenticate."
msgstr "任何由选定来源的 JWK 签发的 JWT 都可以用于身份验证。"
-#: authentik/providers/oauth2/models.py:287
+#: authentik/providers/oauth2/models.py
msgid "OAuth2/OpenID Provider"
msgstr "OAuth2/OpenID 提供程序"
-#: authentik/providers/oauth2/models.py:288
+#: authentik/providers/oauth2/models.py
msgid "OAuth2/OpenID Providers"
msgstr "OAuth2/OpenID 提供程序"
-#: authentik/providers/oauth2/models.py:297
-#: authentik/providers/oauth2/models.py:430
+#: authentik/providers/oauth2/models.py
msgid "Scopes"
msgstr "作用域"
-#: authentik/providers/oauth2/models.py:317
+#: authentik/providers/oauth2/models.py
msgid "Code"
msgstr "代码"
-#: authentik/providers/oauth2/models.py:318
+#: authentik/providers/oauth2/models.py
msgid "Nonce"
msgstr "Nonce"
-#: authentik/providers/oauth2/models.py:319
+#: authentik/providers/oauth2/models.py
msgid "Code Challenge"
msgstr "代码质询"
-#: authentik/providers/oauth2/models.py:321
+#: authentik/providers/oauth2/models.py
msgid "Code Challenge Method"
msgstr "代码质询方法"
-#: authentik/providers/oauth2/models.py:341
+#: authentik/providers/oauth2/models.py
msgid "Authorization Code"
msgstr "授权代码"
-#: authentik/providers/oauth2/models.py:342
+#: authentik/providers/oauth2/models.py
msgid "Authorization Codes"
msgstr "授权代码"
-#: authentik/providers/oauth2/models.py:384
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Access Token"
msgstr "OAuth2 访问令牌"
-#: authentik/providers/oauth2/models.py:385
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Access Tokens"
msgstr "OAuth2 访问令牌"
-#: authentik/providers/oauth2/models.py:395
+#: authentik/providers/oauth2/models.py
msgid "ID Token"
msgstr "ID 令牌"
-#: authentik/providers/oauth2/models.py:414
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Refresh Token"
msgstr "OAuth2 刷新令牌"
-#: authentik/providers/oauth2/models.py:415
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Refresh Tokens"
msgstr "OAuth2 刷新令牌"
-#: authentik/providers/oauth2/models.py:442
+#: authentik/providers/oauth2/models.py
msgid "Device Token"
msgstr "设备令牌"
-#: authentik/providers/oauth2/models.py:443
+#: authentik/providers/oauth2/models.py
msgid "Device Tokens"
msgstr "设备令牌"
-#: authentik/providers/oauth2/views/authorize.py:489
-#: authentik/providers/saml/views/flows.py:87
+#: authentik/providers/oauth2/views/authorize.py
+#: authentik/providers/saml/views/flows.py
#, python-format
msgid "Redirecting to %(app)s..."
msgstr "正在跳转到 %(app)s…"
-#: authentik/providers/oauth2/views/device_init.py:151
+#: authentik/providers/oauth2/views/device_init.py
msgid "Invalid code"
msgstr "无效代码"
-#: authentik/providers/oauth2/views/userinfo.py:55
-#: authentik/providers/oauth2/views/userinfo.py:56
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access your User Information"
msgstr "GitHub 兼容性:访问您的用户信息"
-#: authentik/providers/oauth2/views/userinfo.py:57
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access you Email addresses"
msgstr "GitHub 兼容性:访问您的电子邮件地址"
-#: authentik/providers/oauth2/views/userinfo.py:58
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access your Groups"
msgstr "GitHub 兼容性:访问您的组"
-#: authentik/providers/oauth2/views/userinfo.py:59
+#: authentik/providers/oauth2/views/userinfo.py
msgid "authentik API Access on behalf of your user"
msgstr "代表您的用户访问 authentik API"
-#: authentik/providers/proxy/api.py:52
+#: authentik/providers/proxy/api.py
msgid "User and password attributes must be set when basic auth is enabled."
msgstr "启用 Basic Auth 时,必须设置用户和密码属性。"
-#: authentik/providers/proxy/api.py:63
+#: authentik/providers/proxy/api.py
msgid "Internal host cannot be empty when forward auth is disabled."
msgstr "禁用 Forward Auth 时,内部主机不能为空。"
-#: authentik/providers/proxy/models.py:54
+#: authentik/providers/proxy/models.py
msgid "Validate SSL Certificates of upstream servers"
msgstr "验证上游服务器的 SSL 证书"
-#: authentik/providers/proxy/models.py:55
+#: authentik/providers/proxy/models.py
msgid "Internal host SSL Validation"
msgstr "内部主机 SSL 验证"
-#: authentik/providers/proxy/models.py:61
+#: authentik/providers/proxy/models.py
msgid ""
"Enable support for forwardAuth in traefik and nginx auth_request. Exclusive "
"with internal_host."
msgstr "在 traefik 和 nginx auth_request 中启用对 ForwardAuth 的支持。排除 internal_host。"
-#: authentik/providers/proxy/models.py:70
+#: authentik/providers/proxy/models.py
msgid ""
"Regular expressions for which authentication is not required. Each new line "
"is interpreted as a new Regular Expression."
msgstr "用于描述何处不需要身份验证的正则表达式。每个新行都被解释为一个新的正则表达式。"
-#: authentik/providers/proxy/models.py:78
+#: authentik/providers/proxy/models.py
msgid ""
"When enabled, this provider will intercept the authorization header and "
"authenticate requests based on its value."
msgstr "启用时,此提供程序将会拦截 Authorization 标头,并基于其值认证请求。"
-#: authentik/providers/proxy/models.py:84
+#: authentik/providers/proxy/models.py
msgid "Set HTTP-Basic Authentication"
msgstr "设置 HTTP-Basic 身份验证"
-#: authentik/providers/proxy/models.py:86
+#: authentik/providers/proxy/models.py
msgid ""
"Set a custom HTTP-Basic Authentication header based on values from "
"authentik."
msgstr "根据来自 authentik 的值设置自定义 HTTP-Basic 身份验证标头。"
-#: authentik/providers/proxy/models.py:91
+#: authentik/providers/proxy/models.py
msgid "HTTP-Basic Username Key"
msgstr "HTTP-Basic 用户名密钥"
-#: authentik/providers/proxy/models.py:93
+#: authentik/providers/proxy/models.py
msgid ""
"User/Group Attribute used for the user part of the HTTP-Basic Header. If not"
" set, the user's Email address is used."
msgstr "用于 HTTP-Basic 标头用户名部分的用户/组属性。如果未设置,则使用用户的电子邮件地址。"
-#: authentik/providers/proxy/models.py:99
+#: authentik/providers/proxy/models.py
msgid "HTTP-Basic Password Key"
msgstr "HTTP-Basic 密码密钥"
-#: authentik/providers/proxy/models.py:100
+#: authentik/providers/proxy/models.py
msgid ""
"User/Group Attribute used for the password part of the HTTP-Basic Header."
msgstr "用于 HTTP-Basic 标头的密码部分的用户/组属性。"
-#: authentik/providers/proxy/models.py:154
+#: authentik/providers/proxy/models.py
msgid "Proxy Provider"
msgstr "代理提供程序"
-#: authentik/providers/proxy/models.py:155
+#: authentik/providers/proxy/models.py
msgid "Proxy Providers"
msgstr "代理提供程序"
-#: authentik/providers/radius/models.py:18
+#: authentik/providers/radius/models.py
msgid "Shared secret between clients and server to hash packets."
msgstr "在客户端和服务端之间共享密钥以哈希数据包。"
-#: authentik/providers/radius/models.py:24
+#: authentik/providers/radius/models.py
msgid ""
"List of CIDRs (comma-separated) that clients can connect from. A more "
"specific CIDR will match before a looser one. Clients connecting from a non-"
"specified CIDR will be dropped."
msgstr "允许客户端连接的 CIDR 列表(逗号分隔)。严格的 CIDR 会在宽松的之前匹配。来自 CIDR 范围外的客户端连接将会被丢弃。"
-#: authentik/providers/radius/models.py:60
+#: authentik/providers/radius/models.py
msgid "Radius Provider"
msgstr "Radius 提供程序"
-#: authentik/providers/radius/models.py:61
+#: authentik/providers/radius/models.py
msgid "Radius Providers"
msgstr "Radius 提供程序"
-#: authentik/providers/saml/api/providers.py:258
+#: authentik/providers/saml/api/providers.py
msgid "Invalid XML Syntax"
msgstr "无效 XML 语法"
-#: authentik/providers/saml/api/providers.py:268
+#: authentik/providers/saml/api/providers.py
#, python-format
msgid "Failed to import Metadata: %(message)s"
msgstr "导入元数据失败:%(message)s"
-#: authentik/providers/saml/models.py:38
+#: authentik/providers/saml/models.py
msgid "ACS URL"
msgstr "ACS URL"
-#: authentik/providers/saml/models.py:43
+#: authentik/providers/saml/models.py
msgid ""
"Value of the audience restriction field of the assertion. When left empty, "
"no audience restriction will be added."
msgstr "断言的 Audience 受限字段的值。留空时,不会添加 Audience 限制。"
-#: authentik/providers/saml/models.py:47
+#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "也称为 EntityID"
-#: authentik/providers/saml/models.py:51
+#: authentik/providers/saml/models.py
msgid "Service Provider Binding"
msgstr "服务提供程序绑定"
-#: authentik/providers/saml/models.py:53
+#: authentik/providers/saml/models.py
msgid ""
"This determines how authentik sends the response back to the Service "
"Provider."
msgstr "确定 authentik 如何将响应发送回服务提供程序。"
-#: authentik/providers/saml/models.py:63
+#: authentik/providers/saml/models.py
msgid "NameID Property Mapping"
msgstr "NameID 属性映射"
-#: authentik/providers/saml/models.py:65
+#: authentik/providers/saml/models.py
msgid ""
"Configure how the NameID value will be created. When left empty, the "
"NameIDPolicy of the incoming request will be considered"
msgstr "配置如何创建 NameID 值。如果留空,将考虑传入请求的 NameIDPolicy"
-#: authentik/providers/saml/models.py:74
+#: authentik/providers/saml/models.py
msgid ""
"Assertion valid not before current time + this value (Format: "
"hours=-1;minutes=-2;seconds=-3)."
msgstr "从当前时间经过多久时或之后,断言有效(格式:hours=-1;minutes=-2;seconds=-3)。"
-#: authentik/providers/saml/models.py:82
+#: authentik/providers/saml/models.py
msgid ""
"Assertion not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
msgstr "从当前时间经过多久时或之后,断言无效(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/providers/saml/models.py:91
+#: authentik/providers/saml/models.py
msgid ""
"Session not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
msgstr "从当前时间经过多久时或之后,会话无效(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/providers/saml/models.py:99 authentik/sources/saml/models.py:150
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA1"
msgstr "SHA1"
-#: authentik/providers/saml/models.py:100 authentik/sources/saml/models.py:151
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA256"
msgstr "SHA256"
-#: authentik/providers/saml/models.py:101 authentik/sources/saml/models.py:152
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA384"
msgstr "SHA384"
-#: authentik/providers/saml/models.py:102 authentik/sources/saml/models.py:153
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA512"
msgstr "SHA512"
-#: authentik/providers/saml/models.py:109 authentik/sources/saml/models.py:160
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA1"
msgstr "RSA-SHA1"
-#: authentik/providers/saml/models.py:110 authentik/sources/saml/models.py:161
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA256"
msgstr "RSA-SHA256"
-#: authentik/providers/saml/models.py:111 authentik/sources/saml/models.py:162
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA384"
msgstr "RSA-SHA384"
-#: authentik/providers/saml/models.py:112 authentik/sources/saml/models.py:163
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA512"
msgstr "RSA-SHA512"
-#: authentik/providers/saml/models.py:113 authentik/sources/saml/models.py:164
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "DSA-SHA1"
msgstr "DSA-SHA1"
-#: authentik/providers/saml/models.py:124 authentik/sources/saml/models.py:130
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid ""
"When selected, incoming assertion's Signatures will be validated against "
"this certificate. To allow unsigned Requests, leave on default."
msgstr "选中后,传入断言的签名将根据此证书进行验证。要允许未签名的请求,请保留默认值。"
-#: authentik/providers/saml/models.py:128 authentik/sources/saml/models.py:134
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "Verification Certificate"
msgstr "验证证书"
-#: authentik/providers/saml/models.py:136
+#: authentik/providers/saml/models.py
msgid "Keypair used to sign outgoing Responses going to the Service Provider."
msgstr "密钥对,用于签署发送给服务提供程序的传出响应。"
-#: authentik/providers/saml/models.py:138 authentik/sources/saml/models.py:144
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "Signing Keypair"
msgstr "签名密钥对"
-#: authentik/providers/saml/models.py:142
+#: authentik/providers/saml/models.py
msgid "Default relay_state value for IDP-initiated logins"
msgstr "用于 IDP 发起登录的默认 relay_state 值"
-#: authentik/providers/saml/models.py:171
+#: authentik/providers/saml/models.py
msgid "SAML Provider"
msgstr "SAML 提供程序"
-#: authentik/providers/saml/models.py:172
+#: authentik/providers/saml/models.py
msgid "SAML Providers"
msgstr "SAML 提供程序"
-#: authentik/providers/saml/models.py:196
+#: authentik/providers/saml/models.py
msgid "SAML Property Mapping"
msgstr "SAML 属性映射"
-#: authentik/providers/saml/models.py:197
+#: authentik/providers/saml/models.py
msgid "SAML Property Mappings"
msgstr "SAML 属性映射"
-#: authentik/providers/scim/models.py:23
+#: authentik/providers/scim/models.py
msgid "Base URL to SCIM requests, usually ends in /v2"
msgstr "SCIM 请求的基础 URL,通常以 /v2 结尾"
-#: authentik/providers/scim/models.py:24
+#: authentik/providers/scim/models.py
msgid "Authentication token"
msgstr "身份验证令牌"
-#: authentik/providers/scim/models.py:30 authentik/sources/ldap/models.py:98
+#: authentik/providers/scim/models.py authentik/sources/ldap/models.py
msgid "Property mappings used for group creation/updating."
msgstr "用于创建/更新组的属性映射。"
-#: authentik/providers/scim/models.py:72
+#: authentik/providers/scim/models.py
msgid "SCIM Provider"
msgstr "SCIM 提供程序"
-#: authentik/providers/scim/models.py:73
+#: authentik/providers/scim/models.py
msgid "SCIM Providers"
msgstr "SCIM 提供程序"
-#: authentik/providers/scim/models.py:93
+#: authentik/providers/scim/models.py
msgid "SCIM Mapping"
msgstr "SCIM 映射"
-#: authentik/providers/scim/models.py:94
+#: authentik/providers/scim/models.py
msgid "SCIM Mappings"
msgstr "SCIM 映射"
-#: authentik/providers/scim/tasks.py:57
+#: authentik/providers/scim/tasks.py
msgid "Starting full SCIM sync"
msgstr "开始全量 SCIM 同步"
-#: authentik/providers/scim/tasks.py:67
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Syncing page %(page)d of users"
msgstr "正在同步用户页面 %(page)d"
-#: authentik/providers/scim/tasks.py:71
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Syncing page %(page)d of groups"
msgstr "正在同步群组页面 %(page)d"
-#: authentik/providers/scim/tasks.py:103
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Failed to sync user %(user_name)s due to remote error: %(error)s"
msgstr "由于远端错误,同步用户 %(user_name)s 失败:%(error)s"
-#: authentik/providers/scim/tasks.py:114 authentik/providers/scim/tasks.py:155
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Stopping sync due to error: %(error)s"
msgstr "由于以下错误,同步停止:%(error)s"
-#: authentik/providers/scim/tasks.py:144
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Failed to sync group %(group_name)s due to remote error: %(error)s"
msgstr "由于远端错误,同步组 %(group_name)s 失败:%(error)s"
-#: authentik/rbac/models.py:51
+#: authentik/rbac/models.py
msgid "Role"
msgstr "角色"
-#: authentik/rbac/models.py:52
+#: authentik/rbac/models.py
msgid "Roles"
msgstr "角色"
-#: authentik/rbac/models.py:66
+#: authentik/rbac/models.py
msgid "System permission"
msgstr "系统权限"
-#: authentik/rbac/models.py:67
+#: authentik/rbac/models.py
msgid "System permissions"
msgstr "系统权限"
-#: authentik/rbac/models.py:69
+#: authentik/rbac/models.py
msgid "Can view system info"
msgstr "可以查看系统信息"
-#: authentik/rbac/models.py:70
+#: authentik/rbac/models.py
msgid "Can view system tasks"
msgstr "可以查看系统任务"
-#: authentik/rbac/models.py:71
+#: authentik/rbac/models.py
msgid "Can run system tasks"
msgstr "可以运行系统任务"
-#: authentik/rbac/models.py:72
+#: authentik/rbac/models.py
msgid "Can access admin interface"
msgstr "可以访问管理员界面"
-#: authentik/rbac/models.py:73
+#: authentik/rbac/models.py
msgid "Can view system settings"
msgstr "可以查看系统设置"
-#: authentik/rbac/models.py:74
+#: authentik/rbac/models.py
msgid "Can edit system settings"
msgstr "可以编辑系统设置"
-#: authentik/recovery/management/commands/create_admin_group.py:12
+#: authentik/recovery/management/commands/create_admin_group.py
msgid "Create admin group if the default group gets deleted."
msgstr "如果默认组被删除,则创建管理员组。"
-#: authentik/recovery/management/commands/create_recovery_key.py:16
+#: authentik/recovery/management/commands/create_recovery_key.py
msgid "Create a Key which can be used to restore access to authentik."
msgstr "创建一个密钥,可用于恢复对 authentik 的访问权限。"
-#: authentik/recovery/views.py:24
+#: authentik/recovery/views.py
msgid "Used recovery-link to authenticate."
msgstr "已使用恢复链接进行身份验证。"
-#: authentik/sources/ldap/models.py:41
+#: authentik/sources/ldap/models.py
msgid "Server URI"
msgstr "服务器 URI"
-#: authentik/sources/ldap/models.py:50
+#: authentik/sources/ldap/models.py
msgid ""
"Optionally verify the LDAP Server's Certificate against the CA Chain in this"
" keypair."
msgstr "可选,根据此密钥对中的 CA 链验证 LDAP 服务器的证书。"
-#: authentik/sources/ldap/models.py:59
+#: authentik/sources/ldap/models.py
msgid ""
"Client certificate to authenticate against the LDAP Server's Certificate."
msgstr "基于 LDAP 服务端证书进行身份验证的客户端证书。"
-#: authentik/sources/ldap/models.py:62
+#: authentik/sources/ldap/models.py
msgid "Bind CN"
msgstr "Bind CN"
-#: authentik/sources/ldap/models.py:64
+#: authentik/sources/ldap/models.py
msgid "Enable Start TLS"
msgstr "启用 Start TLS"
-#: authentik/sources/ldap/models.py:65
+#: authentik/sources/ldap/models.py
msgid "Use Server URI for SNI verification"
msgstr "SNI 验证时使用服务器 URI"
-#: authentik/sources/ldap/models.py:67
+#: authentik/sources/ldap/models.py
msgid "Base DN"
msgstr "Base DN"
-#: authentik/sources/ldap/models.py:69
+#: authentik/sources/ldap/models.py
msgid "Prepended to Base DN for User-queries."
msgstr "添加到用户查询的 Base DN 起始处。"
-#: authentik/sources/ldap/models.py:70
+#: authentik/sources/ldap/models.py
msgid "Addition User DN"
msgstr "额外的用户 DN"
-#: authentik/sources/ldap/models.py:74
+#: authentik/sources/ldap/models.py
msgid "Prepended to Base DN for Group-queries."
msgstr "添加到组查询的 Base DN 起始处。"
-#: authentik/sources/ldap/models.py:75
+#: authentik/sources/ldap/models.py
msgid "Addition Group DN"
msgstr "额外的组 DN"
-#: authentik/sources/ldap/models.py:81
+#: authentik/sources/ldap/models.py
msgid "Consider Objects matching this filter to be Users."
msgstr "将与此筛选器匹配的对象视为用户。"
-#: authentik/sources/ldap/models.py:84
+#: authentik/sources/ldap/models.py
msgid "Field which contains members of a group."
msgstr "包含组成员的字段。"
-#: authentik/sources/ldap/models.py:88
+#: authentik/sources/ldap/models.py
msgid "Consider Objects matching this filter to be Groups."
msgstr "将与此过滤器匹配的对象视为组。"
-#: authentik/sources/ldap/models.py:91
+#: authentik/sources/ldap/models.py
msgid "Field which contains a unique Identifier."
msgstr "包含唯一标识符的字段。"
-#: authentik/sources/ldap/models.py:105
+#: authentik/sources/ldap/models.py
msgid ""
"When a user changes their password, sync it back to LDAP. This can only be "
"enabled on a single LDAP source."
msgstr "当用户修改密码时,将其同步回 LDAP。仅可在单点 LDAP 源时启用。"
-#: authentik/sources/ldap/models.py:248
+#: authentik/sources/ldap/models.py
msgid "LDAP Source"
msgstr "LDAP 源"
-#: authentik/sources/ldap/models.py:249
+#: authentik/sources/ldap/models.py
msgid "LDAP Sources"
msgstr "LDAP 源"
-#: authentik/sources/ldap/models.py:271
+#: authentik/sources/ldap/models.py
msgid "LDAP Property Mapping"
msgstr "LDAP 属性映射"
-#: authentik/sources/ldap/models.py:272
+#: authentik/sources/ldap/models.py
msgid "LDAP Property Mappings"
msgstr "LDAP 属性映射"
-#: authentik/sources/ldap/signals.py:52
+#: authentik/sources/ldap/signals.py
msgid "Password does not match Active Directory Complexity."
msgstr "密码与 Active Directory 复杂度不匹配。"
-#: authentik/sources/oauth/clients/oauth2.py:68
+#: authentik/sources/oauth/clients/oauth2.py
msgid "No token received."
msgstr "未收到令牌。"
-#: authentik/sources/oauth/models.py:24
+#: authentik/sources/oauth/models.py
msgid "Request Token URL"
msgstr "请求令牌 URL"
-#: authentik/sources/oauth/models.py:26
+#: authentik/sources/oauth/models.py
msgid ""
"URL used to request the initial token. This URL is only required for OAuth "
"1."
msgstr "用于请求初始令牌的 URL。只有 OAuth 1 才需要此网址。"
-#: authentik/sources/oauth/models.py:32
+#: authentik/sources/oauth/models.py
msgid "Authorization URL"
msgstr "授权 URL"
-#: authentik/sources/oauth/models.py:33
+#: authentik/sources/oauth/models.py
msgid "URL the user is redirect to to conest the flow."
msgstr "为控制流程,使用户被重定向到的 URL"
-#: authentik/sources/oauth/models.py:38
+#: authentik/sources/oauth/models.py
msgid "Access Token URL"
msgstr "访问令牌 URL"
-#: authentik/sources/oauth/models.py:39
+#: authentik/sources/oauth/models.py
msgid "URL used by authentik to retrieve tokens."
msgstr "authentik 用来获取令牌的 URL。"
-#: authentik/sources/oauth/models.py:44
+#: authentik/sources/oauth/models.py
msgid "Profile URL"
msgstr "个人资料 URL"
-#: authentik/sources/oauth/models.py:45
+#: authentik/sources/oauth/models.py
msgid "URL used by authentik to get user information."
msgstr "authentik 用来获取用户信息的 URL。"
-#: authentik/sources/oauth/models.py:48
+#: authentik/sources/oauth/models.py
msgid "Additional Scopes"
msgstr "额外的作用域"
-#: authentik/sources/oauth/models.py:107
+#: authentik/sources/oauth/models.py
msgid "OAuth Source"
msgstr "OAuth 源"
-#: authentik/sources/oauth/models.py:108
+#: authentik/sources/oauth/models.py
msgid "OAuth Sources"
msgstr "OAuth 源"
-#: authentik/sources/oauth/models.py:116
+#: authentik/sources/oauth/models.py
msgid "GitHub OAuth Source"
msgstr "GitHub OAuth 源"
-#: authentik/sources/oauth/models.py:117
+#: authentik/sources/oauth/models.py
msgid "GitHub OAuth Sources"
msgstr "GitHub OAuth 源"
-#: authentik/sources/oauth/models.py:125
+#: authentik/sources/oauth/models.py
msgid "Twitch OAuth Source"
msgstr "Twitch OAuth 源"
-#: authentik/sources/oauth/models.py:126
+#: authentik/sources/oauth/models.py
msgid "Twitch OAuth Sources"
msgstr "Twitch OAuth 源"
-#: authentik/sources/oauth/models.py:134
+#: authentik/sources/oauth/models.py
msgid "Mailcow OAuth Source"
msgstr "Mailcow OAuth 源"
-#: authentik/sources/oauth/models.py:135
+#: authentik/sources/oauth/models.py
msgid "Mailcow OAuth Sources"
msgstr "Mailcow OAuth 源"
-#: authentik/sources/oauth/models.py:143
+#: authentik/sources/oauth/models.py
msgid "Twitter OAuth Source"
msgstr "Twitter OAuth 源"
-#: authentik/sources/oauth/models.py:144
+#: authentik/sources/oauth/models.py
msgid "Twitter OAuth Sources"
msgstr "Twitter OAuth 源"
-#: authentik/sources/oauth/models.py:152
+#: authentik/sources/oauth/models.py
msgid "Facebook OAuth Source"
msgstr "Facebook OAuth 源"
-#: authentik/sources/oauth/models.py:153
+#: authentik/sources/oauth/models.py
msgid "Facebook OAuth Sources"
msgstr "Facebook OAuth 源"
-#: authentik/sources/oauth/models.py:161
+#: authentik/sources/oauth/models.py
msgid "Discord OAuth Source"
msgstr "Discord OAuth 源"
-#: authentik/sources/oauth/models.py:162
+#: authentik/sources/oauth/models.py
msgid "Discord OAuth Sources"
msgstr "Discord OAuth 源"
-#: authentik/sources/oauth/models.py:170
+#: authentik/sources/oauth/models.py
msgid "Patreon OAuth Source"
msgstr "Patreon OAuth 源"
-#: authentik/sources/oauth/models.py:171
+#: authentik/sources/oauth/models.py
msgid "Patreon OAuth Sources"
msgstr "Patreon OAuth 源"
-#: authentik/sources/oauth/models.py:179
+#: authentik/sources/oauth/models.py
msgid "Google OAuth Source"
msgstr "Google OAuth 源"
-#: authentik/sources/oauth/models.py:180
+#: authentik/sources/oauth/models.py
msgid "Google OAuth Sources"
msgstr "Google OAuth 源"
-#: authentik/sources/oauth/models.py:188
+#: authentik/sources/oauth/models.py
msgid "Azure AD OAuth Source"
msgstr "Azure AD OAuth 源"
-#: authentik/sources/oauth/models.py:189
+#: authentik/sources/oauth/models.py
msgid "Azure AD OAuth Sources"
msgstr "Azure AD OAuth 源"
-#: authentik/sources/oauth/models.py:197
+#: authentik/sources/oauth/models.py
msgid "OpenID OAuth Source"
msgstr "OpenID OAuth 源"
-#: authentik/sources/oauth/models.py:198
+#: authentik/sources/oauth/models.py
msgid "OpenID OAuth Sources"
msgstr "OpenID OAuth 源"
-#: authentik/sources/oauth/models.py:206
+#: authentik/sources/oauth/models.py
msgid "Apple OAuth Source"
msgstr "Apple OAuth 源"
-#: authentik/sources/oauth/models.py:207
+#: authentik/sources/oauth/models.py
msgid "Apple OAuth Sources"
msgstr "Apple OAuth 源"
-#: authentik/sources/oauth/models.py:215
+#: authentik/sources/oauth/models.py
msgid "Okta OAuth Source"
msgstr "Okta OAuth 源"
-#: authentik/sources/oauth/models.py:216
+#: authentik/sources/oauth/models.py
msgid "Okta OAuth Sources"
msgstr "Okta OAuth 源"
-#: authentik/sources/oauth/models.py:224
+#: authentik/sources/oauth/models.py
msgid "Reddit OAuth Source"
msgstr "Reddit OAuth 源"
-#: authentik/sources/oauth/models.py:225
+#: authentik/sources/oauth/models.py
msgid "Reddit OAuth Sources"
msgstr "Reddit OAuth 源"
-#: authentik/sources/oauth/models.py:247
+#: authentik/sources/oauth/models.py
msgid "User OAuth Source Connection"
msgstr "用户 OAuth 源连接"
-#: authentik/sources/oauth/models.py:248
+#: authentik/sources/oauth/models.py
msgid "User OAuth Source Connections"
msgstr "用户 OAuth 源连接"
-#: authentik/sources/oauth/views/callback.py:100
+#: authentik/sources/oauth/views/callback.py
#, python-format
msgid "Authentication failed: %(reason)s"
msgstr "身份验证失败:%(reason)s"
-#: authentik/sources/plex/models.py:37
+#: authentik/sources/plex/models.py
msgid "Client identifier used to talk to Plex."
msgstr "用来与 Plex 通信的客户端标识符。"
-#: authentik/sources/plex/models.py:44
+#: authentik/sources/plex/models.py
msgid ""
"Which servers a user has to be a member of to be granted access. Empty list "
"allows every server."
msgstr "用户必须是哪个服务器的成员才能获取权限。空列表允许任何服务器。"
-#: authentik/sources/plex/models.py:50
+#: authentik/sources/plex/models.py
msgid "Allow friends to authenticate, even if you don't share a server."
msgstr "允许好友进行身份验证,即使您不共享服务器。"
-#: authentik/sources/plex/models.py:52
+#: authentik/sources/plex/models.py
msgid "Plex token used to check friends"
msgstr "用于检查好友的 Plex 令牌"
-#: authentik/sources/plex/models.py:95
+#: authentik/sources/plex/models.py
msgid "Plex Source"
msgstr "Plex 源"
-#: authentik/sources/plex/models.py:96
+#: authentik/sources/plex/models.py
msgid "Plex Sources"
msgstr "Plex 源"
-#: authentik/sources/plex/models.py:112
+#: authentik/sources/plex/models.py
msgid "User Plex Source Connection"
msgstr "用户 Plex 源连接"
-#: authentik/sources/plex/models.py:113
+#: authentik/sources/plex/models.py
msgid "User Plex Source Connections"
msgstr "用户 Plex 源连接"
-#: authentik/sources/saml/models.py:40
+#: authentik/sources/saml/models.py
msgid "Redirect Binding"
msgstr "重定向绑定"
-#: authentik/sources/saml/models.py:41
+#: authentik/sources/saml/models.py
msgid "POST Binding"
msgstr "POST 绑定"
-#: authentik/sources/saml/models.py:42
+#: authentik/sources/saml/models.py
msgid "POST Binding with auto-confirmation"
msgstr "带有自动确认功能的 POST 绑定"
-#: authentik/sources/saml/models.py:70
+#: authentik/sources/saml/models.py
msgid "Flow used before authentication."
msgstr "身份验证之前使用的流程。"
-#: authentik/sources/saml/models.py:77
+#: authentik/sources/saml/models.py
msgid "Issuer"
msgstr "颁发者"
-#: authentik/sources/saml/models.py:78
+#: authentik/sources/saml/models.py
msgid "Also known as Entity ID. Defaults the Metadata URL."
msgstr "也称为 Entity ID。 默认为元数据 URL。"
-#: authentik/sources/saml/models.py:82
+#: authentik/sources/saml/models.py
msgid "SSO URL"
msgstr "SSO URL"
-#: authentik/sources/saml/models.py:83
+#: authentik/sources/saml/models.py
msgid "URL that the initial Login request is sent to."
msgstr "初始登录请求发送到的 URL。"
-#: authentik/sources/saml/models.py:89
+#: authentik/sources/saml/models.py
msgid "SLO URL"
msgstr "SLO URL"
-#: authentik/sources/saml/models.py:90
+#: authentik/sources/saml/models.py
msgid "Optional URL if your IDP supports Single-Logout."
msgstr "如果您的 IDP 支持单点登出,则为可选 URL。"
-#: authentik/sources/saml/models.py:96
+#: authentik/sources/saml/models.py
msgid ""
"Allows authentication flows initiated by the IdP. This can be a security "
"risk, as no validation of the request ID is done."
msgstr "允许由 IdP 启动的身份验证流程。这可能存在安全风险,因为未对请求 ID 进行验证。"
-#: authentik/sources/saml/models.py:104
+#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
"sent."
msgstr "发送给 IdP 的 NameID 策略。可以取消设置,此时不会发送任何策略。"
-#: authentik/sources/saml/models.py:115
+#: authentik/sources/saml/models.py
msgid "Delete temporary users after"
msgstr "多久后删除临时用户"
-#: authentik/sources/saml/models.py:118
+#: authentik/sources/saml/models.py
msgid ""
"Time offset when temporary users should be deleted. This only applies if "
"your IDP uses the NameID Format 'transient', and the user doesn't log out "
@@ -2052,321 +2060,320 @@ msgstr ""
"删除临时用户的时间偏移。这仅适用于您的 IDP 使用 NameID 格式 'transient' "
"且用户未手动登出的情况。(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/sources/saml/models.py:142
+#: authentik/sources/saml/models.py
msgid ""
"Keypair used to sign outgoing Responses going to the Identity Provider."
msgstr "密钥对,用于签署发送给身份提供程序的传出响应。"
-#: authentik/sources/saml/models.py:226
+#: authentik/sources/saml/models.py
msgid "SAML Source"
msgstr "SAML 源"
-#: authentik/sources/saml/models.py:227
+#: authentik/sources/saml/models.py
msgid "SAML Sources"
msgstr "SAML 源"
-#: authentik/sources/saml/models.py:242
+#: authentik/sources/saml/models.py
msgid "User SAML Source Connection"
msgstr "用户 SAML 源连接"
-#: authentik/sources/saml/models.py:243
+#: authentik/sources/saml/models.py
msgid "User SAML Source Connections"
msgstr "用户 SAML 源连接"
-#: authentik/stages/authenticator_duo/models.py:79
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Authenticator Setup Stage"
msgstr "Duo 身份验证器设置阶段"
-#: authentik/stages/authenticator_duo/models.py:80
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Authenticator Setup Stages"
msgstr "Duo 身份验证器设置阶段"
-#: authentik/stages/authenticator_duo/models.py:103
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Device"
msgstr "Duo 设备"
-#: authentik/stages/authenticator_duo/models.py:104
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Devices"
msgstr "Duo 设备"
-#: authentik/stages/authenticator_sms/models.py:57
+#: authentik/stages/authenticator_sms/models.py
msgid ""
"When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is"
" not reused in the future."
msgstr "启用时,电话号码仅在注册期间用于验证用户的真实性。仅保存电话号码的哈希,以确保将来不会重复使用。"
-#: authentik/stages/authenticator_sms/models.py:68
+#: authentik/stages/authenticator_sms/models.py
msgid "Optionally modify the payload being sent to custom providers."
msgstr "可选地,修改发送到自定义提供程序的载荷。"
-#: authentik/stages/authenticator_sms/models.py:81
+#: authentik/stages/authenticator_sms/models.py
#, python-format
msgid "Use this code to authenticate in authentik: %(token)s"
msgstr "使用此代码在 authentik 中验证身份:%(token)s"
-#: authentik/stages/authenticator_sms/models.py:180
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Authenticator Setup Stage"
msgstr "短信身份验证器设置阶段"
-#: authentik/stages/authenticator_sms/models.py:181
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Authenticator Setup Stages"
msgstr "短信身份验证器设置阶段"
-#: authentik/stages/authenticator_sms/models.py:226
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Device"
msgstr "短信设备"
-#: authentik/stages/authenticator_sms/models.py:227
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Devices"
msgstr "短信设备"
-#: authentik/stages/authenticator_sms/stage.py:57
-#: authentik/stages/authenticator_totp/stage.py:41
-#: authentik/stages/authenticator_totp/stage.py:44
+#: authentik/stages/authenticator_sms/stage.py
+#: authentik/stages/authenticator_totp/stage.py
msgid "Code does not match"
msgstr "代码不匹配"
-#: authentik/stages/authenticator_sms/stage.py:73
+#: authentik/stages/authenticator_sms/stage.py
msgid "Invalid phone number"
msgstr "无效电话号码"
-#: authentik/stages/authenticator_static/models.py:52
+#: authentik/stages/authenticator_static/models.py
msgid "Static Authenticator Setup Stage"
msgstr "静态身份验证器设置阶段"
-#: authentik/stages/authenticator_static/models.py:53
+#: authentik/stages/authenticator_static/models.py
msgid "Static Authenticator Setup Stages"
msgstr "静态身份验证器设置阶段"
-#: authentik/stages/authenticator_static/models.py:98
+#: authentik/stages/authenticator_static/models.py
msgid "Static Device"
msgstr "静态设备"
-#: authentik/stages/authenticator_static/models.py:99
+#: authentik/stages/authenticator_static/models.py
msgid "Static Devices"
msgstr "静态设备"
-#: authentik/stages/authenticator_static/models.py:129
+#: authentik/stages/authenticator_static/models.py
msgid "Static Token"
msgstr "静态令牌"
-#: authentik/stages/authenticator_static/models.py:130
+#: authentik/stages/authenticator_static/models.py
msgid "Static Tokens"
msgstr "静态令牌"
-#: authentik/stages/authenticator_totp/models.py:25
+#: authentik/stages/authenticator_totp/models.py
msgid "6 digits, widely compatible"
msgstr "6 位数字,广泛兼容"
-#: authentik/stages/authenticator_totp/models.py:26
+#: authentik/stages/authenticator_totp/models.py
msgid "8 digits, not compatible with apps like Google Authenticator"
msgstr "8 位数字,与 Google 身份验证器等应用不兼容"
-#: authentik/stages/authenticator_totp/models.py:62
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Authenticator Setup Stage"
msgstr "TOTP 身份验证器设置阶段"
-#: authentik/stages/authenticator_totp/models.py:63
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Authenticator Setup Stages"
msgstr "TOTP 身份验证器设置阶段"
-#: authentik/stages/authenticator_totp/models.py:244
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Device"
msgstr "TOTP 设备"
-#: authentik/stages/authenticator_totp/models.py:245
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Devices"
msgstr "TOTP 设备"
-#: authentik/stages/authenticator_validate/challenge.py:123
+#: authentik/stages/authenticator_validate/challenge.py
msgid "Invalid Token"
msgstr "无效令牌"
-#: authentik/stages/authenticator_validate/models.py:18
+#: authentik/stages/authenticator_validate/models.py
msgid "Static"
msgstr "静态"
-#: authentik/stages/authenticator_validate/models.py:19
+#: authentik/stages/authenticator_validate/models.py
msgid "TOTP"
msgstr "TOTP"
-#: authentik/stages/authenticator_validate/models.py:20
+#: authentik/stages/authenticator_validate/models.py
msgid "WebAuthn"
msgstr "WebAuthn"
-#: authentik/stages/authenticator_validate/models.py:21
+#: authentik/stages/authenticator_validate/models.py
msgid "Duo"
msgstr "Duo"
-#: authentik/stages/authenticator_validate/models.py:22
+#: authentik/stages/authenticator_validate/models.py
msgid "SMS"
msgstr "短信"
-#: authentik/stages/authenticator_validate/models.py:49
+#: authentik/stages/authenticator_validate/models.py
msgid ""
"Stages used to configure Authenticator when user doesn't have any compatible"
" devices. After this configuration Stage passes, the user is not prompted "
"again."
msgstr "当用户没有任何兼容的设备时,用来配置身份验证器的阶段。此阶段通过后,将不再请求此用户。"
-#: authentik/stages/authenticator_validate/models.py:56
+#: authentik/stages/authenticator_validate/models.py
msgid "Device classes which can be used to authenticate"
msgstr "可用于进行身份验证的设备类型"
-#: authentik/stages/authenticator_validate/models.py:64
+#: authentik/stages/authenticator_validate/models.py
msgid ""
"If any of the user's device has been used within this threshold, this stage "
"will be skipped"
msgstr "如果用户的任意设备在此期限内被使用过,此阶段会被跳过。"
-#: authentik/stages/authenticator_validate/models.py:70
+#: authentik/stages/authenticator_validate/models.py
msgid "Enforce user verification for WebAuthn devices."
msgstr "对 WebAuthn 设备强制用户验证。"
-#: authentik/stages/authenticator_validate/models.py:92
+#: authentik/stages/authenticator_validate/models.py
msgid "Authenticator Validation Stage"
msgstr "身份验证器验证阶段"
-#: authentik/stages/authenticator_validate/models.py:93
+#: authentik/stages/authenticator_validate/models.py
msgid "Authenticator Validation Stages"
msgstr "身份验证器验证阶段"
-#: authentik/stages/authenticator_webauthn/models.py:112
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "WebAuthn 身份验证器设置阶段"
-#: authentik/stages/authenticator_webauthn/models.py:113
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stages"
msgstr "WebAuthn 身份验证器设置阶段"
-#: authentik/stages/authenticator_webauthn/models.py:151
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Device"
msgstr "WebAuthn 设备"
-#: authentik/stages/authenticator_webauthn/models.py:152
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Devices"
msgstr "WebAuthn 设备"
-#: authentik/stages/captcha/models.py:14
+#: authentik/stages/captcha/models.py
msgid "Public key, acquired your captcha Provider."
msgstr "公钥,从您的验证码提供商处取得。"
-#: authentik/stages/captcha/models.py:15
+#: authentik/stages/captcha/models.py
msgid "Private key, acquired your captcha Provider."
msgstr "私钥,从您的验证码提供商处取得。"
-#: authentik/stages/captcha/models.py:37
+#: authentik/stages/captcha/models.py
msgid "Captcha Stage"
msgstr "验证码阶段"
-#: authentik/stages/captcha/models.py:38
+#: authentik/stages/captcha/models.py
msgid "Captcha Stages"
msgstr "验证码阶段"
-#: authentik/stages/consent/models.py:30
+#: authentik/stages/consent/models.py
msgid ""
"Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)."
msgstr "经过多少偏移量后同意授权过期。(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/stages/consent/models.py:50
+#: authentik/stages/consent/models.py
msgid "Consent Stage"
msgstr "同意授权阶段"
-#: authentik/stages/consent/models.py:51
+#: authentik/stages/consent/models.py
msgid "Consent Stages"
msgstr "同意授权阶段"
-#: authentik/stages/consent/models.py:72
+#: authentik/stages/consent/models.py
msgid "User Consent"
msgstr "用户同意授权"
-#: authentik/stages/consent/models.py:73
+#: authentik/stages/consent/models.py
msgid "User Consents"
msgstr "用户同意授权"
-#: authentik/stages/deny/models.py:32
+#: authentik/stages/deny/models.py
msgid "Deny Stage"
msgstr "拒绝阶段"
-#: authentik/stages/deny/models.py:33
+#: authentik/stages/deny/models.py
msgid "Deny Stages"
msgstr "拒绝阶段"
-#: authentik/stages/dummy/models.py:34
+#: authentik/stages/dummy/models.py
msgid "Dummy Stage"
msgstr "虚拟阶段"
-#: authentik/stages/dummy/models.py:35
+#: authentik/stages/dummy/models.py
msgid "Dummy Stages"
msgstr "虚拟阶段"
-#: authentik/stages/email/models.py:26
+#: authentik/stages/email/models.py
msgid "Password Reset"
msgstr "密码重置"
-#: authentik/stages/email/models.py:30
+#: authentik/stages/email/models.py
msgid "Account Confirmation"
msgstr "账户确认"
-#: authentik/stages/email/models.py:59
+#: authentik/stages/email/models.py
msgid ""
"When enabled, global Email connection settings will be used and connection "
"settings below will be ignored."
msgstr "启用后,将使用全局电子邮件连接设置,下面的连接设置将被忽略。"
-#: authentik/stages/email/models.py:74
+#: authentik/stages/email/models.py
msgid "Activate users upon completion of stage."
msgstr "完成阶段后激活用户。"
-#: authentik/stages/email/models.py:78
+#: authentik/stages/email/models.py
msgid "Time in minutes the token sent is valid."
msgstr "发出令牌的有效时间(单位为分钟)。"
-#: authentik/stages/email/models.py:132
+#: authentik/stages/email/models.py
msgid "Email Stage"
msgstr "电子邮件阶段"
-#: authentik/stages/email/models.py:133
+#: authentik/stages/email/models.py
msgid "Email Stages"
msgstr "电子邮件阶段"
-#: authentik/stages/email/stage.py:126
+#: authentik/stages/email/stage.py
msgid "Exception occurred while rendering E-mail template"
msgstr "渲染电子邮件模板时发生异常"
-#: authentik/stages/email/stage.py:140
+#: authentik/stages/email/stage.py
msgid "Successfully verified Email."
msgstr "已成功验证电子邮件。"
-#: authentik/stages/email/stage.py:147 authentik/stages/email/stage.py:173
+#: authentik/stages/email/stage.py
msgid "No pending user."
msgstr "没有待处理的用户。"
-#: authentik/stages/email/stage.py:163
+#: authentik/stages/email/stage.py
msgid "Email sent."
msgstr "电子邮件已发出。"
-#: authentik/stages/email/stage.py:176
+#: authentik/stages/email/stage.py
msgid "Email Successfully sent."
msgstr "成功发送电子邮件。"
-#: authentik/stages/email/templates/email/account_confirmation.html:10
-#: authentik/stages/email/templates/email/account_confirmation.txt:1
+#: authentik/stages/email/templates/email/account_confirmation.html
+#: authentik/stages/email/templates/email/account_confirmation.txt
msgid "Welcome!"
msgstr "欢迎!"
-#: authentik/stages/email/templates/email/account_confirmation.html:19
+#: authentik/stages/email/templates/email/account_confirmation.html
msgid ""
"We're excited to have you get started. First, you need to confirm your "
"account. Just press the button below."
msgstr "我们很高兴您能开始使用。首先,您需要确认您的账户。只需点击下面的按钮。"
-#: authentik/stages/email/templates/email/account_confirmation.html:24
+#: authentik/stages/email/templates/email/account_confirmation.html
msgid "Confirm Account"
msgstr "确认账户"
-#: authentik/stages/email/templates/email/account_confirmation.html:36
+#: authentik/stages/email/templates/email/account_confirmation.html
#, python-format
msgid ""
"\n"
@@ -2377,13 +2384,13 @@ msgstr ""
" 如果按钮无效,请复制并在浏览器中粘贴以下链接:%(url)s\n"
" "
-#: authentik/stages/email/templates/email/account_confirmation.txt:3
+#: authentik/stages/email/templates/email/account_confirmation.txt
msgid ""
"We're excited to have you get started. First, you need to confirm your "
"account. Just open the link below."
msgstr "我们很高兴您能开始使用。首先,您需要确认您的账户。只需打开下面的链接。"
-#: authentik/stages/email/templates/email/event_notification.html:46
+#: authentik/stages/email/templates/email/event_notification.html
#, python-format
msgid ""
"\n"
@@ -2394,19 +2401,19 @@ msgstr ""
" 此邮件由通知递送 %(name)s
发送。\n"
" "
-#: authentik/stages/email/templates/email/event_notification.txt:1
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "Dear authentik user,"
msgstr "亲爱的 authentik 用户,"
-#: authentik/stages/email/templates/email/event_notification.txt:3
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "The following notification was created:"
msgstr "以下通知已创建:"
-#: authentik/stages/email/templates/email/event_notification.txt:8
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "Additional attributes:"
msgstr "额外属性:"
-#: authentik/stages/email/templates/email/event_notification.txt:13
+#: authentik/stages/email/templates/email/event_notification.txt
#, python-format
msgid ""
"\n"
@@ -2415,7 +2422,7 @@ msgstr ""
"\n"
"此邮件由通知递送 %(name)s 发送。\n"
-#: authentik/stages/email/templates/email/password_reset.html:10
+#: authentik/stages/email/templates/email/password_reset.html
#, python-format
msgid ""
"\n"
@@ -2426,7 +2433,7 @@ msgstr ""
" %(username)s 您好,\n"
" "
-#: authentik/stages/email/templates/email/password_reset.html:21
+#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n"
@@ -2436,7 +2443,7 @@ msgstr ""
" 您最近请求更改您的 authentik 账户密码。使用下面的按钮设置新密码。\n"
" "
-#: authentik/stages/email/templates/email/password_reset.html:39
+#: authentik/stages/email/templates/email/password_reset.html
#, python-format
msgid ""
"\n"
@@ -2447,12 +2454,12 @@ msgstr ""
" 如果您没有请求更改密码,请忽略此电子邮件。上面的链接在 %(expires)s 内有效。\n"
" "
-#: authentik/stages/email/templates/email/password_reset.txt:1
+#: authentik/stages/email/templates/email/password_reset.txt
#, python-format
msgid "Hi %(username)s,"
msgstr "您好 %(username)s,"
-#: authentik/stages/email/templates/email/password_reset.txt:3
+#: authentik/stages/email/templates/email/password_reset.txt
msgid ""
"\n"
"You recently requested to change your password for your authentik account. Use the link below to set a new password.\n"
@@ -2460,7 +2467,7 @@ msgstr ""
"\n"
"您最近请求更改您的 authentik 账户密码。使用下面的链接设置新密码。\n"
-#: authentik/stages/email/templates/email/password_reset.txt:7
+#: authentik/stages/email/templates/email/password_reset.txt
#, python-format
msgid ""
"\n"
@@ -2469,11 +2476,11 @@ msgstr ""
"\n"
"如果您没有请求更改密码,请忽略此电子邮件。上面的链接在 %(expires)s 内有效。\n"
-#: authentik/stages/email/templates/email/setup.html:9
+#: authentik/stages/email/templates/email/setup.html
msgid "authentik Test-Email"
msgstr "authentik 测试电子邮件"
-#: authentik/stages/email/templates/email/setup.html:17
+#: authentik/stages/email/templates/email/setup.html
msgid ""
"\n"
" This is a test email to inform you, that you've successfully configured authentik emails.\n"
@@ -2483,7 +2490,7 @@ msgstr ""
" 这是一封测试电子邮件,用于通知您已成功配置 authentik 电子邮件。\n"
" "
-#: authentik/stages/email/templates/email/setup.txt:2
+#: authentik/stages/email/templates/email/setup.txt
msgid ""
"\n"
"This is a test email to inform you, that you've successfully configured authentik emails.\n"
@@ -2491,263 +2498,263 @@ msgstr ""
"\n"
"这是一封测试电子邮件,用于通知您已成功配置 authentik 电子邮件。\n"
-#: authentik/stages/identification/api.py:20
+#: authentik/stages/identification/api.py
msgid "When no user fields are selected, at least one source must be selected"
msgstr "如果未选择用户字段,则至少要选择一个源"
-#: authentik/stages/identification/models.py:29
+#: authentik/stages/identification/models.py
msgid ""
"Fields of the user object to match against. (Hold shift to select multiple "
"options)"
msgstr "用来匹配的用户对象字段。(按住 Shift 多选)"
-#: authentik/stages/identification/models.py:47
+#: authentik/stages/identification/models.py
msgid "When enabled, user fields are matched regardless of their casing."
msgstr "启用后,无论大小写如何,都将匹配用户字段。"
-#: authentik/stages/identification/models.py:52
+#: authentik/stages/identification/models.py
msgid ""
"When a valid username/email has been entered, and this option is enabled, "
"the user's username and avatar will be shown. Otherwise, the text that the "
"user entered will be shown"
msgstr "如果输入了有效的用户名/电子邮箱,并且启用了此选项,则会显示用户的用户名和头像。否则,将显示用户输入的文本"
-#: authentik/stages/identification/models.py:60
+#: authentik/stages/identification/models.py
msgid ""
"When enabled, the stage will succeed and continue even when incorrect user "
"info is entered."
msgstr "启用时,即使输入错误的用户信息,此阶段也会成功并继续。"
-#: authentik/stages/identification/models.py:72
+#: authentik/stages/identification/models.py
msgid "Optional enrollment flow, which is linked at the bottom of the page."
msgstr "可选注册流程,链接在页面底部。"
-#: authentik/stages/identification/models.py:81
+#: authentik/stages/identification/models.py
msgid "Optional recovery flow, which is linked at the bottom of the page."
msgstr "可选的恢复流程,链接在页面底部。"
-#: authentik/stages/identification/models.py:90
+#: authentik/stages/identification/models.py
msgid "Optional passwordless flow, which is linked at the bottom of the page."
msgstr "可选的无密码流程,链接在页面底部。"
-#: authentik/stages/identification/models.py:94
+#: authentik/stages/identification/models.py
msgid "Specify which sources should be shown."
msgstr "指定应显示哪些源。"
-#: authentik/stages/identification/models.py:115
+#: authentik/stages/identification/models.py
msgid "Identification Stage"
msgstr "识别阶段"
-#: authentik/stages/identification/models.py:116
+#: authentik/stages/identification/models.py
msgid "Identification Stages"
msgstr "识别阶段"
-#: authentik/stages/identification/stage.py:188
+#: authentik/stages/identification/stage.py
msgid "Log in"
msgstr "登录"
-#: authentik/stages/identification/stage.py:189
+#: authentik/stages/identification/stage.py
msgid "Continue"
msgstr "继续"
-#: authentik/stages/invitation/models.py:21
+#: authentik/stages/invitation/models.py
msgid ""
"If this flag is set, this Stage will jump to the next Stage when no "
"Invitation is given. By default this Stage will cancel the Flow when no "
"invitation is given."
msgstr "如果设置了此标志,则当没有发出邀请时,此阶段将跳转到下一个阶段。默认情况下,当没有发出邀请时,此阶段将取消流程。"
-#: authentik/stages/invitation/models.py:44
+#: authentik/stages/invitation/models.py
msgid "Invitation Stage"
msgstr "邀请阶段"
-#: authentik/stages/invitation/models.py:45
+#: authentik/stages/invitation/models.py
msgid "Invitation Stages"
msgstr "邀请阶段"
-#: authentik/stages/invitation/models.py:60
+#: authentik/stages/invitation/models.py
msgid "When set, only the configured flow can use this invitation."
msgstr "设置时,只有配置的流程可以使用此邀请。"
-#: authentik/stages/invitation/models.py:64
+#: authentik/stages/invitation/models.py
msgid "When enabled, the invitation will be deleted after usage."
msgstr "启用后,邀请将在使用后被删除。"
-#: authentik/stages/invitation/models.py:71
+#: authentik/stages/invitation/models.py
msgid "Optional fixed data to enforce on user enrollment."
msgstr "在用户注册时强制设置的可选固定数据。"
-#: authentik/stages/invitation/models.py:84
+#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "邀请"
-#: authentik/stages/invitation/models.py:85
+#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "邀请"
-#: authentik/stages/invitation/stage.py:62
+#: authentik/stages/invitation/stage.py
msgid "Invalid invite/invite not found"
msgstr "邀请无效/未找到"
-#: authentik/stages/password/models.py:20
+#: authentik/stages/password/models.py
msgid "User database + standard password"
msgstr "用户数据库 + 标准密码"
-#: authentik/stages/password/models.py:24
+#: authentik/stages/password/models.py
msgid "User database + app passwords"
msgstr "用户数据库 + 应用程序密码"
-#: authentik/stages/password/models.py:28
+#: authentik/stages/password/models.py
msgid "User database + LDAP password"
msgstr "用户数据库 + LDAP 密码"
-#: authentik/stages/password/models.py:38
+#: authentik/stages/password/models.py
msgid "Selection of backends to test the password against."
msgstr "选择用于测试密码的后端。"
-#: authentik/stages/password/models.py:43
+#: authentik/stages/password/models.py
msgid ""
"How many attempts a user has before the flow is canceled. To lock the user "
"out, use a reputation policy and a user_write stage."
msgstr "在取消流程之前,用户可以尝试多少次。要锁定用户,请使用信誉策略和 user_write 阶段。"
-#: authentik/stages/password/models.py:75
+#: authentik/stages/password/models.py
msgid "Password Stage"
msgstr "密码阶段"
-#: authentik/stages/password/models.py:76
+#: authentik/stages/password/models.py
msgid "Password Stages"
msgstr "密码阶段"
-#: authentik/stages/password/stage.py:124
+#: authentik/stages/password/stage.py
msgid "Invalid password"
msgstr "无效密码"
-#: authentik/stages/prompt/models.py:43
+#: authentik/stages/prompt/models.py
msgid "Text: Simple Text input"
msgstr "文本:简单文本输入"
-#: authentik/stages/prompt/models.py:45
+#: authentik/stages/prompt/models.py
msgid "Text area: Multiline Text Input."
msgstr "文本框:多行文本输入。"
-#: authentik/stages/prompt/models.py:48
+#: authentik/stages/prompt/models.py
msgid "Text (read-only): Simple Text input, but cannot be edited."
msgstr "文本(只读):简单文本输入,但无法编辑。"
-#: authentik/stages/prompt/models.py:52
+#: authentik/stages/prompt/models.py
msgid "Text area (read-only): Multiline Text input, but cannot be edited."
msgstr "文本框(只读):多行文本输入,但无法编辑。"
-#: authentik/stages/prompt/models.py:58
+#: authentik/stages/prompt/models.py
msgid ""
"Username: Same as Text input, but checks for and prevents duplicate "
"usernames."
msgstr "用户名:与文本输入相同,但检查并防止用户名重复。"
-#: authentik/stages/prompt/models.py:60
+#: authentik/stages/prompt/models.py
msgid "Email: Text field with Email type."
msgstr "电子邮箱:电子邮箱类型的文本字段。"
-#: authentik/stages/prompt/models.py:64
+#: authentik/stages/prompt/models.py
msgid ""
"Password: Masked input, multiple inputs of this type on the same prompt need"
" to be identical."
msgstr "密码:屏蔽显示输入内容,多个此类型的输入如果在同一个输入项下,则内容需要相同。"
-#: authentik/stages/prompt/models.py:71
+#: authentik/stages/prompt/models.py
msgid "Fixed choice field rendered as a group of radio buttons."
msgstr "显示为一组单选按钮的固定选项字段。"
-#: authentik/stages/prompt/models.py:73
+#: authentik/stages/prompt/models.py
msgid "Fixed choice field rendered as a dropdown."
msgstr "显示为下拉框的固定选项字段。"
-#: authentik/stages/prompt/models.py:80
+#: authentik/stages/prompt/models.py
msgid ""
"File: File upload for arbitrary files. File content will be available in "
"flow context as data-URI"
msgstr "文件:任意文件上传。文件内容将在流程上下文中以 data-URI 形式提供"
-#: authentik/stages/prompt/models.py:85
+#: authentik/stages/prompt/models.py
msgid "Separator: Static Separator Line"
msgstr "分隔符:静态分隔线"
-#: authentik/stages/prompt/models.py:86
+#: authentik/stages/prompt/models.py
msgid "Hidden: Hidden field, can be used to insert data into form."
msgstr "隐藏:隐藏字段,可用于将数据插入表单。"
-#: authentik/stages/prompt/models.py:87
+#: authentik/stages/prompt/models.py
msgid "Static: Static value, displayed as-is."
msgstr "静态:静态值,按原样显示。"
-#: authentik/stages/prompt/models.py:89
+#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik:选择 authentik 支持的语言环境"
-#: authentik/stages/prompt/models.py:116
+#: authentik/stages/prompt/models.py
msgid "Name of the form field, also used to store the value"
msgstr "表单域的名称,也用于存储值"
-#: authentik/stages/prompt/models.py:124
+#: authentik/stages/prompt/models.py
msgid ""
"Optionally provide a short hint that describes the expected input value. "
"When creating a fixed choice field, enable interpreting as expression and "
"return a list to return multiple choices."
msgstr "可选的简短提示,用来描述期望的输入值。在创建固定选项字段时,启用以表达式解释,并返回多个选项的列表。"
-#: authentik/stages/prompt/models.py:132
+#: authentik/stages/prompt/models.py
msgid ""
"Optionally pre-fill the input with an initial value. When creating a fixed "
"choice field, enable interpreting as expression and return a list to return "
"multiple default choices."
msgstr "可选的预设输入初始值。在创建固定选项字段时,启用以表达式解释,并返回多个默认选项的列表。"
-#: authentik/stages/prompt/models.py:321
+#: authentik/stages/prompt/models.py
msgid "Prompt"
msgstr "输入"
-#: authentik/stages/prompt/models.py:322
+#: authentik/stages/prompt/models.py
msgid "Prompts"
msgstr "输入"
-#: authentik/stages/prompt/models.py:349
+#: authentik/stages/prompt/models.py
msgid "Prompt Stage"
msgstr "输入阶段"
-#: authentik/stages/prompt/models.py:350
+#: authentik/stages/prompt/models.py
msgid "Prompt Stages"
msgstr "输入阶段"
-#: authentik/stages/prompt/stage.py:108
+#: authentik/stages/prompt/stage.py
msgid "Passwords don't match."
msgstr "密码不匹配。"
-#: authentik/stages/user_delete/models.py:31
+#: authentik/stages/user_delete/models.py
msgid "User Delete Stage"
msgstr "用户删除阶段"
-#: authentik/stages/user_delete/models.py:32
+#: authentik/stages/user_delete/models.py
msgid "User Delete Stages"
msgstr "用户删除阶段"
-#: authentik/stages/user_delete/stage.py:18
+#: authentik/stages/user_delete/stage.py
msgid "No Pending User."
msgstr "没有待处理的用户。"
-#: authentik/stages/user_login/models.py:47
+#: authentik/stages/user_login/models.py
msgid "Bind sessions created by this stage to the configured network"
msgstr "将此阶段创建的会话与配置的网络绑定"
-#: authentik/stages/user_login/models.py:52
+#: authentik/stages/user_login/models.py
msgid "Bind sessions created by this stage to the configured GeoIP location"
msgstr "将此阶段创建的会话与配置的 GeoIP 位置绑定"
-#: authentik/stages/user_login/models.py:55
+#: authentik/stages/user_login/models.py
msgid "Terminate all other sessions of the user logging in."
msgstr "终止用户登录的所有其他会话。"
-#: authentik/stages/user_login/models.py:61
+#: authentik/stages/user_login/models.py
msgid ""
"Offset the session will be extended by when the user picks the remember me "
"option. Default of 0 means that the remember me option will not be shown. "
@@ -2756,113 +2763,112 @@ msgstr ""
"当用户选择“记住我”选项时,会话将会延长的时间。默认值 0 "
"表示不显示“记住我”选项。(格式:hours=-1;minutes=-2;seconds=-3)"
-#: authentik/stages/user_login/models.py:84
+#: authentik/stages/user_login/models.py
msgid "User Login Stage"
msgstr "用户登录阶段"
-#: authentik/stages/user_login/models.py:85
+#: authentik/stages/user_login/models.py
msgid "User Login Stages"
msgstr "用户登录阶段"
-#: authentik/stages/user_login/stage.py:85
+#: authentik/stages/user_login/stage.py
msgid "No Pending user to login."
msgstr "没有待定用户可以登录。"
-#: authentik/stages/user_login/stage.py:112
+#: authentik/stages/user_login/stage.py
msgid "Successfully logged in!"
msgstr "已成功登录!"
-#: authentik/stages/user_logout/models.py:30
+#: authentik/stages/user_logout/models.py
msgid "User Logout Stage"
msgstr "用户登出阶段"
-#: authentik/stages/user_logout/models.py:31
+#: authentik/stages/user_logout/models.py
msgid "User Logout Stages"
msgstr "用户登出阶段"
-#: authentik/stages/user_write/models.py:31
+#: authentik/stages/user_write/models.py
msgid "When set, newly created users are inactive and cannot login."
msgstr "设置后,新创建的用户将处于未激活状态,且无法登录。"
-#: authentik/stages/user_write/models.py:39
+#: authentik/stages/user_write/models.py
msgid "Optionally add newly created users to this group."
msgstr "可选,将新创建的用户添加到此组。"
-#: authentik/stages/user_write/models.py:68
+#: authentik/stages/user_write/models.py
msgid "User Write Stage"
msgstr "用户写入阶段"
-#: authentik/stages/user_write/models.py:69
+#: authentik/stages/user_write/models.py
msgid "User Write Stages"
msgstr "用户写入阶段"
-#: authentik/stages/user_write/stage.py:141
+#: authentik/stages/user_write/stage.py
msgid "No Pending data."
msgstr "没有待处理的数据。"
-#: authentik/stages/user_write/stage.py:147
+#: authentik/stages/user_write/stage.py
msgid "No user found and can't create new user."
msgstr "未找到用户并且无法创建新用户。"
-#: authentik/stages/user_write/stage.py:164
-#: authentik/stages/user_write/stage.py:178
+#: authentik/stages/user_write/stage.py
msgid "Failed to update user. Please try again later."
msgstr "更新用户失败。请稍后重试。"
-#: authentik/tenants/models.py:29
+#: authentik/tenants/models.py
msgid ""
"Schema name must start with t_, only contain lowercase letters and numbers "
"and be less than 63 characters."
msgstr "模式名称必须以 t_ 开始,只能包含小写字母和数字,并且少于 63 个字符。"
-#: authentik/tenants/models.py:49
+#: authentik/tenants/models.py
msgid "Configure how authentik should show avatars for users."
msgstr "配置 authentik 应该如何显示用户头像。"
-#: authentik/tenants/models.py:53
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their name."
msgstr "启用用户修改自己名称的能力。"
-#: authentik/tenants/models.py:56
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their email address."
msgstr "启用用户修改自己电子邮件地址的能力。"
-#: authentik/tenants/models.py:59
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their username."
msgstr "启用用户修改自己用户名的能力。"
-#: authentik/tenants/models.py:65
+#: authentik/tenants/models.py
msgid ""
"Events will be deleted after this duration.(Format: "
"weeks=3;days=2;hours=3,seconds=2)."
msgstr "事件会在多久后被删除。(格式:weeks=3;days=2;hours=3,seconds=2)。"
-#: authentik/tenants/models.py:69
+#: authentik/tenants/models.py
msgid "The option configures the footer links on the flow executor pages."
msgstr "此选项配置流程执行器页面上的页脚链接。"
-#: authentik/tenants/models.py:75
+#: authentik/tenants/models.py
msgid ""
"When enabled, all the events caused by a user will be deleted upon the "
"user's deletion."
msgstr "启用时,所有由用户造成的事件会在相应用户被删除时一并删除。"
-#: authentik/tenants/models.py:81
+#: authentik/tenants/models.py
msgid "Globally enable/disable impersonation."
msgstr "全局启用/禁用模拟身份。"
-#: authentik/tenants/models.py:104
+#: authentik/tenants/models.py
msgid "Tenant"
msgstr "租户"
-#: authentik/tenants/models.py:105
+#: authentik/tenants/models.py
msgid "Tenants"
msgstr "租户"
-#: authentik/tenants/models.py:125
+#: authentik/tenants/models.py
msgid "Domain"
msgstr "域名"
-#: authentik/tenants/models.py:126
+#: authentik/tenants/models.py
msgid "Domains"
msgstr "域名"
diff --git a/locale/zh_CN/LC_MESSAGES/django.po b/locale/zh_CN/LC_MESSAGES/django.po
index dd336981c2..ea5b8d76c6 100644
--- a/locale/zh_CN/LC_MESSAGES/django.po
+++ b/locale/zh_CN/LC_MESSAGES/django.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-01-26 17:26+0000\n"
+"POT-Creation-Date: 2024-02-14 18:51+0000\n"
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
"Last-Translator: deluxghost, 2024\n"
"Language-Team: Chinese (China) (https://app.transifex.com/authentik/teams/119923/zh_CN/)\n"
@@ -24,32 +24,32 @@ msgstr ""
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: authentik/api/schema.py:25
+#: authentik/api/schema.py
msgid "Generic API Error"
msgstr "通用 API 错误"
-#: authentik/api/schema.py:33
+#: authentik/api/schema.py
msgid "Validation Error"
msgstr "校验错误"
-#: authentik/blueprints/api.py:43
+#: authentik/blueprints/api.py
msgid "Blueprint file does not exist"
msgstr "蓝图文件不存在"
-#: authentik/blueprints/api.py:54
+#: authentik/blueprints/api.py
#, python-format
msgid "Failed to validate blueprint: %(logs)s"
msgstr "验证蓝图失败:%(logs)s"
-#: authentik/blueprints/api.py:59
+#: authentik/blueprints/api.py
msgid "Either path or content must be set."
msgstr "必须设置路径或内容。"
-#: authentik/blueprints/models.py:30
+#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "由 authentik 管理"
-#: authentik/blueprints/models.py:32
+#: authentik/blueprints/models.py
msgid ""
"Objects that are managed by authentik. These objects are created and updated"
" automatically. This flag only indicates that an object can be overwritten "
@@ -59,248 +59,255 @@ msgstr ""
"由 authentik 管理的对象。这些对象会自动创建和更新。此标记仅仅表明对象可以被 Migration 覆盖。您仍然可以通过 API "
"修改对象,但这些修改可能会在之后的更新中被覆盖。"
-#: authentik/blueprints/models.py:112
+#: authentik/blueprints/models.py
msgid "Blueprint Instance"
msgstr "蓝图实例"
-#: authentik/blueprints/models.py:113
+#: authentik/blueprints/models.py
msgid "Blueprint Instances"
msgstr "蓝图实例"
-#: authentik/blueprints/v1/exporter.py:62
+#: authentik/blueprints/v1/exporter.py
#, python-format
msgid "authentik Export - %(date)s"
msgstr "authentik 导出 - %(date)s"
-#: authentik/blueprints/v1/tasks.py:145 authentik/crypto/tasks.py:87
+#: authentik/blueprints/v1/tasks.py authentik/crypto/tasks.py
#, python-format
msgid "Successfully imported %(count)d files."
msgstr "已成功导入 %(count)d 个文件。"
-#: authentik/brands/models.py:22
+#: authentik/brands/models.py
msgid ""
"Domain that activates this brand. Can be a superset, i.e. `a.b` for `aa.b` "
"and `ba.b`"
msgstr "激活此品牌的域。可以是超集,即 `a.b` 可以同时表示 `aa.b` 和 `ba.b`"
-#: authentik/brands/models.py:58
+#: authentik/brands/models.py
msgid "Web Certificate used by the authentik Core webserver."
msgstr "authentik 核心 Web 服务器使用的 Web 证书。"
-#: authentik/brands/models.py:84
+#: authentik/brands/models.py
msgid "Brand"
msgstr "品牌"
-#: authentik/brands/models.py:85
+#: authentik/brands/models.py
msgid "Brands"
msgstr "品牌"
-#: authentik/core/api/providers.py:122
+#: authentik/core/api/providers.py
msgid "SAML Provider from Metadata"
msgstr "来自元数据的 SAML 提供程序"
-#: authentik/core/api/providers.py:123
+#: authentik/core/api/providers.py
msgid "Create a SAML Provider by importing its Metadata."
msgstr "通过导入元数据来创建 SAML 提供程序。"
-#: authentik/core/api/users.py:149
+#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
msgstr "不允许前缀或后缀斜线。"
-#: authentik/core/api/users.py:152
+#: authentik/core/api/users.py
msgid "No empty segments in user path allowed."
msgstr "不允许用户路径包含空段。"
-#: authentik/core/models.py:92
+#: authentik/core/models.py
msgid "name"
msgstr "名称"
-#: authentik/core/models.py:94
+#: authentik/core/models.py
msgid "Users added to this group will be superusers."
msgstr "添加到该组的用户均为超级用户。"
-#: authentik/core/models.py:168
+#: authentik/core/models.py
msgid "Group"
msgstr "组"
-#: authentik/core/models.py:169
+#: authentik/core/models.py
msgid "Groups"
msgstr "组"
-#: authentik/core/models.py:184
+#: authentik/core/models.py
msgid "User's display name."
msgstr "用户的显示名称。"
-#: authentik/core/models.py:280 authentik/providers/oauth2/models.py:295
+#: authentik/core/models.py authentik/providers/oauth2/models.py
msgid "User"
msgstr "用户"
-#: authentik/core/models.py:281
+#: authentik/core/models.py
msgid "Users"
msgstr "用户"
-#: authentik/core/models.py:283
-#: authentik/stages/email/templates/email/password_reset.html:28
+#: authentik/core/models.py
+#: authentik/stages/email/templates/email/password_reset.html
msgid "Reset Password"
msgstr "重置密码"
-#: authentik/core/models.py:284
+#: authentik/core/models.py
msgid "Can impersonate other users"
msgstr "可以模拟其他用户的身份"
-#: authentik/core/models.py:285 authentik/rbac/models.py:54
+#: authentik/core/models.py authentik/rbac/models.py
msgid "Can assign permissions to users"
msgstr "可以为用户分配权限"
-#: authentik/core/models.py:286 authentik/rbac/models.py:55
+#: authentik/core/models.py authentik/rbac/models.py
msgid "Can unassign permissions from users"
msgstr "可以取消分配用户的权限"
-#: authentik/core/models.py:308
+#: authentik/core/models.py
+msgid "Can preview user data sent to providers"
+msgstr "可以预览发送给提供程序的用户数据"
+
+#: authentik/core/models.py
+msgid "View applications the user has access to"
+msgstr "查看用户有权访问的应用程序"
+
+#: authentik/core/models.py
msgid ""
"Flow used for authentication when the associated application is accessed by "
"an un-authenticated user."
msgstr "当关联应用程序被未验证身份的用户访问时,用于身份验证的流程。"
-#: authentik/core/models.py:318
+#: authentik/core/models.py
msgid "Flow used when authorizing this provider."
msgstr "授权此提供程序时使用的流程。"
-#: authentik/core/models.py:330
+#: authentik/core/models.py
msgid ""
"Accessed from applications; optional backchannel providers for protocols "
"like LDAP and SCIM."
msgstr "从应用程序访问;为类似 LDAP 和 SCIM 的协议提供的可选反向通道提供程序。"
-#: authentik/core/models.py:385
+#: authentik/core/models.py
msgid "Application's display Name."
msgstr "应用的显示名称。"
-#: authentik/core/models.py:386
+#: authentik/core/models.py
msgid "Internal application name, used in URLs."
msgstr "应用的内部名称,在 URL 中使用。"
-#: authentik/core/models.py:398
+#: authentik/core/models.py
msgid "Open launch URL in a new browser tab or window."
msgstr "在新浏览器标签页或窗口中打开启动 URL。"
-#: authentik/core/models.py:462
+#: authentik/core/models.py
msgid "Application"
msgstr "应用程序"
-#: authentik/core/models.py:463
+#: authentik/core/models.py
msgid "Applications"
msgstr "应用程序"
-#: authentik/core/models.py:469
+#: authentik/core/models.py
msgid "Use the source-specific identifier"
msgstr "使用源特定的标识符"
-#: authentik/core/models.py:471
+#: authentik/core/models.py
msgid ""
"Link to a user with identical email address. Can have security implications "
"when a source doesn't validate email addresses."
msgstr "链接到电子邮件地址相同的用户。当源不验证电子邮件地址时,可能会有安全隐患。"
-#: authentik/core/models.py:475
+#: authentik/core/models.py
msgid ""
"Use the user's email address, but deny enrollment when the email address "
"already exists."
msgstr "使用用户的电子邮件地址,但在电子邮件地址已存在时拒绝注册。"
-#: authentik/core/models.py:478
+#: authentik/core/models.py
msgid ""
"Link to a user with identical username. Can have security implications when "
"a username is used with another source."
msgstr "链接到用户名相同的用户。当其他源使用相同用户名时,可能会有安全隐患。"
-#: authentik/core/models.py:482
+#: authentik/core/models.py
msgid ""
"Use the user's username, but deny enrollment when the username already "
"exists."
msgstr "使用用户的用户名,但在用户名已存在时拒绝注册。"
-#: authentik/core/models.py:489
+#: authentik/core/models.py
msgid "Source's display Name."
msgstr "源的显示名称。"
-#: authentik/core/models.py:490
+#: authentik/core/models.py
msgid "Internal source name, used in URLs."
msgstr "源的内部名称,在 URL 中使用。"
-#: authentik/core/models.py:509
+#: authentik/core/models.py
msgid "Flow to use when authenticating existing users."
msgstr "认证已存在用户时所使用的流程。"
-#: authentik/core/models.py:518
+#: authentik/core/models.py
msgid "Flow to use when enrolling new users."
msgstr "新用户注册的流程。"
-#: authentik/core/models.py:526
+#: authentik/core/models.py
msgid ""
"How the source determines if an existing user should be authenticated or a "
"new user enrolled."
msgstr "源怎样确定应该验证已有用户的身份还是注册新用户。"
-#: authentik/core/models.py:698
+#: authentik/core/models.py
msgid "Token"
msgstr "令牌"
-#: authentik/core/models.py:699
+#: authentik/core/models.py
msgid "Tokens"
msgstr "令牌"
-#: authentik/core/models.py:704
+#: authentik/core/models.py
msgid "View token's key"
msgstr "查看令牌密钥"
-#: authentik/core/models.py:740
+#: authentik/core/models.py
msgid "Property Mapping"
msgstr "属性映射"
-#: authentik/core/models.py:741
+#: authentik/core/models.py
msgid "Property Mappings"
msgstr "属性映射"
-#: authentik/core/models.py:778
+#: authentik/core/models.py
msgid "Authenticated Session"
msgstr "已认证会话"
-#: authentik/core/models.py:779
+#: authentik/core/models.py
msgid "Authenticated Sessions"
msgstr "已认证会话"
-#: authentik/core/sources/flow_manager.py:190
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid ""
"Request to authenticate with %(source)s has been denied. Please authenticate"
" with the source you've previously signed up with."
msgstr "来自 %(source)s 的身份验证请求被拒绝。请用您注册时使用的方式验证身份。"
-#: authentik/core/sources/flow_manager.py:242
+#: authentik/core/sources/flow_manager.py
msgid "Configured flow does not exist."
msgstr "配置的流程不存在。"
-#: authentik/core/sources/flow_manager.py:272
-#: authentik/core/sources/flow_manager.py:324
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid "Successfully authenticated with %(source)s!"
msgstr "成功通过 %(source)s 认证!"
-#: authentik/core/sources/flow_manager.py:296
+#: authentik/core/sources/flow_manager.py
#, python-format
msgid "Successfully linked %(source)s!"
msgstr "成功链接 %(source)s!"
-#: authentik/core/sources/flow_manager.py:315
+#: authentik/core/sources/flow_manager.py
msgid "Source is not configured for enrollment."
msgstr "源未被配置用于注册。"
-#: authentik/core/templates/if/end_session.html:7
+#: authentik/core/templates/if/end_session.html
msgid "End session"
msgstr "结束会话"
-#: authentik/core/templates/if/end_session.html:11
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -309,7 +316,7 @@ msgstr ""
"\n"
"您已登出 %(application)s。\n"
-#: authentik/core/templates/if/end_session.html:19
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -319,11 +326,11 @@ msgstr ""
"\n"
" 您已成功登出 %(application)s 。现在您可以返回总览页来启动其他应用,或者登出您的 %(branding_title)s 账户。"
-#: authentik/core/templates/if/end_session.html:25
+#: authentik/core/templates/if/end_session.html
msgid "Go back to overview"
msgstr "返回总览"
-#: authentik/core/templates/if/end_session.html:29
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -334,7 +341,7 @@ msgstr ""
" 登出 %(branding_title)s\n"
" "
-#: authentik/core/templates/if/end_session.html:36
+#: authentik/core/templates/if/end_session.html
#, python-format
msgid ""
"\n"
@@ -345,361 +352,367 @@ msgstr ""
" 重新登录 %(application)s\n"
" "
-#: authentik/core/templates/if/error.html:18
+#: authentik/core/templates/if/error.html
msgid "Go home"
msgstr "前往首页"
-#: authentik/core/templates/login/base_full.html:75
+#: authentik/core/templates/login/base_full.html
msgid "Powered by authentik"
msgstr "由 authentik 强力驱动"
-#: authentik/core/views/apps.py:53
-#: authentik/providers/oauth2/views/authorize.py:434
-#: authentik/providers/oauth2/views/device_init.py:70
-#: authentik/providers/saml/views/sso.py:70
+#: authentik/core/views/apps.py authentik/providers/oauth2/views/authorize.py
+#: authentik/providers/oauth2/views/device_init.py
+#: authentik/providers/saml/views/sso.py
#, python-format
msgid "You're about to sign into %(application)s."
msgstr "您即将登录 %(application)s。"
-#: authentik/crypto/api.py:179
+#: authentik/crypto/api.py
msgid "Subject-alt name"
msgstr "替代名称"
-#: authentik/crypto/models.py:30
+#: authentik/crypto/models.py
msgid "PEM-encoded Certificate data"
msgstr "PEM 编码的证书数据"
-#: authentik/crypto/models.py:33
+#: authentik/crypto/models.py
msgid ""
"Optional Private Key. If this is set, you can use this keypair for "
"encryption."
msgstr "可选私钥。如果设置,则可以使用此密钥对来加密。"
-#: authentik/crypto/models.py:101
+#: authentik/crypto/models.py
msgid "Certificate-Key Pair"
msgstr "证书密钥对"
-#: authentik/crypto/models.py:102
+#: authentik/crypto/models.py
msgid "Certificate-Key Pairs"
msgstr "证书密钥对"
-#: authentik/enterprise/api.py:33
+#: authentik/enterprise/api.py
msgid "Enterprise is required to create/update this object."
msgstr "创建/更新此对象需要企业版。"
-#: authentik/enterprise/models.py:183
+#: authentik/enterprise/models.py
msgid "License"
msgstr "许可证"
-#: authentik/enterprise/models.py:184
+#: authentik/enterprise/models.py
msgid "Licenses"
msgstr "许可证"
-#: authentik/enterprise/models.py:206
+#: authentik/enterprise/models.py
msgid "License Usage"
msgstr "许可证使用情况"
-#: authentik/enterprise/models.py:207
+#: authentik/enterprise/models.py
msgid "License Usage Records"
msgstr "许可证使用情况记录"
-#: authentik/enterprise/policy.py:18
+#: authentik/enterprise/policy.py
msgid "Enterprise required to access this feature."
msgstr "访问此功能需要企业版。"
-#: authentik/enterprise/policy.py:20
+#: authentik/enterprise/policy.py
msgid "Feature only accessible for internal users."
msgstr "仅内部用户能访问此功能。"
-#: authentik/enterprise/providers/rac/models.py:48
-#: authentik/stages/user_login/models.py:39
+#: authentik/enterprise/providers/rac/models.py
+#: authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
"lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)"
msgstr "确定会话持续多长时间。默认值为 0 表示会话持续到浏览器关闭为止。(格式:hours=-1;minutes=-2;seconds=-3)"
-#: authentik/enterprise/providers/rac/models.py:71
+#: authentik/enterprise/providers/rac/models.py
+msgid "When set to true, connection tokens will be deleted upon disconnect."
+msgstr "启用时,连接令牌将会在断开连接时被删除。"
+
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Provider"
msgstr "RAC 提供程序"
-#: authentik/enterprise/providers/rac/models.py:72
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Providers"
msgstr "RAC 提供程序"
-#: authentik/enterprise/providers/rac/models.py:100
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Endpoint"
msgstr "RAC 端点"
-#: authentik/enterprise/providers/rac/models.py:101
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Endpoints"
msgstr "RAC 端点"
-#: authentik/enterprise/providers/rac/models.py:122
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Property Mapping"
msgstr "RAC 属性映射"
-#: authentik/enterprise/providers/rac/models.py:123
+#: authentik/enterprise/providers/rac/models.py
msgid "RAC Property Mappings"
msgstr "RAC 属性映射"
-#: authentik/enterprise/providers/rac/views.py:108
+#: authentik/enterprise/providers/rac/models.py
+msgid "RAC Connection token"
+msgstr "RAC 连接令牌"
+
+#: authentik/enterprise/providers/rac/models.py
+msgid "RAC Connection tokens"
+msgstr "RAC 连接令牌"
+
+#: authentik/enterprise/providers/rac/views.py
msgid "Maximum connection limit reached."
msgstr "已达到最大连接数。"
-#: authentik/enterprise/providers/rac/views.py:112
+#: authentik/enterprise/providers/rac/views.py
msgid "(You are already connected in another tab/window)"
msgstr "(您已经在另一个标签页/窗口连接了)"
-#: authentik/events/api/tasks.py:100
+#: authentik/events/api/tasks.py
#, python-format
msgid "Successfully started task %(name)s."
msgstr "已成功开始任务 %(name)s。"
-#: authentik/events/models.py:304
+#: authentik/events/models.py
msgid "Event"
msgstr "事件"
-#: authentik/events/models.py:305
+#: authentik/events/models.py
msgid "Events"
msgstr "事件"
-#: authentik/events/models.py:311
+#: authentik/events/models.py
msgid "authentik inbuilt notifications"
msgstr "authentik 内置通知"
-#: authentik/events/models.py:312
+#: authentik/events/models.py
msgid "Generic Webhook"
msgstr "通用 Webhook"
-#: authentik/events/models.py:313
+#: authentik/events/models.py
msgid "Slack Webhook (Slack/Discord)"
msgstr "Slack Webhook(Slack/Discord)"
-#: authentik/events/models.py:314
+#: authentik/events/models.py
msgid "Email"
msgstr "电子邮箱"
-#: authentik/events/models.py:332
+#: authentik/events/models.py
msgid ""
"Only send notification once, for example when sending a webhook into a chat "
"channel."
msgstr "仅发送一次通知,例如在向聊天频道发送 Webhook 时。"
-#: authentik/events/models.py:397
+#: authentik/events/models.py
msgid "Severity"
msgstr "严重程度"
-#: authentik/events/models.py:402
+#: authentik/events/models.py
msgid "Dispatched for user"
msgstr "为用户分派"
-#: authentik/events/models.py:411
+#: authentik/events/models.py
msgid "Event user"
msgstr "事件用户"
-#: authentik/events/models.py:505
+#: authentik/events/models.py
msgid "Notification Transport"
msgstr "通知传输"
-#: authentik/events/models.py:506
+#: authentik/events/models.py
msgid "Notification Transports"
msgstr "通知传输"
-#: authentik/events/models.py:512
+#: authentik/events/models.py
msgid "Notice"
msgstr "通知"
-#: authentik/events/models.py:513
+#: authentik/events/models.py
msgid "Warning"
msgstr "警告"
-#: authentik/events/models.py:514
+#: authentik/events/models.py
msgid "Alert"
msgstr "注意"
-#: authentik/events/models.py:539
+#: authentik/events/models.py
msgid "Notification"
msgstr "通知"
-#: authentik/events/models.py:540
+#: authentik/events/models.py
msgid "Notifications"
msgstr "通知"
-#: authentik/events/models.py:550
+#: authentik/events/models.py
msgid ""
"Select which transports should be used to notify the user. If none are "
"selected, the notification will only be shown in the authentik UI."
msgstr "选择应使用哪些传输方式来通知用户。如果未选择任何内容,则通知将仅显示在 authentik UI 中。"
-#: authentik/events/models.py:558
+#: authentik/events/models.py
msgid "Controls which severity level the created notifications will have."
msgstr "控制被创建的通知的严重性级别。"
-#: authentik/events/models.py:563
+#: authentik/events/models.py
msgid ""
"Define which group of users this notification should be sent and shown to. "
"If left empty, Notification won't ben sent."
msgstr "定义此通知应该发送到哪些用户组。如果留空,则不会发送通知。"
-#: authentik/events/models.py:581
+#: authentik/events/models.py
msgid "Notification Rule"
msgstr "通知规则"
-#: authentik/events/models.py:582
+#: authentik/events/models.py
msgid "Notification Rules"
msgstr "通知规则"
-#: authentik/events/models.py:602
+#: authentik/events/models.py
msgid "Webhook Mapping"
msgstr "Webhook 映射"
-#: authentik/events/models.py:603
+#: authentik/events/models.py
msgid "Webhook Mappings"
msgstr "Webhook 映射"
-#: authentik/events/models.py:668
+#: authentik/events/models.py
msgid "Run task"
msgstr "运行任务"
-#: authentik/events/models.py:669
+#: authentik/events/models.py
msgid "System Task"
msgstr "系统任务"
-#: authentik/events/models.py:670
+#: authentik/events/models.py
msgid "System Tasks"
msgstr "系统任务"
-#: authentik/events/system_tasks.py:126
+#: authentik/events/system_tasks.py
msgid "Task has not been run yet."
msgstr "任务尚未运行。"
-#: authentik/flows/api/flows.py:295
+#: authentik/flows/api/flows.py
#, python-format
msgid "Flow not applicable to current user/request: %(messages)s"
msgstr "流程不适用于当前用户/请求:%(messages)s"
-#: authentik/flows/api/flows_diagram.py:68
-#: authentik/flows/api/flows_diagram.py:94
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Policy (%(type)s)"
msgstr "策略(%(type)s)"
-#: authentik/flows/api/flows_diagram.py:71
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Binding %(order)d"
msgstr "绑定 %(order)d"
-#: authentik/flows/api/flows_diagram.py:118
+#: authentik/flows/api/flows_diagram.py
msgid "Policy passed"
msgstr "策略通过"
-#: authentik/flows/api/flows_diagram.py:122
+#: authentik/flows/api/flows_diagram.py
#, python-format
msgid "Stage (%(type)s)"
msgstr "阶段(%(type)s)"
-#: authentik/flows/api/flows_diagram.py:146
-#: authentik/flows/api/flows_diagram.py:206
+#: authentik/flows/api/flows_diagram.py
msgid "Policy denied"
msgstr "策略拒绝"
-#: authentik/flows/api/flows_diagram.py:156
-#: authentik/flows/api/flows_diagram.py:168
-#: authentik/flows/api/flows_diagram.py:205
-#: authentik/flows/api/flows_diagram.py:227
+#: authentik/flows/api/flows_diagram.py
msgid "End of the flow"
msgstr "流程结束"
-#: authentik/flows/api/flows_diagram.py:169
+#: authentik/flows/api/flows_diagram.py
msgid "Requirement not fulfilled"
msgstr "需求条件未达成"
-#: authentik/flows/api/flows_diagram.py:177
+#: authentik/flows/api/flows_diagram.py
msgid "Flow authentication requirement"
msgstr "流程身份验证需求"
-#: authentik/flows/api/flows_diagram.py:183
+#: authentik/flows/api/flows_diagram.py
msgid "Requirement fulfilled"
msgstr "需求条件已达成"
-#: authentik/flows/api/flows_diagram.py:196
+#: authentik/flows/api/flows_diagram.py
msgid "Pre-flow policies"
msgstr "流程前置策略"
-#: authentik/flows/api/flows_diagram.py:214 authentik/flows/models.py:194
+#: authentik/flows/api/flows_diagram.py authentik/flows/models.py
msgid "Flow"
msgstr "流程"
-#: authentik/flows/exceptions.py:19
+#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "流程不应用于当前用户。"
-#: authentik/flows/models.py:115
+#: authentik/flows/models.py
#, python-format
msgid "Dynamic In-memory stage: %(doc)s"
msgstr "动态内存中阶段:%(doc)s"
-#: authentik/flows/models.py:130
+#: authentik/flows/models.py
msgid "Visible in the URL."
msgstr "在 URL 中可见。"
-#: authentik/flows/models.py:132
+#: authentik/flows/models.py
msgid "Shown as the Title in Flow pages."
msgstr "显示为流程页面中的标题。"
-#: authentik/flows/models.py:139
+#: authentik/flows/models.py
msgid ""
"Decides what this Flow is used for. For example, the Authentication flow is "
"redirect to when an un-authenticated user visits authentik."
msgstr "决定此流程的用途。例如,当未经身份验证的用户访问 authentik 时,会重定向到身份验证流程。"
-#: authentik/flows/models.py:148
+#: authentik/flows/models.py
msgid "Background shown during execution"
msgstr "执行时的背景"
-#: authentik/flows/models.py:155
+#: authentik/flows/models.py
msgid ""
"Enable compatibility mode, increases compatibility with password managers on"
" mobile devices."
msgstr "启用兼容模式,增强与移动设备上密码管理器的兼容性。"
-#: authentik/flows/models.py:163
+#: authentik/flows/models.py
msgid "Configure what should happen when a flow denies access to a user."
msgstr "配置当流程拒绝访问一名用户时应该发生什么。"
-#: authentik/flows/models.py:169
+#: authentik/flows/models.py
msgid "Required level of authentication and authorization to access a flow."
msgstr "需要身份验证和授权等级以访问流程。"
-#: authentik/flows/models.py:195
+#: authentik/flows/models.py
msgid "Flows"
msgstr "流程"
-#: authentik/flows/models.py:198
+#: authentik/flows/models.py
msgid "Can export a Flow"
msgstr "可以导出流程"
-#: authentik/flows/models.py:199
+#: authentik/flows/models.py
msgid "Can inspect a Flow's execution"
msgstr "可以检视流程执行"
-#: authentik/flows/models.py:200
+#: authentik/flows/models.py
msgid "View Flow's cache metrics"
msgstr "查看流程缓存指标"
-#: authentik/flows/models.py:201
+#: authentik/flows/models.py
msgid "Clear Flow's cache metrics"
msgstr "清除流程缓存指标"
-#: authentik/flows/models.py:217
+#: authentik/flows/models.py
msgid "Evaluate policies during the Flow planning process."
msgstr "在流程规划过程中评估策略。"
-#: authentik/flows/models.py:221
+#: authentik/flows/models.py
msgid "Evaluate policies when the Stage is present to the user."
msgstr "在阶段呈现给用户时评估策略。"
-#: authentik/flows/models.py:228
+#: authentik/flows/models.py
msgid ""
"Configure how the flow executor should handle an invalid response to a "
"challenge. RETRY returns the error message and a similar challenge to the "
@@ -709,62 +722,62 @@ msgstr ""
"配置流程执行器应如何处理对质询的无效响应。RETRY 向执行器返回错误消息和类似的质询。RESTART "
"从头开始重新启动流程,RESTART_WITH_CONTEXT 在保留当前上下文的同时重新启动流程。"
-#: authentik/flows/models.py:251
+#: authentik/flows/models.py
msgid "Flow Stage Binding"
msgstr "流程阶段绑定"
-#: authentik/flows/models.py:252
+#: authentik/flows/models.py
msgid "Flow Stage Bindings"
msgstr "流程阶段绑定"
-#: authentik/flows/models.py:267
+#: authentik/flows/models.py
msgid ""
"Flow used by an authenticated user to configure this Stage. If empty, user "
"will not be able to configure this stage."
msgstr "经过身份验证的用户用来配置此阶段的流程。如果为空,用户将无法配置此阶段。"
-#: authentik/flows/models.py:307
+#: authentik/flows/models.py
msgid "Flow Token"
msgstr "流程令牌"
-#: authentik/flows/models.py:308
+#: authentik/flows/models.py
msgid "Flow Tokens"
msgstr "流程令牌"
-#: authentik/lib/utils/time.py:27
+#: authentik/lib/utils/time.py
#, python-format
msgid "%(value)s is not in the correct format of 'hours=3;minutes=1'."
msgstr "%(value)s 的格式不正确,应为 'hours=3;minutes=1'。"
-#: authentik/lib/validators.py:16
+#: authentik/lib/validators.py
#, python-brace-format
msgid "The fields {field_names} must be used together."
msgstr "字段 {field_names} 必须一同使用。"
-#: authentik/outposts/api/service_connections.py:127
+#: authentik/outposts/api/service_connections.py
msgid ""
"You can only use an empty kubeconfig when connecting to a local cluster."
msgstr "您只能在连接到本地集群时使用空的 kubeconfig。"
-#: authentik/outposts/api/service_connections.py:135
+#: authentik/outposts/api/service_connections.py
msgid "Invalid kubeconfig"
msgstr "无效 kubeconfig "
-#: authentik/outposts/models.py:123
+#: authentik/outposts/models.py
msgid ""
"If enabled, use the local connection. Required Docker socket/Kubernetes "
"Integration"
msgstr "如果启用,则使用本地连接。需要 Docker Socket / Kubernetes 集成"
-#: authentik/outposts/models.py:153
+#: authentik/outposts/models.py
msgid "Outpost Service-Connection"
msgstr "前哨服务连接"
-#: authentik/outposts/models.py:154
+#: authentik/outposts/models.py
msgid "Outpost Service-Connections"
msgstr "前哨服务连接"
-#: authentik/outposts/models.py:162
+#: authentik/outposts/models.py
msgid ""
"Can be in the format of 'unix://' when connecting to a local docker "
"daemon, or 'https://:2376' when connecting to a remote system."
@@ -772,271 +785,270 @@ msgstr ""
"当连接到本地 Docker "
"守护进程时,可以使用“unix://”格式,或者在连接远程系统时,使用“https://:2376”格式。"
-#: authentik/outposts/models.py:174
+#: authentik/outposts/models.py
msgid ""
"CA which the endpoint's Certificate is verified against. Can be left empty "
"for no validation."
msgstr "验证端点证书所依据的 CA。可以留空,表示不进行验证。"
-#: authentik/outposts/models.py:186
+#: authentik/outposts/models.py
msgid ""
"Certificate/Key used for authentication. Can be left empty for no "
"authentication."
msgstr "用于身份验证的证书/密钥。可以留空表示不验证。"
-#: authentik/outposts/models.py:204
+#: authentik/outposts/models.py
msgid "Docker Service-Connection"
msgstr "Docker 服务连接"
-#: authentik/outposts/models.py:205
+#: authentik/outposts/models.py
msgid "Docker Service-Connections"
msgstr "Docker 服务连接"
-#: authentik/outposts/models.py:213
+#: authentik/outposts/models.py
msgid ""
"Paste your kubeconfig here. authentik will automatically use the currently "
"selected context."
msgstr "在这里粘贴您的 kubeconfig。authentik 会自动使用当前选择的上下文。"
-#: authentik/outposts/models.py:219
+#: authentik/outposts/models.py
msgid "Verify SSL Certificates of the Kubernetes API endpoint"
msgstr "验证 Kubernetes API 端点的 SSL 证书"
-#: authentik/outposts/models.py:236
+#: authentik/outposts/models.py
msgid "Kubernetes Service-Connection"
msgstr "Kubernetes 服务连接"
-#: authentik/outposts/models.py:237
+#: authentik/outposts/models.py
msgid "Kubernetes Service-Connections"
msgstr "Kubernetes 服务连接"
-#: authentik/outposts/models.py:253
+#: authentik/outposts/models.py
msgid ""
"Select Service-Connection authentik should use to manage this outpost. Leave"
" empty if authentik should not handle the deployment."
msgstr "选择 authentik 在管理此前哨时需要使用的服务连接。如果 authentik 不应该处理此部署,则应该留空。"
-#: authentik/outposts/models.py:420
+#: authentik/outposts/models.py
msgid "Outpost"
msgstr "前哨"
-#: authentik/outposts/models.py:421
+#: authentik/outposts/models.py
msgid "Outposts"
msgstr "前哨"
-#: authentik/policies/denied.py:24
+#: authentik/policies/denied.py
msgid "Access denied"
msgstr "访问被拒绝"
-#: authentik/policies/dummy/models.py:44
+#: authentik/policies/dummy/models.py
msgid "Dummy Policy"
msgstr "虚拟策略"
-#: authentik/policies/dummy/models.py:45
+#: authentik/policies/dummy/models.py
msgid "Dummy Policies"
msgstr "虚拟策略"
-#: authentik/policies/event_matcher/api.py:20
-#: authentik/policies/event_matcher/models.py:56
+#: authentik/policies/event_matcher/api.py
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match events created by selected application. When left empty, all "
"applications are matched."
msgstr "匹配选定应用程序创建的事件。如果留空,则匹配所有应用程序。"
-#: authentik/policies/event_matcher/api.py:29
-#: authentik/policies/event_matcher/models.py:64
+#: authentik/policies/event_matcher/api.py
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match events created by selected model. When left empty, all models are "
"matched. When an app is selected, all the application's models are matched."
msgstr "匹配选定模型创建的事件。如果留空,则匹配所有模型。选择应用程序后,则匹配该应用程序的所有模型。"
-#: authentik/policies/event_matcher/api.py:42
+#: authentik/policies/event_matcher/api.py
msgid "At least one criteria must be set."
msgstr "必须至少设置一项标准。"
-#: authentik/policies/event_matcher/models.py:48
+#: authentik/policies/event_matcher/models.py
msgid ""
"Match created events with this action type. When left empty, all action "
"types will be matched."
msgstr "将创建的事件与此操作类型匹配。留空时,所有操作类型都将匹配。"
-#: authentik/policies/event_matcher/models.py:73
+#: authentik/policies/event_matcher/models.py
msgid ""
"Matches Event's Client IP (strict matching, for network matching use an "
"Expression Policy)"
msgstr "匹配事件的客户端 IP(严格匹配,要匹配网段请使用表达式策略)"
-#: authentik/policies/event_matcher/models.py:143
+#: authentik/policies/event_matcher/models.py
msgid "Event Matcher Policy"
msgstr "事件匹配策略"
-#: authentik/policies/event_matcher/models.py:144
+#: authentik/policies/event_matcher/models.py
msgid "Event Matcher Policies"
msgstr "事件匹配策略"
-#: authentik/policies/expiry/models.py:45
+#: authentik/policies/expiry/models.py
#, python-format
msgid "Password expired %(days)d days ago. Please update your password."
msgstr "密码在 %(days)d 天前过期。请更新您的密码。"
-#: authentik/policies/expiry/models.py:49
+#: authentik/policies/expiry/models.py
msgid "Password has expired."
msgstr "密码已过期。"
-#: authentik/policies/expiry/models.py:53
+#: authentik/policies/expiry/models.py
msgid "Password Expiry Policy"
msgstr "密码过期策略"
-#: authentik/policies/expiry/models.py:54
+#: authentik/policies/expiry/models.py
msgid "Password Expiry Policies"
msgstr "密码过期策略"
-#: authentik/policies/expression/models.py:40
+#: authentik/policies/expression/models.py
msgid "Expression Policy"
msgstr "表达式策略"
-#: authentik/policies/expression/models.py:41
+#: authentik/policies/expression/models.py
msgid "Expression Policies"
msgstr "表达式策略"
-#: authentik/policies/models.py:22
+#: authentik/policies/models.py
msgid "all, all policies must pass"
msgstr "All,必须通过所有策略"
-#: authentik/policies/models.py:23
+#: authentik/policies/models.py
msgid "any, any policy must pass"
msgstr "Any,必须通过任意策略"
-#: authentik/policies/models.py:46
+#: authentik/policies/models.py
msgid "Policy Binding Model"
msgstr "策略绑定模型"
-#: authentik/policies/models.py:47
+#: authentik/policies/models.py
msgid "Policy Binding Models"
msgstr "策略绑定模型"
-#: authentik/policies/models.py:86
+#: authentik/policies/models.py
msgid "Negates the outcome of the policy. Messages are unaffected."
msgstr "反转策略的结果。消息不受影响。"
-#: authentik/policies/models.py:89
+#: authentik/policies/models.py
msgid "Timeout after which Policy execution is terminated."
msgstr "策略执行终止的超时时间。"
-#: authentik/policies/models.py:92
+#: authentik/policies/models.py
msgid "Result if the Policy execution fails."
msgstr "策略执行失败时的结果。"
-#: authentik/policies/models.py:145
+#: authentik/policies/models.py
msgid "Policy Binding"
msgstr "策略绑定"
-#: authentik/policies/models.py:146
+#: authentik/policies/models.py
msgid "Policy Bindings"
msgstr "策略绑定"
-#: authentik/policies/models.py:167
+#: authentik/policies/models.py
msgid ""
"When this option is enabled, all executions of this policy will be logged. "
"By default, only execution errors are logged."
msgstr "启用此选项后,将记录此策略的所有执行日志。默认情况下,只记录执行错误。"
-#: authentik/policies/models.py:189
+#: authentik/policies/models.py
msgid "Policy"
msgstr "策略"
-#: authentik/policies/models.py:190
+#: authentik/policies/models.py
msgid "Policies"
msgstr "策略"
-#: authentik/policies/models.py:193
+#: authentik/policies/models.py
msgid "View Policy's cache metrics"
msgstr "查看策略缓存指标"
-#: authentik/policies/models.py:194
+#: authentik/policies/models.py
msgid "Clear Policy's cache metrics"
msgstr "清除策略缓存指标"
-#: authentik/policies/password/models.py:27
+#: authentik/policies/password/models.py
msgid "Field key to check, field keys defined in Prompt stages are available."
msgstr "要检查的字段键,可以使用输入阶段中定义的字段键。"
-#: authentik/policies/password/models.py:44
+#: authentik/policies/password/models.py
msgid "How many times the password hash is allowed to be on haveibeenpwned"
msgstr "密码哈希允许出现在 HaveIBeenPwned 中多少次"
-#: authentik/policies/password/models.py:49
+#: authentik/policies/password/models.py
msgid ""
"If the zxcvbn score is equal or less than this value, the policy will fail."
msgstr "如果 zxcvbn 分数小于等于此值,则策略失败。"
-#: authentik/policies/password/models.py:72
+#: authentik/policies/password/models.py
msgid "Password not set in context"
msgstr "未在上下文中设置密码"
-#: authentik/policies/password/models.py:134
+#: authentik/policies/password/models.py
#, python-format
msgid "Password exists on %(count)d online lists."
msgstr "%(count)d 个在线列表中存在密码。"
-#: authentik/policies/password/models.py:154
+#: authentik/policies/password/models.py
msgid "Password is too weak."
msgstr "密码太弱。"
-#: authentik/policies/password/models.py:162
+#: authentik/policies/password/models.py
msgid "Password Policy"
msgstr "密码策略"
-#: authentik/policies/password/models.py:163
+#: authentik/policies/password/models.py
msgid "Password Policies"
msgstr "密码策略"
-#: authentik/policies/reputation/api.py:18
+#: authentik/policies/reputation/api.py
msgid "Either IP or Username must be checked"
msgstr "必须检查 IP 或用户名"
-#: authentik/policies/reputation/models.py:67
+#: authentik/policies/reputation/models.py
msgid "Reputation Policy"
msgstr "信誉策略"
-#: authentik/policies/reputation/models.py:68
+#: authentik/policies/reputation/models.py
msgid "Reputation Policies"
msgstr "信誉策略"
-#: authentik/policies/reputation/models.py:96
+#: authentik/policies/reputation/models.py
msgid "Reputation Score"
msgstr "信誉分数"
-#: authentik/policies/reputation/models.py:97
+#: authentik/policies/reputation/models.py
msgid "Reputation Scores"
msgstr "信誉分数"
-#: authentik/policies/templates/policies/denied.html:7
-#: authentik/policies/templates/policies/denied.html:11
+#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "权限被拒绝"
-#: authentik/policies/templates/policies/denied.html:21
+#: authentik/policies/templates/policies/denied.html
msgid "User's avatar"
msgstr "用户的头像"
-#: authentik/policies/templates/policies/denied.html:25
+#: authentik/policies/templates/policies/denied.html
msgid "Not you?"
msgstr "不是您?"
-#: authentik/policies/templates/policies/denied.html:33
+#: authentik/policies/templates/policies/denied.html
msgid "Request has been denied."
msgstr "请求被拒绝。"
-#: authentik/policies/templates/policies/denied.html:44
+#: authentik/policies/templates/policies/denied.html
msgid "Messages:"
msgstr "消息:"
-#: authentik/policies/templates/policies/denied.html:54
+#: authentik/policies/templates/policies/denied.html
msgid "Explanation:"
msgstr "解释:"
-#: authentik/policies/templates/policies/denied.html:58
+#: authentik/policies/templates/policies/denied.html
#, python-format
msgid ""
"\n"
@@ -1047,21 +1059,21 @@ msgstr ""
" 策略绑定 '%(name)s' 返回结果 '%(result)s'\n"
" "
-#: authentik/policies/views.py:68
+#: authentik/policies/views.py
msgid "Failed to resolve application"
msgstr "解析应用程序失败"
-#: authentik/providers/ldap/models.py:25
+#: authentik/providers/ldap/models.py
msgid "DN under which objects are accessible."
msgstr "可访问对象的 DN。"
-#: authentik/providers/ldap/models.py:34
+#: authentik/providers/ldap/models.py
msgid ""
"Users in this group can do search queries. If not set, every user can "
"execute search queries."
msgstr "该组中的用户可以执行搜索查询。如果未设置,则每个用户都可以执行搜索查询。"
-#: authentik/providers/ldap/models.py:53
+#: authentik/providers/ldap/models.py
msgid ""
"The start for uidNumbers, this number is added to the user.pk to make sure "
"that the numbers aren't too low for POSIX users. Default is 2000 to ensure "
@@ -1070,7 +1082,7 @@ msgstr ""
"起始 uidNumbers,这个数字会被添加到 user.pk 中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 "
"2000,以确保我们不会与本地用户的 uidNumber 发生冲突"
-#: authentik/providers/ldap/models.py:62
+#: authentik/providers/ldap/models.py
msgid ""
"The start for gidNumbers, this number is added to a number generated from "
"the group.pk to make sure that the numbers aren't too low for POSIX groups. "
@@ -1080,8 +1092,7 @@ msgstr ""
"起始 gidNumbers,这个数字会被添加到从 group.pk 生成的数字中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 "
"4000,以确保我们不会与本地群组或用户主组的 gidNumber 发生冲突"
-#: authentik/providers/ldap/models.py:76
-#: authentik/providers/radius/models.py:34
+#: authentik/providers/ldap/models.py authentik/providers/radius/models.py
msgid ""
"When enabled, code-based multi-factor authentication can be used by "
"appending a semicolon and the TOTP code to the password. This should only be"
@@ -1092,958 +1103,955 @@ msgstr ""
"启用时,可以通过在密码后添加分号和 TOTP 代码来使用基于代码的多因素身份验证。仅在所有绑定到此提供程序的用户都已配置 TOTP "
"设备的情况下才应该启用,否则密码可能会因为包含分号而被错误地拒绝。"
-#: authentik/providers/ldap/models.py:108
+#: authentik/providers/ldap/models.py
msgid "LDAP Provider"
msgstr "LDAP 提供程序"
-#: authentik/providers/ldap/models.py:109
+#: authentik/providers/ldap/models.py
msgid "LDAP Providers"
msgstr "LDAP 提供程序"
-#: authentik/providers/oauth2/id_token.py:27
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the Hashed User ID"
msgstr "基于经过哈希处理的用户 ID"
-#: authentik/providers/oauth2/id_token.py:28
+#: authentik/providers/oauth2/id_token.py
msgid "Based on user ID"
msgstr "基于用户 ID"
-#: authentik/providers/oauth2/id_token.py:29
+#: authentik/providers/oauth2/id_token.py
msgid "Based on user UUID"
msgstr "基于用户 UUID"
-#: authentik/providers/oauth2/id_token.py:30
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the username"
msgstr "基于用户名"
-#: authentik/providers/oauth2/id_token.py:33
+#: authentik/providers/oauth2/id_token.py
msgid "Based on the User's Email. This is recommended over the UPN method."
msgstr "基于用户的电子邮箱。建议在 UPN 方法上使用。"
-#: authentik/providers/oauth2/id_token.py:38
+#: authentik/providers/oauth2/id_token.py
msgid ""
"Based on the User's UPN, only works if user has a 'upn' attribute set. Use "
"this method only if you have different UPN and Mail domains."
msgstr "基于用户的 UPN,仅当用户设置了 'upn' 属性时才有效。仅当您有不同的 UPN 和 Mail 域时才使用此方法。"
-#: authentik/providers/oauth2/models.py:43
+#: authentik/providers/oauth2/models.py
msgid "Confidential"
msgstr "机密"
-#: authentik/providers/oauth2/models.py:44
+#: authentik/providers/oauth2/models.py
msgid "Public"
msgstr "公开"
-#: authentik/providers/oauth2/models.py:66
+#: authentik/providers/oauth2/models.py
msgid "Same identifier is used for all providers"
msgstr "所有提供程序都使用相同的标识符"
-#: authentik/providers/oauth2/models.py:68
+#: authentik/providers/oauth2/models.py
msgid "Each provider has a different issuer, based on the application slug."
msgstr "根据应用程序 Slug,每个提供程序都有不同的颁发者。"
-#: authentik/providers/oauth2/models.py:75
+#: authentik/providers/oauth2/models.py
msgid "code (Authorization Code Flow)"
msgstr "code(授权码流程)"
-#: authentik/providers/oauth2/models.py:76
+#: authentik/providers/oauth2/models.py
msgid "id_token (Implicit Flow)"
msgstr "id_token(隐式流程)"
-#: authentik/providers/oauth2/models.py:77
+#: authentik/providers/oauth2/models.py
msgid "id_token token (Implicit Flow)"
msgstr "id_token token(隐式流程)"
-#: authentik/providers/oauth2/models.py:78
+#: authentik/providers/oauth2/models.py
msgid "code token (Hybrid Flow)"
msgstr "code token(混合流程)"
-#: authentik/providers/oauth2/models.py:79
+#: authentik/providers/oauth2/models.py
msgid "code id_token (Hybrid Flow)"
msgstr "code id_token(混合流程)"
-#: authentik/providers/oauth2/models.py:80
+#: authentik/providers/oauth2/models.py
msgid "code id_token token (Hybrid Flow)"
msgstr "code id_token token(混合流程)"
-#: authentik/providers/oauth2/models.py:86
+#: authentik/providers/oauth2/models.py
msgid "HS256 (Symmetric Encryption)"
msgstr "HS256(对称加密)"
-#: authentik/providers/oauth2/models.py:87
+#: authentik/providers/oauth2/models.py
msgid "RS256 (Asymmetric Encryption)"
msgstr "RS256(非对称加密)"
-#: authentik/providers/oauth2/models.py:88
+#: authentik/providers/oauth2/models.py
msgid "ES256 (Asymmetric Encryption)"
msgstr "ES256(非对称加密)"
-#: authentik/providers/oauth2/models.py:94
+#: authentik/providers/oauth2/models.py
msgid "Scope used by the client"
msgstr "客户端使用的作用域"
-#: authentik/providers/oauth2/models.py:98
+#: authentik/providers/oauth2/models.py
msgid ""
"Description shown to the user when consenting. If left empty, the user won't"
" be informed."
msgstr "同意授权时向用户显示的描述。如果留空,则不会告知用户。"
-#: authentik/providers/oauth2/models.py:117
+#: authentik/providers/oauth2/models.py
msgid "Scope Mapping"
msgstr "作用域映射"
-#: authentik/providers/oauth2/models.py:118
+#: authentik/providers/oauth2/models.py
msgid "Scope Mappings"
msgstr "作用域映射"
-#: authentik/providers/oauth2/models.py:128
+#: authentik/providers/oauth2/models.py
msgid "Client Type"
msgstr "客户端类型"
-#: authentik/providers/oauth2/models.py:130
+#: authentik/providers/oauth2/models.py
msgid ""
"Confidential clients are capable of maintaining the confidentiality of their"
" credentials. Public clients are incapable"
msgstr "机密客户端有能力维护其凭据的机密性。公开客户端无此能力。"
-#: authentik/providers/oauth2/models.py:137
+#: authentik/providers/oauth2/models.py
msgid "Client ID"
msgstr "客户端 ID"
-#: authentik/providers/oauth2/models.py:143
+#: authentik/providers/oauth2/models.py
msgid "Client Secret"
msgstr "客户端密钥"
-#: authentik/providers/oauth2/models.py:149
+#: authentik/providers/oauth2/models.py
msgid "Redirect URIs"
msgstr "重定向 URI"
-#: authentik/providers/oauth2/models.py:150
+#: authentik/providers/oauth2/models.py
msgid "Enter each URI on a new line."
msgstr "每行输入一个 URI。"
-#: authentik/providers/oauth2/models.py:155
+#: authentik/providers/oauth2/models.py
msgid "Include claims in id_token"
msgstr "在 id_token 中包含声明"
-#: authentik/providers/oauth2/models.py:157
+#: authentik/providers/oauth2/models.py
msgid ""
"Include User claims from scopes in the id_token, for applications that don't"
" access the userinfo endpoint."
msgstr "对于不访问 userinfo 端点的应用程序,将来自作用域的用户声明包含在 id_token 中。"
-#: authentik/providers/oauth2/models.py:166
+#: authentik/providers/oauth2/models.py
msgid ""
"Access codes not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
msgstr "从当前时间经过多久时或之后,访问代码无效(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/providers/oauth2/models.py:174
-#: authentik/providers/oauth2/models.py:182
+#: authentik/providers/oauth2/models.py
msgid ""
"Tokens not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
msgstr "从当前时间经过多久时或之后,令牌无效(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/providers/oauth2/models.py:191
+#: authentik/providers/oauth2/models.py
msgid ""
"Configure what data should be used as unique User Identifier. For most "
"cases, the default should be fine."
msgstr "配置应将哪些数据用作唯一用户标识符。在大多数情况下保持默认值即可。"
-#: authentik/providers/oauth2/models.py:198
+#: authentik/providers/oauth2/models.py
msgid "Configure how the issuer field of the ID Token should be filled."
msgstr "配置如何填写 ID 令牌的颁发者字段。"
-#: authentik/providers/oauth2/models.py:203
+#: authentik/providers/oauth2/models.py
msgid "Signing Key"
msgstr "签名密钥"
-#: authentik/providers/oauth2/models.py:207
+#: authentik/providers/oauth2/models.py
msgid ""
"Key used to sign the tokens. Only required when JWT Algorithm is set to "
"RS256."
msgstr "用于签名令牌的密钥。仅当 JWT 算法设置为 RS256 时才需要。"
-#: authentik/providers/oauth2/models.py:214
+#: authentik/providers/oauth2/models.py
msgid ""
"Any JWT signed by the JWK of the selected source can be used to "
"authenticate."
msgstr "任何由选定来源的 JWK 签发的 JWT 都可以用于身份验证。"
-#: authentik/providers/oauth2/models.py:287
+#: authentik/providers/oauth2/models.py
msgid "OAuth2/OpenID Provider"
msgstr "OAuth2/OpenID 提供程序"
-#: authentik/providers/oauth2/models.py:288
+#: authentik/providers/oauth2/models.py
msgid "OAuth2/OpenID Providers"
msgstr "OAuth2/OpenID 提供程序"
-#: authentik/providers/oauth2/models.py:297
-#: authentik/providers/oauth2/models.py:430
+#: authentik/providers/oauth2/models.py
msgid "Scopes"
msgstr "作用域"
-#: authentik/providers/oauth2/models.py:317
+#: authentik/providers/oauth2/models.py
msgid "Code"
msgstr "代码"
-#: authentik/providers/oauth2/models.py:318
+#: authentik/providers/oauth2/models.py
msgid "Nonce"
msgstr "Nonce"
-#: authentik/providers/oauth2/models.py:319
+#: authentik/providers/oauth2/models.py
msgid "Code Challenge"
msgstr "代码质询"
-#: authentik/providers/oauth2/models.py:321
+#: authentik/providers/oauth2/models.py
msgid "Code Challenge Method"
msgstr "代码质询方法"
-#: authentik/providers/oauth2/models.py:341
+#: authentik/providers/oauth2/models.py
msgid "Authorization Code"
msgstr "授权代码"
-#: authentik/providers/oauth2/models.py:342
+#: authentik/providers/oauth2/models.py
msgid "Authorization Codes"
msgstr "授权代码"
-#: authentik/providers/oauth2/models.py:384
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Access Token"
msgstr "OAuth2 访问令牌"
-#: authentik/providers/oauth2/models.py:385
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Access Tokens"
msgstr "OAuth2 访问令牌"
-#: authentik/providers/oauth2/models.py:395
+#: authentik/providers/oauth2/models.py
msgid "ID Token"
msgstr "ID 令牌"
-#: authentik/providers/oauth2/models.py:414
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Refresh Token"
msgstr "OAuth2 刷新令牌"
-#: authentik/providers/oauth2/models.py:415
+#: authentik/providers/oauth2/models.py
msgid "OAuth2 Refresh Tokens"
msgstr "OAuth2 刷新令牌"
-#: authentik/providers/oauth2/models.py:442
+#: authentik/providers/oauth2/models.py
msgid "Device Token"
msgstr "设备令牌"
-#: authentik/providers/oauth2/models.py:443
+#: authentik/providers/oauth2/models.py
msgid "Device Tokens"
msgstr "设备令牌"
-#: authentik/providers/oauth2/views/authorize.py:489
-#: authentik/providers/saml/views/flows.py:87
+#: authentik/providers/oauth2/views/authorize.py
+#: authentik/providers/saml/views/flows.py
#, python-format
msgid "Redirecting to %(app)s..."
msgstr "正在跳转到 %(app)s…"
-#: authentik/providers/oauth2/views/device_init.py:151
+#: authentik/providers/oauth2/views/device_init.py
msgid "Invalid code"
msgstr "无效代码"
-#: authentik/providers/oauth2/views/userinfo.py:55
-#: authentik/providers/oauth2/views/userinfo.py:56
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access your User Information"
msgstr "GitHub 兼容性:访问您的用户信息"
-#: authentik/providers/oauth2/views/userinfo.py:57
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access you Email addresses"
msgstr "GitHub 兼容性:访问您的电子邮件地址"
-#: authentik/providers/oauth2/views/userinfo.py:58
+#: authentik/providers/oauth2/views/userinfo.py
msgid "GitHub Compatibility: Access your Groups"
msgstr "GitHub 兼容性:访问您的组"
-#: authentik/providers/oauth2/views/userinfo.py:59
+#: authentik/providers/oauth2/views/userinfo.py
msgid "authentik API Access on behalf of your user"
msgstr "代表您的用户访问 authentik API"
-#: authentik/providers/proxy/api.py:52
+#: authentik/providers/proxy/api.py
msgid "User and password attributes must be set when basic auth is enabled."
msgstr "启用 Basic Auth 时,必须设置用户和密码属性。"
-#: authentik/providers/proxy/api.py:63
+#: authentik/providers/proxy/api.py
msgid "Internal host cannot be empty when forward auth is disabled."
msgstr "禁用 Forward Auth 时,内部主机不能为空。"
-#: authentik/providers/proxy/models.py:54
+#: authentik/providers/proxy/models.py
msgid "Validate SSL Certificates of upstream servers"
msgstr "验证上游服务器的 SSL 证书"
-#: authentik/providers/proxy/models.py:55
+#: authentik/providers/proxy/models.py
msgid "Internal host SSL Validation"
msgstr "内部主机 SSL 验证"
-#: authentik/providers/proxy/models.py:61
+#: authentik/providers/proxy/models.py
msgid ""
"Enable support for forwardAuth in traefik and nginx auth_request. Exclusive "
"with internal_host."
msgstr "在 traefik 和 nginx auth_request 中启用对 ForwardAuth 的支持。排除 internal_host。"
-#: authentik/providers/proxy/models.py:70
+#: authentik/providers/proxy/models.py
msgid ""
"Regular expressions for which authentication is not required. Each new line "
"is interpreted as a new Regular Expression."
msgstr "用于描述何处不需要身份验证的正则表达式。每个新行都被解释为一个新的正则表达式。"
-#: authentik/providers/proxy/models.py:78
+#: authentik/providers/proxy/models.py
msgid ""
"When enabled, this provider will intercept the authorization header and "
"authenticate requests based on its value."
msgstr "启用时,此提供程序将会拦截 Authorization 标头,并基于其值认证请求。"
-#: authentik/providers/proxy/models.py:84
+#: authentik/providers/proxy/models.py
msgid "Set HTTP-Basic Authentication"
msgstr "设置 HTTP-Basic 身份验证"
-#: authentik/providers/proxy/models.py:86
+#: authentik/providers/proxy/models.py
msgid ""
"Set a custom HTTP-Basic Authentication header based on values from "
"authentik."
msgstr "根据来自 authentik 的值设置自定义 HTTP-Basic 身份验证标头。"
-#: authentik/providers/proxy/models.py:91
+#: authentik/providers/proxy/models.py
msgid "HTTP-Basic Username Key"
msgstr "HTTP-Basic 用户名密钥"
-#: authentik/providers/proxy/models.py:93
+#: authentik/providers/proxy/models.py
msgid ""
"User/Group Attribute used for the user part of the HTTP-Basic Header. If not"
" set, the user's Email address is used."
msgstr "用于 HTTP-Basic 标头用户名部分的用户/组属性。如果未设置,则使用用户的电子邮件地址。"
-#: authentik/providers/proxy/models.py:99
+#: authentik/providers/proxy/models.py
msgid "HTTP-Basic Password Key"
msgstr "HTTP-Basic 密码密钥"
-#: authentik/providers/proxy/models.py:100
+#: authentik/providers/proxy/models.py
msgid ""
"User/Group Attribute used for the password part of the HTTP-Basic Header."
msgstr "用于 HTTP-Basic 标头的密码部分的用户/组属性。"
-#: authentik/providers/proxy/models.py:154
+#: authentik/providers/proxy/models.py
msgid "Proxy Provider"
msgstr "代理提供程序"
-#: authentik/providers/proxy/models.py:155
+#: authentik/providers/proxy/models.py
msgid "Proxy Providers"
msgstr "代理提供程序"
-#: authentik/providers/radius/models.py:18
+#: authentik/providers/radius/models.py
msgid "Shared secret between clients and server to hash packets."
msgstr "在客户端和服务端之间共享密钥以哈希数据包。"
-#: authentik/providers/radius/models.py:24
+#: authentik/providers/radius/models.py
msgid ""
"List of CIDRs (comma-separated) that clients can connect from. A more "
"specific CIDR will match before a looser one. Clients connecting from a non-"
"specified CIDR will be dropped."
msgstr "允许客户端连接的 CIDR 列表(逗号分隔)。严格的 CIDR 会在宽松的之前匹配。来自 CIDR 范围外的客户端连接将会被丢弃。"
-#: authentik/providers/radius/models.py:60
+#: authentik/providers/radius/models.py
msgid "Radius Provider"
msgstr "Radius 提供程序"
-#: authentik/providers/radius/models.py:61
+#: authentik/providers/radius/models.py
msgid "Radius Providers"
msgstr "Radius 提供程序"
-#: authentik/providers/saml/api/providers.py:258
+#: authentik/providers/saml/api/providers.py
msgid "Invalid XML Syntax"
msgstr "无效 XML 语法"
-#: authentik/providers/saml/api/providers.py:268
+#: authentik/providers/saml/api/providers.py
#, python-format
msgid "Failed to import Metadata: %(message)s"
msgstr "导入元数据失败:%(message)s"
-#: authentik/providers/saml/models.py:38
+#: authentik/providers/saml/models.py
msgid "ACS URL"
msgstr "ACS URL"
-#: authentik/providers/saml/models.py:43
+#: authentik/providers/saml/models.py
msgid ""
"Value of the audience restriction field of the assertion. When left empty, "
"no audience restriction will be added."
msgstr "断言的 Audience 受限字段的值。留空时,不会添加 Audience 限制。"
-#: authentik/providers/saml/models.py:47
+#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "也称为 EntityID"
-#: authentik/providers/saml/models.py:51
+#: authentik/providers/saml/models.py
msgid "Service Provider Binding"
msgstr "服务提供程序绑定"
-#: authentik/providers/saml/models.py:53
+#: authentik/providers/saml/models.py
msgid ""
"This determines how authentik sends the response back to the Service "
"Provider."
msgstr "确定 authentik 如何将响应发送回服务提供程序。"
-#: authentik/providers/saml/models.py:63
+#: authentik/providers/saml/models.py
msgid "NameID Property Mapping"
msgstr "NameID 属性映射"
-#: authentik/providers/saml/models.py:65
+#: authentik/providers/saml/models.py
msgid ""
"Configure how the NameID value will be created. When left empty, the "
"NameIDPolicy of the incoming request will be considered"
msgstr "配置如何创建 NameID 值。如果留空,将考虑传入请求的 NameIDPolicy"
-#: authentik/providers/saml/models.py:74
+#: authentik/providers/saml/models.py
msgid ""
"Assertion valid not before current time + this value (Format: "
"hours=-1;minutes=-2;seconds=-3)."
msgstr "从当前时间经过多久时或之后,断言有效(格式:hours=-1;minutes=-2;seconds=-3)。"
-#: authentik/providers/saml/models.py:82
+#: authentik/providers/saml/models.py
msgid ""
"Assertion not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
msgstr "从当前时间经过多久时或之后,断言无效(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/providers/saml/models.py:91
+#: authentik/providers/saml/models.py
msgid ""
"Session not valid on or after current time + this value (Format: "
"hours=1;minutes=2;seconds=3)."
msgstr "从当前时间经过多久时或之后,会话无效(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/providers/saml/models.py:99 authentik/sources/saml/models.py:150
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA1"
msgstr "SHA1"
-#: authentik/providers/saml/models.py:100 authentik/sources/saml/models.py:151
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA256"
msgstr "SHA256"
-#: authentik/providers/saml/models.py:101 authentik/sources/saml/models.py:152
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA384"
msgstr "SHA384"
-#: authentik/providers/saml/models.py:102 authentik/sources/saml/models.py:153
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "SHA512"
msgstr "SHA512"
-#: authentik/providers/saml/models.py:109 authentik/sources/saml/models.py:160
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA1"
msgstr "RSA-SHA1"
-#: authentik/providers/saml/models.py:110 authentik/sources/saml/models.py:161
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA256"
msgstr "RSA-SHA256"
-#: authentik/providers/saml/models.py:111 authentik/sources/saml/models.py:162
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA384"
msgstr "RSA-SHA384"
-#: authentik/providers/saml/models.py:112 authentik/sources/saml/models.py:163
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "RSA-SHA512"
msgstr "RSA-SHA512"
-#: authentik/providers/saml/models.py:113 authentik/sources/saml/models.py:164
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "DSA-SHA1"
msgstr "DSA-SHA1"
-#: authentik/providers/saml/models.py:124 authentik/sources/saml/models.py:130
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid ""
"When selected, incoming assertion's Signatures will be validated against "
"this certificate. To allow unsigned Requests, leave on default."
msgstr "选中后,传入断言的签名将根据此证书进行验证。要允许未签名的请求,请保留默认值。"
-#: authentik/providers/saml/models.py:128 authentik/sources/saml/models.py:134
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "Verification Certificate"
msgstr "验证证书"
-#: authentik/providers/saml/models.py:136
+#: authentik/providers/saml/models.py
msgid "Keypair used to sign outgoing Responses going to the Service Provider."
msgstr "密钥对,用于签署发送给服务提供程序的传出响应。"
-#: authentik/providers/saml/models.py:138 authentik/sources/saml/models.py:144
+#: authentik/providers/saml/models.py authentik/sources/saml/models.py
msgid "Signing Keypair"
msgstr "签名密钥对"
-#: authentik/providers/saml/models.py:142
+#: authentik/providers/saml/models.py
msgid "Default relay_state value for IDP-initiated logins"
msgstr "用于 IDP 发起登录的默认 relay_state 值"
-#: authentik/providers/saml/models.py:171
+#: authentik/providers/saml/models.py
msgid "SAML Provider"
msgstr "SAML 提供程序"
-#: authentik/providers/saml/models.py:172
+#: authentik/providers/saml/models.py
msgid "SAML Providers"
msgstr "SAML 提供程序"
-#: authentik/providers/saml/models.py:196
+#: authentik/providers/saml/models.py
msgid "SAML Property Mapping"
msgstr "SAML 属性映射"
-#: authentik/providers/saml/models.py:197
+#: authentik/providers/saml/models.py
msgid "SAML Property Mappings"
msgstr "SAML 属性映射"
-#: authentik/providers/scim/models.py:23
+#: authentik/providers/scim/models.py
msgid "Base URL to SCIM requests, usually ends in /v2"
msgstr "SCIM 请求的基础 URL,通常以 /v2 结尾"
-#: authentik/providers/scim/models.py:24
+#: authentik/providers/scim/models.py
msgid "Authentication token"
msgstr "身份验证令牌"
-#: authentik/providers/scim/models.py:30 authentik/sources/ldap/models.py:98
+#: authentik/providers/scim/models.py authentik/sources/ldap/models.py
msgid "Property mappings used for group creation/updating."
msgstr "用于创建/更新组的属性映射。"
-#: authentik/providers/scim/models.py:72
+#: authentik/providers/scim/models.py
msgid "SCIM Provider"
msgstr "SCIM 提供程序"
-#: authentik/providers/scim/models.py:73
+#: authentik/providers/scim/models.py
msgid "SCIM Providers"
msgstr "SCIM 提供程序"
-#: authentik/providers/scim/models.py:93
+#: authentik/providers/scim/models.py
msgid "SCIM Mapping"
msgstr "SCIM 映射"
-#: authentik/providers/scim/models.py:94
+#: authentik/providers/scim/models.py
msgid "SCIM Mappings"
msgstr "SCIM 映射"
-#: authentik/providers/scim/tasks.py:57
+#: authentik/providers/scim/tasks.py
msgid "Starting full SCIM sync"
msgstr "开始全量 SCIM 同步"
-#: authentik/providers/scim/tasks.py:67
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Syncing page %(page)d of users"
msgstr "正在同步用户页面 %(page)d"
-#: authentik/providers/scim/tasks.py:71
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Syncing page %(page)d of groups"
msgstr "正在同步群组页面 %(page)d"
-#: authentik/providers/scim/tasks.py:103
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Failed to sync user %(user_name)s due to remote error: %(error)s"
msgstr "由于远端错误,同步用户 %(user_name)s 失败:%(error)s"
-#: authentik/providers/scim/tasks.py:114 authentik/providers/scim/tasks.py:155
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Stopping sync due to error: %(error)s"
msgstr "由于以下错误,同步停止:%(error)s"
-#: authentik/providers/scim/tasks.py:144
+#: authentik/providers/scim/tasks.py
#, python-format
msgid "Failed to sync group %(group_name)s due to remote error: %(error)s"
msgstr "由于远端错误,同步组 %(group_name)s 失败:%(error)s"
-#: authentik/rbac/models.py:51
+#: authentik/rbac/models.py
msgid "Role"
msgstr "角色"
-#: authentik/rbac/models.py:52
+#: authentik/rbac/models.py
msgid "Roles"
msgstr "角色"
-#: authentik/rbac/models.py:66
+#: authentik/rbac/models.py
msgid "System permission"
msgstr "系统权限"
-#: authentik/rbac/models.py:67
+#: authentik/rbac/models.py
msgid "System permissions"
msgstr "系统权限"
-#: authentik/rbac/models.py:69
+#: authentik/rbac/models.py
msgid "Can view system info"
msgstr "可以查看系统信息"
-#: authentik/rbac/models.py:70
+#: authentik/rbac/models.py
msgid "Can view system tasks"
msgstr "可以查看系统任务"
-#: authentik/rbac/models.py:71
+#: authentik/rbac/models.py
msgid "Can run system tasks"
msgstr "可以运行系统任务"
-#: authentik/rbac/models.py:72
+#: authentik/rbac/models.py
msgid "Can access admin interface"
msgstr "可以访问管理员界面"
-#: authentik/rbac/models.py:73
+#: authentik/rbac/models.py
msgid "Can view system settings"
msgstr "可以查看系统设置"
-#: authentik/rbac/models.py:74
+#: authentik/rbac/models.py
msgid "Can edit system settings"
msgstr "可以编辑系统设置"
-#: authentik/recovery/management/commands/create_admin_group.py:12
+#: authentik/recovery/management/commands/create_admin_group.py
msgid "Create admin group if the default group gets deleted."
msgstr "如果默认组被删除,则创建管理员组。"
-#: authentik/recovery/management/commands/create_recovery_key.py:16
+#: authentik/recovery/management/commands/create_recovery_key.py
msgid "Create a Key which can be used to restore access to authentik."
msgstr "创建一个密钥,可用于恢复对 authentik 的访问权限。"
-#: authentik/recovery/views.py:24
+#: authentik/recovery/views.py
msgid "Used recovery-link to authenticate."
msgstr "已使用恢复链接进行身份验证。"
-#: authentik/sources/ldap/models.py:41
+#: authentik/sources/ldap/models.py
msgid "Server URI"
msgstr "服务器 URI"
-#: authentik/sources/ldap/models.py:50
+#: authentik/sources/ldap/models.py
msgid ""
"Optionally verify the LDAP Server's Certificate against the CA Chain in this"
" keypair."
msgstr "可选,根据此密钥对中的 CA 链验证 LDAP 服务器的证书。"
-#: authentik/sources/ldap/models.py:59
+#: authentik/sources/ldap/models.py
msgid ""
"Client certificate to authenticate against the LDAP Server's Certificate."
msgstr "基于 LDAP 服务端证书进行身份验证的客户端证书。"
-#: authentik/sources/ldap/models.py:62
+#: authentik/sources/ldap/models.py
msgid "Bind CN"
msgstr "Bind CN"
-#: authentik/sources/ldap/models.py:64
+#: authentik/sources/ldap/models.py
msgid "Enable Start TLS"
msgstr "启用 Start TLS"
-#: authentik/sources/ldap/models.py:65
+#: authentik/sources/ldap/models.py
msgid "Use Server URI for SNI verification"
msgstr "SNI 验证时使用服务器 URI"
-#: authentik/sources/ldap/models.py:67
+#: authentik/sources/ldap/models.py
msgid "Base DN"
msgstr "Base DN"
-#: authentik/sources/ldap/models.py:69
+#: authentik/sources/ldap/models.py
msgid "Prepended to Base DN for User-queries."
msgstr "添加到用户查询的 Base DN 起始处。"
-#: authentik/sources/ldap/models.py:70
+#: authentik/sources/ldap/models.py
msgid "Addition User DN"
msgstr "额外的用户 DN"
-#: authentik/sources/ldap/models.py:74
+#: authentik/sources/ldap/models.py
msgid "Prepended to Base DN for Group-queries."
msgstr "添加到组查询的 Base DN 起始处。"
-#: authentik/sources/ldap/models.py:75
+#: authentik/sources/ldap/models.py
msgid "Addition Group DN"
msgstr "额外的组 DN"
-#: authentik/sources/ldap/models.py:81
+#: authentik/sources/ldap/models.py
msgid "Consider Objects matching this filter to be Users."
msgstr "将与此筛选器匹配的对象视为用户。"
-#: authentik/sources/ldap/models.py:84
+#: authentik/sources/ldap/models.py
msgid "Field which contains members of a group."
msgstr "包含组成员的字段。"
-#: authentik/sources/ldap/models.py:88
+#: authentik/sources/ldap/models.py
msgid "Consider Objects matching this filter to be Groups."
msgstr "将与此过滤器匹配的对象视为组。"
-#: authentik/sources/ldap/models.py:91
+#: authentik/sources/ldap/models.py
msgid "Field which contains a unique Identifier."
msgstr "包含唯一标识符的字段。"
-#: authentik/sources/ldap/models.py:105
+#: authentik/sources/ldap/models.py
msgid ""
"When a user changes their password, sync it back to LDAP. This can only be "
"enabled on a single LDAP source."
msgstr "当用户修改密码时,将其同步回 LDAP。仅可在单点 LDAP 源时启用。"
-#: authentik/sources/ldap/models.py:248
+#: authentik/sources/ldap/models.py
msgid "LDAP Source"
msgstr "LDAP 源"
-#: authentik/sources/ldap/models.py:249
+#: authentik/sources/ldap/models.py
msgid "LDAP Sources"
msgstr "LDAP 源"
-#: authentik/sources/ldap/models.py:271
+#: authentik/sources/ldap/models.py
msgid "LDAP Property Mapping"
msgstr "LDAP 属性映射"
-#: authentik/sources/ldap/models.py:272
+#: authentik/sources/ldap/models.py
msgid "LDAP Property Mappings"
msgstr "LDAP 属性映射"
-#: authentik/sources/ldap/signals.py:52
+#: authentik/sources/ldap/signals.py
msgid "Password does not match Active Directory Complexity."
msgstr "密码与 Active Directory 复杂度不匹配。"
-#: authentik/sources/oauth/clients/oauth2.py:68
+#: authentik/sources/oauth/clients/oauth2.py
msgid "No token received."
msgstr "未收到令牌。"
-#: authentik/sources/oauth/models.py:24
+#: authentik/sources/oauth/models.py
msgid "Request Token URL"
msgstr "请求令牌 URL"
-#: authentik/sources/oauth/models.py:26
+#: authentik/sources/oauth/models.py
msgid ""
"URL used to request the initial token. This URL is only required for OAuth "
"1."
msgstr "用于请求初始令牌的 URL。只有 OAuth 1 才需要此网址。"
-#: authentik/sources/oauth/models.py:32
+#: authentik/sources/oauth/models.py
msgid "Authorization URL"
msgstr "授权 URL"
-#: authentik/sources/oauth/models.py:33
+#: authentik/sources/oauth/models.py
msgid "URL the user is redirect to to conest the flow."
msgstr "为控制流程,使用户被重定向到的 URL"
-#: authentik/sources/oauth/models.py:38
+#: authentik/sources/oauth/models.py
msgid "Access Token URL"
msgstr "访问令牌 URL"
-#: authentik/sources/oauth/models.py:39
+#: authentik/sources/oauth/models.py
msgid "URL used by authentik to retrieve tokens."
msgstr "authentik 用来获取令牌的 URL。"
-#: authentik/sources/oauth/models.py:44
+#: authentik/sources/oauth/models.py
msgid "Profile URL"
msgstr "个人资料 URL"
-#: authentik/sources/oauth/models.py:45
+#: authentik/sources/oauth/models.py
msgid "URL used by authentik to get user information."
msgstr "authentik 用来获取用户信息的 URL。"
-#: authentik/sources/oauth/models.py:48
+#: authentik/sources/oauth/models.py
msgid "Additional Scopes"
msgstr "额外的作用域"
-#: authentik/sources/oauth/models.py:107
+#: authentik/sources/oauth/models.py
msgid "OAuth Source"
msgstr "OAuth 源"
-#: authentik/sources/oauth/models.py:108
+#: authentik/sources/oauth/models.py
msgid "OAuth Sources"
msgstr "OAuth 源"
-#: authentik/sources/oauth/models.py:116
+#: authentik/sources/oauth/models.py
msgid "GitHub OAuth Source"
msgstr "GitHub OAuth 源"
-#: authentik/sources/oauth/models.py:117
+#: authentik/sources/oauth/models.py
msgid "GitHub OAuth Sources"
msgstr "GitHub OAuth 源"
-#: authentik/sources/oauth/models.py:125
+#: authentik/sources/oauth/models.py
msgid "Twitch OAuth Source"
msgstr "Twitch OAuth 源"
-#: authentik/sources/oauth/models.py:126
+#: authentik/sources/oauth/models.py
msgid "Twitch OAuth Sources"
msgstr "Twitch OAuth 源"
-#: authentik/sources/oauth/models.py:134
+#: authentik/sources/oauth/models.py
msgid "Mailcow OAuth Source"
msgstr "Mailcow OAuth 源"
-#: authentik/sources/oauth/models.py:135
+#: authentik/sources/oauth/models.py
msgid "Mailcow OAuth Sources"
msgstr "Mailcow OAuth 源"
-#: authentik/sources/oauth/models.py:143
+#: authentik/sources/oauth/models.py
msgid "Twitter OAuth Source"
msgstr "Twitter OAuth 源"
-#: authentik/sources/oauth/models.py:144
+#: authentik/sources/oauth/models.py
msgid "Twitter OAuth Sources"
msgstr "Twitter OAuth 源"
-#: authentik/sources/oauth/models.py:152
+#: authentik/sources/oauth/models.py
msgid "Facebook OAuth Source"
msgstr "Facebook OAuth 源"
-#: authentik/sources/oauth/models.py:153
+#: authentik/sources/oauth/models.py
msgid "Facebook OAuth Sources"
msgstr "Facebook OAuth 源"
-#: authentik/sources/oauth/models.py:161
+#: authentik/sources/oauth/models.py
msgid "Discord OAuth Source"
msgstr "Discord OAuth 源"
-#: authentik/sources/oauth/models.py:162
+#: authentik/sources/oauth/models.py
msgid "Discord OAuth Sources"
msgstr "Discord OAuth 源"
-#: authentik/sources/oauth/models.py:170
+#: authentik/sources/oauth/models.py
msgid "Patreon OAuth Source"
msgstr "Patreon OAuth 源"
-#: authentik/sources/oauth/models.py:171
+#: authentik/sources/oauth/models.py
msgid "Patreon OAuth Sources"
msgstr "Patreon OAuth 源"
-#: authentik/sources/oauth/models.py:179
+#: authentik/sources/oauth/models.py
msgid "Google OAuth Source"
msgstr "Google OAuth 源"
-#: authentik/sources/oauth/models.py:180
+#: authentik/sources/oauth/models.py
msgid "Google OAuth Sources"
msgstr "Google OAuth 源"
-#: authentik/sources/oauth/models.py:188
+#: authentik/sources/oauth/models.py
msgid "Azure AD OAuth Source"
msgstr "Azure AD OAuth 源"
-#: authentik/sources/oauth/models.py:189
+#: authentik/sources/oauth/models.py
msgid "Azure AD OAuth Sources"
msgstr "Azure AD OAuth 源"
-#: authentik/sources/oauth/models.py:197
+#: authentik/sources/oauth/models.py
msgid "OpenID OAuth Source"
msgstr "OpenID OAuth 源"
-#: authentik/sources/oauth/models.py:198
+#: authentik/sources/oauth/models.py
msgid "OpenID OAuth Sources"
msgstr "OpenID OAuth 源"
-#: authentik/sources/oauth/models.py:206
+#: authentik/sources/oauth/models.py
msgid "Apple OAuth Source"
msgstr "Apple OAuth 源"
-#: authentik/sources/oauth/models.py:207
+#: authentik/sources/oauth/models.py
msgid "Apple OAuth Sources"
msgstr "Apple OAuth 源"
-#: authentik/sources/oauth/models.py:215
+#: authentik/sources/oauth/models.py
msgid "Okta OAuth Source"
msgstr "Okta OAuth 源"
-#: authentik/sources/oauth/models.py:216
+#: authentik/sources/oauth/models.py
msgid "Okta OAuth Sources"
msgstr "Okta OAuth 源"
-#: authentik/sources/oauth/models.py:224
+#: authentik/sources/oauth/models.py
msgid "Reddit OAuth Source"
msgstr "Reddit OAuth 源"
-#: authentik/sources/oauth/models.py:225
+#: authentik/sources/oauth/models.py
msgid "Reddit OAuth Sources"
msgstr "Reddit OAuth 源"
-#: authentik/sources/oauth/models.py:247
+#: authentik/sources/oauth/models.py
msgid "User OAuth Source Connection"
msgstr "用户 OAuth 源连接"
-#: authentik/sources/oauth/models.py:248
+#: authentik/sources/oauth/models.py
msgid "User OAuth Source Connections"
msgstr "用户 OAuth 源连接"
-#: authentik/sources/oauth/views/callback.py:100
+#: authentik/sources/oauth/views/callback.py
#, python-format
msgid "Authentication failed: %(reason)s"
msgstr "身份验证失败:%(reason)s"
-#: authentik/sources/plex/models.py:37
+#: authentik/sources/plex/models.py
msgid "Client identifier used to talk to Plex."
msgstr "用来与 Plex 通信的客户端标识符。"
-#: authentik/sources/plex/models.py:44
+#: authentik/sources/plex/models.py
msgid ""
"Which servers a user has to be a member of to be granted access. Empty list "
"allows every server."
msgstr "用户必须是哪个服务器的成员才能获取权限。空列表允许任何服务器。"
-#: authentik/sources/plex/models.py:50
+#: authentik/sources/plex/models.py
msgid "Allow friends to authenticate, even if you don't share a server."
msgstr "允许好友进行身份验证,即使您不共享服务器。"
-#: authentik/sources/plex/models.py:52
+#: authentik/sources/plex/models.py
msgid "Plex token used to check friends"
msgstr "用于检查好友的 Plex 令牌"
-#: authentik/sources/plex/models.py:95
+#: authentik/sources/plex/models.py
msgid "Plex Source"
msgstr "Plex 源"
-#: authentik/sources/plex/models.py:96
+#: authentik/sources/plex/models.py
msgid "Plex Sources"
msgstr "Plex 源"
-#: authentik/sources/plex/models.py:112
+#: authentik/sources/plex/models.py
msgid "User Plex Source Connection"
msgstr "用户 Plex 源连接"
-#: authentik/sources/plex/models.py:113
+#: authentik/sources/plex/models.py
msgid "User Plex Source Connections"
msgstr "用户 Plex 源连接"
-#: authentik/sources/saml/models.py:40
+#: authentik/sources/saml/models.py
msgid "Redirect Binding"
msgstr "重定向绑定"
-#: authentik/sources/saml/models.py:41
+#: authentik/sources/saml/models.py
msgid "POST Binding"
msgstr "POST 绑定"
-#: authentik/sources/saml/models.py:42
+#: authentik/sources/saml/models.py
msgid "POST Binding with auto-confirmation"
msgstr "带有自动确认功能的 POST 绑定"
-#: authentik/sources/saml/models.py:70
+#: authentik/sources/saml/models.py
msgid "Flow used before authentication."
msgstr "身份验证之前使用的流程。"
-#: authentik/sources/saml/models.py:77
+#: authentik/sources/saml/models.py
msgid "Issuer"
msgstr "颁发者"
-#: authentik/sources/saml/models.py:78
+#: authentik/sources/saml/models.py
msgid "Also known as Entity ID. Defaults the Metadata URL."
msgstr "也称为 Entity ID。 默认为元数据 URL。"
-#: authentik/sources/saml/models.py:82
+#: authentik/sources/saml/models.py
msgid "SSO URL"
msgstr "SSO URL"
-#: authentik/sources/saml/models.py:83
+#: authentik/sources/saml/models.py
msgid "URL that the initial Login request is sent to."
msgstr "初始登录请求发送到的 URL。"
-#: authentik/sources/saml/models.py:89
+#: authentik/sources/saml/models.py
msgid "SLO URL"
msgstr "SLO URL"
-#: authentik/sources/saml/models.py:90
+#: authentik/sources/saml/models.py
msgid "Optional URL if your IDP supports Single-Logout."
msgstr "如果您的 IDP 支持单点登出,则为可选 URL。"
-#: authentik/sources/saml/models.py:96
+#: authentik/sources/saml/models.py
msgid ""
"Allows authentication flows initiated by the IdP. This can be a security "
"risk, as no validation of the request ID is done."
msgstr "允许由 IdP 启动的身份验证流程。这可能存在安全风险,因为未对请求 ID 进行验证。"
-#: authentik/sources/saml/models.py:104
+#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
"sent."
msgstr "发送给 IdP 的 NameID 策略。可以取消设置,此时不会发送任何策略。"
-#: authentik/sources/saml/models.py:115
+#: authentik/sources/saml/models.py
msgid "Delete temporary users after"
msgstr "多久后删除临时用户"
-#: authentik/sources/saml/models.py:118
+#: authentik/sources/saml/models.py
msgid ""
"Time offset when temporary users should be deleted. This only applies if "
"your IDP uses the NameID Format 'transient', and the user doesn't log out "
@@ -2052,321 +2060,320 @@ msgstr ""
"删除临时用户的时间偏移。这仅适用于您的 IDP 使用 NameID 格式 'transient' "
"且用户未手动登出的情况。(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/sources/saml/models.py:142
+#: authentik/sources/saml/models.py
msgid ""
"Keypair used to sign outgoing Responses going to the Identity Provider."
msgstr "密钥对,用于签署发送给身份提供程序的传出响应。"
-#: authentik/sources/saml/models.py:226
+#: authentik/sources/saml/models.py
msgid "SAML Source"
msgstr "SAML 源"
-#: authentik/sources/saml/models.py:227
+#: authentik/sources/saml/models.py
msgid "SAML Sources"
msgstr "SAML 源"
-#: authentik/sources/saml/models.py:242
+#: authentik/sources/saml/models.py
msgid "User SAML Source Connection"
msgstr "用户 SAML 源连接"
-#: authentik/sources/saml/models.py:243
+#: authentik/sources/saml/models.py
msgid "User SAML Source Connections"
msgstr "用户 SAML 源连接"
-#: authentik/stages/authenticator_duo/models.py:79
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Authenticator Setup Stage"
msgstr "Duo 身份验证器设置阶段"
-#: authentik/stages/authenticator_duo/models.py:80
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Authenticator Setup Stages"
msgstr "Duo 身份验证器设置阶段"
-#: authentik/stages/authenticator_duo/models.py:103
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Device"
msgstr "Duo 设备"
-#: authentik/stages/authenticator_duo/models.py:104
+#: authentik/stages/authenticator_duo/models.py
msgid "Duo Devices"
msgstr "Duo 设备"
-#: authentik/stages/authenticator_sms/models.py:57
+#: authentik/stages/authenticator_sms/models.py
msgid ""
"When enabled, the Phone number is only used during enrollment to verify the "
"users authenticity. Only a hash of the phone number is saved to ensure it is"
" not reused in the future."
msgstr "启用时,电话号码仅在注册期间用于验证用户的真实性。仅保存电话号码的哈希,以确保将来不会重复使用。"
-#: authentik/stages/authenticator_sms/models.py:68
+#: authentik/stages/authenticator_sms/models.py
msgid "Optionally modify the payload being sent to custom providers."
msgstr "可选地,修改发送到自定义提供程序的载荷。"
-#: authentik/stages/authenticator_sms/models.py:81
+#: authentik/stages/authenticator_sms/models.py
#, python-format
msgid "Use this code to authenticate in authentik: %(token)s"
msgstr "使用此代码在 authentik 中验证身份:%(token)s"
-#: authentik/stages/authenticator_sms/models.py:180
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Authenticator Setup Stage"
msgstr "短信身份验证器设置阶段"
-#: authentik/stages/authenticator_sms/models.py:181
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Authenticator Setup Stages"
msgstr "短信身份验证器设置阶段"
-#: authentik/stages/authenticator_sms/models.py:226
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Device"
msgstr "短信设备"
-#: authentik/stages/authenticator_sms/models.py:227
+#: authentik/stages/authenticator_sms/models.py
msgid "SMS Devices"
msgstr "短信设备"
-#: authentik/stages/authenticator_sms/stage.py:57
-#: authentik/stages/authenticator_totp/stage.py:41
-#: authentik/stages/authenticator_totp/stage.py:44
+#: authentik/stages/authenticator_sms/stage.py
+#: authentik/stages/authenticator_totp/stage.py
msgid "Code does not match"
msgstr "代码不匹配"
-#: authentik/stages/authenticator_sms/stage.py:73
+#: authentik/stages/authenticator_sms/stage.py
msgid "Invalid phone number"
msgstr "无效电话号码"
-#: authentik/stages/authenticator_static/models.py:52
+#: authentik/stages/authenticator_static/models.py
msgid "Static Authenticator Setup Stage"
msgstr "静态身份验证器设置阶段"
-#: authentik/stages/authenticator_static/models.py:53
+#: authentik/stages/authenticator_static/models.py
msgid "Static Authenticator Setup Stages"
msgstr "静态身份验证器设置阶段"
-#: authentik/stages/authenticator_static/models.py:98
+#: authentik/stages/authenticator_static/models.py
msgid "Static Device"
msgstr "静态设备"
-#: authentik/stages/authenticator_static/models.py:99
+#: authentik/stages/authenticator_static/models.py
msgid "Static Devices"
msgstr "静态设备"
-#: authentik/stages/authenticator_static/models.py:129
+#: authentik/stages/authenticator_static/models.py
msgid "Static Token"
msgstr "静态令牌"
-#: authentik/stages/authenticator_static/models.py:130
+#: authentik/stages/authenticator_static/models.py
msgid "Static Tokens"
msgstr "静态令牌"
-#: authentik/stages/authenticator_totp/models.py:25
+#: authentik/stages/authenticator_totp/models.py
msgid "6 digits, widely compatible"
msgstr "6 位数字,广泛兼容"
-#: authentik/stages/authenticator_totp/models.py:26
+#: authentik/stages/authenticator_totp/models.py
msgid "8 digits, not compatible with apps like Google Authenticator"
msgstr "8 位数字,与 Google 身份验证器等应用不兼容"
-#: authentik/stages/authenticator_totp/models.py:62
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Authenticator Setup Stage"
msgstr "TOTP 身份验证器设置阶段"
-#: authentik/stages/authenticator_totp/models.py:63
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Authenticator Setup Stages"
msgstr "TOTP 身份验证器设置阶段"
-#: authentik/stages/authenticator_totp/models.py:244
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Device"
msgstr "TOTP 设备"
-#: authentik/stages/authenticator_totp/models.py:245
+#: authentik/stages/authenticator_totp/models.py
msgid "TOTP Devices"
msgstr "TOTP 设备"
-#: authentik/stages/authenticator_validate/challenge.py:123
+#: authentik/stages/authenticator_validate/challenge.py
msgid "Invalid Token"
msgstr "无效令牌"
-#: authentik/stages/authenticator_validate/models.py:18
+#: authentik/stages/authenticator_validate/models.py
msgid "Static"
msgstr "静态"
-#: authentik/stages/authenticator_validate/models.py:19
+#: authentik/stages/authenticator_validate/models.py
msgid "TOTP"
msgstr "TOTP"
-#: authentik/stages/authenticator_validate/models.py:20
+#: authentik/stages/authenticator_validate/models.py
msgid "WebAuthn"
msgstr "WebAuthn"
-#: authentik/stages/authenticator_validate/models.py:21
+#: authentik/stages/authenticator_validate/models.py
msgid "Duo"
msgstr "Duo"
-#: authentik/stages/authenticator_validate/models.py:22
+#: authentik/stages/authenticator_validate/models.py
msgid "SMS"
msgstr "短信"
-#: authentik/stages/authenticator_validate/models.py:49
+#: authentik/stages/authenticator_validate/models.py
msgid ""
"Stages used to configure Authenticator when user doesn't have any compatible"
" devices. After this configuration Stage passes, the user is not prompted "
"again."
msgstr "当用户没有任何兼容的设备时,用来配置身份验证器的阶段。此阶段通过后,将不再请求此用户。"
-#: authentik/stages/authenticator_validate/models.py:56
+#: authentik/stages/authenticator_validate/models.py
msgid "Device classes which can be used to authenticate"
msgstr "可用于进行身份验证的设备类型"
-#: authentik/stages/authenticator_validate/models.py:64
+#: authentik/stages/authenticator_validate/models.py
msgid ""
"If any of the user's device has been used within this threshold, this stage "
"will be skipped"
msgstr "如果用户的任意设备在此期限内被使用过,此阶段会被跳过。"
-#: authentik/stages/authenticator_validate/models.py:70
+#: authentik/stages/authenticator_validate/models.py
msgid "Enforce user verification for WebAuthn devices."
msgstr "对 WebAuthn 设备强制用户验证。"
-#: authentik/stages/authenticator_validate/models.py:92
+#: authentik/stages/authenticator_validate/models.py
msgid "Authenticator Validation Stage"
msgstr "身份验证器验证阶段"
-#: authentik/stages/authenticator_validate/models.py:93
+#: authentik/stages/authenticator_validate/models.py
msgid "Authenticator Validation Stages"
msgstr "身份验证器验证阶段"
-#: authentik/stages/authenticator_webauthn/models.py:112
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "WebAuthn 身份验证器设置阶段"
-#: authentik/stages/authenticator_webauthn/models.py:113
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stages"
msgstr "WebAuthn 身份验证器设置阶段"
-#: authentik/stages/authenticator_webauthn/models.py:151
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Device"
msgstr "WebAuthn 设备"
-#: authentik/stages/authenticator_webauthn/models.py:152
+#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Devices"
msgstr "WebAuthn 设备"
-#: authentik/stages/captcha/models.py:14
+#: authentik/stages/captcha/models.py
msgid "Public key, acquired your captcha Provider."
msgstr "公钥,从您的验证码提供商处取得。"
-#: authentik/stages/captcha/models.py:15
+#: authentik/stages/captcha/models.py
msgid "Private key, acquired your captcha Provider."
msgstr "私钥,从您的验证码提供商处取得。"
-#: authentik/stages/captcha/models.py:37
+#: authentik/stages/captcha/models.py
msgid "Captcha Stage"
msgstr "验证码阶段"
-#: authentik/stages/captcha/models.py:38
+#: authentik/stages/captcha/models.py
msgid "Captcha Stages"
msgstr "验证码阶段"
-#: authentik/stages/consent/models.py:30
+#: authentik/stages/consent/models.py
msgid ""
"Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)."
msgstr "经过多少偏移量后同意授权过期。(格式:hours=1;minutes=2;seconds=3)。"
-#: authentik/stages/consent/models.py:50
+#: authentik/stages/consent/models.py
msgid "Consent Stage"
msgstr "同意授权阶段"
-#: authentik/stages/consent/models.py:51
+#: authentik/stages/consent/models.py
msgid "Consent Stages"
msgstr "同意授权阶段"
-#: authentik/stages/consent/models.py:72
+#: authentik/stages/consent/models.py
msgid "User Consent"
msgstr "用户同意授权"
-#: authentik/stages/consent/models.py:73
+#: authentik/stages/consent/models.py
msgid "User Consents"
msgstr "用户同意授权"
-#: authentik/stages/deny/models.py:32
+#: authentik/stages/deny/models.py
msgid "Deny Stage"
msgstr "拒绝阶段"
-#: authentik/stages/deny/models.py:33
+#: authentik/stages/deny/models.py
msgid "Deny Stages"
msgstr "拒绝阶段"
-#: authentik/stages/dummy/models.py:34
+#: authentik/stages/dummy/models.py
msgid "Dummy Stage"
msgstr "虚拟阶段"
-#: authentik/stages/dummy/models.py:35
+#: authentik/stages/dummy/models.py
msgid "Dummy Stages"
msgstr "虚拟阶段"
-#: authentik/stages/email/models.py:26
+#: authentik/stages/email/models.py
msgid "Password Reset"
msgstr "密码重置"
-#: authentik/stages/email/models.py:30
+#: authentik/stages/email/models.py
msgid "Account Confirmation"
msgstr "账户确认"
-#: authentik/stages/email/models.py:59
+#: authentik/stages/email/models.py
msgid ""
"When enabled, global Email connection settings will be used and connection "
"settings below will be ignored."
msgstr "启用后,将使用全局电子邮件连接设置,下面的连接设置将被忽略。"
-#: authentik/stages/email/models.py:74
+#: authentik/stages/email/models.py
msgid "Activate users upon completion of stage."
msgstr "完成阶段后激活用户。"
-#: authentik/stages/email/models.py:78
+#: authentik/stages/email/models.py
msgid "Time in minutes the token sent is valid."
msgstr "发出令牌的有效时间(单位为分钟)。"
-#: authentik/stages/email/models.py:132
+#: authentik/stages/email/models.py
msgid "Email Stage"
msgstr "电子邮件阶段"
-#: authentik/stages/email/models.py:133
+#: authentik/stages/email/models.py
msgid "Email Stages"
msgstr "电子邮件阶段"
-#: authentik/stages/email/stage.py:126
+#: authentik/stages/email/stage.py
msgid "Exception occurred while rendering E-mail template"
msgstr "渲染电子邮件模板时发生异常"
-#: authentik/stages/email/stage.py:140
+#: authentik/stages/email/stage.py
msgid "Successfully verified Email."
msgstr "已成功验证电子邮件。"
-#: authentik/stages/email/stage.py:147 authentik/stages/email/stage.py:173
+#: authentik/stages/email/stage.py
msgid "No pending user."
msgstr "没有待处理的用户。"
-#: authentik/stages/email/stage.py:163
+#: authentik/stages/email/stage.py
msgid "Email sent."
msgstr "电子邮件已发出。"
-#: authentik/stages/email/stage.py:176
+#: authentik/stages/email/stage.py
msgid "Email Successfully sent."
msgstr "成功发送电子邮件。"
-#: authentik/stages/email/templates/email/account_confirmation.html:10
-#: authentik/stages/email/templates/email/account_confirmation.txt:1
+#: authentik/stages/email/templates/email/account_confirmation.html
+#: authentik/stages/email/templates/email/account_confirmation.txt
msgid "Welcome!"
msgstr "欢迎!"
-#: authentik/stages/email/templates/email/account_confirmation.html:19
+#: authentik/stages/email/templates/email/account_confirmation.html
msgid ""
"We're excited to have you get started. First, you need to confirm your "
"account. Just press the button below."
msgstr "我们很高兴您能开始使用。首先,您需要确认您的账户。只需点击下面的按钮。"
-#: authentik/stages/email/templates/email/account_confirmation.html:24
+#: authentik/stages/email/templates/email/account_confirmation.html
msgid "Confirm Account"
msgstr "确认账户"
-#: authentik/stages/email/templates/email/account_confirmation.html:36
+#: authentik/stages/email/templates/email/account_confirmation.html
#, python-format
msgid ""
"\n"
@@ -2377,13 +2384,13 @@ msgstr ""
" 如果按钮无效,请复制并在浏览器中粘贴以下链接:%(url)s\n"
" "
-#: authentik/stages/email/templates/email/account_confirmation.txt:3
+#: authentik/stages/email/templates/email/account_confirmation.txt
msgid ""
"We're excited to have you get started. First, you need to confirm your "
"account. Just open the link below."
msgstr "我们很高兴您能开始使用。首先,您需要确认您的账户。只需打开下面的链接。"
-#: authentik/stages/email/templates/email/event_notification.html:46
+#: authentik/stages/email/templates/email/event_notification.html
#, python-format
msgid ""
"\n"
@@ -2394,19 +2401,19 @@ msgstr ""
" 此邮件由通知递送 %(name)s
发送。\n"
" "
-#: authentik/stages/email/templates/email/event_notification.txt:1
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "Dear authentik user,"
msgstr "亲爱的 authentik 用户,"
-#: authentik/stages/email/templates/email/event_notification.txt:3
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "The following notification was created:"
msgstr "以下通知已创建:"
-#: authentik/stages/email/templates/email/event_notification.txt:8
+#: authentik/stages/email/templates/email/event_notification.txt
msgid "Additional attributes:"
msgstr "额外属性:"
-#: authentik/stages/email/templates/email/event_notification.txt:13
+#: authentik/stages/email/templates/email/event_notification.txt
#, python-format
msgid ""
"\n"
@@ -2415,7 +2422,7 @@ msgstr ""
"\n"
"此邮件由通知递送 %(name)s 发送。\n"
-#: authentik/stages/email/templates/email/password_reset.html:10
+#: authentik/stages/email/templates/email/password_reset.html
#, python-format
msgid ""
"\n"
@@ -2426,7 +2433,7 @@ msgstr ""
" %(username)s 您好,\n"
" "
-#: authentik/stages/email/templates/email/password_reset.html:21
+#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n"
@@ -2436,7 +2443,7 @@ msgstr ""
" 您最近请求更改您的 authentik 账户密码。使用下面的按钮设置新密码。\n"
" "
-#: authentik/stages/email/templates/email/password_reset.html:39
+#: authentik/stages/email/templates/email/password_reset.html
#, python-format
msgid ""
"\n"
@@ -2447,12 +2454,12 @@ msgstr ""
" 如果您没有请求更改密码,请忽略此电子邮件。上面的链接在 %(expires)s 内有效。\n"
" "
-#: authentik/stages/email/templates/email/password_reset.txt:1
+#: authentik/stages/email/templates/email/password_reset.txt
#, python-format
msgid "Hi %(username)s,"
msgstr "您好 %(username)s,"
-#: authentik/stages/email/templates/email/password_reset.txt:3
+#: authentik/stages/email/templates/email/password_reset.txt
msgid ""
"\n"
"You recently requested to change your password for your authentik account. Use the link below to set a new password.\n"
@@ -2460,7 +2467,7 @@ msgstr ""
"\n"
"您最近请求更改您的 authentik 账户密码。使用下面的链接设置新密码。\n"
-#: authentik/stages/email/templates/email/password_reset.txt:7
+#: authentik/stages/email/templates/email/password_reset.txt
#, python-format
msgid ""
"\n"
@@ -2469,11 +2476,11 @@ msgstr ""
"\n"
"如果您没有请求更改密码,请忽略此电子邮件。上面的链接在 %(expires)s 内有效。\n"
-#: authentik/stages/email/templates/email/setup.html:9
+#: authentik/stages/email/templates/email/setup.html
msgid "authentik Test-Email"
msgstr "authentik 测试电子邮件"
-#: authentik/stages/email/templates/email/setup.html:17
+#: authentik/stages/email/templates/email/setup.html
msgid ""
"\n"
" This is a test email to inform you, that you've successfully configured authentik emails.\n"
@@ -2483,7 +2490,7 @@ msgstr ""
" 这是一封测试电子邮件,用于通知您已成功配置 authentik 电子邮件。\n"
" "
-#: authentik/stages/email/templates/email/setup.txt:2
+#: authentik/stages/email/templates/email/setup.txt
msgid ""
"\n"
"This is a test email to inform you, that you've successfully configured authentik emails.\n"
@@ -2491,263 +2498,263 @@ msgstr ""
"\n"
"这是一封测试电子邮件,用于通知您已成功配置 authentik 电子邮件。\n"
-#: authentik/stages/identification/api.py:20
+#: authentik/stages/identification/api.py
msgid "When no user fields are selected, at least one source must be selected"
msgstr "如果未选择用户字段,则至少要选择一个源"
-#: authentik/stages/identification/models.py:29
+#: authentik/stages/identification/models.py
msgid ""
"Fields of the user object to match against. (Hold shift to select multiple "
"options)"
msgstr "用来匹配的用户对象字段。(按住 Shift 多选)"
-#: authentik/stages/identification/models.py:47
+#: authentik/stages/identification/models.py
msgid "When enabled, user fields are matched regardless of their casing."
msgstr "启用后,无论大小写如何,都将匹配用户字段。"
-#: authentik/stages/identification/models.py:52
+#: authentik/stages/identification/models.py
msgid ""
"When a valid username/email has been entered, and this option is enabled, "
"the user's username and avatar will be shown. Otherwise, the text that the "
"user entered will be shown"
msgstr "如果输入了有效的用户名/电子邮箱,并且启用了此选项,则会显示用户的用户名和头像。否则,将显示用户输入的文本"
-#: authentik/stages/identification/models.py:60
+#: authentik/stages/identification/models.py
msgid ""
"When enabled, the stage will succeed and continue even when incorrect user "
"info is entered."
msgstr "启用时,即使输入错误的用户信息,此阶段也会成功并继续。"
-#: authentik/stages/identification/models.py:72
+#: authentik/stages/identification/models.py
msgid "Optional enrollment flow, which is linked at the bottom of the page."
msgstr "可选注册流程,链接在页面底部。"
-#: authentik/stages/identification/models.py:81
+#: authentik/stages/identification/models.py
msgid "Optional recovery flow, which is linked at the bottom of the page."
msgstr "可选的恢复流程,链接在页面底部。"
-#: authentik/stages/identification/models.py:90
+#: authentik/stages/identification/models.py
msgid "Optional passwordless flow, which is linked at the bottom of the page."
msgstr "可选的无密码流程,链接在页面底部。"
-#: authentik/stages/identification/models.py:94
+#: authentik/stages/identification/models.py
msgid "Specify which sources should be shown."
msgstr "指定应显示哪些源。"
-#: authentik/stages/identification/models.py:115
+#: authentik/stages/identification/models.py
msgid "Identification Stage"
msgstr "识别阶段"
-#: authentik/stages/identification/models.py:116
+#: authentik/stages/identification/models.py
msgid "Identification Stages"
msgstr "识别阶段"
-#: authentik/stages/identification/stage.py:188
+#: authentik/stages/identification/stage.py
msgid "Log in"
msgstr "登录"
-#: authentik/stages/identification/stage.py:189
+#: authentik/stages/identification/stage.py
msgid "Continue"
msgstr "继续"
-#: authentik/stages/invitation/models.py:21
+#: authentik/stages/invitation/models.py
msgid ""
"If this flag is set, this Stage will jump to the next Stage when no "
"Invitation is given. By default this Stage will cancel the Flow when no "
"invitation is given."
msgstr "如果设置了此标志,则当没有发出邀请时,此阶段将跳转到下一个阶段。默认情况下,当没有发出邀请时,此阶段将取消流程。"
-#: authentik/stages/invitation/models.py:44
+#: authentik/stages/invitation/models.py
msgid "Invitation Stage"
msgstr "邀请阶段"
-#: authentik/stages/invitation/models.py:45
+#: authentik/stages/invitation/models.py
msgid "Invitation Stages"
msgstr "邀请阶段"
-#: authentik/stages/invitation/models.py:60
+#: authentik/stages/invitation/models.py
msgid "When set, only the configured flow can use this invitation."
msgstr "设置时,只有配置的流程可以使用此邀请。"
-#: authentik/stages/invitation/models.py:64
+#: authentik/stages/invitation/models.py
msgid "When enabled, the invitation will be deleted after usage."
msgstr "启用后,邀请将在使用后被删除。"
-#: authentik/stages/invitation/models.py:71
+#: authentik/stages/invitation/models.py
msgid "Optional fixed data to enforce on user enrollment."
msgstr "在用户注册时强制设置的可选固定数据。"
-#: authentik/stages/invitation/models.py:84
+#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "邀请"
-#: authentik/stages/invitation/models.py:85
+#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "邀请"
-#: authentik/stages/invitation/stage.py:62
+#: authentik/stages/invitation/stage.py
msgid "Invalid invite/invite not found"
msgstr "邀请无效/未找到"
-#: authentik/stages/password/models.py:20
+#: authentik/stages/password/models.py
msgid "User database + standard password"
msgstr "用户数据库 + 标准密码"
-#: authentik/stages/password/models.py:24
+#: authentik/stages/password/models.py
msgid "User database + app passwords"
msgstr "用户数据库 + 应用程序密码"
-#: authentik/stages/password/models.py:28
+#: authentik/stages/password/models.py
msgid "User database + LDAP password"
msgstr "用户数据库 + LDAP 密码"
-#: authentik/stages/password/models.py:38
+#: authentik/stages/password/models.py
msgid "Selection of backends to test the password against."
msgstr "选择用于测试密码的后端。"
-#: authentik/stages/password/models.py:43
+#: authentik/stages/password/models.py
msgid ""
"How many attempts a user has before the flow is canceled. To lock the user "
"out, use a reputation policy and a user_write stage."
msgstr "在取消流程之前,用户可以尝试多少次。要锁定用户,请使用信誉策略和 user_write 阶段。"
-#: authentik/stages/password/models.py:75
+#: authentik/stages/password/models.py
msgid "Password Stage"
msgstr "密码阶段"
-#: authentik/stages/password/models.py:76
+#: authentik/stages/password/models.py
msgid "Password Stages"
msgstr "密码阶段"
-#: authentik/stages/password/stage.py:124
+#: authentik/stages/password/stage.py
msgid "Invalid password"
msgstr "无效密码"
-#: authentik/stages/prompt/models.py:43
+#: authentik/stages/prompt/models.py
msgid "Text: Simple Text input"
msgstr "文本:简单文本输入"
-#: authentik/stages/prompt/models.py:45
+#: authentik/stages/prompt/models.py
msgid "Text area: Multiline Text Input."
msgstr "文本框:多行文本输入。"
-#: authentik/stages/prompt/models.py:48
+#: authentik/stages/prompt/models.py
msgid "Text (read-only): Simple Text input, but cannot be edited."
msgstr "文本(只读):简单文本输入,但无法编辑。"
-#: authentik/stages/prompt/models.py:52
+#: authentik/stages/prompt/models.py
msgid "Text area (read-only): Multiline Text input, but cannot be edited."
msgstr "文本框(只读):多行文本输入,但无法编辑。"
-#: authentik/stages/prompt/models.py:58
+#: authentik/stages/prompt/models.py
msgid ""
"Username: Same as Text input, but checks for and prevents duplicate "
"usernames."
msgstr "用户名:与文本输入相同,但检查并防止用户名重复。"
-#: authentik/stages/prompt/models.py:60
+#: authentik/stages/prompt/models.py
msgid "Email: Text field with Email type."
msgstr "电子邮箱:电子邮箱类型的文本字段。"
-#: authentik/stages/prompt/models.py:64
+#: authentik/stages/prompt/models.py
msgid ""
"Password: Masked input, multiple inputs of this type on the same prompt need"
" to be identical."
msgstr "密码:屏蔽显示输入内容,多个此类型的输入如果在同一个输入项下,则内容需要相同。"
-#: authentik/stages/prompt/models.py:71
+#: authentik/stages/prompt/models.py
msgid "Fixed choice field rendered as a group of radio buttons."
msgstr "显示为一组单选按钮的固定选项字段。"
-#: authentik/stages/prompt/models.py:73
+#: authentik/stages/prompt/models.py
msgid "Fixed choice field rendered as a dropdown."
msgstr "显示为下拉框的固定选项字段。"
-#: authentik/stages/prompt/models.py:80
+#: authentik/stages/prompt/models.py
msgid ""
"File: File upload for arbitrary files. File content will be available in "
"flow context as data-URI"
msgstr "文件:任意文件上传。文件内容将在流程上下文中以 data-URI 形式提供"
-#: authentik/stages/prompt/models.py:85
+#: authentik/stages/prompt/models.py
msgid "Separator: Static Separator Line"
msgstr "分隔符:静态分隔线"
-#: authentik/stages/prompt/models.py:86
+#: authentik/stages/prompt/models.py
msgid "Hidden: Hidden field, can be used to insert data into form."
msgstr "隐藏:隐藏字段,可用于将数据插入表单。"
-#: authentik/stages/prompt/models.py:87
+#: authentik/stages/prompt/models.py
msgid "Static: Static value, displayed as-is."
msgstr "静态:静态值,按原样显示。"
-#: authentik/stages/prompt/models.py:89
+#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik:选择 authentik 支持的语言环境"
-#: authentik/stages/prompt/models.py:116
+#: authentik/stages/prompt/models.py
msgid "Name of the form field, also used to store the value"
msgstr "表单域的名称,也用于存储值"
-#: authentik/stages/prompt/models.py:124
+#: authentik/stages/prompt/models.py
msgid ""
"Optionally provide a short hint that describes the expected input value. "
"When creating a fixed choice field, enable interpreting as expression and "
"return a list to return multiple choices."
msgstr "可选的简短提示,用来描述期望的输入值。在创建固定选项字段时,启用以表达式解释,并返回多个选项的列表。"
-#: authentik/stages/prompt/models.py:132
+#: authentik/stages/prompt/models.py
msgid ""
"Optionally pre-fill the input with an initial value. When creating a fixed "
"choice field, enable interpreting as expression and return a list to return "
"multiple default choices."
msgstr "可选的预设输入初始值。在创建固定选项字段时,启用以表达式解释,并返回多个默认选项的列表。"
-#: authentik/stages/prompt/models.py:321
+#: authentik/stages/prompt/models.py
msgid "Prompt"
msgstr "输入"
-#: authentik/stages/prompt/models.py:322
+#: authentik/stages/prompt/models.py
msgid "Prompts"
msgstr "输入"
-#: authentik/stages/prompt/models.py:349
+#: authentik/stages/prompt/models.py
msgid "Prompt Stage"
msgstr "输入阶段"
-#: authentik/stages/prompt/models.py:350
+#: authentik/stages/prompt/models.py
msgid "Prompt Stages"
msgstr "输入阶段"
-#: authentik/stages/prompt/stage.py:108
+#: authentik/stages/prompt/stage.py
msgid "Passwords don't match."
msgstr "密码不匹配。"
-#: authentik/stages/user_delete/models.py:31
+#: authentik/stages/user_delete/models.py
msgid "User Delete Stage"
msgstr "用户删除阶段"
-#: authentik/stages/user_delete/models.py:32
+#: authentik/stages/user_delete/models.py
msgid "User Delete Stages"
msgstr "用户删除阶段"
-#: authentik/stages/user_delete/stage.py:18
+#: authentik/stages/user_delete/stage.py
msgid "No Pending User."
msgstr "没有待处理的用户。"
-#: authentik/stages/user_login/models.py:47
+#: authentik/stages/user_login/models.py
msgid "Bind sessions created by this stage to the configured network"
msgstr "将此阶段创建的会话与配置的网络绑定"
-#: authentik/stages/user_login/models.py:52
+#: authentik/stages/user_login/models.py
msgid "Bind sessions created by this stage to the configured GeoIP location"
msgstr "将此阶段创建的会话与配置的 GeoIP 位置绑定"
-#: authentik/stages/user_login/models.py:55
+#: authentik/stages/user_login/models.py
msgid "Terminate all other sessions of the user logging in."
msgstr "终止用户登录的所有其他会话。"
-#: authentik/stages/user_login/models.py:61
+#: authentik/stages/user_login/models.py
msgid ""
"Offset the session will be extended by when the user picks the remember me "
"option. Default of 0 means that the remember me option will not be shown. "
@@ -2756,113 +2763,112 @@ msgstr ""
"当用户选择“记住我”选项时,会话将会延长的时间。默认值 0 "
"表示不显示“记住我”选项。(格式:hours=-1;minutes=-2;seconds=-3)"
-#: authentik/stages/user_login/models.py:84
+#: authentik/stages/user_login/models.py
msgid "User Login Stage"
msgstr "用户登录阶段"
-#: authentik/stages/user_login/models.py:85
+#: authentik/stages/user_login/models.py
msgid "User Login Stages"
msgstr "用户登录阶段"
-#: authentik/stages/user_login/stage.py:85
+#: authentik/stages/user_login/stage.py
msgid "No Pending user to login."
msgstr "没有待定用户可以登录。"
-#: authentik/stages/user_login/stage.py:112
+#: authentik/stages/user_login/stage.py
msgid "Successfully logged in!"
msgstr "已成功登录!"
-#: authentik/stages/user_logout/models.py:30
+#: authentik/stages/user_logout/models.py
msgid "User Logout Stage"
msgstr "用户登出阶段"
-#: authentik/stages/user_logout/models.py:31
+#: authentik/stages/user_logout/models.py
msgid "User Logout Stages"
msgstr "用户登出阶段"
-#: authentik/stages/user_write/models.py:31
+#: authentik/stages/user_write/models.py
msgid "When set, newly created users are inactive and cannot login."
msgstr "设置后,新创建的用户将处于未激活状态,且无法登录。"
-#: authentik/stages/user_write/models.py:39
+#: authentik/stages/user_write/models.py
msgid "Optionally add newly created users to this group."
msgstr "可选,将新创建的用户添加到此组。"
-#: authentik/stages/user_write/models.py:68
+#: authentik/stages/user_write/models.py
msgid "User Write Stage"
msgstr "用户写入阶段"
-#: authentik/stages/user_write/models.py:69
+#: authentik/stages/user_write/models.py
msgid "User Write Stages"
msgstr "用户写入阶段"
-#: authentik/stages/user_write/stage.py:141
+#: authentik/stages/user_write/stage.py
msgid "No Pending data."
msgstr "没有待处理的数据。"
-#: authentik/stages/user_write/stage.py:147
+#: authentik/stages/user_write/stage.py
msgid "No user found and can't create new user."
msgstr "未找到用户并且无法创建新用户。"
-#: authentik/stages/user_write/stage.py:164
-#: authentik/stages/user_write/stage.py:178
+#: authentik/stages/user_write/stage.py
msgid "Failed to update user. Please try again later."
msgstr "更新用户失败。请稍后重试。"
-#: authentik/tenants/models.py:29
+#: authentik/tenants/models.py
msgid ""
"Schema name must start with t_, only contain lowercase letters and numbers "
"and be less than 63 characters."
msgstr "模式名称必须以 t_ 开始,只能包含小写字母和数字,并且少于 63 个字符。"
-#: authentik/tenants/models.py:49
+#: authentik/tenants/models.py
msgid "Configure how authentik should show avatars for users."
msgstr "配置 authentik 应该如何显示用户头像。"
-#: authentik/tenants/models.py:53
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their name."
msgstr "启用用户修改自己名称的能力。"
-#: authentik/tenants/models.py:56
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their email address."
msgstr "启用用户修改自己电子邮件地址的能力。"
-#: authentik/tenants/models.py:59
+#: authentik/tenants/models.py
msgid "Enable the ability for users to change their username."
msgstr "启用用户修改自己用户名的能力。"
-#: authentik/tenants/models.py:65
+#: authentik/tenants/models.py
msgid ""
"Events will be deleted after this duration.(Format: "
"weeks=3;days=2;hours=3,seconds=2)."
msgstr "事件会在多久后被删除。(格式:weeks=3;days=2;hours=3,seconds=2)。"
-#: authentik/tenants/models.py:69
+#: authentik/tenants/models.py
msgid "The option configures the footer links on the flow executor pages."
msgstr "此选项配置流程执行器页面上的页脚链接。"
-#: authentik/tenants/models.py:75
+#: authentik/tenants/models.py
msgid ""
"When enabled, all the events caused by a user will be deleted upon the "
"user's deletion."
msgstr "启用时,所有由用户造成的事件会在相应用户被删除时一并删除。"
-#: authentik/tenants/models.py:81
+#: authentik/tenants/models.py
msgid "Globally enable/disable impersonation."
msgstr "全局启用/禁用模拟身份。"
-#: authentik/tenants/models.py:104
+#: authentik/tenants/models.py
msgid "Tenant"
msgstr "租户"
-#: authentik/tenants/models.py:105
+#: authentik/tenants/models.py
msgid "Tenants"
msgstr "租户"
-#: authentik/tenants/models.py:125
+#: authentik/tenants/models.py
msgid "Domain"
msgstr "域名"
-#: authentik/tenants/models.py:126
+#: authentik/tenants/models.py
msgid "Domains"
msgstr "域名"
diff --git a/poetry.lock b/poetry.lock
index eb5c1436c3..4098481c08 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -993,47 +993,56 @@ toml = ["tomli"]
[[package]]
name = "cryptography"
-version = "41.0.7"
+version = "42.0.0"
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
optional = false
python-versions = ">=3.7"
files = [
- {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"},
- {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"},
- {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"},
- {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"},
- {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"},
- {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"},
- {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"},
- {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"},
- {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"},
- {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"},
- {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"},
- {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"},
- {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"},
- {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"},
- {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"},
- {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"},
- {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"},
- {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"},
- {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"},
- {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"},
- {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"},
- {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"},
- {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"},
+ {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434"},
+ {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01"},
+ {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd"},
+ {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3"},
+ {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b"},
+ {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87"},
+ {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17"},
+ {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d"},
+ {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec"},
+ {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc"},
+ {file = "cryptography-42.0.0-cp37-abi3-win32.whl", hash = "sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4"},
+ {file = "cryptography-42.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0"},
+ {file = "cryptography-42.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf"},
+ {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689"},
+ {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0"},
+ {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139"},
+ {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2"},
+ {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513"},
+ {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8"},
+ {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81"},
+ {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221"},
+ {file = "cryptography-42.0.0-cp39-abi3-win32.whl", hash = "sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b"},
+ {file = "cryptography-42.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94"},
+ {file = "cryptography-42.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e"},
+ {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3"},
+ {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f"},
+ {file = "cryptography-42.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08"},
+ {file = "cryptography-42.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f"},
+ {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440"},
+ {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0"},
+ {file = "cryptography-42.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce"},
+ {file = "cryptography-42.0.0.tar.gz", hash = "sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4"},
]
[package.dependencies]
-cffi = ">=1.12"
+cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""}
[package.extras]
docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"]
-docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"]
+docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"]
nox = ["nox"]
-pep8test = ["black", "check-sdist", "mypy", "ruff"]
+pep8test = ["check-sdist", "click", "mypy", "ruff"]
sdist = ["build"]
ssh = ["bcrypt (>=3.1.5)"]
-test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"]
+test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"]
test-randomorder = ["pytest-randomly"]
[[package]]
@@ -1070,29 +1079,33 @@ tests = ["django", "hypothesis", "pytest", "pytest-asyncio"]
[[package]]
name = "debugpy"
-version = "1.8.0"
+version = "1.8.1"
description = "An implementation of the Debug Adapter Protocol for Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"},
- {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"},
- {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"},
- {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"},
- {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"},
- {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"},
- {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"},
- {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"},
- {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"},
- {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"},
- {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"},
- {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"},
- {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"},
- {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"},
- {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"},
- {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"},
- {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"},
- {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"},
+ {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"},
+ {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"},
+ {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"},
+ {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"},
+ {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"},
+ {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"},
+ {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"},
+ {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"},
+ {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"},
+ {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"},
+ {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"},
+ {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"},
+ {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"},
+ {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"},
+ {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"},
+ {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"},
+ {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"},
+ {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"},
+ {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"},
+ {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"},
+ {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"},
+ {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"},
]
[[package]]
@@ -1133,13 +1146,13 @@ graph = ["objgraph (>=1.7.2)"]
[[package]]
name = "django"
-version = "5.0.1"
+version = "5.0.2"
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
optional = false
python-versions = ">=3.10"
files = [
- {file = "Django-5.0.1-py3-none-any.whl", hash = "sha256:f47a37a90b9bbe2c8ec360235192c7fddfdc832206fcf618bb849b39256affc1"},
- {file = "Django-5.0.1.tar.gz", hash = "sha256:8c8659665bc6e3a44fefe1ab0a291e5a3fb3979f9a8230be29de975e57e8f854"},
+ {file = "Django-5.0.2-py3-none-any.whl", hash = "sha256:56ab63a105e8bb06ee67381d7b65fe6774f057e41a8bab06c8020c8882d8ecd4"},
+ {file = "Django-5.0.2.tar.gz", hash = "sha256:b5bb1d11b2518a5f91372a282f24662f58f66749666b0a286ab057029f728080"},
]
[package.dependencies]
@@ -1181,13 +1194,13 @@ Django = ">=2.2"
[[package]]
name = "django-model-utils"
-version = "4.3.1"
+version = "4.4.0"
description = "Django model mixins and utilities"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "django-model-utils-4.3.1.tar.gz", hash = "sha256:2e2e4f13e4f14613134a9777db7ad4265f59a1d8f1384107bcaa3028fe3c87c1"},
- {file = "django_model_utils-4.3.1-py3-none-any.whl", hash = "sha256:8c0b0177bab909a8635b602d960daa67e80607aa5469217857271a60726d7a4b"},
+ {file = "django-model-utils-4.4.0.tar.gz", hash = "sha256:7b73179480e4d4a737d0188e7c49da03776bbadedad569a534c4e9f1afc004d4"},
+ {file = "django_model_utils-4.4.0-py3-none-any.whl", hash = "sha256:d57143e8b7345fd4719c5a95d07d7a50f7d11134da6a729aa6b73fb9674bec9d"},
]
[package.dependencies]
@@ -2773,36 +2786,36 @@ wcwidth = "*"
[[package]]
name = "psycopg"
-version = "3.1.17"
+version = "3.1.18"
description = "PostgreSQL database adapter for Python"
optional = false
python-versions = ">=3.7"
files = [
- {file = "psycopg-3.1.17-py3-none-any.whl", hash = "sha256:96b7b13af6d5a514118b759a66b2799a8a4aa78675fa6bb0d3f7d52d67eff002"},
- {file = "psycopg-3.1.17.tar.gz", hash = "sha256:437e7d7925459f21de570383e2e10542aceb3b9cb972ce957fdd3826ca47edc6"},
+ {file = "psycopg-3.1.18-py3-none-any.whl", hash = "sha256:4d5a0a5a8590906daa58ebd5f3cfc34091377354a1acced269dd10faf55da60e"},
+ {file = "psycopg-3.1.18.tar.gz", hash = "sha256:31144d3fb4c17d78094d9e579826f047d4af1da6a10427d91dfcfb6ecdf6f12b"},
]
[package.dependencies]
-psycopg-c = {version = "3.1.17", optional = true, markers = "implementation_name != \"pypy\" and extra == \"c\""}
+psycopg-c = {version = "3.1.18", optional = true, markers = "implementation_name != \"pypy\" and extra == \"c\""}
typing-extensions = ">=4.1"
tzdata = {version = "*", markers = "sys_platform == \"win32\""}
[package.extras]
-binary = ["psycopg-binary (==3.1.17)"]
-c = ["psycopg-c (==3.1.17)"]
-dev = ["black (>=23.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.4.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"]
+binary = ["psycopg-binary (==3.1.18)"]
+c = ["psycopg-c (==3.1.18)"]
+dev = ["black (>=24.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.4.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"]
docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"]
pool = ["psycopg-pool"]
test = ["anyio (>=3.6.2,<4.0)", "mypy (>=1.4.1)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"]
[[package]]
name = "psycopg-c"
-version = "3.1.17"
+version = "3.1.18"
description = "PostgreSQL database adapter for Python -- C optimisation distribution"
optional = false
python-versions = ">=3.7"
files = [
- {file = "psycopg-c-3.1.17.tar.gz", hash = "sha256:5cc4d544d552b8ab92a9e3a9dbe3b4f46ce0a86338654d26387fc076e0c97977"},
+ {file = "psycopg-c-3.1.18.tar.gz", hash = "sha256:ffff0c4a9c0e0b7aadb1acb7b61eb8f886365dd8ef00120ce14676235846ba73"},
]
[[package]]
@@ -2884,19 +2897,19 @@ files = [
[[package]]
name = "pydantic"
-version = "2.6.0"
+version = "2.6.1"
description = "Data validation using Python type hints"
optional = false
python-versions = ">=3.8"
files = [
- {file = "pydantic-2.6.0-py3-none-any.whl", hash = "sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae"},
- {file = "pydantic-2.6.0.tar.gz", hash = "sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf"},
+ {file = "pydantic-2.6.1-py3-none-any.whl", hash = "sha256:0b6a909df3192245cb736509a92ff69e4fef76116feffec68e93a567347bae6f"},
+ {file = "pydantic-2.6.1.tar.gz", hash = "sha256:4fd5c182a2488dc63e6d32737ff19937888001e2a6d86e94b3f233104a5d1fa9"},
]
[package.dependencies]
annotated-types = ">=0.4.0"
email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""}
-pydantic-core = "2.16.1"
+pydantic-core = "2.16.2"
typing-extensions = ">=4.6.1"
[package.extras]
@@ -2904,90 +2917,90 @@ email = ["email-validator (>=2.0.0)"]
[[package]]
name = "pydantic-core"
-version = "2.16.1"
+version = "2.16.2"
description = ""
optional = false
python-versions = ">=3.8"
files = [
- {file = "pydantic_core-2.16.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948"},
- {file = "pydantic_core-2.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f"},
- {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f"},
- {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8"},
- {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48"},
- {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f"},
- {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798"},
- {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17"},
- {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388"},
- {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7"},
- {file = "pydantic_core-2.16.1-cp310-none-win32.whl", hash = "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4"},
- {file = "pydantic_core-2.16.1-cp310-none-win_amd64.whl", hash = "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c"},
- {file = "pydantic_core-2.16.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da"},
- {file = "pydantic_core-2.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e"},
- {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4"},
- {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f"},
- {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91"},
- {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c"},
- {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d"},
- {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864"},
- {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7"},
- {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae"},
- {file = "pydantic_core-2.16.1-cp311-none-win32.whl", hash = "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1"},
- {file = "pydantic_core-2.16.1-cp311-none-win_amd64.whl", hash = "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c"},
- {file = "pydantic_core-2.16.1-cp311-none-win_arm64.whl", hash = "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b"},
- {file = "pydantic_core-2.16.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51"},
- {file = "pydantic_core-2.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66"},
- {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13"},
- {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49"},
- {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137"},
- {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253"},
- {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54"},
- {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e"},
- {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8"},
- {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f"},
- {file = "pydantic_core-2.16.1-cp312-none-win32.whl", hash = "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212"},
- {file = "pydantic_core-2.16.1-cp312-none-win_amd64.whl", hash = "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f"},
- {file = "pydantic_core-2.16.1-cp312-none-win_arm64.whl", hash = "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd"},
- {file = "pydantic_core-2.16.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706"},
- {file = "pydantic_core-2.16.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60"},
- {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818"},
- {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06"},
- {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9"},
- {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66"},
- {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c"},
- {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95"},
- {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8"},
- {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca"},
- {file = "pydantic_core-2.16.1-cp38-none-win32.whl", hash = "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610"},
- {file = "pydantic_core-2.16.1-cp38-none-win_amd64.whl", hash = "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e"},
- {file = "pydantic_core-2.16.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196"},
- {file = "pydantic_core-2.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95"},
- {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c"},
- {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3"},
- {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506"},
- {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60"},
- {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc"},
- {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e"},
- {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d"},
- {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640"},
- {file = "pydantic_core-2.16.1-cp39-none-win32.whl", hash = "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f"},
- {file = "pydantic_core-2.16.1-cp39-none-win_amd64.whl", hash = "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118"},
- {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76"},
- {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394"},
- {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0"},
- {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c"},
- {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05"},
- {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0"},
- {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc"},
- {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2"},
- {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf"},
- {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1"},
- {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9"},
- {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8"},
- {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7"},
- {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff"},
- {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206"},
- {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76"},
- {file = "pydantic_core-2.16.1.tar.gz", hash = "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3fab4e75b8c525a4776e7630b9ee48aea50107fea6ca9f593c98da3f4d11bf7c"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8bde5b48c65b8e807409e6f20baee5d2cd880e0fad00b1a811ebc43e39a00ab2"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2924b89b16420712e9bb8192396026a8fbd6d8726224f918353ac19c4c043d2a"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16aa02e7a0f539098e215fc193c8926c897175d64c7926d00a36188917717a05"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:936a787f83db1f2115ee829dd615c4f684ee48ac4de5779ab4300994d8af325b"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:459d6be6134ce3b38e0ef76f8a672924460c455d45f1ad8fdade36796df1ddc8"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9ee4febb249c591d07b2d4dd36ebcad0ccd128962aaa1801508320896575ef"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40a0bd0bed96dae5712dab2aba7d334a6c67cbcac2ddfca7dbcc4a8176445990"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:870dbfa94de9b8866b37b867a2cb37a60c401d9deb4a9ea392abf11a1f98037b"},
+ {file = "pydantic_core-2.16.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:308974fdf98046db28440eb3377abba274808bf66262e042c412eb2adf852731"},
+ {file = "pydantic_core-2.16.2-cp310-none-win32.whl", hash = "sha256:a477932664d9611d7a0816cc3c0eb1f8856f8a42435488280dfbf4395e141485"},
+ {file = "pydantic_core-2.16.2-cp310-none-win_amd64.whl", hash = "sha256:8f9142a6ed83d90c94a3efd7af8873bf7cefed2d3d44387bf848888482e2d25f"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:406fac1d09edc613020ce9cf3f2ccf1a1b2f57ab00552b4c18e3d5276c67eb11"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce232a6170dd6532096cadbf6185271e4e8c70fc9217ebe105923ac105da9978"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90fec23b4b05a09ad988e7a4f4e081711a90eb2a55b9c984d8b74597599180f"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8aafeedb6597a163a9c9727d8a8bd363a93277701b7bfd2749fbefee2396469e"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9957433c3a1b67bdd4c63717eaf174ebb749510d5ea612cd4e83f2d9142f3fc8"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0d7a9165167269758145756db43a133608a531b1e5bb6a626b9ee24bc38a8f7"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dffaf740fe2e147fedcb6b561353a16243e654f7fe8e701b1b9db148242e1272"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ed79883b4328b7f0bd142733d99c8e6b22703e908ec63d930b06be3a0e7113"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cf903310a34e14651c9de056fcc12ce090560864d5a2bb0174b971685684e1d8"},
+ {file = "pydantic_core-2.16.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46b0d5520dbcafea9a8645a8164658777686c5c524d381d983317d29687cce97"},
+ {file = "pydantic_core-2.16.2-cp311-none-win32.whl", hash = "sha256:70651ff6e663428cea902dac297066d5c6e5423fda345a4ca62430575364d62b"},
+ {file = "pydantic_core-2.16.2-cp311-none-win_amd64.whl", hash = "sha256:98dc6f4f2095fc7ad277782a7c2c88296badcad92316b5a6e530930b1d475ebc"},
+ {file = "pydantic_core-2.16.2-cp311-none-win_arm64.whl", hash = "sha256:ef6113cd31411eaf9b39fc5a8848e71c72656fd418882488598758b2c8c6dfa0"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:88646cae28eb1dd5cd1e09605680c2b043b64d7481cdad7f5003ebef401a3039"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b883af50eaa6bb3299780651e5be921e88050ccf00e3e583b1e92020333304b"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bf26c2e2ea59d32807081ad51968133af3025c4ba5753e6a794683d2c91bf6e"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99af961d72ac731aae2a1b55ccbdae0733d816f8bfb97b41909e143de735f522"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02906e7306cb8c5901a1feb61f9ab5e5c690dbbeaa04d84c1b9ae2a01ebe9379"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5362d099c244a2d2f9659fb3c9db7c735f0004765bbe06b99be69fbd87c3f15"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ac426704840877a285d03a445e162eb258924f014e2f074e209d9b4ff7bf380"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b94cbda27267423411c928208e89adddf2ea5dd5f74b9528513f0358bba019cb"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6db58c22ac6c81aeac33912fb1af0e930bc9774166cdd56eade913d5f2fff35e"},
+ {file = "pydantic_core-2.16.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396fdf88b1b503c9c59c84a08b6833ec0c3b5ad1a83230252a9e17b7dfb4cffc"},
+ {file = "pydantic_core-2.16.2-cp312-none-win32.whl", hash = "sha256:7c31669e0c8cc68400ef0c730c3a1e11317ba76b892deeefaf52dcb41d56ed5d"},
+ {file = "pydantic_core-2.16.2-cp312-none-win_amd64.whl", hash = "sha256:a3b7352b48fbc8b446b75f3069124e87f599d25afb8baa96a550256c031bb890"},
+ {file = "pydantic_core-2.16.2-cp312-none-win_arm64.whl", hash = "sha256:a9e523474998fb33f7c1a4d55f5504c908d57add624599e095c20fa575b8d943"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ae34418b6b389d601b31153b84dce480351a352e0bb763684a1b993d6be30f17"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:732bd062c9e5d9582a30e8751461c1917dd1ccbdd6cafb032f02c86b20d2e7ec"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b52776a2e3230f4854907a1e0946eec04d41b1fc64069ee774876bbe0eab55"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef551c053692b1e39e3f7950ce2296536728871110e7d75c4e7753fb30ca87f4"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebb892ed8599b23fa8f1799e13a12c87a97a6c9d0f497525ce9858564c4575a4"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa6c8c582036275997a733427b88031a32ffa5dfc3124dc25a730658c47a572f"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4ba0884a91f1aecce75202473ab138724aa4fb26d7707f2e1fa6c3e68c84fbf"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7924e54f7ce5d253d6160090ddc6df25ed2feea25bfb3339b424a9dd591688bc"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69a7b96b59322a81c2203be537957313b07dd333105b73db0b69212c7d867b4b"},
+ {file = "pydantic_core-2.16.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e6231aa5bdacda78e96ad7b07d0c312f34ba35d717115f4b4bff6cb87224f0f"},
+ {file = "pydantic_core-2.16.2-cp38-none-win32.whl", hash = "sha256:41dac3b9fce187a25c6253ec79a3f9e2a7e761eb08690e90415069ea4a68ff7a"},
+ {file = "pydantic_core-2.16.2-cp38-none-win_amd64.whl", hash = "sha256:f685dbc1fdadb1dcd5b5e51e0a378d4685a891b2ddaf8e2bba89bd3a7144e44a"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:55749f745ebf154c0d63d46c8c58594d8894b161928aa41adbb0709c1fe78b77"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b30b0dd58a4509c3bd7eefddf6338565c4905406aee0c6e4a5293841411a1286"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18de31781cdc7e7b28678df7c2d7882f9692ad060bc6ee3c94eb15a5d733f8f7"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5864b0242f74b9dd0b78fd39db1768bc3f00d1ffc14e596fd3e3f2ce43436a33"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f9186ca45aee030dc8234118b9c0784ad91a0bb27fc4e7d9d6608a5e3d386c"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc6f6c9be0ab6da37bc77c2dda5f14b1d532d5dbef00311ee6e13357a418e646"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa057095f621dad24a1e906747179a69780ef45cc8f69e97463692adbcdae878"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ad84731a26bcfb299f9eab56c7932d46f9cad51c52768cace09e92a19e4cf55"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3b052c753c4babf2d1edc034c97851f867c87d6f3ea63a12e2700f159f5c41c3"},
+ {file = "pydantic_core-2.16.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0f686549e32ccdb02ae6f25eee40cc33900910085de6aa3790effd391ae10c2"},
+ {file = "pydantic_core-2.16.2-cp39-none-win32.whl", hash = "sha256:7afb844041e707ac9ad9acad2188a90bffce2c770e6dc2318be0c9916aef1469"},
+ {file = "pydantic_core-2.16.2-cp39-none-win_amd64.whl", hash = "sha256:9da90d393a8227d717c19f5397688a38635afec89f2e2d7af0df037f3249c39a"},
+ {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f60f920691a620b03082692c378661947d09415743e437a7478c309eb0e4f82"},
+ {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:47924039e785a04d4a4fa49455e51b4eb3422d6eaacfde9fc9abf8fdef164e8a"},
+ {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6294e76b0380bb7a61eb8a39273c40b20beb35e8c87ee101062834ced19c545"},
+ {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe56851c3f1d6f5384b3051c536cc81b3a93a73faf931f404fef95217cf1e10d"},
+ {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d776d30cde7e541b8180103c3f294ef7c1862fd45d81738d156d00551005784"},
+ {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:72f7919af5de5ecfaf1eba47bf9a5d8aa089a3340277276e5636d16ee97614d7"},
+ {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:4bfcbde6e06c56b30668a0c872d75a7ef3025dc3c1823a13cf29a0e9b33f67e8"},
+ {file = "pydantic_core-2.16.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ff7c97eb7a29aba230389a2661edf2e9e06ce616c7e35aa764879b6894a44b25"},
+ {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b5f13857da99325dcabe1cc4e9e6a3d7b2e2c726248ba5dd4be3e8e4a0b6d0e"},
+ {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a7e41e3ada4cca5f22b478c08e973c930e5e6c7ba3588fb8e35f2398cdcc1545"},
+ {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60eb8ceaa40a41540b9acae6ae7c1f0a67d233c40dc4359c256ad2ad85bdf5e5"},
+ {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7beec26729d496a12fd23cf8da9944ee338c8b8a17035a560b585c36fe81af20"},
+ {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22c5f022799f3cd6741e24f0443ead92ef42be93ffda0d29b2597208c94c3753"},
+ {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:eca58e319f4fd6df004762419612122b2c7e7d95ffafc37e890252f869f3fb2a"},
+ {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed957db4c33bc99895f3a1672eca7e80e8cda8bd1e29a80536b4ec2153fa9804"},
+ {file = "pydantic_core-2.16.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:459c0d338cc55d099798618f714b21b7ece17eb1a87879f2da20a3ff4c7628e2"},
+ {file = "pydantic_core-2.16.2.tar.gz", hash = "sha256:0ba503850d8b8dcc18391f10de896ae51d37fe5fe43dbfb6a35c5c5cad271a06"},
]
[package.dependencies]
@@ -3126,17 +3139,17 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"]
[[package]]
name = "pyopenssl"
-version = "23.3.0"
+version = "24.0.0"
description = "Python wrapper module around the OpenSSL library"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pyOpenSSL-23.3.0-py3-none-any.whl", hash = "sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2"},
- {file = "pyOpenSSL-23.3.0.tar.gz", hash = "sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12"},
+ {file = "pyOpenSSL-24.0.0-py3-none-any.whl", hash = "sha256:ba07553fb6fd6a7a2259adb9b84e12302a9a8a75c44046e8bb5d3e5ee887e3c3"},
+ {file = "pyOpenSSL-24.0.0.tar.gz", hash = "sha256:6aa33039a93fffa4563e655b61d11364d01264be8ccb49906101e02a334530bf"},
]
[package.dependencies]
-cryptography = ">=41.0.5,<42"
+cryptography = ">=41.0.5,<43"
[package.extras]
docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"]
@@ -3601,28 +3614,28 @@ pyasn1 = ">=0.1.3"
[[package]]
name = "ruff"
-version = "0.1.15"
+version = "0.2.1"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
files = [
- {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"},
- {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"},
- {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"},
- {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"},
- {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"},
- {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"},
- {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"},
- {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"},
- {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"},
- {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"},
- {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"},
- {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"},
- {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"},
- {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"},
- {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"},
- {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"},
- {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"},
+ {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dd81b911d28925e7e8b323e8d06951554655021df8dd4ac3045d7212ac4ba080"},
+ {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dc586724a95b7d980aa17f671e173df00f0a2eef23f8babbeee663229a938fec"},
+ {file = "ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92db7101ef5bfc18e96777ed7bc7c822d545fa5977e90a585accac43d22f18a"},
+ {file = "ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13471684694d41ae0f1e8e3a7497e14cd57ccb7dd72ae08d56a159d6c9c3e30e"},
+ {file = "ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a11567e20ea39d1f51aebd778685582d4c56ccb082c1161ffc10f79bebe6df35"},
+ {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:00a818e2db63659570403e44383ab03c529c2b9678ba4ba6c105af7854008105"},
+ {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be60592f9d218b52f03384d1325efa9d3b41e4c4d55ea022cd548547cc42cd2b"},
+ {file = "ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbd2288890b88e8aab4499e55148805b58ec711053588cc2f0196a44f6e3d855"},
+ {file = "ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ef052283da7dec1987bba8d8733051c2325654641dfe5877a4022108098683"},
+ {file = "ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7022d66366d6fded4ba3889f73cd791c2d5621b2ccf34befc752cb0df70f5fad"},
+ {file = "ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0a725823cb2a3f08ee743a534cb6935727d9e47409e4ad72c10a3faf042ad5ba"},
+ {file = "ruff-0.2.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0034d5b6323e6e8fe91b2a1e55b02d92d0b582d2953a2b37a67a2d7dedbb7acc"},
+ {file = "ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5cb5526d69bb9143c2e4d2a115d08ffca3d8e0fddc84925a7b54931c96f5c02"},
+ {file = "ruff-0.2.1-py3-none-win32.whl", hash = "sha256:6b95ac9ce49b4fb390634d46d6ece32ace3acdd52814671ccaf20b7f60adb232"},
+ {file = "ruff-0.2.1-py3-none-win_amd64.whl", hash = "sha256:e3affdcbc2afb6f5bd0eb3130139ceedc5e3f28d206fe49f63073cb9e65988e0"},
+ {file = "ruff-0.2.1-py3-none-win_arm64.whl", hash = "sha256:efababa8e12330aa94a53e90a81eb6e2d55f348bc2e71adbf17d9cad23c03ee6"},
+ {file = "ruff-0.2.1.tar.gz", hash = "sha256:3b42b5d8677cd0c72b99fcaf068ffc62abb5a19e71b4a3b9cfa50658a0af02f1"},
]
[[package]]
@@ -3662,13 +3675,13 @@ urllib3 = {version = ">=1.26,<3", extras = ["socks"]}
[[package]]
name = "sentry-sdk"
-version = "1.39.2"
+version = "1.40.4"
description = "Python client for Sentry (https://sentry.io)"
optional = false
python-versions = "*"
files = [
- {file = "sentry-sdk-1.39.2.tar.gz", hash = "sha256:24c83b0b41c887d33328a9166f5950dc37ad58f01c9f2fbff6b87a6f1094170c"},
- {file = "sentry_sdk-1.39.2-py2.py3-none-any.whl", hash = "sha256:acaf597b30258fc7663063b291aa99e58f3096e91fe1e6634f4b79f9c1943e8e"},
+ {file = "sentry-sdk-1.40.4.tar.gz", hash = "sha256:657abae98b0050a0316f0873d7149f951574ae6212f71d2e3a1c4c88f62d6456"},
+ {file = "sentry_sdk-1.40.4-py2.py3-none-any.whl", hash = "sha256:ac5cf56bb897ec47135d239ddeedf7c1c12d406fb031a4c0caa07399ed014d7e"},
]
[package.dependencies]
@@ -4100,13 +4113,13 @@ files = [
[[package]]
name = "uvicorn"
-version = "0.27.0.post1"
+version = "0.27.1"
description = "The lightning-fast ASGI server."
optional = false
python-versions = ">=3.8"
files = [
- {file = "uvicorn-0.27.0.post1-py3-none-any.whl", hash = "sha256:4b85ba02b8a20429b9b205d015cbeb788a12da527f731811b643fd739ef90d5f"},
- {file = "uvicorn-0.27.0.post1.tar.gz", hash = "sha256:54898fcd80c13ff1cd28bf77b04ec9dbd8ff60c5259b499b4b12bb0917f22907"},
+ {file = "uvicorn-0.27.1-py3-none-any.whl", hash = "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4"},
+ {file = "uvicorn-0.27.1.tar.gz", hash = "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a"},
]
[package.dependencies]
@@ -4180,38 +4193,40 @@ files = [
[[package]]
name = "watchdog"
-version = "3.0.0"
+version = "4.0.0"
description = "Filesystem events monitoring"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"},
- {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"},
- {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"},
- {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"},
- {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"},
- {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"},
- {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"},
- {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"},
- {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"},
- {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"},
- {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"},
- {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"},
- {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"},
- {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"},
- {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"},
- {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"},
- {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"},
- {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"},
- {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"},
- {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"},
- {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"},
+ {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"},
+ {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"},
+ {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"},
+ {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"},
+ {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"},
+ {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"},
+ {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"},
+ {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"},
+ {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"},
+ {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"},
+ {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"},
+ {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"},
+ {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"},
+ {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"},
+ {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"},
+ {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"},
+ {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"},
+ {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"},
+ {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"},
+ {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"},
+ {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"},
+ {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"},
+ {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"},
+ {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"},
+ {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"},
+ {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"},
+ {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"},
+ {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"},
+ {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"},
]
[package.extras]
diff --git a/proxy.Dockerfile b/proxy.Dockerfile
index a0c67f64df..58eb314589 100644
--- a/proxy.Dockerfile
+++ b/proxy.Dockerfile
@@ -17,7 +17,7 @@ COPY web .
RUN npm run build-proxy
# Stage 2: Build
-FROM --platform=${BUILDPLATFORM} docker.io/golang:1.21.6-bookworm AS builder
+FROM --platform=${BUILDPLATFORM} docker.io/golang:1.22.0-bookworm AS builder
ARG TARGETOS
ARG TARGETARCH
diff --git a/rac.Dockerfile b/rac.Dockerfile
index e59c22d05e..dd08b2909f 100644
--- a/rac.Dockerfile
+++ b/rac.Dockerfile
@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:1
# Stage 1: Build
-FROM docker.io/golang:1.21.6-bookworm AS builder
+FROM docker.io/golang:1.22.0-bookworm AS builder
WORKDIR /go/src/goauthentik.io
diff --git a/radius.Dockerfile b/radius.Dockerfile
index 5113a7eeb2..053ee75302 100644
--- a/radius.Dockerfile
+++ b/radius.Dockerfile
@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:1
# Stage 1: Build
-FROM --platform=${BUILDPLATFORM} docker.io/golang:1.21.6-bookworm AS builder
+FROM --platform=${BUILDPLATFORM} docker.io/golang:1.22.0-bookworm AS builder
ARG TARGETOS
ARG TARGETARCH
diff --git a/schema.yml b/schema.yml
index f9bc7b12fb..4c7a433d00 100644
--- a/schema.yml
+++ b/schema.yml
@@ -2935,8 +2935,6 @@ paths:
schema:
$ref: '#/components/schemas/PolicyTestResult'
description: ''
- '404':
- description: for_user user not found
'400':
content:
application/json:
@@ -17820,6 +17818,252 @@ paths:
schema:
$ref: '#/components/schemas/GenericError'
description: ''
+ /rac/connection_tokens/:
+ get:
+ operationId: rac_connection_tokens_list
+ description: ConnectionToken Viewset
+ parameters:
+ - in: query
+ name: endpoint
+ schema:
+ type: string
+ format: uuid
+ - name: ordering
+ required: false
+ in: query
+ description: Which field to use when ordering the results.
+ schema:
+ type: string
+ - name: page
+ required: false
+ in: query
+ description: A page number within the paginated result set.
+ schema:
+ type: integer
+ - name: page_size
+ required: false
+ in: query
+ description: Number of results to return per page.
+ schema:
+ type: integer
+ - in: query
+ name: provider
+ schema:
+ type: integer
+ - name: search
+ required: false
+ in: query
+ description: A search term.
+ schema:
+ type: string
+ - in: query
+ name: session__user
+ schema:
+ type: integer
+ tags:
+ - rac
+ security:
+ - authentik: []
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PaginatedConnectionTokenList'
+ description: ''
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ValidationError'
+ description: ''
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GenericError'
+ description: ''
+ /rac/connection_tokens/{connection_token_uuid}/:
+ get:
+ operationId: rac_connection_tokens_retrieve
+ description: ConnectionToken Viewset
+ parameters:
+ - in: path
+ name: connection_token_uuid
+ schema:
+ type: string
+ format: uuid
+ description: A UUID string identifying this connection token.
+ required: true
+ tags:
+ - rac
+ security:
+ - authentik: []
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ConnectionToken'
+ description: ''
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ValidationError'
+ description: ''
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GenericError'
+ description: ''
+ put:
+ operationId: rac_connection_tokens_update
+ description: ConnectionToken Viewset
+ parameters:
+ - in: path
+ name: connection_token_uuid
+ schema:
+ type: string
+ format: uuid
+ description: A UUID string identifying this connection token.
+ required: true
+ tags:
+ - rac
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ConnectionTokenRequest'
+ required: true
+ security:
+ - authentik: []
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ConnectionToken'
+ description: ''
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ValidationError'
+ description: ''
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GenericError'
+ description: ''
+ patch:
+ operationId: rac_connection_tokens_partial_update
+ description: ConnectionToken Viewset
+ parameters:
+ - in: path
+ name: connection_token_uuid
+ schema:
+ type: string
+ format: uuid
+ description: A UUID string identifying this connection token.
+ required: true
+ tags:
+ - rac
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PatchedConnectionTokenRequest'
+ security:
+ - authentik: []
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ConnectionToken'
+ description: ''
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ValidationError'
+ description: ''
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GenericError'
+ description: ''
+ delete:
+ operationId: rac_connection_tokens_destroy
+ description: ConnectionToken Viewset
+ parameters:
+ - in: path
+ name: connection_token_uuid
+ schema:
+ type: string
+ format: uuid
+ description: A UUID string identifying this connection token.
+ required: true
+ tags:
+ - rac
+ security:
+ - authentik: []
+ responses:
+ '204':
+ description: No response body
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ValidationError'
+ description: ''
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GenericError'
+ description: ''
+ /rac/connection_tokens/{connection_token_uuid}/used_by/:
+ get:
+ operationId: rac_connection_tokens_used_by_list
+ description: Get a list of all objects that use this object
+ parameters:
+ - in: path
+ name: connection_token_uuid
+ schema:
+ type: string
+ format: uuid
+ description: A UUID string identifying this connection token.
+ required: true
+ tags:
+ - rac
+ security:
+ - authentik: []
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/UsedBy'
+ description: ''
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ValidationError'
+ description: ''
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GenericError'
+ description: ''
/rac/endpoints/:
get:
operationId: rac_endpoints_list
@@ -18284,11 +18528,6 @@ paths:
description: |-
* `authentik_tenants.domain` - Domain
* `authentik_crypto.certificatekeypair` - Certificate-Key Pair
- * `authentik_events.event` - Event
- * `authentik_events.notificationtransport` - Notification Transport
- * `authentik_events.notification` - Notification
- * `authentik_events.notificationrule` - Notification Rule
- * `authentik_events.notificationwebhookmapping` - Webhook Mapping
* `authentik_flows.flow` - Flow
* `authentik_flows.flowstagebinding` - Flow Stage Binding
* `authentik_outposts.dockerserviceconnection` - Docker Service-Connection
@@ -18356,6 +18595,11 @@ paths:
* `authentik_providers_rac.racprovider` - RAC Provider
* `authentik_providers_rac.endpoint` - RAC Endpoint
* `authentik_providers_rac.racpropertymapping` - RAC Property Mapping
+ * `authentik_events.event` - Event
+ * `authentik_events.notificationtransport` - Notification Transport
+ * `authentik_events.notification` - Notification
+ * `authentik_events.notificationrule` - Notification Rule
+ * `authentik_events.notificationwebhookmapping` - Webhook Mapping
required: true
- in: query
name: object_pk
@@ -18572,11 +18816,6 @@ paths:
description: |-
* `authentik_tenants.domain` - Domain
* `authentik_crypto.certificatekeypair` - Certificate-Key Pair
- * `authentik_events.event` - Event
- * `authentik_events.notificationtransport` - Notification Transport
- * `authentik_events.notification` - Notification
- * `authentik_events.notificationrule` - Notification Rule
- * `authentik_events.notificationwebhookmapping` - Webhook Mapping
* `authentik_flows.flow` - Flow
* `authentik_flows.flowstagebinding` - Flow Stage Binding
* `authentik_outposts.dockerserviceconnection` - Docker Service-Connection
@@ -18644,6 +18883,11 @@ paths:
* `authentik_providers_rac.racprovider` - RAC Provider
* `authentik_providers_rac.endpoint` - RAC Endpoint
* `authentik_providers_rac.racpropertymapping` - RAC Property Mapping
+ * `authentik_events.event` - Event
+ * `authentik_events.notificationtransport` - Notification Transport
+ * `authentik_events.notification` - Notification
+ * `authentik_events.notificationrule` - Notification Rule
+ * `authentik_events.notificationwebhookmapping` - Webhook Mapping
required: true
- in: query
name: object_pk
@@ -29359,7 +29603,6 @@ components:
- authentik.admin
- authentik.api
- authentik.crypto
- - authentik.events
- authentik.flows
- authentik.outposts
- authentik.policies.dummy
@@ -29407,13 +29650,13 @@ components:
- authentik.enterprise
- authentik.enterprise.audit
- authentik.enterprise.providers.rac
+ - authentik.events
type: string
description: |-
* `authentik.tenants` - authentik Tenants
* `authentik.admin` - authentik Admin
* `authentik.api` - authentik API
* `authentik.crypto` - authentik Crypto
- * `authentik.events` - authentik Events
* `authentik.flows` - authentik Flows
* `authentik.outposts` - authentik Outpost
* `authentik.policies.dummy` - authentik Policies.Dummy
@@ -29461,6 +29704,7 @@ components:
* `authentik.enterprise` - authentik Enterprise
* `authentik.enterprise.audit` - authentik Enterprise.Audit
* `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC
+ * `authentik.events` - authentik Events
AppleChallengeResponseRequest:
type: object
description: Pseudo class for plex response
@@ -31250,6 +31494,48 @@ components:
- cache_timeout_reputation
- capabilities
- error_reporting
+ ConnectionToken:
+ type: object
+ description: ConnectionToken Serializer
+ properties:
+ pk:
+ type: string
+ format: uuid
+ readOnly: true
+ title: Pbm uuid
+ provider:
+ type: integer
+ provider_obj:
+ allOf:
+ - $ref: '#/components/schemas/RACProvider'
+ readOnly: true
+ endpoint:
+ type: string
+ format: uuid
+ readOnly: true
+ endpoint_obj:
+ allOf:
+ - $ref: '#/components/schemas/Endpoint'
+ readOnly: true
+ user:
+ allOf:
+ - $ref: '#/components/schemas/GroupMember'
+ readOnly: true
+ required:
+ - endpoint
+ - endpoint_obj
+ - pk
+ - provider
+ - provider_obj
+ - user
+ ConnectionTokenRequest:
+ type: object
+ description: ConnectionToken Serializer
+ properties:
+ provider:
+ type: integer
+ required:
+ - provider
ConsentChallenge:
type: object
description: Challenge info for consent screens
@@ -32414,7 +32700,6 @@ components:
* `authentik.admin` - authentik Admin
* `authentik.api` - authentik API
* `authentik.crypto` - authentik Crypto
- * `authentik.events` - authentik Events
* `authentik.flows` - authentik Flows
* `authentik.outposts` - authentik Outpost
* `authentik.policies.dummy` - authentik Policies.Dummy
@@ -32462,6 +32747,7 @@ components:
* `authentik.enterprise` - authentik Enterprise
* `authentik.enterprise.audit` - authentik Enterprise.Audit
* `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC
+ * `authentik.events` - authentik Events
model:
allOf:
- $ref: '#/components/schemas/ModelEnum'
@@ -32471,11 +32757,6 @@ components:
* `authentik_tenants.domain` - Domain
* `authentik_crypto.certificatekeypair` - Certificate-Key Pair
- * `authentik_events.event` - Event
- * `authentik_events.notificationtransport` - Notification Transport
- * `authentik_events.notification` - Notification
- * `authentik_events.notificationrule` - Notification Rule
- * `authentik_events.notificationwebhookmapping` - Webhook Mapping
* `authentik_flows.flow` - Flow
* `authentik_flows.flowstagebinding` - Flow Stage Binding
* `authentik_outposts.dockerserviceconnection` - Docker Service-Connection
@@ -32543,6 +32824,11 @@ components:
* `authentik_providers_rac.racprovider` - RAC Provider
* `authentik_providers_rac.endpoint` - RAC Endpoint
* `authentik_providers_rac.racpropertymapping` - RAC Property Mapping
+ * `authentik_events.event` - Event
+ * `authentik_events.notificationtransport` - Notification Transport
+ * `authentik_events.notification` - Notification
+ * `authentik_events.notificationrule` - Notification Rule
+ * `authentik_events.notificationwebhookmapping` - Webhook Mapping
required:
- bound_to
- component
@@ -32613,7 +32899,6 @@ components:
* `authentik.admin` - authentik Admin
* `authentik.api` - authentik API
* `authentik.crypto` - authentik Crypto
- * `authentik.events` - authentik Events
* `authentik.flows` - authentik Flows
* `authentik.outposts` - authentik Outpost
* `authentik.policies.dummy` - authentik Policies.Dummy
@@ -32661,6 +32946,7 @@ components:
* `authentik.enterprise` - authentik Enterprise
* `authentik.enterprise.audit` - authentik Enterprise.Audit
* `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC
+ * `authentik.events` - authentik Events
model:
allOf:
- $ref: '#/components/schemas/ModelEnum'
@@ -32670,11 +32956,6 @@ components:
* `authentik_tenants.domain` - Domain
* `authentik_crypto.certificatekeypair` - Certificate-Key Pair
- * `authentik_events.event` - Event
- * `authentik_events.notificationtransport` - Notification Transport
- * `authentik_events.notification` - Notification
- * `authentik_events.notificationrule` - Notification Rule
- * `authentik_events.notificationwebhookmapping` - Webhook Mapping
* `authentik_flows.flow` - Flow
* `authentik_flows.flowstagebinding` - Flow Stage Binding
* `authentik_outposts.dockerserviceconnection` - Docker Service-Connection
@@ -32742,6 +33023,11 @@ components:
* `authentik_providers_rac.racprovider` - RAC Provider
* `authentik_providers_rac.endpoint` - RAC Endpoint
* `authentik_providers_rac.racpropertymapping` - RAC Property Mapping
+ * `authentik_events.event` - Event
+ * `authentik_events.notificationtransport` - Notification Transport
+ * `authentik_events.notification` - Notification
+ * `authentik_events.notificationrule` - Notification Rule
+ * `authentik_events.notificationwebhookmapping` - Webhook Mapping
required:
- name
EventRequest:
@@ -34985,11 +35271,6 @@ components:
enum:
- authentik_tenants.domain
- authentik_crypto.certificatekeypair
- - authentik_events.event
- - authentik_events.notificationtransport
- - authentik_events.notification
- - authentik_events.notificationrule
- - authentik_events.notificationwebhookmapping
- authentik_flows.flow
- authentik_flows.flowstagebinding
- authentik_outposts.dockerserviceconnection
@@ -35057,15 +35338,15 @@ components:
- authentik_providers_rac.racprovider
- authentik_providers_rac.endpoint
- authentik_providers_rac.racpropertymapping
+ - authentik_events.event
+ - authentik_events.notificationtransport
+ - authentik_events.notification
+ - authentik_events.notificationrule
+ - authentik_events.notificationwebhookmapping
type: string
description: |-
* `authentik_tenants.domain` - Domain
* `authentik_crypto.certificatekeypair` - Certificate-Key Pair
- * `authentik_events.event` - Event
- * `authentik_events.notificationtransport` - Notification Transport
- * `authentik_events.notification` - Notification
- * `authentik_events.notificationrule` - Notification Rule
- * `authentik_events.notificationwebhookmapping` - Webhook Mapping
* `authentik_flows.flow` - Flow
* `authentik_flows.flowstagebinding` - Flow Stage Binding
* `authentik_outposts.dockerserviceconnection` - Docker Service-Connection
@@ -35133,6 +35414,11 @@ components:
* `authentik_providers_rac.racprovider` - RAC Provider
* `authentik_providers_rac.endpoint` - RAC Endpoint
* `authentik_providers_rac.racpropertymapping` - RAC Property Mapping
+ * `authentik_events.event` - Event
+ * `authentik_events.notificationtransport` - Notification Transport
+ * `authentik_events.notification` - Notification
+ * `authentik_events.notificationrule` - Notification Rule
+ * `authentik_events.notificationwebhookmapping` - Webhook Mapping
NameIdPolicyEnum:
enum:
- urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
@@ -36270,6 +36556,18 @@ components:
required:
- pagination
- results
+ PaginatedConnectionTokenList:
+ type: object
+ properties:
+ pagination:
+ $ref: '#/components/schemas/Pagination'
+ results:
+ type: array
+ items:
+ $ref: '#/components/schemas/ConnectionToken'
+ required:
+ - pagination
+ - results
PaginatedConsentStageList:
type: object
properties:
@@ -37982,6 +38280,12 @@ components:
writeOnly: true
description: Optional Private Key. If this is set, you can use this keypair
for encryption.
+ PatchedConnectionTokenRequest:
+ type: object
+ description: ConnectionToken Serializer
+ properties:
+ provider:
+ type: integer
PatchedConsentStageRequest:
type: object
description: ConsentStage Serializer
@@ -38240,7 +38544,6 @@ components:
* `authentik.admin` - authentik Admin
* `authentik.api` - authentik API
* `authentik.crypto` - authentik Crypto
- * `authentik.events` - authentik Events
* `authentik.flows` - authentik Flows
* `authentik.outposts` - authentik Outpost
* `authentik.policies.dummy` - authentik Policies.Dummy
@@ -38288,6 +38591,7 @@ components:
* `authentik.enterprise` - authentik Enterprise
* `authentik.enterprise.audit` - authentik Enterprise.Audit
* `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC
+ * `authentik.events` - authentik Events
model:
allOf:
- $ref: '#/components/schemas/ModelEnum'
@@ -38297,11 +38601,6 @@ components:
* `authentik_tenants.domain` - Domain
* `authentik_crypto.certificatekeypair` - Certificate-Key Pair
- * `authentik_events.event` - Event
- * `authentik_events.notificationtransport` - Notification Transport
- * `authentik_events.notification` - Notification
- * `authentik_events.notificationrule` - Notification Rule
- * `authentik_events.notificationwebhookmapping` - Webhook Mapping
* `authentik_flows.flow` - Flow
* `authentik_flows.flowstagebinding` - Flow Stage Binding
* `authentik_outposts.dockerserviceconnection` - Docker Service-Connection
@@ -38369,6 +38668,11 @@ components:
* `authentik_providers_rac.racprovider` - RAC Provider
* `authentik_providers_rac.endpoint` - RAC Endpoint
* `authentik_providers_rac.racpropertymapping` - RAC Property Mapping
+ * `authentik_events.event` - Event
+ * `authentik_events.notificationtransport` - Notification Transport
+ * `authentik_events.notification` - Notification
+ * `authentik_events.notificationrule` - Notification Rule
+ * `authentik_events.notificationwebhookmapping` - Webhook Mapping
PatchedEventRequest:
type: object
description: Event Serializer
@@ -39544,6 +39848,9 @@ components:
minLength: 1
description: 'Determines how long a session lasts. Default of 0 means that
the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)'
+ delete_token_on_disconnect:
+ type: boolean
+ description: When set to true, connection tokens will be deleted upon disconnect.
PatchedRadiusProviderRequest:
type: object
description: RadiusProvider Serializer
@@ -41617,6 +41924,9 @@ components:
type: string
description: 'Determines how long a session lasts. Default of 0 means that
the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)'
+ delete_token_on_disconnect:
+ type: boolean
+ description: When set to true, connection tokens will be deleted upon disconnect.
required:
- assigned_application_name
- assigned_application_slug
@@ -41658,6 +41968,9 @@ components:
minLength: 1
description: 'Determines how long a session lasts. Default of 0 means that
the sessions lasts until the browser is closed. (Format: hours=-1;minutes=-2;seconds=-3)'
+ delete_token_on_disconnect:
+ type: boolean
+ description: When set to true, connection tokens will be deleted upon disconnect.
required:
- authorization_flow
- name
@@ -43573,17 +43886,14 @@ components:
start_timestamp:
type: string
format: date-time
- description: Timestamp when the task started
readOnly: true
finish_timestamp:
type: string
format: date-time
- description: Timestamp when the task finished
readOnly: true
duration:
type: number
format: double
- description: Get the duration a task took to run
readOnly: true
status:
$ref: '#/components/schemas/SystemTaskStatusEnum'
@@ -43963,6 +44273,7 @@ components:
maxLength: 254
avatar:
type: string
+ description: User's avatar, either a http/https URL or a data URI
readOnly: true
attributes:
type: object
@@ -44056,6 +44367,8 @@ components:
expires:
type: string
format: date-time
+ expiring:
+ type: boolean
user:
$ref: '#/components/schemas/User'
application:
@@ -44634,6 +44947,7 @@ components:
maxLength: 254
avatar:
type: string
+ description: User's avatar, either a http/https URL or a data URI
readOnly: true
uid:
type: string
diff --git a/tests/wdio/package-lock.json b/tests/wdio/package-lock.json
index ee49705bee..aba8421534 100644
--- a/tests/wdio/package-lock.json
+++ b/tests/wdio/package-lock.json
@@ -10,20 +10,20 @@
},
"devDependencies": {
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
- "@typescript-eslint/eslint-plugin": "^6.20.0",
- "@typescript-eslint/parser": "^6.20.0",
- "@wdio/cli": "^8.29.3",
- "@wdio/local-runner": "^8.29.5",
- "@wdio/mocha-framework": "^8.29.3",
- "@wdio/spec-reporter": "^8.29.3",
+ "@typescript-eslint/eslint-plugin": "^7.0.1",
+ "@typescript-eslint/parser": "^7.0.1",
+ "@wdio/cli": "^8.31.1",
+ "@wdio/local-runner": "^8.31.1",
+ "@wdio/mocha-framework": "^8.31.1",
+ "@wdio/spec-reporter": "^8.31.1",
"eslint": "^8.56.0",
"eslint-config-google": "^0.14.0",
- "eslint-plugin-sonarjs": "^0.23.0",
+ "eslint-plugin-sonarjs": "^0.24.0",
"npm-run-all": "^4.1.5",
- "prettier": "^3.2.4",
+ "prettier": "^3.2.5",
"ts-node": "^10.9.2",
"typescript": "^5.3.3",
- "wdio-wait-for": "^3.0.10"
+ "wdio-wait-for": "^3.0.11"
},
"engines": {
"node": ">=20"
@@ -655,12 +655,12 @@
}
},
"node_modules/@ljharb/through": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz",
- "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==",
+ "version": "2.3.12",
+ "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz",
+ "integrity": "sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2"
+ "call-bind": "^1.0.5"
},
"engines": {
"node": ">= 0.4"
@@ -902,9 +902,9 @@
"dev": true
},
"node_modules/@types/semver": {
- "version": "7.5.6",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
- "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+ "version": "7.5.7",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz",
+ "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==",
"dev": true
},
"node_modules/@types/stack-utils": {
@@ -953,16 +953,16 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.20.0.tgz",
- "integrity": "sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.1.tgz",
+ "integrity": "sha512-OLvgeBv3vXlnnJGIAgCLYKjgMEU+wBGj07MQ/nxAaON+3mLzX7mJbhRYrVGiVvFiXtwFlkcBa/TtmglHy0UbzQ==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.5.1",
- "@typescript-eslint/scope-manager": "6.20.0",
- "@typescript-eslint/type-utils": "6.20.0",
- "@typescript-eslint/utils": "6.20.0",
- "@typescript-eslint/visitor-keys": "6.20.0",
+ "@typescript-eslint/scope-manager": "7.0.1",
+ "@typescript-eslint/type-utils": "7.0.1",
+ "@typescript-eslint/utils": "7.0.1",
+ "@typescript-eslint/visitor-keys": "7.0.1",
"debug": "^4.3.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.4",
@@ -978,8 +978,8 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
- "eslint": "^7.0.0 || ^8.0.0"
+ "@typescript-eslint/parser": "^7.0.0",
+ "eslint": "^8.56.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -988,15 +988,15 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.20.0.tgz",
- "integrity": "sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.1.tgz",
+ "integrity": "sha512-8GcRRZNzaHxKzBPU3tKtFNing571/GwPBeCvmAUw0yBtfE2XVd0zFKJIMSWkHJcPQi0ekxjIts6L/rrZq5cxGQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "6.20.0",
- "@typescript-eslint/types": "6.20.0",
- "@typescript-eslint/typescript-estree": "6.20.0",
- "@typescript-eslint/visitor-keys": "6.20.0",
+ "@typescript-eslint/scope-manager": "7.0.1",
+ "@typescript-eslint/types": "7.0.1",
+ "@typescript-eslint/typescript-estree": "7.0.1",
+ "@typescript-eslint/visitor-keys": "7.0.1",
"debug": "^4.3.4"
},
"engines": {
@@ -1007,7 +1007,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
+ "eslint": "^8.56.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -1016,13 +1016,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz",
- "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.1.tgz",
+ "integrity": "sha512-v7/T7As10g3bcWOOPAcbnMDuvctHzCFYCG/8R4bK4iYzdFqsZTbXGln0cZNVcwQcwewsYU2BJLay8j0/4zOk4w==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.20.0",
- "@typescript-eslint/visitor-keys": "6.20.0"
+ "@typescript-eslint/types": "7.0.1",
+ "@typescript-eslint/visitor-keys": "7.0.1"
},
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -1033,13 +1033,13 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.20.0.tgz",
- "integrity": "sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.1.tgz",
+ "integrity": "sha512-YtT9UcstTG5Yqy4xtLiClm1ZpM/pWVGFnkAa90UfdkkZsR1eP2mR/1jbHeYp8Ay1l1JHPyGvoUYR6o3On5Nhmw==",
"dev": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "6.20.0",
- "@typescript-eslint/utils": "6.20.0",
+ "@typescript-eslint/typescript-estree": "7.0.1",
+ "@typescript-eslint/utils": "7.0.1",
"debug": "^4.3.4",
"ts-api-utils": "^1.0.1"
},
@@ -1051,7 +1051,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
+ "eslint": "^8.56.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -1060,9 +1060,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz",
- "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.1.tgz",
+ "integrity": "sha512-uJDfmirz4FHib6ENju/7cz9SdMSkeVvJDK3VcMFvf/hAShg8C74FW+06MaQPODHfDJp/z/zHfgawIJRjlu0RLg==",
"dev": true,
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -1073,13 +1073,13 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz",
- "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.1.tgz",
+ "integrity": "sha512-SO9wHb6ph0/FN5OJxH4MiPscGah5wjOd0RRpaLvuBv9g8565Fgu0uMySFEPqwPHiQU90yzJ2FjRYKGrAhS1xig==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.20.0",
- "@typescript-eslint/visitor-keys": "6.20.0",
+ "@typescript-eslint/types": "7.0.1",
+ "@typescript-eslint/visitor-keys": "7.0.1",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -1125,17 +1125,17 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz",
- "integrity": "sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.1.tgz",
+ "integrity": "sha512-oe4his30JgPbnv+9Vef1h48jm0S6ft4mNwi9wj7bX10joGn07QRfqIqFHoMiajrtoU88cIhXf8ahwgrcbNLgPA==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.12",
"@types/semver": "^7.5.0",
- "@typescript-eslint/scope-manager": "6.20.0",
- "@typescript-eslint/types": "6.20.0",
- "@typescript-eslint/typescript-estree": "6.20.0",
+ "@typescript-eslint/scope-manager": "7.0.1",
+ "@typescript-eslint/types": "7.0.1",
+ "@typescript-eslint/typescript-estree": "7.0.1",
"semver": "^7.5.4"
},
"engines": {
@@ -1146,16 +1146,16 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
+ "eslint": "^8.56.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz",
- "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.1.tgz",
+ "integrity": "sha512-hwAgrOyk++RTXrP4KzCg7zB2U0xt7RUU0ZdMSCsqF3eKUwkdXUMyTb0qdCuji7VIbcpG62kKTU9M1J1c9UpFBw==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.20.0",
+ "@typescript-eslint/types": "7.0.1",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
@@ -1173,9 +1173,9 @@
"dev": true
},
"node_modules/@vitest/snapshot": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.2.1.tgz",
- "integrity": "sha512-Tmp/IcYEemKaqAYCS08sh0vORLJkMr0NRV76Gl8sHGxXT5151cITJCET20063wk0Yr/1koQ6dnmP6eEqezmd/Q==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.2.2.tgz",
+ "integrity": "sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==",
"dev": true,
"dependencies": {
"magic-string": "^0.30.5",
@@ -1187,19 +1187,19 @@
}
},
"node_modules/@wdio/cli": {
- "version": "8.29.3",
- "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.29.3.tgz",
- "integrity": "sha512-n0Tgl5RgAdJtr5wBY4w56QQim36e7hIZQM9vOtrTRUaMmY3XoYlExtmYu+wUx4zFoy3p5mK+AW4Of0tl1CMUzg==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.31.1.tgz",
+ "integrity": "sha512-UnAoXjUrgRTfFq7TSnnMSuA80V8G7yW/d5zo59RtzrHdrGr6QVWJfnt6aLueXJJ6SnouVA6yU2rcsXPOvGpUIA==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.1",
"@vitest/snapshot": "^1.2.1",
- "@wdio/config": "8.29.3",
- "@wdio/globals": "8.29.3",
+ "@wdio/config": "8.31.1",
+ "@wdio/globals": "8.31.1",
"@wdio/logger": "8.28.0",
- "@wdio/protocols": "8.24.12",
- "@wdio/types": "8.29.1",
- "@wdio/utils": "8.29.3",
+ "@wdio/protocols": "8.29.7",
+ "@wdio/types": "8.31.1",
+ "@wdio/utils": "8.31.1",
"async-exit-hook": "^2.0.1",
"chalk": "^5.2.0",
"chokidar": "^3.5.3",
@@ -1208,13 +1208,13 @@
"ejs": "^3.1.9",
"execa": "^8.0.1",
"import-meta-resolve": "^4.0.0",
- "inquirer": "9.2.12",
+ "inquirer": "9.2.14",
"lodash.flattendeep": "^4.4.0",
"lodash.pickby": "^4.6.0",
"lodash.union": "^4.6.0",
"read-pkg-up": "^10.0.0",
"recursive-readdir": "^2.2.3",
- "webdriverio": "8.29.3",
+ "webdriverio": "8.31.1",
"yargs": "^17.7.2"
},
"bin": {
@@ -1237,14 +1237,14 @@
}
},
"node_modules/@wdio/config": {
- "version": "8.29.3",
- "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.29.3.tgz",
- "integrity": "sha512-9TvmQAq4fLGKvYHvBJI4uXmqosZJgKtFQkxTaONt7R2cptIhQ7Ju6w+9eUsd4gQ6H/tUlQOstsx6ROHGJTVfKg==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.31.1.tgz",
+ "integrity": "sha512-Iz4DTXQdy53VT8LRZ6ayaDKE+zEDk4QY/ILz+D0IQh0OaMWruFesfoxqFP0hnU6rbJT1YE4ehTGf7JTZLWIPcw==",
"dev": true,
"dependencies": {
"@wdio/logger": "8.28.0",
- "@wdio/types": "8.29.1",
- "@wdio/utils": "8.29.3",
+ "@wdio/types": "8.31.1",
+ "@wdio/utils": "8.31.1",
"decamelize": "^6.0.0",
"deepmerge-ts": "^5.0.0",
"glob": "^10.2.2",
@@ -1255,29 +1255,29 @@
}
},
"node_modules/@wdio/globals": {
- "version": "8.29.3",
- "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.29.3.tgz",
- "integrity": "sha512-WPRjPf1yiRYt7tUjctKiBLPOUnO8kHt2SUcsQ59E0gg9zGfUXKWupnrfa2qoOAiieSySUwutf/hjDi/yvTT4mA==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.31.1.tgz",
+ "integrity": "sha512-2r80BX8aS5YiQ6cFuxtt44g2Y5P01MoHJTR3w21suSyiVoH70mxvJf6vJsLB+jtGfaXLJzOjlZkgXrd+Kn+keA==",
"dev": true,
"engines": {
"node": "^16.13 || >=18"
},
"optionalDependencies": {
- "expect-webdriverio": "^4.9.3",
- "webdriverio": "8.29.3"
+ "expect-webdriverio": "^4.11.2",
+ "webdriverio": "8.31.1"
}
},
"node_modules/@wdio/local-runner": {
- "version": "8.29.5",
- "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.29.5.tgz",
- "integrity": "sha512-+5A4i+h2ty0rn+TzjGPVR3m8ufqKev4guujx0d/dgrGiiyFb0jLxkAXQbz/0MktS1n11WMuflC8nr3AZ7J6FRA==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.31.1.tgz",
+ "integrity": "sha512-KaMok/LaVvWcXTTi61Al5+XgocBDJ2+gpG1mjxytILrwaMFohYL0YuaGDw4yb3lx3Lsej6K+/FbaWMMnGq3JIw==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0",
"@wdio/logger": "8.28.0",
"@wdio/repl": "8.24.12",
- "@wdio/runner": "8.29.5",
- "@wdio/types": "8.29.1",
+ "@wdio/runner": "8.31.1",
+ "@wdio/types": "8.31.1",
"async-exit-hook": "^2.0.1",
"split2": "^4.1.0",
"stream-buffers": "^3.0.2"
@@ -1314,16 +1314,16 @@
}
},
"node_modules/@wdio/mocha-framework": {
- "version": "8.29.3",
- "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.29.3.tgz",
- "integrity": "sha512-w+tJLRdNhYPScesPGVcuuM4McAfxzx3K39Jp5rmKxxah6/Fv8Hb2eOHxO4WLfhd5Tv3KkdCYHe4wCPGYNxnsng==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.31.1.tgz",
+ "integrity": "sha512-5297tKj9zNvzZD+X4tMSuTcJrSaQ6mmDGLEdapa/+CMA549N+0vE38tNh+5Br7dmFXXVanw40T752OQcSeFf1A==",
"dev": true,
"dependencies": {
"@types/mocha": "^10.0.0",
"@types/node": "^20.1.0",
"@wdio/logger": "8.28.0",
- "@wdio/types": "8.29.1",
- "@wdio/utils": "8.29.3",
+ "@wdio/types": "8.31.1",
+ "@wdio/utils": "8.31.1",
"mocha": "^10.0.0"
},
"engines": {
@@ -1331,9 +1331,9 @@
}
},
"node_modules/@wdio/protocols": {
- "version": "8.24.12",
- "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.24.12.tgz",
- "integrity": "sha512-QnVj3FkapmVD3h2zoZk+ZQ8gevSj9D9MiIQIy8eOnY4FAneYZ9R9GvoW+mgNcCZO8S8++S/jZHetR8n+8Q808g==",
+ "version": "8.29.7",
+ "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.29.7.tgz",
+ "integrity": "sha512-9hhEePMLmI8fm9F2v4jlg9x4w4jEoZmY3vT6fXy90ne1DFaGWfy/a853nKEagQe/ZzxkN3/cpMBh8mryv9BVjw==",
"dev": true
},
"node_modules/@wdio/repl": {
@@ -1349,14 +1349,14 @@
}
},
"node_modules/@wdio/reporter": {
- "version": "8.29.1",
- "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.29.1.tgz",
- "integrity": "sha512-LZeYHC+HHJRYiFH9odaotDazZh0zNhu4mTuL/T/e3c/Q3oPSQjLvfQYhB3Ece1QA9PKjP1VPmr+g9CvC0lMixA==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.31.1.tgz",
+ "integrity": "sha512-ayZipzyr9dSwpbKYbV4PoXuw91A1H7fjadJ5R5oMYUETx+pfBJqjR2UIHZhhPAa0lJ7bWHEn7eCsGB1PXp47Og==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0",
"@wdio/logger": "8.28.0",
- "@wdio/types": "8.29.1",
+ "@wdio/types": "8.31.1",
"diff": "^5.0.0",
"object-inspect": "^1.12.0"
},
@@ -1365,35 +1365,35 @@
}
},
"node_modules/@wdio/runner": {
- "version": "8.29.5",
- "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.29.5.tgz",
- "integrity": "sha512-CIKFFajJocQZsZe3l/QWuGgHTpFO13toXBR/02LuPke6Z8dJd9poxQVYt6DKNcyC6jpI+Cpd0ZXMEOE5qfOUrA==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.31.1.tgz",
+ "integrity": "sha512-9KUDaAHNUeBp5h1YoEmKVk0hZyzBDl6x0ge1dnaORACKKi6TXa76T0kLaBruuBTBn4zZd4+Xrg9/bLGAnTFvLA==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0",
- "@wdio/config": "8.29.3",
- "@wdio/globals": "8.29.3",
+ "@wdio/config": "8.31.1",
+ "@wdio/globals": "8.31.1",
"@wdio/logger": "8.28.0",
- "@wdio/types": "8.29.1",
- "@wdio/utils": "8.29.3",
+ "@wdio/types": "8.31.1",
+ "@wdio/utils": "8.31.1",
"deepmerge-ts": "^5.0.0",
- "expect-webdriverio": "^4.9.3",
+ "expect-webdriverio": "^4.11.2",
"gaze": "^1.1.2",
- "webdriver": "8.29.3",
- "webdriverio": "8.29.3"
+ "webdriver": "8.31.1",
+ "webdriverio": "8.31.1"
},
"engines": {
"node": "^16.13 || >=18"
}
},
"node_modules/@wdio/spec-reporter": {
- "version": "8.29.3",
- "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.29.3.tgz",
- "integrity": "sha512-di3SZKupuwW4/Uts9vqDkaVxe6TSnnpLmQg4zmlFhbixC89zM4EW/eXoLA9n0LFfx3HpuhRF/exgduJf71ZH/Q==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.31.1.tgz",
+ "integrity": "sha512-t2isqf/yDvc3xfNnkuR8XdRaKf34I6/40f1DHfojHZUpTF94jrt7CLACkFiDZhu5sz0KCuDWzy56aycd6IUz3w==",
"dev": true,
"dependencies": {
- "@wdio/reporter": "8.29.1",
- "@wdio/types": "8.29.1",
+ "@wdio/reporter": "8.31.1",
+ "@wdio/types": "8.31.1",
"chalk": "^5.1.2",
"easy-table": "^1.2.0",
"pretty-ms": "^7.0.0"
@@ -1415,9 +1415,9 @@
}
},
"node_modules/@wdio/types": {
- "version": "8.29.1",
- "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.29.1.tgz",
- "integrity": "sha512-rZYzu+sK8zY1PjCEWxNu4ELJPYKDZRn7HFcYNgR122ylHygfldwkb5TioI6Pn311hQH/S+663KEeoq//Jb0f8A==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.31.1.tgz",
+ "integrity": "sha512-KQ0EmjeVdshufhsxygaPzkJ8WD7hm8WlflZcLwKMZ0OM6f8pV9NMGGOvfBQXgTs447ScK6/6rX+lbJk3yvg65g==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0"
@@ -1427,14 +1427,14 @@
}
},
"node_modules/@wdio/utils": {
- "version": "8.29.3",
- "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.29.3.tgz",
- "integrity": "sha512-WnZ5vZrc0oKX0u6dteB9j04Yl2EUKBLi6GtRCNTRPTpCRYiGfqSLhs0pUddTNXye7gErlqIzsVwh64q19Z5KIQ==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.31.1.tgz",
+ "integrity": "sha512-fGUtNeJYSqPLMqIRrooEg1ViM2+z1Izd/7bzWzhg8EQHKFXqD/G68rEwBWpoLF/ziiHZFe4fJk7SZdXUK/gFgQ==",
"dev": true,
"dependencies": {
"@puppeteer/browsers": "^1.6.0",
"@wdio/logger": "8.28.0",
- "@wdio/types": "8.29.1",
+ "@wdio/types": "8.31.1",
"decamelize": "^6.0.0",
"deepmerge-ts": "^5.1.0",
"edgedriver": "^5.3.5",
@@ -1966,13 +1966,18 @@
}
},
"node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz",
+ "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==",
"dev": true,
"dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.3",
+ "set-function-length": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -2142,9 +2147,9 @@
}
},
"node_modules/cli-spinners": {
- "version": "2.9.1",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz",
- "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==",
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
"dev": true,
"engines": {
"node": ">=6"
@@ -2521,14 +2526,15 @@
}
},
"node_modules/define-data-property": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz",
- "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz",
+ "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.2",
"gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
+ "has-property-descriptors": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -2583,9 +2589,9 @@
}
},
"node_modules/devtools-protocol": {
- "version": "0.0.1249869",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1249869.tgz",
- "integrity": "sha512-Ctp4hInA0BEavlUoRy9mhGq0i+JSo/AwVyX2EFgZmV1kYB+Zq+EMBAn52QWu6FbRr10hRb6pBl420upbp4++vg==",
+ "version": "0.0.1255431",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1255431.tgz",
+ "integrity": "sha512-VuKgO1U4Ew4meKKoXCEBMUNkzyQqci5F8HIuoELPJkr5yvk9kR9p07gaZfzG9QIIrcIfpJVgf6Ms8OqEMxEYgA==",
"dev": true
},
"node_modules/diff": {
@@ -2851,6 +2857,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-set-tostringtag": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
@@ -2999,12 +3014,12 @@
}
},
"node_modules/eslint-plugin-sonarjs": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.23.0.tgz",
- "integrity": "sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.24.0.tgz",
+ "integrity": "sha512-87zp50mbbNrSTuoEOebdRQBPa0mdejA5UEjyuScyIw8hEpEjfWP89Qhkq5xVZfVyVSRQKZc9alVm7yRKQvvUmg==",
"dev": true,
"engines": {
- "node": ">=14"
+ "node": ">=16"
},
"peerDependencies": {
"eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
@@ -3283,12 +3298,12 @@
}
},
"node_modules/expect-webdriverio": {
- "version": "4.9.3",
- "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.9.3.tgz",
- "integrity": "sha512-ASHsFc/QaK5ipF4ct3e8hd3elm8wNXk/Qa3EemtYDmfUQ4uzwqDf75m/QFQpwVNCjEpkNP7Be/6X9kz7bN0P9Q==",
+ "version": "4.11.2",
+ "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.11.2.tgz",
+ "integrity": "sha512-PK8lrQmRhK8NRtE8i/CJsnKS/QGrHULQW5EfmyKxIiLHnXd7t8dX0dWJn/fiYVtrPKBUyXSL6h52QqvZVc9yGQ==",
"dev": true,
"dependencies": {
- "@vitest/snapshot": "^1.2.1",
+ "@vitest/snapshot": "^1.2.2",
"expect": "^29.7.0",
"jest-matcher-utils": "^29.7.0",
"lodash.isequal": "^4.5.0"
@@ -3297,9 +3312,9 @@
"node": ">=16 || >=18 || >=20"
},
"optionalDependencies": {
- "@wdio/globals": "^8.27.0",
- "@wdio/logger": "^8.24.12",
- "webdriverio": "^8.27.0"
+ "@wdio/globals": "^8.29.3",
+ "@wdio/logger": "^8.28.0",
+ "webdriverio": "^8.29.3"
}
},
"node_modules/external-editor": {
@@ -3430,28 +3445,15 @@
}
},
"node_modules/figures": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz",
- "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
"dev": true,
"dependencies": {
- "escape-string-regexp": "^5.0.0",
- "is-unicode-supported": "^1.2.0"
+ "escape-string-regexp": "^1.0.5"
},
"engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/figures/node_modules/escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "dev": true,
- "engines": {
- "node": ">=12"
+ "node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -3728,10 +3730,13 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/function.prototype.name": {
"version": "1.1.6",
@@ -3805,15 +3810,19 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
- "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
"has-proto": "^1.0.1",
- "has-symbols": "^1.0.3"
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -4129,12 +4138,12 @@
}
},
"node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.1.1"
+ "get-intrinsic": "^1.2.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -4179,6 +4188,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -4341,18 +4362,18 @@
"dev": true
},
"node_modules/inquirer": {
- "version": "9.2.12",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz",
- "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==",
+ "version": "9.2.14",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.14.tgz",
+ "integrity": "sha512-4ByIMt677Iz5AvjyKrDpzaepIyMewNvDcvwpVVRZNmy9dLakVoVgdCHZXbK1SlVJra1db0JZ6XkJyHsanpdrdQ==",
"dev": true,
"dependencies": {
- "@ljharb/through": "^2.3.11",
+ "@ljharb/through": "^2.3.12",
"ansi-escapes": "^4.3.2",
"chalk": "^5.3.0",
"cli-cursor": "^3.1.0",
"cli-width": "^4.1.0",
"external-editor": "^3.1.0",
- "figures": "^5.0.0",
+ "figures": "^3.2.0",
"lodash": "^4.17.21",
"mute-stream": "1.0.0",
"ora": "^5.4.1",
@@ -4363,7 +4384,7 @@
"wrap-ansi": "^6.2.0"
},
"engines": {
- "node": ">=14.18.0"
+ "node": ">=18"
}
},
"node_modules/inquirer/node_modules/chalk": {
@@ -4699,12 +4720,12 @@
}
},
"node_modules/is-unicode-supported": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
- "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"dev": true,
"engines": {
- "node": ">=12"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -5568,18 +5589,6 @@
"node": ">=8"
}
},
- "node_modules/log-symbols/node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/log-symbols/node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -6436,18 +6445,6 @@
"node": ">=8"
}
},
- "node_modules/ora/node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/ora/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -6699,9 +6696,9 @@
}
},
"node_modules/prettier": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz",
- "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==",
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
+ "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
"dev": true,
"bin": {
"prettier": "bin/prettier.cjs"
@@ -7662,6 +7659,23 @@
"randombytes": "^2.1.0"
}
},
+ "node_modules/set-function-length": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
+ "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.2",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/set-function-name": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
@@ -8716,9 +8730,9 @@
}
},
"node_modules/wdio-wait-for": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/wdio-wait-for/-/wdio-wait-for-3.0.10.tgz",
- "integrity": "sha512-YMWfI0BYgEviGDB9+rDUuHDZNVk8pHeae0cvaqk3Wx/2LijwJi4xkRP01uYC/hM7RBB7QJFBmjrXczVSqtJOGw==",
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/wdio-wait-for/-/wdio-wait-for-3.0.11.tgz",
+ "integrity": "sha512-kck1TeQeIzI9fdP8efy7izzdkBiOZJR8lMOkKpxYp2/k7r2F2+8SHWBGPt1TfSiehKHLsIalB7G1RzJKF+PqDA==",
"dev": true,
"engines": {
"node": "^16.13 || >=18"
@@ -8734,18 +8748,18 @@
}
},
"node_modules/webdriver": {
- "version": "8.29.3",
- "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.29.3.tgz",
- "integrity": "sha512-VL9SNV4FBX/8ak45aS35SYYDWc6HLXsfbnhVJnPSku8DgfDbfG8g9bCKQckpQcP7Te8a81/XbbrCjZfuqhVHfA==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.31.1.tgz",
+ "integrity": "sha512-J1Ata+ZiBVhCFKL7hnD6qCfr7ZRsBN2c/YlCgosq0lG/iYMKXWi5rlWDfpuyISprM/G/V3GjfEGxTUC6jJBSBA==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0",
"@types/ws": "^8.5.3",
- "@wdio/config": "8.29.3",
+ "@wdio/config": "8.31.1",
"@wdio/logger": "8.28.0",
- "@wdio/protocols": "8.24.12",
- "@wdio/types": "8.29.1",
- "@wdio/utils": "8.29.3",
+ "@wdio/protocols": "8.29.7",
+ "@wdio/types": "8.31.1",
+ "@wdio/utils": "8.31.1",
"deepmerge-ts": "^5.1.0",
"got": "^12.6.1",
"ky": "^0.33.0",
@@ -8756,23 +8770,23 @@
}
},
"node_modules/webdriverio": {
- "version": "8.29.3",
- "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.29.3.tgz",
- "integrity": "sha512-U8JQuBXSJhdSdSnDttekN3o6WCTf3o805HDncOYtRebFd3/4vy2PmYBOOhbY5lmEq7/ROA8KSbe7TfogWskzTQ==",
+ "version": "8.31.1",
+ "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.31.1.tgz",
+ "integrity": "sha512-b3bLBkkSGESGcRw3s3Sty84luZe2+qwPudXosSXbzcRu2Z1sccjdA6BHJA36IcLgKndNCOhf9wx3yQ3umoS7Jw==",
"dev": true,
"dependencies": {
"@types/node": "^20.1.0",
- "@wdio/config": "8.29.3",
+ "@wdio/config": "8.31.1",
"@wdio/logger": "8.28.0",
- "@wdio/protocols": "8.24.12",
+ "@wdio/protocols": "8.29.7",
"@wdio/repl": "8.24.12",
- "@wdio/types": "8.29.1",
- "@wdio/utils": "8.29.3",
+ "@wdio/types": "8.31.1",
+ "@wdio/utils": "8.31.1",
"archiver": "^6.0.0",
"aria-query": "^5.0.0",
"css-shorthand-properties": "^1.1.1",
"css-value": "^0.0.1",
- "devtools-protocol": "^0.0.1249869",
+ "devtools-protocol": "^0.0.1255431",
"grapheme-splitter": "^1.0.2",
"import-meta-resolve": "^4.0.0",
"is-plain-obj": "^4.1.0",
@@ -8784,7 +8798,7 @@
"resq": "^1.9.1",
"rgb2hex": "0.2.5",
"serialize-error": "^11.0.1",
- "webdriver": "8.29.3"
+ "webdriver": "8.31.1"
},
"engines": {
"node": "^16.13 || >=18"
diff --git a/tests/wdio/package.json b/tests/wdio/package.json
index da12b113bf..ba90344f94 100644
--- a/tests/wdio/package.json
+++ b/tests/wdio/package.json
@@ -4,20 +4,20 @@
"type": "module",
"devDependencies": {
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
- "@typescript-eslint/eslint-plugin": "^6.20.0",
- "@typescript-eslint/parser": "^6.20.0",
- "@wdio/cli": "^8.29.3",
- "@wdio/local-runner": "^8.29.5",
- "@wdio/mocha-framework": "^8.29.3",
- "@wdio/spec-reporter": "^8.29.3",
+ "@typescript-eslint/eslint-plugin": "^7.0.1",
+ "@typescript-eslint/parser": "^7.0.1",
+ "@wdio/cli": "^8.31.1",
+ "@wdio/local-runner": "^8.31.1",
+ "@wdio/mocha-framework": "^8.31.1",
+ "@wdio/spec-reporter": "^8.31.1",
"eslint": "^8.56.0",
"eslint-config-google": "^0.14.0",
- "eslint-plugin-sonarjs": "^0.23.0",
+ "eslint-plugin-sonarjs": "^0.24.0",
"npm-run-all": "^4.1.5",
- "prettier": "^3.2.4",
+ "prettier": "^3.2.5",
"ts-node": "^10.9.2",
"typescript": "^5.3.3",
- "wdio-wait-for": "^3.0.10"
+ "wdio-wait-for": "^3.0.11"
},
"scripts": {
"wdio": "wdio run ./wdio.conf.ts",
diff --git a/web/.eslintrc.json b/web/.eslintrc.json
index fdae375c68..86137ef245 100644
--- a/web/.eslintrc.json
+++ b/web/.eslintrc.json
@@ -13,7 +13,8 @@
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 12,
- "sourceType": "module"
+ "sourceType": "module",
+ "project": true
},
"plugins": ["@typescript-eslint", "lit", "custom-elements"],
"ignorePatterns": ["authentik-live-tests/**"],
diff --git a/web/package-lock.json b/web/package-lock.json
index 5411d8ff36..05827ac7e8 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -11,20 +11,20 @@
"dependencies": {
"@codemirror/lang-html": "^6.4.8",
"@codemirror/lang-javascript": "^6.2.1",
- "@codemirror/lang-python": "^6.1.3",
+ "@codemirror/lang-python": "^6.1.4",
"@codemirror/lang-xml": "^6.0.2",
"@codemirror/legacy-modes": "^6.3.3",
"@codemirror/theme-one-dark": "^6.1.2",
"@formatjs/intl-listformat": "^7.5.5",
"@fortawesome/fontawesome-free": "^6.5.1",
- "@goauthentik/api": "^2023.10.7-1706576211",
+ "@goauthentik/api": "^2023.10.7-1707933453",
"@lit-labs/context": "^0.4.0",
"@lit-labs/task": "^3.1.0",
"@lit/localize": "^0.11.4",
"@open-wc/lit-helpers": "^0.6.0",
"@patternfly/elements": "^2.4.0",
"@patternfly/patternfly": "^4.224.2",
- "@sentry/browser": "^7.99.0",
+ "@sentry/browser": "^7.101.0",
"@webcomponents/webcomponentsjs": "^2.8.0",
"base64-js": "^1.5.1",
"chart.js": "^4.4.1",
@@ -36,7 +36,7 @@
"fuse.js": "^7.0.0",
"guacamole-common-js": "^1.5.0",
"lit": "^2.8.0",
- "mermaid": "^10.7.0",
+ "mermaid": "^10.8.0",
"rapidoc": "^9.3.4",
"style-mod": "^4.1.0",
"webcomponent-qr-code": "^1.2.0",
@@ -61,21 +61,21 @@
"@rollup/plugin-replace": "^5.0.5",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^11.1.6",
- "@spotlightjs/spotlight": "^1.2.10",
- "@storybook/addon-essentials": "^7.6.12",
- "@storybook/addon-links": "^7.6.12",
- "@storybook/api": "^7.6.12",
+ "@spotlightjs/spotlight": "^1.2.12",
+ "@storybook/addon-essentials": "^7.6.15",
+ "@storybook/addon-links": "^7.6.15",
+ "@storybook/api": "^7.6.15",
"@storybook/blocks": "^7.6.4",
- "@storybook/manager-api": "^7.6.12",
- "@storybook/web-components": "^7.6.12",
- "@storybook/web-components-vite": "^7.6.12",
+ "@storybook/manager-api": "^7.6.15",
+ "@storybook/web-components": "^7.6.15",
+ "@storybook/web-components-vite": "^7.6.15",
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@types/chart.js": "^2.9.41",
"@types/codemirror": "5.60.15",
"@types/grecaptcha": "^3.0.7",
"@types/guacamole-common-js": "1.5.2",
- "@typescript-eslint/eslint-plugin": "^6.20.0",
- "@typescript-eslint/parser": "^6.20.0",
+ "@typescript-eslint/eslint-plugin": "^7.0.1",
+ "@typescript-eslint/parser": "^7.0.1",
"babel-plugin-macros": "^3.1.0",
"babel-plugin-tsconfig-paths": "^1.0.3",
"cross-env": "^7.0.3",
@@ -83,22 +83,22 @@
"eslint-config-google": "^0.14.0",
"eslint-plugin-custom-elements": "0.0.8",
"eslint-plugin-lit": "^1.11.0",
- "eslint-plugin-sonarjs": "^0.23.0",
+ "eslint-plugin-sonarjs": "^0.24.0",
"eslint-plugin-storybook": "^0.6.15",
"github-slugger": "^2.0.0",
"lit-analyzer": "^2.0.3",
"npm-run-all": "^4.1.5",
- "prettier": "^3.2.4",
+ "prettier": "^3.2.5",
"pseudolocale": "^2.0.0",
"pyright": "=1.1.338",
"react": "^18.2.0",
"react-dom": "^18.2.0",
- "rollup": "^4.9.6",
+ "rollup": "^4.10.0",
"rollup-plugin-copy": "^3.5.0",
"rollup-plugin-cssimport": "^1.0.3",
"rollup-plugin-modify": "^3.0.0",
"rollup-plugin-postcss-lit": "^2.1.0",
- "storybook": "^7.6.12",
+ "storybook": "^7.6.15",
"storybook-addon-mock": "^4.3.0",
"ts-lit-plugin": "^2.0.2",
"tslib": "^2.6.2",
@@ -2268,12 +2268,14 @@
}
},
"node_modules/@codemirror/lang-python": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.1.3.tgz",
- "integrity": "sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==",
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.1.4.tgz",
+ "integrity": "sha512-b6d1TDqrkCjFNvMO01SWldFiDoZ39yl3tDMC1Y5f8glA2eZpynPxJhwYVTlGFr0stizcJgrp6ojLEGH2myoZAw==",
"dependencies": {
"@codemirror/autocomplete": "^6.3.2",
"@codemirror/language": "^6.8.0",
+ "@codemirror/state": "^6.0.0",
+ "@lezer/common": "^1.2.1",
"@lezer/python": "^1.1.4"
}
},
@@ -2913,9 +2915,9 @@
}
},
"node_modules/@goauthentik/api": {
- "version": "2023.10.7-1706576211",
- "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2023.10.7-1706576211.tgz",
- "integrity": "sha512-mpDMRquBZkYIE/wb7uG+p7Jax/ge0TCVoI0ZsW9vn9uspvHAkoX6K7kA78wW8ktA7wUEeJ51l5GoIHYRMdhavA=="
+ "version": "2023.10.7-1707933453",
+ "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2023.10.7-1707933453.tgz",
+ "integrity": "sha512-fY9C8ogpetif7x0UGzp4pCgI05jObhPqs2yWOWFDEZyiLY15umb53P9LfkGZJ5ExtMxoD2GBC7YQ7FIvm7j9GA=="
},
"node_modules/@hcaptcha/types": {
"version": "1.0.3",
@@ -3399,9 +3401,9 @@
"integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
},
"node_modules/@lezer/common": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.4.tgz",
- "integrity": "sha512-lZHlk8p67x4aIDtJl6UQrXSOP6oi7dQR3W/geFVrENdA1JDaAJWldnVqVjPMJupbTKbzDfFcePfKttqVidS/dg=="
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz",
+ "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ=="
},
"node_modules/@lezer/css": {
"version": "1.1.3",
@@ -4569,9 +4571,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz",
- "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.10.0.tgz",
+ "integrity": "sha512-/MeDQmcD96nVoRumKUljsYOLqfv1YFJps+0pTrb2Z9Nl/w5qNUysMaWQsrd1mvAlNT4yza1iVyIu4Q4AgF6V3A==",
"cpu": [
"arm"
],
@@ -4582,9 +4584,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz",
- "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.10.0.tgz",
+ "integrity": "sha512-lvu0jK97mZDJdpZKDnZI93I0Om8lSDaiPx3OiCk0RXn3E8CMPJNS/wxjAvSJJzhhZpfjXsjLWL8LnS6qET4VNQ==",
"cpu": [
"arm64"
],
@@ -4595,9 +4597,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz",
- "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.10.0.tgz",
+ "integrity": "sha512-uFpayx8I8tyOvDkD7X6n0PriDRWxcqEjqgtlxnUA/G9oS93ur9aZ8c8BEpzFmsed1TH5WZNG5IONB8IiW90TQg==",
"cpu": [
"arm64"
],
@@ -4608,9 +4610,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz",
- "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.10.0.tgz",
+ "integrity": "sha512-nIdCX03qFKoR/MwQegQBK+qZoSpO3LESurVAC6s6jazLA1Mpmgzo3Nj3H1vydXp/JM29bkCiuF7tDuToj4+U9Q==",
"cpu": [
"x64"
],
@@ -4621,9 +4623,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz",
- "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.10.0.tgz",
+ "integrity": "sha512-Fz7a+y5sYhYZMQFRkOyCs4PLhICAnxRX/GnWYReaAoruUzuRtcf+Qnw+T0CoAWbHCuz2gBUwmWnUgQ67fb3FYw==",
"cpu": [
"arm"
],
@@ -4634,9 +4636,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz",
- "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.10.0.tgz",
+ "integrity": "sha512-yPtF9jIix88orwfTi0lJiqINnlWo6p93MtZEoaehZnmCzEmLL0eqjA3eGVeyQhMtxdV+Mlsgfwhh0+M/k1/V7Q==",
"cpu": [
"arm64"
],
@@ -4647,9 +4649,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz",
- "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.10.0.tgz",
+ "integrity": "sha512-9GW9yA30ib+vfFiwjX+N7PnjTnCMiUffhWj4vkG4ukYv1kJ4T9gHNg8zw+ChsOccM27G9yXrEtMScf1LaCuoWQ==",
"cpu": [
"arm64"
],
@@ -4660,9 +4662,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz",
- "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.10.0.tgz",
+ "integrity": "sha512-X1ES+V4bMq2ws5fF4zHornxebNxMXye0ZZjUrzOrf7UMx1d6wMQtfcchZ8SqUnQPPHdOyOLW6fTcUiFgHFadRA==",
"cpu": [
"riscv64"
],
@@ -4673,9 +4675,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz",
- "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.10.0.tgz",
+ "integrity": "sha512-w/5OpT2EnI/Xvypw4FIhV34jmNqU5PZjZue2l2Y3ty1Ootm3SqhI+AmfhlUYGBTd9JnpneZCDnt3uNOiOBkMyw==",
"cpu": [
"x64"
],
@@ -4686,9 +4688,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz",
- "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.10.0.tgz",
+ "integrity": "sha512-q/meftEe3QlwQiGYxD9rWwB21DoKQ9Q8wA40of/of6yGHhZuGfZO0c3WYkN9dNlopHlNT3mf5BPsUSxoPuVQaw==",
"cpu": [
"x64"
],
@@ -4699,9 +4701,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz",
- "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.10.0.tgz",
+ "integrity": "sha512-NrR6667wlUfP0BHaEIKgYM/2va+Oj+RjZSASbBMnszM9k+1AmliRjHc3lJIiOehtSSjqYiO7R6KLNrWOX+YNSQ==",
"cpu": [
"arm64"
],
@@ -4712,9 +4714,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz",
- "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.10.0.tgz",
+ "integrity": "sha512-FV0Tpt84LPYDduIDcXvEC7HKtyXxdvhdAOvOeWMWbQNulxViH2O07QXkT/FffX4FqEI02jEbCJbr+YcuKdyyMg==",
"cpu": [
"ia32"
],
@@ -4725,9 +4727,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz",
- "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.10.0.tgz",
+ "integrity": "sha512-OZoJd+o5TaTSQeFFQ6WjFCiltiYVjIdsXxwu/XZ8qRpsvMQr4UsVrE5UyT9RIvsnuF47DqkJKhhVZ2Q9YW9IpQ==",
"cpu": [
"x64"
],
@@ -4738,102 +4740,102 @@
]
},
"node_modules/@sentry-internal/feedback": {
- "version": "7.99.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.99.0.tgz",
- "integrity": "sha512-exIO1o+bE0MW4z30FxC0cYzJ4ZHSMlDPMHCBDPzU+MWGQc/fb8s58QUrx5Dnm6HTh9G3H+YlroCxIo9u0GSwGQ==",
+ "version": "7.101.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.101.0.tgz",
+ "integrity": "sha512-uQBMYhZp/qkBEA/GXRMm1OfSkRkZojxBrCrFmzkWhJzXT+YbL57/M1uCcwkKmorKlg393Soh7MLULInwmcwWkA==",
"dependencies": {
- "@sentry/core": "7.99.0",
- "@sentry/types": "7.99.0",
- "@sentry/utils": "7.99.0"
+ "@sentry/core": "7.101.0",
+ "@sentry/types": "7.101.0",
+ "@sentry/utils": "7.101.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@sentry-internal/replay-canvas": {
- "version": "7.99.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.99.0.tgz",
- "integrity": "sha512-PoIkfusToDq0snfl2M6HJx/1KJYtXxYhQplrn11kYadO04SdG0XGXf4h7wBTMEQ7LDEAtQyvsOu4nEQtTO3YjQ==",
+ "version": "7.101.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.101.0.tgz",
+ "integrity": "sha512-fiz4kPpz/j6ZaD+vOcUXuO1HqD49djs4QwyTsRwCCi77EKZOGAaijpqWckDWyZs0dOOnbGGGC5x3o+CfTJcjKA==",
"dependencies": {
- "@sentry/core": "7.99.0",
- "@sentry/replay": "7.99.0",
- "@sentry/types": "7.99.0",
- "@sentry/utils": "7.99.0"
+ "@sentry/core": "7.101.0",
+ "@sentry/replay": "7.101.0",
+ "@sentry/types": "7.101.0",
+ "@sentry/utils": "7.101.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@sentry-internal/tracing": {
- "version": "7.99.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.99.0.tgz",
- "integrity": "sha512-z3JQhHjoM1KdM20qrHwRClKJrNLr2CcKtCluq7xevLtXHJWNAQQbafnWD+Aoj85EWXBzKt9yJMv2ltcXJ+at+w==",
+ "version": "7.101.0",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.101.0.tgz",
+ "integrity": "sha512-rp9oOLQs6vMuzvAnAHRRCNu5Z0o/ZVRI3WPYedxpdMWKD1Z3G9o+0joP+ZIUqHsamWWYiIgPqXgL9AK6AWjFRg==",
"dependencies": {
- "@sentry/core": "7.99.0",
- "@sentry/types": "7.99.0",
- "@sentry/utils": "7.99.0"
+ "@sentry/core": "7.101.0",
+ "@sentry/types": "7.101.0",
+ "@sentry/utils": "7.101.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@sentry/browser": {
- "version": "7.99.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.99.0.tgz",
- "integrity": "sha512-bgfoUv3wkwwLgN5YUOe0ibB3y268ZCnamZh6nLFqnY/UBKC1+FXWFdvzVON/XKUm62LF8wlpCybOf08ebNj2yg==",
+ "version": "7.101.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.101.0.tgz",
+ "integrity": "sha512-wj9YLfS/caR20Yq0hdEjsZHuhnYLU7Ht0SlcJx5MNMnArtmW1k2CWZz3PCqcW/rTZe53npVTe6eMqMccB4aPrQ==",
"dependencies": {
- "@sentry-internal/feedback": "7.99.0",
- "@sentry-internal/replay-canvas": "7.99.0",
- "@sentry-internal/tracing": "7.99.0",
- "@sentry/core": "7.99.0",
- "@sentry/replay": "7.99.0",
- "@sentry/types": "7.99.0",
- "@sentry/utils": "7.99.0"
+ "@sentry-internal/feedback": "7.101.0",
+ "@sentry-internal/replay-canvas": "7.101.0",
+ "@sentry-internal/tracing": "7.101.0",
+ "@sentry/core": "7.101.0",
+ "@sentry/replay": "7.101.0",
+ "@sentry/types": "7.101.0",
+ "@sentry/utils": "7.101.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@sentry/core": {
- "version": "7.99.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.99.0.tgz",
- "integrity": "sha512-vOAtzcAXEUtS/oW7wi3wMkZ3hsb5Ch96gKyrrj/mXdOp2zrcwdNV6N9/pawq2E9P/7Pw8AXw4CeDZztZrjQLuA==",
+ "version": "7.101.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.101.0.tgz",
+ "integrity": "sha512-dRNrNV5OLGARkOGgxJsVDhA98Pev5G1LVJcud5E83cRg49BCUx2riqEtDP6iIS1nvem6cApkSnLC1kvl/T5/Cw==",
"dependencies": {
- "@sentry/types": "7.99.0",
- "@sentry/utils": "7.99.0"
+ "@sentry/types": "7.101.0",
+ "@sentry/utils": "7.101.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@sentry/replay": {
- "version": "7.99.0",
- "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.99.0.tgz",
- "integrity": "sha512-gyN/I2WpQrLAZDT+rScB/0jnFL2knEVBo8U8/OVt8gNP20Pq8T/rDZKO/TG0cBfvULDUbJj2P4CJryn2p/O2rA==",
+ "version": "7.101.0",
+ "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.101.0.tgz",
+ "integrity": "sha512-DSWkGKI/QhCAY+qm4mBnPob3/YsewisskVTak7KMDotJ75H85WFJhVwOMtvaEWIzVezCOItPv7ql51jTwhR3wA==",
"dependencies": {
- "@sentry-internal/tracing": "7.99.0",
- "@sentry/core": "7.99.0",
- "@sentry/types": "7.99.0",
- "@sentry/utils": "7.99.0"
+ "@sentry-internal/tracing": "7.101.0",
+ "@sentry/core": "7.101.0",
+ "@sentry/types": "7.101.0",
+ "@sentry/utils": "7.101.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@sentry/types": {
- "version": "7.99.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.99.0.tgz",
- "integrity": "sha512-94qwOw4w40sAs5mCmzcGyj8ZUu/KhnWnuMZARRq96k+SjRW/tHFAOlIdnFSrt3BLPvSOK7R3bVAskZQ0N4FTmA==",
+ "version": "7.101.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.101.0.tgz",
+ "integrity": "sha512-YC+ltO/AlbEyJHjCUYQ4is1HcDT2zSMuLkIAcyQmK7fUdlGT4iR5sfENriY9ZopYHgjPdJKfhI8ohScam7zp/A==",
"engines": {
"node": ">=8"
}
},
"node_modules/@sentry/utils": {
- "version": "7.99.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.99.0.tgz",
- "integrity": "sha512-cYZy5WNTkWs5GgggGnjfGqC44CWir0pAv4GVVSx0fsup4D4pMKBJPrtub15f9uC+QkUf3vVkqwpBqeFxtmJQTQ==",
+ "version": "7.101.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.101.0.tgz",
+ "integrity": "sha512-px1NUkCLsD9UKLE4W4DghpyzmAVHgYhskrjRt30ubyUKqlggtHkOXRvS8MjuWowR/i0wF0GuTCbU9StBd7JMrw==",
"dependencies": {
- "@sentry/types": "7.99.0"
+ "@sentry/types": "7.101.0"
},
"engines": {
"node": ">=8"
@@ -4846,40 +4848,40 @@
"dev": true
},
"node_modules/@spotlightjs/overlay": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@spotlightjs/overlay/-/overlay-1.4.1.tgz",
- "integrity": "sha512-YZj/po1jT2KRzq5zFLgISRrt0S9jkxJf+8e9yW+POaQxaOkM5SB6h9ZjjN4bM9/OlXOIqVGoqFhjr4TaGxglJw==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@spotlightjs/overlay/-/overlay-1.6.0.tgz",
+ "integrity": "sha512-8QfE8LnpWtsQHGXutuJev8kpfw7tovtkEiLWurT9sMK6t78G00erAc+h3XfI9VIV1tMJxx+FaiG+n5jQs7wVHw==",
"dev": true
},
"node_modules/@spotlightjs/sidecar": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@spotlightjs/sidecar/-/sidecar-1.3.5.tgz",
- "integrity": "sha512-mtpNWE07DnrUhkvZ1EN8rIH5xVgsfqrw+LSJZTb1FjJ8jODTafiXCJjf40f9tswtGQKhNvaJ+Z24N/o92CYyGw==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@spotlightjs/sidecar/-/sidecar-1.4.0.tgz",
+ "integrity": "sha512-onj/phrNtDI8a79zc8jfxJ5BITQk5klO4xSoQXxiYeQWTZcegVeO8VftOVfWPBnMY/axnh+ltxJm/cHaV5SP6Q==",
"dev": true,
"bin": {
"spotlight-sidecar": "server.js"
}
},
"node_modules/@spotlightjs/spotlight": {
- "version": "1.2.10",
- "resolved": "https://registry.npmjs.org/@spotlightjs/spotlight/-/spotlight-1.2.10.tgz",
- "integrity": "sha512-U8rHtNIjDeH1XRhHyMzMbXB+d/8wr53B1aDq45n5XWqghthYR3oRgBaAgMt7Evmf53LSNQY4gN9ZjRBX9/n2Tw==",
+ "version": "1.2.12",
+ "resolved": "https://registry.npmjs.org/@spotlightjs/spotlight/-/spotlight-1.2.12.tgz",
+ "integrity": "sha512-FHXsKLOatoyG7fKwsxMYPspkS9h/wEIli02GiA98Hg0UqHWZ5UV7xFzlUqaBmr6hbPLnQoc7fcFIN0ATgVJ9ng==",
"dev": true,
"dependencies": {
- "@spotlightjs/overlay": "1.4.1",
- "@spotlightjs/sidecar": "1.3.5"
+ "@spotlightjs/overlay": "1.6.0",
+ "@spotlightjs/sidecar": "1.4.0"
},
"bin": {
"spotlight-sidecar": "bin/run.js"
}
},
"node_modules/@storybook/addon-actions": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.12.tgz",
- "integrity": "sha512-vK/H6K+AJ4ZSsCu/+MapYYI/xrynB6JoCOejt//flTigZOhwTWv7WXbmEeqGIIToXy0LA2IUZ1/kCjFXR0lEdQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.15.tgz",
+ "integrity": "sha512-2Jfvbahe/tmq1iNnNxmcP0JnX0rqCuijjXXai9yMDV3koIMawn6t88MPVrdcso5ch/fxE45522nZqA3SZJbM4g==",
"dev": true,
"dependencies": {
- "@storybook/core-events": "7.6.12",
+ "@storybook/core-events": "7.6.15",
"@storybook/global": "^5.0.0",
"@types/uuid": "^9.0.1",
"dequal": "^2.0.2",
@@ -4892,9 +4894,9 @@
}
},
"node_modules/@storybook/addon-backgrounds": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.12.tgz",
- "integrity": "sha512-G14uN5lDXUtXw+dmEPaB6lpDpR9K25ssYuWWn8yYR44B1WMuD4kDgw0QGb0g+xYQj9R1TsalKEJHA4AuSYkVGQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.15.tgz",
+ "integrity": "sha512-t0wWZiLHUoxP1GqSR44Zt+mI6cq17dAtpX/aC9I1xGl4xKUizmZjjX9GcH2EjcIiuKBER0ouQtQcDNyV939VvA==",
"dev": true,
"dependencies": {
"@storybook/global": "^5.0.0",
@@ -4907,12 +4909,12 @@
}
},
"node_modules/@storybook/addon-controls": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.12.tgz",
- "integrity": "sha512-NX4KajscOsuXyYE3hhniF+y0E59E6rM0FgIaZ48P9c0DD+wDo8bAISHjZvmKXtDVajLk4/JySvByx1eN6V3hmA==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.15.tgz",
+ "integrity": "sha512-HXcG/Lr4ri7WUFz14Y5lEBTA1XmKy0E/DepW88XVy6YNsTpERVWEBcvjKoLAU1smKrfhVto96hK2AVFL3A8EBQ==",
"dev": true,
"dependencies": {
- "@storybook/blocks": "7.6.12",
+ "@storybook/blocks": "7.6.15",
"lodash": "^4.17.21",
"ts-dedent": "^2.0.0"
},
@@ -4922,26 +4924,26 @@
}
},
"node_modules/@storybook/addon-docs": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.12.tgz",
- "integrity": "sha512-AzMgnGYfEg+Z1ycJh8MEp44x1DfjRijKCVYNaPFT6o+TjN/9GBaAkV4ydxmQzMEMnnnh/0E9YeHO+ivBVSkNog==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.15.tgz",
+ "integrity": "sha512-UPODqO+mrYaKyTSAtfRslxOFgSP/v/5vfDx896pbNTC4Sf8xLytoudw4I14hzkHmRdXiOnd21FqXJfmF/Onsvw==",
"dev": true,
"dependencies": {
"@jest/transform": "^29.3.1",
"@mdx-js/react": "^2.1.5",
- "@storybook/blocks": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/components": "7.6.12",
- "@storybook/csf-plugin": "7.6.12",
- "@storybook/csf-tools": "7.6.12",
+ "@storybook/blocks": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/components": "7.6.15",
+ "@storybook/csf-plugin": "7.6.15",
+ "@storybook/csf-tools": "7.6.15",
"@storybook/global": "^5.0.0",
"@storybook/mdx2-csf": "^1.0.0",
- "@storybook/node-logger": "7.6.12",
- "@storybook/postinstall": "7.6.12",
- "@storybook/preview-api": "7.6.12",
- "@storybook/react-dom-shim": "7.6.12",
- "@storybook/theming": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/node-logger": "7.6.15",
+ "@storybook/postinstall": "7.6.15",
+ "@storybook/preview-api": "7.6.15",
+ "@storybook/react-dom-shim": "7.6.15",
+ "@storybook/theming": "7.6.15",
+ "@storybook/types": "7.6.15",
"fs-extra": "^11.1.0",
"remark-external-links": "^8.0.0",
"remark-slug": "^6.0.0",
@@ -4957,17 +4959,17 @@
}
},
"node_modules/@storybook/addon-docs/node_modules/@storybook/preview-api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz",
- "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz",
+ "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/types": "7.6.12",
+ "@storybook/types": "7.6.15",
"@types/qs": "^6.9.5",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
@@ -4997,24 +4999,24 @@
}
},
"node_modules/@storybook/addon-essentials": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.12.tgz",
- "integrity": "sha512-Pl6n+19QC/T+cuU8DZjCwILXVxrdRTivNxPOiy8SEX+jjR4H0uAfXC9+RXCPjRFn64t4j1K7oIyoNokEn39cNw==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.15.tgz",
+ "integrity": "sha512-m8OJtRG1/DEbFCQ1S6y/yKN3uWl9bsEn2ZsX5WcYmEt501BUbTPwpGOPyP57Q7nYYXKmWT2375Uq1qauwcD6NA==",
"dev": true,
"dependencies": {
- "@storybook/addon-actions": "7.6.12",
- "@storybook/addon-backgrounds": "7.6.12",
- "@storybook/addon-controls": "7.6.12",
- "@storybook/addon-docs": "7.6.12",
- "@storybook/addon-highlight": "7.6.12",
- "@storybook/addon-measure": "7.6.12",
- "@storybook/addon-outline": "7.6.12",
- "@storybook/addon-toolbars": "7.6.12",
- "@storybook/addon-viewport": "7.6.12",
- "@storybook/core-common": "7.6.12",
- "@storybook/manager-api": "7.6.12",
- "@storybook/node-logger": "7.6.12",
- "@storybook/preview-api": "7.6.12",
+ "@storybook/addon-actions": "7.6.15",
+ "@storybook/addon-backgrounds": "7.6.15",
+ "@storybook/addon-controls": "7.6.15",
+ "@storybook/addon-docs": "7.6.15",
+ "@storybook/addon-highlight": "7.6.15",
+ "@storybook/addon-measure": "7.6.15",
+ "@storybook/addon-outline": "7.6.15",
+ "@storybook/addon-toolbars": "7.6.15",
+ "@storybook/addon-viewport": "7.6.15",
+ "@storybook/core-common": "7.6.15",
+ "@storybook/manager-api": "7.6.15",
+ "@storybook/node-logger": "7.6.15",
+ "@storybook/preview-api": "7.6.15",
"ts-dedent": "^2.0.0"
},
"funding": {
@@ -5027,17 +5029,17 @@
}
},
"node_modules/@storybook/addon-essentials/node_modules/@storybook/preview-api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz",
- "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz",
+ "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/types": "7.6.12",
+ "@storybook/types": "7.6.15",
"@types/qs": "^6.9.5",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
@@ -5053,9 +5055,9 @@
}
},
"node_modules/@storybook/addon-highlight": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.12.tgz",
- "integrity": "sha512-rWNEyBhwncXEDd9z7l67BLBIPqn0SRI/CJpZvCSF5KLWrVaoSEDF8INavmbikd1JBMcajJ28Ur6NsGj+eJjJiw==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.15.tgz",
+ "integrity": "sha512-ptidWZJJcEM83YsxCjf+m1q8Rr9sN8piJ4PJlM2vyc4MLZY4q6htb1JJFeq3ov1Iz6SY9KjKc/zOkWo4L54nxw==",
"dev": true,
"dependencies": {
"@storybook/global": "^5.0.0"
@@ -5066,9 +5068,9 @@
}
},
"node_modules/@storybook/addon-links": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.12.tgz",
- "integrity": "sha512-rGwPYpZAANPrf2GaNi5t9zAjLF8PgzKizyBPltIXUtplxDg88ziXlDA1dhsuGDs4Kf0oXECyAHPw79JjkJQziA==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.15.tgz",
+ "integrity": "sha512-DEBlut3ofpggbm8N7n3f/Xdi6KkjKps2hnL5blz5aQ7iSJJPT683GDP2CKjhtrlrL6+uJyEHWDLoECVq2kveaQ==",
"dev": true,
"dependencies": {
"@storybook/csf": "^0.1.2",
@@ -5089,9 +5091,9 @@
}
},
"node_modules/@storybook/addon-measure": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.12.tgz",
- "integrity": "sha512-K3aKErr84V0eVK7t+wco5cSYDdeotwoXi4e7VLSa2cdUz0wanOb4R7v3kf6vxucUyp05Lv+yHkz9zsbwuezepA==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.15.tgz",
+ "integrity": "sha512-3csc8Vu/wDkgpuHprl9fbKKym/+nR8HBvcALPLlH2MWnlU3DEURrj/ykRKWlp7G3F5eqDIcaIEjq6xiBZyWg7Q==",
"dev": true,
"dependencies": {
"@storybook/global": "^5.0.0",
@@ -5103,9 +5105,9 @@
}
},
"node_modules/@storybook/addon-outline": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.12.tgz",
- "integrity": "sha512-r6eO4EKh+zwGUNjxe8v/44BhyV+JD3Dl9GYMutsFqbwYsoWHJaZmzHuyqeFBXwx2MEoixdWdIzNMP71+srQqvw==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.15.tgz",
+ "integrity": "sha512-5zYDWO0OIlFchYqSjRDmQv2mPMwAwIDTocc00FMiQAaNqPZ+3ZP9L6kOng8YgwYWpPBecoHdLvSW6rTmcufHtw==",
"dev": true,
"dependencies": {
"@storybook/global": "^5.0.0",
@@ -5117,9 +5119,9 @@
}
},
"node_modules/@storybook/addon-toolbars": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.12.tgz",
- "integrity": "sha512-TSwq8xO7fmS6GRTgJJa31OBzm+5zlgDYK2Q42jxFo/Vm10uMzCpjYJE6mIHpUDyjyBVQk6xxMMEcvo6no2eAWg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.15.tgz",
+ "integrity": "sha512-QougKS2eABB5Jd332i9tBpKgh2lN4aaqXkvmVC5egT5dOuJ9IeuZbGwiALef/uf1f3IuyUP41So9l2dI4u19aw==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -5127,9 +5129,9 @@
}
},
"node_modules/@storybook/addon-viewport": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.12.tgz",
- "integrity": "sha512-51zsBeoaEzq699SKDCe+GG/2PDAJKKJtpjqxIc4lDskogaCJSb3Ie8LyookHAKYgbi2qealVgK8zaP27KUj3Pg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.15.tgz",
+ "integrity": "sha512-0esg0+onJftU2prD3n/sbxBTrTOIGQnZhbrKPP+/S26dVHuYaR/65XdwpRgXNY5PHK2yjU78HxiJP+Kyu75ntw==",
"dev": true,
"dependencies": {
"memoizerific": "^1.11.3"
@@ -5322,13 +5324,13 @@
"dev": true
},
"node_modules/@storybook/api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/api/-/api-7.6.12.tgz",
- "integrity": "sha512-ePKOszvvpZ7gcprUHp1lM5wbrSngFLYbHeFnm6J1BWewEQ+TdWujlVxRJJs+HYEL1vW+se3IR2nvJVM1Sq7vLQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/api/-/api-7.6.15.tgz",
+ "integrity": "sha512-5JuJI75h7QCKn6Sm1rhVCatKtKcuZCR4hb5b3Ef11xQ3I9bYOtEP403K9xSKe4OcJWBYhIYGqVNSBgeNOa5jCg==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.12",
- "@storybook/manager-api": "7.6.12"
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/manager-api": "7.6.15"
},
"funding": {
"type": "opencollective",
@@ -5336,22 +5338,22 @@
}
},
"node_modules/@storybook/blocks": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.12.tgz",
- "integrity": "sha512-T47KOAjgZmhV+Ov59A70inE5edInh1Jh5w/5J5cjpk9a2p4uhd337SnK4B8J5YLhcM2lbKRWJjzIJ0nDZQTdnQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.15.tgz",
+ "integrity": "sha512-ODP7AVh2iIGblI5WKGokWSHbp9YQHc+Uce7JCGcnDbNavoy64Z6R6G+wXzF5jfl7xQlbhQ8yQCuSSL4GNdYTeA==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/components": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/components": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
- "@storybook/docs-tools": "7.6.12",
+ "@storybook/docs-tools": "7.6.15",
"@storybook/global": "^5.0.0",
- "@storybook/manager-api": "7.6.12",
- "@storybook/preview-api": "7.6.12",
- "@storybook/theming": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/manager-api": "7.6.15",
+ "@storybook/preview-api": "7.6.15",
+ "@storybook/theming": "7.6.15",
+ "@storybook/types": "7.6.15",
"@types/lodash": "^4.14.167",
"color-convert": "^2.0.1",
"dequal": "^2.0.2",
@@ -5375,17 +5377,17 @@
}
},
"node_modules/@storybook/blocks/node_modules/@storybook/preview-api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz",
- "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz",
+ "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/types": "7.6.12",
+ "@storybook/types": "7.6.15",
"@types/qs": "^6.9.5",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
@@ -5401,15 +5403,15 @@
}
},
"node_modules/@storybook/builder-manager": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.12.tgz",
- "integrity": "sha512-AJFrtBj0R11OFwwz+2j+ivRzttWXT6LesSGoLnxown24EV9uLQoHtGb7GOA2GyzY5wjUJS9gQBPGHXjvQEfLJA==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.15.tgz",
+ "integrity": "sha512-vfpfCywiasyP7vtbgLJhjssBEwUjZhBsRsubDAzumgOochPiKKPNwsSc5NU/4ZIGaC5zRO26kUaUqFIbJdTEUQ==",
"dev": true,
"dependencies": {
"@fal-works/esbuild-plugin-global-externals": "^2.1.2",
- "@storybook/core-common": "7.6.12",
- "@storybook/manager": "7.6.12",
- "@storybook/node-logger": "7.6.12",
+ "@storybook/core-common": "7.6.15",
+ "@storybook/manager": "7.6.15",
+ "@storybook/node-logger": "7.6.15",
"@types/ejs": "^3.1.1",
"@types/find-cache-dir": "^3.2.1",
"@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10",
@@ -5443,19 +5445,19 @@
}
},
"node_modules/@storybook/builder-vite": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.6.12.tgz",
- "integrity": "sha512-VJIn+XYVVhdJHHMEtYDnEyQQU4fRupugSFpP9XLYTRYgXPN9PSVey4vI/IyuHcHYINPba39UY2+8PW+5NgShxQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.6.15.tgz",
+ "integrity": "sha512-ZqmWoty+AsxArvwGCg1F/1dpZUWDYfiZe0Ag1S9hdqNj6geM1IqO0wLB6Y5c4gl3BKEFmOLA36yRVlP5KIkx8w==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-common": "7.6.12",
- "@storybook/csf-plugin": "7.6.12",
- "@storybook/node-logger": "7.6.12",
- "@storybook/preview": "7.6.12",
- "@storybook/preview-api": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-common": "7.6.15",
+ "@storybook/csf-plugin": "7.6.15",
+ "@storybook/node-logger": "7.6.15",
+ "@storybook/preview": "7.6.15",
+ "@storybook/preview-api": "7.6.15",
+ "@storybook/types": "7.6.15",
"@types/find-cache-dir": "^3.2.1",
"browser-assert": "^1.2.1",
"es-module-lexer": "^0.9.3",
@@ -5488,17 +5490,17 @@
}
},
"node_modules/@storybook/builder-vite/node_modules/@storybook/preview-api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz",
- "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz",
+ "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/types": "7.6.12",
+ "@storybook/types": "7.6.15",
"@types/qs": "^6.9.5",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
@@ -5544,13 +5546,13 @@
}
},
"node_modules/@storybook/channels": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.12.tgz",
- "integrity": "sha512-TaPl5Y3lOoVi5kTLgKNRX8xh2sUPekH0Id1l4Ymw+lpgriEY6r60bmkZLysLG1GhlskpQ/da2+S2ap2ht8P2TQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.15.tgz",
+ "integrity": "sha512-UPDYRzGkygYFa8QUpEiumWrvZm4u4RKVzgiBt9C4RmHORqkkZzL9LXhaZJp2SmIz1ND5gx6KR5ze8ZnAdwxxoQ==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/global": "^5.0.0",
"qs": "^6.10.0",
"telejson": "^7.2.0",
@@ -5562,23 +5564,23 @@
}
},
"node_modules/@storybook/cli": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.12.tgz",
- "integrity": "sha512-x4sG1oIVERxp+WnWUexVlgaJCFmML0kGi7a5qfx7z4vHMxCV/WG7g1q7mPS/kqStCGEiQdTciCqOEFqlMh9MLw==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.15.tgz",
+ "integrity": "sha512-2QRqCyVGDSkraHxX2JPYkkFccbu5Uo+JYFaFJo4vmMXzDurjWON+Ga2B8FCTd4A8P4C02Ca/79jgQoyBB3xoew==",
"dev": true,
"dependencies": {
"@babel/core": "^7.23.2",
"@babel/preset-env": "^7.23.2",
"@babel/types": "^7.23.0",
"@ndelangen/get-tarball": "^3.0.7",
- "@storybook/codemod": "7.6.12",
- "@storybook/core-common": "7.6.12",
- "@storybook/core-events": "7.6.12",
- "@storybook/core-server": "7.6.12",
- "@storybook/csf-tools": "7.6.12",
- "@storybook/node-logger": "7.6.12",
- "@storybook/telemetry": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/codemod": "7.6.15",
+ "@storybook/core-common": "7.6.15",
+ "@storybook/core-events": "7.6.15",
+ "@storybook/core-server": "7.6.15",
+ "@storybook/csf-tools": "7.6.15",
+ "@storybook/node-logger": "7.6.15",
+ "@storybook/telemetry": "7.6.15",
+ "@storybook/types": "7.6.15",
"@types/semver": "^7.3.4",
"@yarnpkg/fslib": "2.10.3",
"@yarnpkg/libzip": "2.3.0",
@@ -5708,9 +5710,9 @@
}
},
"node_modules/@storybook/cli/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -5741,9 +5743,9 @@
"dev": true
},
"node_modules/@storybook/client-logger": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.12.tgz",
- "integrity": "sha512-hiRv6dXsOttMPqm9SxEuFoAtDe9rs7TUS8XcO5rmJ9BgfwBJsYlHzAxXkazxmvlyZtKL7gMx6m8OYbCdZgUqtA==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.15.tgz",
+ "integrity": "sha512-n+K8IqnombqiQNnywVovS+lK61tvv/XSfgPt0cgvoF/hJZB0VDOMRjWsV+v9qQpj1TQEl1lLWeJwZMthTWupJA==",
"dev": true,
"dependencies": {
"@storybook/global": "^5.0.0"
@@ -5754,18 +5756,18 @@
}
},
"node_modules/@storybook/codemod": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.12.tgz",
- "integrity": "sha512-4EI4Ah1cvz6gFkXOS/LGf23oN8LO6ABGpWwPQoMHpIV3wUkFWBwrKFUe/UAQZGptnM0VZRYx4grS82Hluw4XJA==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.15.tgz",
+ "integrity": "sha512-NiEbTLCdacj6TMxC7G49IImXeMzkG8wpPr8Ayxm9HeG6q5UkiF5/DiZdqbJm2zaosOsOKWwvXg1t6Pq6Nivytg==",
"dev": true,
"dependencies": {
"@babel/core": "^7.23.2",
"@babel/preset-env": "^7.23.2",
"@babel/types": "^7.23.0",
"@storybook/csf": "^0.1.2",
- "@storybook/csf-tools": "7.6.12",
- "@storybook/node-logger": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/csf-tools": "7.6.15",
+ "@storybook/node-logger": "7.6.15",
+ "@storybook/types": "7.6.15",
"@types/cross-spawn": "^6.0.2",
"cross-spawn": "^7.0.3",
"globby": "^11.0.2",
@@ -5795,18 +5797,18 @@
}
},
"node_modules/@storybook/components": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.12.tgz",
- "integrity": "sha512-PCijPqmlZd7qyTzNr+vD0Kf8sAI9vWJIaxbSjXwn/De3e63m4fsEcIf8FaUT8cMZ46AWZvaxaxX5km2u0UISJQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.15.tgz",
+ "integrity": "sha512-xD+maP7+C9HeZXi2vJ+uK9hXN4S4spP4uDj9pyZ9yViKb+ztEO6WpovUMT8WRQ0mMegWyLXkx3zqu43hZvXM1g==",
"dev": true,
"dependencies": {
"@radix-ui/react-select": "^1.2.2",
"@radix-ui/react-toolbar": "^1.0.4",
- "@storybook/client-logger": "7.6.12",
+ "@storybook/client-logger": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/theming": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/theming": "7.6.15",
+ "@storybook/types": "7.6.15",
"memoizerific": "^1.11.3",
"use-resize-observer": "^9.1.0",
"util-deprecate": "^1.0.2"
@@ -5821,13 +5823,13 @@
}
},
"node_modules/@storybook/core-client": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.12.tgz",
- "integrity": "sha512-VzVp32tMZsCzM4UIqfvCoJF7N9mBf6dsAxh1/ZgViy75Fht78pGo3JwZXW8osMbFSRpmWD7fxlUM5S7TQOYQug==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.15.tgz",
+ "integrity": "sha512-jwWol+zo+ItKBzPm9i80bEL6seHMsV0wKSaViVMQ4TqHtEbNeFE8sFEc2NTr18VNBnQOdlQPnEWmdboXBUrGcA==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.12",
- "@storybook/preview-api": "7.6.12"
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/preview-api": "7.6.15"
},
"funding": {
"type": "opencollective",
@@ -5835,17 +5837,17 @@
}
},
"node_modules/@storybook/core-client/node_modules/@storybook/preview-api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz",
- "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz",
+ "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/types": "7.6.12",
+ "@storybook/types": "7.6.15",
"@types/qs": "^6.9.5",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
@@ -5861,14 +5863,14 @@
}
},
"node_modules/@storybook/core-common": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.12.tgz",
- "integrity": "sha512-kM9YiBBMM2x5v/oylL7gdO1PS4oehgJC21MivS9p5QZ8uuXKtCQ6UQvI3rzaV+1ZzUA4n+I8MyaMrNIQk8KDbw==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.15.tgz",
+ "integrity": "sha512-VGmcLJ5U1r1s8/YnLbKcyB4GnNL+/sZIPqwlcSKzDXO76HoVFv1kywf7PbASote7P3gdhLSxBdg95LH2bdIbmw==",
"dev": true,
"dependencies": {
- "@storybook/core-events": "7.6.12",
- "@storybook/node-logger": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/core-events": "7.6.15",
+ "@storybook/node-logger": "7.6.15",
+ "@storybook/types": "7.6.15",
"@types/find-cache-dir": "^3.2.1",
"@types/node": "^18.0.0",
"@types/node-fetch": "^2.6.4",
@@ -5896,9 +5898,9 @@
}
},
"node_modules/@storybook/core-common/node_modules/@types/node": {
- "version": "18.19.12",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.12.tgz",
- "integrity": "sha512-uLcpWEAvatBEubmgCMzWforZbAu1dT9syweWnU3/DNwbeUBq2miP5nG8Y4JL9MDMKWt+7Yv1CSvA8xELdEl54w==",
+ "version": "18.19.15",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz",
+ "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
@@ -6017,9 +6019,9 @@
}
},
"node_modules/@storybook/core-events": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.12.tgz",
- "integrity": "sha512-IO4cwk7bBCKH6lLnnIlHO9FwQXt/9CzLUAoZSY9msWsdPppCdKlw8ynJI5YarSNKDBUn8ArIfnRf0Mve0KQr9Q==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.15.tgz",
+ "integrity": "sha512-i4YnjGecbpGyrFe0340sPhQ9QjZZEBqvMy6kF4XWt6DYLHxZmsTj1HEdvxVl4Ej7V49Vw0Dm8MepJ1d4Y8MKrQ==",
"dev": true,
"dependencies": {
"ts-dedent": "^2.0.0"
@@ -6030,26 +6032,26 @@
}
},
"node_modules/@storybook/core-server": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.12.tgz",
- "integrity": "sha512-tjWifKsDnIc8pvbjVyQrOHef70Gcp93Bg3WwuysB8PGk7lcX2RD9zv44HNIyjxdOLSSv66IGKrOldEBL3hab4w==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.15.tgz",
+ "integrity": "sha512-iIlxEAkrmKTSA3iGNqt/4QG7hf5suxBGYIB3DZAOfBo8EdZogMYaEmuCm5dbuaJr0mcVwlqwdhQiWb1VsR/NhA==",
"dev": true,
"dependencies": {
"@aw-web-design/x-default-browser": "1.4.126",
"@discoveryjs/json-ext": "^0.5.3",
- "@storybook/builder-manager": "7.6.12",
- "@storybook/channels": "7.6.12",
- "@storybook/core-common": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/builder-manager": "7.6.15",
+ "@storybook/channels": "7.6.15",
+ "@storybook/core-common": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
- "@storybook/csf-tools": "7.6.12",
+ "@storybook/csf-tools": "7.6.15",
"@storybook/docs-mdx": "^0.1.0",
"@storybook/global": "^5.0.0",
- "@storybook/manager": "7.6.12",
- "@storybook/node-logger": "7.6.12",
- "@storybook/preview-api": "7.6.12",
- "@storybook/telemetry": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/manager": "7.6.15",
+ "@storybook/node-logger": "7.6.15",
+ "@storybook/preview-api": "7.6.15",
+ "@storybook/telemetry": "7.6.15",
+ "@storybook/types": "7.6.15",
"@types/detect-port": "^1.3.0",
"@types/node": "^18.0.0",
"@types/pretty-hrtime": "^1.0.0",
@@ -6083,17 +6085,17 @@
}
},
"node_modules/@storybook/core-server/node_modules/@storybook/preview-api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz",
- "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz",
+ "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/types": "7.6.12",
+ "@storybook/types": "7.6.15",
"@types/qs": "^6.9.5",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
@@ -6109,9 +6111,9 @@
}
},
"node_modules/@storybook/core-server/node_modules/@types/node": {
- "version": "18.19.12",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.12.tgz",
- "integrity": "sha512-uLcpWEAvatBEubmgCMzWforZbAu1dT9syweWnU3/DNwbeUBq2miP5nG8Y4JL9MDMKWt+7Yv1CSvA8xELdEl54w==",
+ "version": "18.19.15",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz",
+ "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
@@ -6184,9 +6186,9 @@
}
},
"node_modules/@storybook/core-server/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -6226,12 +6228,12 @@
}
},
"node_modules/@storybook/csf-plugin": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.12.tgz",
- "integrity": "sha512-fe/84AyctJcrpH1F/tTBxKrbjv0ilmG3ZTwVcufEiAzupZuYjQ/0P+Pxs8m8VxiGJZZ1pWofFFDbYi+wERjamQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.15.tgz",
+ "integrity": "sha512-5Pm2B8XKNdG3fHyItWKbWnXHSRDFSvetlML+sMWGWYIjwOsnvPqt+gAvLksWhv/uJgDujGxNcPEh+/Y5C8ZAjQ==",
"dev": true,
"dependencies": {
- "@storybook/csf-tools": "7.6.12",
+ "@storybook/csf-tools": "7.6.15",
"unplugin": "^1.3.1"
},
"funding": {
@@ -6240,9 +6242,9 @@
}
},
"node_modules/@storybook/csf-tools": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.12.tgz",
- "integrity": "sha512-MdhkYYxSW5I6Jpk34gTkAZsuj9sxe0xdyeUQpNa8CgJxG43F+ehZ6scW/IPjoSG9gCXBUJMekq26UrmbVfsLCQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.15.tgz",
+ "integrity": "sha512-8iKgg2cmbFTpVhRRJOqouhPcEh0c8ywabG4S8ICZvnJooSXUI9mD9p3tYCS7MYuSiHj0epa1Kkn9DtXJRo9o6g==",
"dev": true,
"dependencies": {
"@babel/generator": "^7.23.0",
@@ -6250,7 +6252,7 @@
"@babel/traverse": "^7.23.2",
"@babel/types": "^7.23.0",
"@storybook/csf": "^0.1.2",
- "@storybook/types": "7.6.12",
+ "@storybook/types": "7.6.15",
"fs-extra": "^11.1.0",
"recast": "^0.23.1",
"ts-dedent": "^2.0.0"
@@ -6281,14 +6283,14 @@
"dev": true
},
"node_modules/@storybook/docs-tools": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.12.tgz",
- "integrity": "sha512-nY2lqEDTd/fR/D91ZLlIp+boSuJtkb8DqHW7pECy61rJqzGq4QpepRaWjQDKnGTgPItrsPfTPOu6iXvXNK07Ow==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.15.tgz",
+ "integrity": "sha512-npZEaI9Wpn9uJcRXFElqyiRw8bSxt95mLywPiEEGMT2kE5FfXM8d5Uj5O64kzoXdRI9IhRPEEZZidOtA/UInfQ==",
"dev": true,
"dependencies": {
- "@storybook/core-common": "7.6.12",
- "@storybook/preview-api": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/core-common": "7.6.15",
+ "@storybook/preview-api": "7.6.15",
+ "@storybook/types": "7.6.15",
"@types/doctrine": "^0.0.3",
"assert": "^2.1.0",
"doctrine": "^3.0.0",
@@ -6300,17 +6302,17 @@
}
},
"node_modules/@storybook/docs-tools/node_modules/@storybook/preview-api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz",
- "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz",
+ "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/types": "7.6.12",
+ "@storybook/types": "7.6.15",
"@types/qs": "^6.9.5",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
@@ -6332,9 +6334,9 @@
"dev": true
},
"node_modules/@storybook/manager": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.12.tgz",
- "integrity": "sha512-WMWvswJHGiqJFJb98WQMQfZQhLuVtmci4y/VJGQ/Jnq1nJQs76BCtaeGiHcsYmRaAP1HMI4DbzuTSEgca146xw==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.15.tgz",
+ "integrity": "sha512-GGV2ElV5AOIApy/FSDzoSlLUbyd2VhQVD3TdNGRxNauYRjEO8ulXHw2tNbT6ludtpYpDTAILzI6zT/iag8hmPQ==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -6342,19 +6344,19 @@
}
},
"node_modules/@storybook/manager-api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.12.tgz",
- "integrity": "sha512-XA5KQpY44d6mlqt0AlesZ7fsPpm1PCpoV+nRGFBR0YtF6RdPFvrPyHhlGgLkJC4xSyb2YJmLKn8cERSluAcEgQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.15.tgz",
+ "integrity": "sha512-cPBsXcnJiaO3QyaEum2JgdihYea3cI03FeV35JdrBYLIelT4oqbYFnzjznsFg9+Ia9iAbz7aOBNyyRsWnC/UKw==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/router": "7.6.12",
- "@storybook/theming": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/router": "7.6.15",
+ "@storybook/theming": "7.6.15",
+ "@storybook/types": "7.6.15",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
"memoizerific": "^1.11.3",
@@ -6374,9 +6376,9 @@
"dev": true
},
"node_modules/@storybook/node-logger": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.12.tgz",
- "integrity": "sha512-iS44/EjfF6hLecKzICmcpQoB9bmVi4tXx5gVXnbI5ZyziBibRQcg/U191Njl7wY2ScN/RCQOr8lh5k57rI3Prg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.15.tgz",
+ "integrity": "sha512-C+sCvRjR+5uVU3VTrfyv7/RlPBxesAjIucUAK0keGyIZ7sFQYCPdkm4m/C4s+TcubgAzVvuoUHlRrSppdA7WzQ==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -6384,9 +6386,9 @@
}
},
"node_modules/@storybook/postinstall": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.12.tgz",
- "integrity": "sha512-uR0mDPxLzPaouCNrLp8vID8lATVTOtG7HB6lfjjzMdE3sN6MLmK9n2z2nXjb5DRRxOFWMeE1/4Age1/Ml2tnmA==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.15.tgz",
+ "integrity": "sha512-DXQQ4kjAbQ7BSd9M4lDI/12vEEciYMP8uYFDlrPFjwD9LezsxtRiORkazjNRRX4730faO5zZsnWhXxCVkxck0g==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -6394,9 +6396,9 @@
}
},
"node_modules/@storybook/preview": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.12.tgz",
- "integrity": "sha512-7vbeqQY3X+FCt/ccgCuBmj4rkbQebLHGEBAt8elcX0E2pr7SGW57lWhnasU3jeMaz7tNrkcs0gfl4hyVRWUHDg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.15.tgz",
+ "integrity": "sha512-q8d9v0+Bo/DHLV68OyV3Klep4knf2GAbrlHhLW1X4jlPccuEDUojIfqfK7m48ayeIxJzO48fcO0JdKM1XABx7g==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -6490,9 +6492,9 @@
}
},
"node_modules/@storybook/react-dom-shim": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.12.tgz",
- "integrity": "sha512-P8eu/s/RQlc/7Yvr260lqNa6rttxIYiPUuHQBu9oCacwkpB3Xep2R/PUY2CifRHqlDhaOINO/Z79oGZl4EBQRQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.15.tgz",
+ "integrity": "sha512-2+X0HIxIyvjfSKVyGGjSJJLEFJ2ox7Rr8FjlMiRo5QfoOJhohZuWH7p4Lw7JMwm5PotnjrwlfsZI3cCilYJeYA==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -6504,12 +6506,12 @@
}
},
"node_modules/@storybook/router": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.12.tgz",
- "integrity": "sha512-1fqscJbePFJXhapqiv7fAIIqAvouSsdPnqWjJGJrUMR6JBtRYMcrb3MnDeqi9OYnU73r65BrQBPtSzWM8nP0LQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.15.tgz",
+ "integrity": "sha512-5yhXXoVZ1iKUgeZoO8PGqBclrLgoJisxIYVK/Y1iJMXZ2ZvwUiTswLALT6lu97tSrcoBVxmqSghg0+U0YEU4Fg==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.12",
+ "@storybook/client-logger": "7.6.15",
"memoizerific": "^1.11.3",
"qs": "^6.10.0"
},
@@ -6519,14 +6521,14 @@
}
},
"node_modules/@storybook/telemetry": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.12.tgz",
- "integrity": "sha512-eBG3sLb9CZ05pyK2JXBvnaAsxDzbZH57VyhtphhuZmx0DqF/78qIoHs9ebRJpJWV0sL5rtT9vIq8QXpQhDHLWg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.15.tgz",
+ "integrity": "sha512-klhKXLUS3OXozGEtMbbhKZLDfm+m3nNk2jvGwD6kkBenzFUzb0P2m8awxU7h1pBcKZKH/27U9t3KVzNFzWoWPw==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-common": "7.6.12",
- "@storybook/csf-tools": "7.6.12",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-common": "7.6.15",
+ "@storybook/csf-tools": "7.6.15",
"chalk": "^4.1.0",
"detect-package-manager": "^2.0.1",
"fetch-retry": "^5.0.2",
@@ -6605,13 +6607,13 @@
}
},
"node_modules/@storybook/theming": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.12.tgz",
- "integrity": "sha512-P4zoMKlSYbNrWJjQROuz+DZSDEpdf3TUvk203EqBRdElqw2EMHcqZ8+0HGPFfVHpqEj05+B9Mr6R/Z/BURj0lw==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.15.tgz",
+ "integrity": "sha512-9PpsHAbUf6o0w33/P3mnb7QheTmfGlTYCismj5HMM1O2/zY0kQK9XcG9W+Cyvu56D/lFC19fz9YHQY8W4AbfnQ==",
"dev": true,
"dependencies": {
"@emotion/use-insertion-effect-with-fallbacks": "^1.0.0",
- "@storybook/client-logger": "7.6.12",
+ "@storybook/client-logger": "7.6.15",
"@storybook/global": "^5.0.0",
"memoizerific": "^1.11.3"
},
@@ -6625,12 +6627,12 @@
}
},
"node_modules/@storybook/types": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.12.tgz",
- "integrity": "sha512-Wsbd+NS10/2yMHQ/26rXHflXam0hm2qufTFiHOX6VXZWxij3slRU88Fnwzp+1QSyjXb0qkEr8dOx7aG00+ItVw==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.15.tgz",
+ "integrity": "sha512-tLH0lK6SXECSfMpKin9bge+7XiHZII17n6jc9ZI1TfSBZJyq3M6VzWh2r1C2lC97FlkcKXjIwM3n8h1xNjnI+A==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
+ "@storybook/channels": "7.6.15",
"@types/babel__core": "^7.0.0",
"@types/express": "^4.7.0",
"file-system-cache": "2.3.0"
@@ -6641,18 +6643,18 @@
}
},
"node_modules/@storybook/web-components": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.6.12.tgz",
- "integrity": "sha512-kPGLXk8iu71XdInOCPeCpZE4uUJYWBveHfSuBYzuJrrR0UPVbpIHGSH/a3CcixSX/01NLPrZ2stc1dfB/hJr6A==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.6.15.tgz",
+ "integrity": "sha512-ebCkPZNkeRPfM+q0jQZDWkSojRIi8vpziCpJtDx20itT14izSKlLuBgIv3LO304btC07Yh2gRcfG2gleh8pzMQ==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-client": "7.6.12",
- "@storybook/docs-tools": "7.6.12",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-client": "7.6.15",
+ "@storybook/docs-tools": "7.6.15",
"@storybook/global": "^5.0.0",
- "@storybook/manager-api": "7.6.12",
- "@storybook/preview-api": "7.6.12",
- "@storybook/types": "7.6.12",
+ "@storybook/manager-api": "7.6.15",
+ "@storybook/preview-api": "7.6.15",
+ "@storybook/types": "7.6.15",
"tiny-invariant": "^1.3.1",
"ts-dedent": "^2.0.0"
},
@@ -6668,15 +6670,15 @@
}
},
"node_modules/@storybook/web-components-vite": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.6.12.tgz",
- "integrity": "sha512-kXDIYYBnbvMWXLOIDebqbxgr0GcNrE4Dd8P3UFgKXS5B298vAm5y/FRfTTcldYKoKFed5O3BksgTJT1AQV67Qg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.6.15.tgz",
+ "integrity": "sha512-+E53U3innNAljuY9aWBr82Cp3HcnVxOPCkEw0EjS1h+Yzrg76QGVtgKu8+qMMa6OKSTXF0E+7pi8Vt9+sHVATQ==",
"dev": true,
"dependencies": {
- "@storybook/builder-vite": "7.6.12",
- "@storybook/core-server": "7.6.12",
- "@storybook/node-logger": "7.6.12",
- "@storybook/web-components": "7.6.12",
+ "@storybook/builder-vite": "7.6.15",
+ "@storybook/core-server": "7.6.15",
+ "@storybook/node-logger": "7.6.15",
+ "@storybook/web-components": "7.6.15",
"magic-string": "^0.30.0"
},
"engines": {
@@ -6688,17 +6690,17 @@
}
},
"node_modules/@storybook/web-components/node_modules/@storybook/preview-api": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz",
- "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz",
+ "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.12",
- "@storybook/client-logger": "7.6.12",
- "@storybook/core-events": "7.6.12",
+ "@storybook/channels": "7.6.15",
+ "@storybook/client-logger": "7.6.15",
+ "@storybook/core-events": "7.6.15",
"@storybook/csf": "^0.1.2",
"@storybook/global": "^5.0.0",
- "@storybook/types": "7.6.12",
+ "@storybook/types": "7.6.15",
"@types/qs": "^6.9.5",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
@@ -7594,16 +7596,16 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.20.0.tgz",
- "integrity": "sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.1.tgz",
+ "integrity": "sha512-OLvgeBv3vXlnnJGIAgCLYKjgMEU+wBGj07MQ/nxAaON+3mLzX7mJbhRYrVGiVvFiXtwFlkcBa/TtmglHy0UbzQ==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.5.1",
- "@typescript-eslint/scope-manager": "6.20.0",
- "@typescript-eslint/type-utils": "6.20.0",
- "@typescript-eslint/utils": "6.20.0",
- "@typescript-eslint/visitor-keys": "6.20.0",
+ "@typescript-eslint/scope-manager": "7.0.1",
+ "@typescript-eslint/type-utils": "7.0.1",
+ "@typescript-eslint/utils": "7.0.1",
+ "@typescript-eslint/visitor-keys": "7.0.1",
"debug": "^4.3.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.4",
@@ -7619,8 +7621,8 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
- "eslint": "^7.0.0 || ^8.0.0"
+ "@typescript-eslint/parser": "^7.0.0",
+ "eslint": "^8.56.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -7662,15 +7664,15 @@
"dev": true
},
"node_modules/@typescript-eslint/parser": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.20.0.tgz",
- "integrity": "sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.1.tgz",
+ "integrity": "sha512-8GcRRZNzaHxKzBPU3tKtFNing571/GwPBeCvmAUw0yBtfE2XVd0zFKJIMSWkHJcPQi0ekxjIts6L/rrZq5cxGQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "6.20.0",
- "@typescript-eslint/types": "6.20.0",
- "@typescript-eslint/typescript-estree": "6.20.0",
- "@typescript-eslint/visitor-keys": "6.20.0",
+ "@typescript-eslint/scope-manager": "7.0.1",
+ "@typescript-eslint/types": "7.0.1",
+ "@typescript-eslint/typescript-estree": "7.0.1",
+ "@typescript-eslint/visitor-keys": "7.0.1",
"debug": "^4.3.4"
},
"engines": {
@@ -7681,7 +7683,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
+ "eslint": "^8.56.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -7690,13 +7692,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz",
- "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.1.tgz",
+ "integrity": "sha512-v7/T7As10g3bcWOOPAcbnMDuvctHzCFYCG/8R4bK4iYzdFqsZTbXGln0cZNVcwQcwewsYU2BJLay8j0/4zOk4w==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.20.0",
- "@typescript-eslint/visitor-keys": "6.20.0"
+ "@typescript-eslint/types": "7.0.1",
+ "@typescript-eslint/visitor-keys": "7.0.1"
},
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -7707,13 +7709,13 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.20.0.tgz",
- "integrity": "sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.1.tgz",
+ "integrity": "sha512-YtT9UcstTG5Yqy4xtLiClm1ZpM/pWVGFnkAa90UfdkkZsR1eP2mR/1jbHeYp8Ay1l1JHPyGvoUYR6o3On5Nhmw==",
"dev": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "6.20.0",
- "@typescript-eslint/utils": "6.20.0",
+ "@typescript-eslint/typescript-estree": "7.0.1",
+ "@typescript-eslint/utils": "7.0.1",
"debug": "^4.3.4",
"ts-api-utils": "^1.0.1"
},
@@ -7725,7 +7727,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
+ "eslint": "^8.56.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -7734,9 +7736,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz",
- "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.1.tgz",
+ "integrity": "sha512-uJDfmirz4FHib6ENju/7cz9SdMSkeVvJDK3VcMFvf/hAShg8C74FW+06MaQPODHfDJp/z/zHfgawIJRjlu0RLg==",
"dev": true,
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -7747,13 +7749,13 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz",
- "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.1.tgz",
+ "integrity": "sha512-SO9wHb6ph0/FN5OJxH4MiPscGah5wjOd0RRpaLvuBv9g8565Fgu0uMySFEPqwPHiQU90yzJ2FjRYKGrAhS1xig==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.20.0",
- "@typescript-eslint/visitor-keys": "6.20.0",
+ "@typescript-eslint/types": "7.0.1",
+ "@typescript-eslint/visitor-keys": "7.0.1",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -7811,9 +7813,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -7832,17 +7834,17 @@
"dev": true
},
"node_modules/@typescript-eslint/utils": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz",
- "integrity": "sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.1.tgz",
+ "integrity": "sha512-oe4his30JgPbnv+9Vef1h48jm0S6ft4mNwi9wj7bX10joGn07QRfqIqFHoMiajrtoU88cIhXf8ahwgrcbNLgPA==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.12",
"@types/semver": "^7.5.0",
- "@typescript-eslint/scope-manager": "6.20.0",
- "@typescript-eslint/types": "6.20.0",
- "@typescript-eslint/typescript-estree": "6.20.0",
+ "@typescript-eslint/scope-manager": "7.0.1",
+ "@typescript-eslint/types": "7.0.1",
+ "@typescript-eslint/typescript-estree": "7.0.1",
"semver": "^7.5.4"
},
"engines": {
@@ -7853,7 +7855,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
+ "eslint": "^8.56.0"
}
},
"node_modules/@typescript-eslint/utils/node_modules/lru-cache": {
@@ -7869,9 +7871,9 @@
}
},
"node_modules/@typescript-eslint/utils/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -7890,12 +7892,12 @@
"dev": true
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz",
- "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.1.tgz",
+ "integrity": "sha512-hwAgrOyk++RTXrP4KzCg7zB2U0xt7RUU0ZdMSCsqF3eKUwkdXUMyTb0qdCuji7VIbcpG62kKTU9M1J1c9UpFBw==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.20.0",
+ "@typescript-eslint/types": "7.0.1",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
@@ -9337,9 +9339,9 @@
"dev": true
},
"node_modules/cytoscape": {
- "version": "3.26.0",
- "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.26.0.tgz",
- "integrity": "sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==",
+ "version": "3.28.1",
+ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.28.1.tgz",
+ "integrity": "sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg==",
"dependencies": {
"heap": "^0.2.6",
"lodash": "^4.17.21"
@@ -9359,30 +9361,6 @@
"cytoscape": "^3.2.0"
}
},
- "node_modules/cytoscape-fcose": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz",
- "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==",
- "dependencies": {
- "cose-base": "^2.2.0"
- },
- "peerDependencies": {
- "cytoscape": "^3.2.0"
- }
- },
- "node_modules/cytoscape-fcose/node_modules/cose-base": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz",
- "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==",
- "dependencies": {
- "layout-base": "^2.0.0"
- }
- },
- "node_modules/cytoscape-fcose/node_modules/layout-base": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz",
- "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="
- },
"node_modules/d3": {
"version": "7.8.5",
"resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz",
@@ -10248,9 +10226,9 @@
}
},
"node_modules/envinfo": {
- "version": "7.11.0",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
- "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==",
+ "version": "7.11.1",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz",
+ "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==",
"dev": true,
"bin": {
"envinfo": "dist/cli.js"
@@ -10563,12 +10541,12 @@
}
},
"node_modules/eslint-plugin-sonarjs": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.23.0.tgz",
- "integrity": "sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.24.0.tgz",
+ "integrity": "sha512-87zp50mbbNrSTuoEOebdRQBPa0mdejA5UEjyuScyIw8hEpEjfWP89Qhkq5xVZfVyVSRQKZc9alVm7yRKQvvUmg==",
"dev": true,
"engines": {
- "node": ">=14"
+ "node": ">=16"
},
"peerDependencies": {
"eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
@@ -11465,9 +11443,9 @@
"dev": true
},
"node_modules/flow-parser": {
- "version": "0.227.0",
- "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.227.0.tgz",
- "integrity": "sha512-nOygtGKcX/siZK/lFzpfdHEfOkfGcTW7rNroR1Zsz6T/JxSahPALXVt5qVHq/fgvMJuv096BTKbgxN3PzVBaDA==",
+ "version": "0.228.0",
+ "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.228.0.tgz",
+ "integrity": "sha512-xPWkzCO07AnS8X+fQFpWm+tJ+C7aeaiVzJ+rSepbkCXUvUJ6l6squEl63axoMcixyH4wLjmypOzq/+zTD0O93w==",
"dev": true,
"engines": {
"node": ">=0.4.0"
@@ -13728,16 +13706,15 @@
}
},
"node_modules/mermaid": {
- "version": "10.7.0",
- "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.7.0.tgz",
- "integrity": "sha512-PsvGupPCkN1vemAAjScyw4pw34p4/0dZkSrqvAB26hUvJulOWGIwt35FZWmT9wPIi4r0QLa5X0PB4YLIGn0/YQ==",
+ "version": "10.8.0",
+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.8.0.tgz",
+ "integrity": "sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==",
"dependencies": {
"@braintree/sanitize-url": "^6.0.1",
"@types/d3-scale": "^4.0.3",
"@types/d3-scale-chromatic": "^3.0.0",
- "cytoscape": "^3.23.0",
+ "cytoscape": "^3.28.1",
"cytoscape-cose-bilkent": "^4.1.0",
- "cytoscape-fcose": "^2.1.0",
"d3": "^7.4.0",
"d3-sankey": "^0.12.3",
"dagre-d3-es": "7.0.10",
@@ -14602,9 +14579,9 @@
}
},
"node_modules/node-fetch-native": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.1.tgz",
- "integrity": "sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==",
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz",
+ "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==",
"dev": true
},
"node_modules/node-int64": {
@@ -15509,9 +15486,9 @@
}
},
"node_modules/prettier": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz",
- "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==",
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
+ "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
"dev": true,
"bin": {
"prettier": "bin/prettier.cjs"
@@ -16443,9 +16420,9 @@
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
},
"node_modules/rollup": {
- "version": "4.9.6",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz",
- "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.10.0.tgz",
+ "integrity": "sha512-t2v9G2AKxcQ8yrG+WGxctBes1AomT0M4ND7jTFBCVPXQ/WFTvNSefIrNSmLKhIKBrvN8SG+CZslimJcT3W2u2g==",
"dev": true,
"dependencies": {
"@types/estree": "1.0.5"
@@ -16458,19 +16435,19 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.9.6",
- "@rollup/rollup-android-arm64": "4.9.6",
- "@rollup/rollup-darwin-arm64": "4.9.6",
- "@rollup/rollup-darwin-x64": "4.9.6",
- "@rollup/rollup-linux-arm-gnueabihf": "4.9.6",
- "@rollup/rollup-linux-arm64-gnu": "4.9.6",
- "@rollup/rollup-linux-arm64-musl": "4.9.6",
- "@rollup/rollup-linux-riscv64-gnu": "4.9.6",
- "@rollup/rollup-linux-x64-gnu": "4.9.6",
- "@rollup/rollup-linux-x64-musl": "4.9.6",
- "@rollup/rollup-win32-arm64-msvc": "4.9.6",
- "@rollup/rollup-win32-ia32-msvc": "4.9.6",
- "@rollup/rollup-win32-x64-msvc": "4.9.6",
+ "@rollup/rollup-android-arm-eabi": "4.10.0",
+ "@rollup/rollup-android-arm64": "4.10.0",
+ "@rollup/rollup-darwin-arm64": "4.10.0",
+ "@rollup/rollup-darwin-x64": "4.10.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.10.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.10.0",
+ "@rollup/rollup-linux-arm64-musl": "4.10.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.10.0",
+ "@rollup/rollup-linux-x64-gnu": "4.10.0",
+ "@rollup/rollup-linux-x64-musl": "4.10.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.10.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.10.0",
+ "@rollup/rollup-win32-x64-msvc": "4.10.0",
"fsevents": "~2.3.2"
}
},
@@ -17081,12 +17058,12 @@
"dev": true
},
"node_modules/storybook": {
- "version": "7.6.12",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.12.tgz",
- "integrity": "sha512-zcH9CwIsE8N4PX3he5vaJ3mTTWGxu7cxJ/ag9oja/k3N5/IvQjRyIU1TLkRVb28BB8gaLyorpnc4C4aLVGy4WQ==",
+ "version": "7.6.15",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.15.tgz",
+ "integrity": "sha512-Ybezq9JRk5CBhzjgzZ/oT7mnU45UwhyVSGKW+PUKZGGUG9VH2hCrTEES9f/zEF82kj/5COVPyqR/5vlXuuS39A==",
"dev": true,
"dependencies": {
- "@storybook/cli": "7.6.12"
+ "@storybook/cli": "7.6.15"
},
"bin": {
"sb": "index.js",
@@ -18031,9 +18008,9 @@
}
},
"node_modules/ufo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz",
- "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz",
+ "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==",
"dev": true
},
"node_modules/uglify-js": {
diff --git a/web/package.json b/web/package.json
index 90b1486939..1fe3fc2a24 100644
--- a/web/package.json
+++ b/web/package.json
@@ -8,9 +8,9 @@
"build-locales": "run-s build-locales:build",
"build-locales:build": "lit-localize build",
"build-locales:repair": "prettier --write ./src/locale-codes.ts",
- "rollup:build": "cross-env NODE_OPTIONS='--max_old_space_size=4096' rollup -c ./rollup.config.mjs",
- "rollup:build-proxy": "cross-env NODE_OPTIONS='--max_old_space_size=4096' rollup -c ./rollup.proxy.mjs",
- "rollup:watch": "cross-env NODE_OPTIONS='--max_old_space_size=4096' rollup -c -w",
+ "rollup:build": "cross-env NODE_OPTIONS='--max_old_space_size=8192' rollup -c ./rollup.config.mjs",
+ "rollup:build-proxy": "cross-env NODE_OPTIONS='--max_old_space_size=8192' rollup -c ./rollup.proxy.mjs",
+ "rollup:watch": "cross-env NODE_OPTIONS='--max_old_space_size=8192' rollup -c -w",
"build": "run-s build-locales rollup:build",
"build-proxy": "run-s build-locales rollup:build-proxy",
"watch": "run-s build-locales rollup:watch",
@@ -28,7 +28,7 @@
"tsc:execute": "tsc --noEmit -p .",
"tsc": "run-s build-locales tsc:execute",
"storybook": "storybook dev -p 6006",
- "storybook:build": "cross-env NODE_OPTIONS='--max_old_space_size=4096' storybook build",
+ "storybook:build": "cross-env NODE_OPTIONS='--max_old_space_size=8192' storybook build",
"storybook:build-import-map": "run-s storybook:build-import-map-script storybook:run-import-map-script",
"storybook:build-import-map-script": "cd scripts && tsc --esModuleInterop --module es2020 --target es2020 --moduleResolution 'node' build-storybook-import-maps.ts && mv build-storybook-import-maps.js build-storybook-import-maps.mjs",
"storybook:run-import-map-script": "node scripts/build-storybook-import-maps.mjs"
@@ -36,20 +36,20 @@
"dependencies": {
"@codemirror/lang-html": "^6.4.8",
"@codemirror/lang-javascript": "^6.2.1",
- "@codemirror/lang-python": "^6.1.3",
+ "@codemirror/lang-python": "^6.1.4",
"@codemirror/lang-xml": "^6.0.2",
"@codemirror/legacy-modes": "^6.3.3",
"@codemirror/theme-one-dark": "^6.1.2",
"@formatjs/intl-listformat": "^7.5.5",
"@fortawesome/fontawesome-free": "^6.5.1",
- "@goauthentik/api": "^2023.10.7-1706576211",
+ "@goauthentik/api": "^2023.10.7-1707933453",
"@lit-labs/context": "^0.4.0",
"@lit-labs/task": "^3.1.0",
"@lit/localize": "^0.11.4",
"@open-wc/lit-helpers": "^0.6.0",
"@patternfly/elements": "^2.4.0",
"@patternfly/patternfly": "^4.224.2",
- "@sentry/browser": "^7.99.0",
+ "@sentry/browser": "^7.101.0",
"@webcomponents/webcomponentsjs": "^2.8.0",
"base64-js": "^1.5.1",
"chart.js": "^4.4.1",
@@ -61,7 +61,7 @@
"fuse.js": "^7.0.0",
"guacamole-common-js": "^1.5.0",
"lit": "^2.8.0",
- "mermaid": "^10.7.0",
+ "mermaid": "^10.8.0",
"rapidoc": "^9.3.4",
"style-mod": "^4.1.0",
"webcomponent-qr-code": "^1.2.0",
@@ -86,21 +86,21 @@
"@rollup/plugin-replace": "^5.0.5",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^11.1.6",
- "@spotlightjs/spotlight": "^1.2.10",
- "@storybook/addon-essentials": "^7.6.12",
- "@storybook/addon-links": "^7.6.12",
- "@storybook/api": "^7.6.12",
+ "@spotlightjs/spotlight": "^1.2.12",
+ "@storybook/addon-essentials": "^7.6.15",
+ "@storybook/addon-links": "^7.6.15",
+ "@storybook/api": "^7.6.15",
"@storybook/blocks": "^7.6.4",
- "@storybook/manager-api": "^7.6.12",
- "@storybook/web-components": "^7.6.12",
- "@storybook/web-components-vite": "^7.6.12",
+ "@storybook/manager-api": "^7.6.15",
+ "@storybook/web-components": "^7.6.15",
+ "@storybook/web-components-vite": "^7.6.15",
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@types/chart.js": "^2.9.41",
"@types/codemirror": "5.60.15",
"@types/grecaptcha": "^3.0.7",
"@types/guacamole-common-js": "1.5.2",
- "@typescript-eslint/eslint-plugin": "^6.20.0",
- "@typescript-eslint/parser": "^6.20.0",
+ "@typescript-eslint/eslint-plugin": "^7.0.1",
+ "@typescript-eslint/parser": "^7.0.1",
"babel-plugin-macros": "^3.1.0",
"babel-plugin-tsconfig-paths": "^1.0.3",
"cross-env": "^7.0.3",
@@ -108,22 +108,22 @@
"eslint-config-google": "^0.14.0",
"eslint-plugin-custom-elements": "0.0.8",
"eslint-plugin-lit": "^1.11.0",
- "eslint-plugin-sonarjs": "^0.23.0",
+ "eslint-plugin-sonarjs": "^0.24.0",
"eslint-plugin-storybook": "^0.6.15",
"github-slugger": "^2.0.0",
"lit-analyzer": "^2.0.3",
"npm-run-all": "^4.1.5",
- "prettier": "^3.2.4",
+ "prettier": "^3.2.5",
"pseudolocale": "^2.0.0",
"pyright": "=1.1.338",
"react": "^18.2.0",
"react-dom": "^18.2.0",
- "rollup": "^4.9.6",
+ "rollup": "^4.10.0",
"rollup-plugin-copy": "^3.5.0",
"rollup-plugin-cssimport": "^1.0.3",
"rollup-plugin-modify": "^3.0.0",
"rollup-plugin-postcss-lit": "^2.1.0",
- "storybook": "^7.6.12",
+ "storybook": "^7.6.15",
"storybook-addon-mock": "^4.3.0",
"ts-lit-plugin": "^2.0.2",
"tslib": "^2.6.2",
diff --git a/web/src/admin/AdminInterface/AdminInterface.ts b/web/src/admin/AdminInterface/AdminInterface.ts
index 0f1a59ccd0..dab187f8d9 100644
--- a/web/src/admin/AdminInterface/AdminInterface.ts
+++ b/web/src/admin/AdminInterface/AdminInterface.ts
@@ -7,7 +7,7 @@ import {
import { configureSentry } from "@goauthentik/common/sentry";
import { me } from "@goauthentik/common/users";
import { WebsocketClient } from "@goauthentik/common/ws";
-import { Interface } from "@goauthentik/elements/Interface";
+import { EnterpriseAwareInterface } from "@goauthentik/elements/Interface";
import "@goauthentik/elements/ak-locale-context";
import "@goauthentik/elements/enterprise/EnterpriseStatusBanner";
import "@goauthentik/elements/messages/MessageContainer";
@@ -33,7 +33,7 @@ import { AdminApi, SessionUser, UiThemeEnum, Version } from "@goauthentik/api";
import "./AdminSidebar";
@customElement("ak-interface-admin")
-export class AdminInterface extends Interface {
+export class AdminInterface extends EnterpriseAwareInterface {
@property({ type: Boolean })
notificationDrawerOpen = getURLParam("notificationDrawerOpen", false);
diff --git a/web/src/admin/applications/components/ak-backchannel-input.ts b/web/src/admin/applications/components/ak-backchannel-input.ts
index 06fccc32b1..f8f3f28ddf 100644
--- a/web/src/admin/applications/components/ak-backchannel-input.ts
+++ b/web/src/admin/applications/components/ak-backchannel-input.ts
@@ -61,7 +61,7 @@ export class AkBackchannelProvidersInput extends AKElement {
>`;
return html`
-
+
`;
}
diff --git a/web/src/admin/applications/wizard/methods/ak-application-wizard-authentication-method.ts b/web/src/admin/applications/wizard/methods/ak-application-wizard-authentication-method.ts
index 9b7e813bfc..9c940c9424 100644
--- a/web/src/admin/applications/wizard/methods/ak-application-wizard-authentication-method.ts
+++ b/web/src/admin/applications/wizard/methods/ak-application-wizard-authentication-method.ts
@@ -7,6 +7,7 @@ import "./oauth/ak-application-wizard-authentication-by-oauth";
import "./proxy/ak-application-wizard-authentication-for-forward-domain-proxy";
import "./proxy/ak-application-wizard-authentication-for-reverse-proxy";
import "./proxy/ak-application-wizard-authentication-for-single-forward-proxy";
+import "./rac/ak-application-wizard-authentication-for-rac";
import "./radius/ak-application-wizard-authentication-by-radius";
import "./saml/ak-application-wizard-authentication-by-saml-configuration";
import "./scim/ak-application-wizard-authentication-by-scim";
diff --git a/web/src/admin/applications/wizard/methods/rac/ak-application-wizard-authentication-for-rac.ts b/web/src/admin/applications/wizard/methods/rac/ak-application-wizard-authentication-for-rac.ts
new file mode 100644
index 0000000000..53ce353f47
--- /dev/null
+++ b/web/src/admin/applications/wizard/methods/rac/ak-application-wizard-authentication-for-rac.ts
@@ -0,0 +1,110 @@
+import "@goauthentik/admin/applications/wizard/ak-wizard-title";
+import "@goauthentik/admin/common/ak-flow-search/ak-flow-search";
+import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
+import "@goauthentik/components/ak-text-input";
+import "@goauthentik/elements/CodeMirror";
+import "@goauthentik/elements/forms/FormGroup";
+import "@goauthentik/elements/forms/HorizontalFormElement";
+
+import { msg } from "@lit/localize";
+import { html } from "lit";
+import { customElement, state } from "lit/decorators.js";
+import { ifDefined } from "lit/directives/if-defined.js";
+
+import {
+ FlowsInstancesListDesignationEnum,
+ PaginatedRACPropertyMappingList,
+ PropertymappingsApi,
+ RACProvider,
+} from "@goauthentik/api";
+
+import BaseProviderPanel from "../BaseProviderPanel";
+
+@customElement("ak-application-wizard-authentication-for-rac")
+export class ApplicationWizardAuthenticationByRAC extends BaseProviderPanel {
+ @state()
+ propertyMappings?: PaginatedRACPropertyMappingList;
+
+ constructor() {
+ super();
+ new PropertymappingsApi(DEFAULT_CONFIG)
+ .propertymappingsRacList({
+ ordering: "name",
+ })
+ .then((propertyMappings) => {
+ this.propertyMappings = propertyMappings;
+ });
+ }
+
+ render() {
+ const provider = this.wizard.provider as RACProvider | undefined;
+ const selected = new Set(Array.from(provider?.propertyMappings ?? []));
+ const errors = this.wizard.errors.provider;
+
+ return html`${msg("Configure Remote Access Provider Provider")}
+ `;
+ }
+}
+
+export default ApplicationWizardAuthenticationByRAC;
diff --git a/web/src/admin/applications/wizard/types.ts b/web/src/admin/applications/wizard/types.ts
index a6e86cac13..d36340c87c 100644
--- a/web/src/admin/applications/wizard/types.ts
+++ b/web/src/admin/applications/wizard/types.ts
@@ -6,6 +6,7 @@ import {
type OAuth2ProviderRequest,
type ProvidersSamlImportMetadataCreateRequest,
type ProxyProviderRequest,
+ type RACProviderRequest,
type RadiusProviderRequest,
type SAMLProviderRequest,
type SCIMProviderRequest,
@@ -16,6 +17,7 @@ export type OneOfProvider =
| Partial
| Partial
| Partial
+ | Partial
| Partial
| Partial
| Partial
diff --git a/web/src/admin/enterprise/EnterpriseLicenseForm.ts b/web/src/admin/enterprise/EnterpriseLicenseForm.ts
index ebce9938db..466a96aa71 100644
--- a/web/src/admin/enterprise/EnterpriseLicenseForm.ts
+++ b/web/src/admin/enterprise/EnterpriseLicenseForm.ts
@@ -1,3 +1,4 @@
+import { EVENT_REFRESH_ENTERPRISE } from "@goauthentik/app/common/constants";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import "@goauthentik/elements/CodeMirror";
import "@goauthentik/elements/forms/HorizontalFormElement";
@@ -34,14 +35,19 @@ export class EnterpriseLicenseForm extends ModelForm {
}
async send(data: License): Promise {
- return this.instance
- ? new EnterpriseApi(DEFAULT_CONFIG).enterpriseLicensePartialUpdate({
- licenseUuid: this.instance.licenseUuid || "",
- patchedLicenseRequest: data,
- })
- : new EnterpriseApi(DEFAULT_CONFIG).enterpriseLicenseCreate({
- licenseRequest: data,
- });
+ return (
+ this.instance
+ ? new EnterpriseApi(DEFAULT_CONFIG).enterpriseLicensePartialUpdate({
+ licenseUuid: this.instance.licenseUuid || "",
+ patchedLicenseRequest: data,
+ })
+ : new EnterpriseApi(DEFAULT_CONFIG).enterpriseLicenseCreate({
+ licenseRequest: data,
+ })
+ ).then((data) => {
+ window.dispatchEvent(new CustomEvent(EVENT_REFRESH_ENTERPRISE));
+ return data;
+ });
}
renderForm(): TemplateResult {
diff --git a/web/src/admin/property-mappings/PropertyMappingRACForm.ts b/web/src/admin/property-mappings/PropertyMappingRACForm.ts
index 72e2bb0906..145a63556b 100644
--- a/web/src/admin/property-mappings/PropertyMappingRACForm.ts
+++ b/web/src/admin/property-mappings/PropertyMappingRACForm.ts
@@ -1,4 +1,3 @@
-import { first } from "@goauthentik/app/common/utils";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { docLink } from "@goauthentik/common/global";
import "@goauthentik/elements/CodeMirror";
@@ -6,6 +5,8 @@ import { CodeMirrorMode } from "@goauthentik/elements/CodeMirror";
import "@goauthentik/elements/forms/FormGroup";
import "@goauthentik/elements/forms/HorizontalFormElement";
import { ModelForm } from "@goauthentik/elements/forms/ModelForm";
+import "@goauthentik/elements/forms/Radio";
+import type { RadioOption } from "@goauthentik/elements/forms/Radio";
import { msg } from "@lit/localize";
import { TemplateResult, html } from "lit";
@@ -14,6 +15,23 @@ import { ifDefined } from "lit/directives/if-defined.js";
import { PropertymappingsApi, RACPropertyMapping } from "@goauthentik/api";
+export const staticSettingOptions: RadioOption[] = [
+ {
+ label: msg("Unconfigured"),
+ value: undefined,
+ default: true,
+ description: html`${msg("This option will not be changed by this mapping.")}`,
+ },
+ {
+ label: msg("Enabled"),
+ value: "true",
+ },
+ {
+ label: msg("Disabled"),
+ value: "false",
+ },
+];
+
@customElement("ak-property-mapping-rac-form")
export class PropertyMappingLDAPForm extends ModelForm {
loadInstance(pk: string): Promise {
@@ -58,7 +76,6 @@ export class PropertyMappingLDAPForm extends ModelForm
${msg("RDP settings")}
diff --git a/web/src/admin/property-mappings/PropertyMappingTestForm.ts b/web/src/admin/property-mappings/PropertyMappingTestForm.ts
index e81af9a0c8..e3e010ef73 100644
--- a/web/src/admin/property-mappings/PropertyMappingTestForm.ts
+++ b/web/src/admin/property-mappings/PropertyMappingTestForm.ts
@@ -84,12 +84,14 @@ export class PolicyTestForm extends Form {
user: this.request?.user || 0,
context: {
ldap: {
- name: "test-user",
- objectSid: "S-1-5-21-2611707862-2219215769-354220275-1137",
- objectClass: "person",
displayName: "authentik test user",
- sAMAccountName: "sAMAccountName",
distinguishedName: "cn=user,ou=users,dc=goauthentik,dc=io",
+ givenName: "test",
+ name: "test-user",
+ objectClass: "person",
+ objectSid: "S-1-5-21-2611707862-2219215769-354220275-1137",
+ sAMAccountName: "sAMAccountName",
+ sn: "user",
},
},
};
diff --git a/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts b/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts
index c34f56b61a..7ec25d5a51 100644
--- a/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts
+++ b/web/src/admin/providers/oauth2/OAuth2ProviderViewPage.ts
@@ -3,7 +3,6 @@ import "@goauthentik/admin/providers/oauth2/OAuth2ProviderForm";
import renderDescriptionList from "@goauthentik/app/components/DescriptionList";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EVENT_REFRESH } from "@goauthentik/common/constants";
-import { convertToTitle } from "@goauthentik/common/utils";
import "@goauthentik/components/events/ObjectChangelog";
import MDProviderOAuth2 from "@goauthentik/docs/providers/oauth2/index.md";
import { AKElement } from "@goauthentik/elements/Base";
@@ -31,6 +30,7 @@ import PFGrid from "@patternfly/patternfly/layouts/Grid/grid.css";
import PFBase from "@patternfly/patternfly/patternfly-base.css";
import {
+ ClientTypeEnum,
CoreApi,
CoreUsersListRequest,
OAuth2Provider,
@@ -41,6 +41,18 @@ import {
User,
} from "@goauthentik/api";
+export function TypeToLabel(type?: ClientTypeEnum): string {
+ if (!type) return "";
+ switch (type) {
+ case ClientTypeEnum.Confidential:
+ return msg("Confidential");
+ case ClientTypeEnum.Public:
+ return msg("Public");
+ case ClientTypeEnum.UnknownDefaultOpenApi:
+ return msg("Unknown type");
+ }
+}
+
@customElement("ak-provider-oauth2-view")
export class OAuth2ProviderViewPage extends AKElement {
@property({ type: Number })
@@ -198,7 +210,7 @@ export class OAuth2ProviderViewPage extends AKElement {
- ${convertToTitle(this.provider.clientType || "")}
+ ${TypeToLabel(this.provider.clientType)}
diff --git a/web/src/admin/providers/rac/ConnectionTokenList.ts b/web/src/admin/providers/rac/ConnectionTokenList.ts
new file mode 100644
index 0000000000..93ee5ddf15
--- /dev/null
+++ b/web/src/admin/providers/rac/ConnectionTokenList.ts
@@ -0,0 +1,98 @@
+import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
+import { uiConfig } from "@goauthentik/common/ui/config";
+import "@goauthentik/elements/buttons/SpinnerButton";
+import "@goauthentik/elements/forms/DeleteBulkForm";
+import "@goauthentik/elements/forms/ModalForm";
+import { PaginatedResponse, Table } from "@goauthentik/elements/table/Table";
+import { TableColumn } from "@goauthentik/elements/table/Table";
+import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
+
+import { msg } from "@lit/localize";
+import { CSSResult, TemplateResult, html } from "lit";
+import { customElement, property } from "lit/decorators.js";
+
+import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css";
+
+import { ConnectionToken, Endpoint, RACProvider, RacApi } from "@goauthentik/api";
+
+@customElement("ak-rac-connection-token-list")
+export class ConnectionTokenListPage extends Table {
+ checkbox = true;
+ clearOnRefresh = true;
+
+ searchEnabled(): boolean {
+ return true;
+ }
+
+ @property()
+ order = "name";
+
+ @property({ attribute: false })
+ provider?: RACProvider;
+
+ @property({ type: Number })
+ userId?: number;
+
+ static get styles(): CSSResult[] {
+ return super.styles.concat(PFDescriptionList);
+ }
+
+ async apiEndpoint(page: number): Promise> {
+ return new RacApi(DEFAULT_CONFIG).racConnectionTokensList({
+ ordering: this.order,
+ page: page,
+ pageSize: (await uiConfig()).pagination.perPage,
+ search: this.search || "",
+ provider: this.provider?.pk,
+ sessionUser: this.userId,
+ });
+ }
+
+ renderToolbarSelected(): TemplateResult {
+ const disabled = this.selectedElements.length < 1;
+ return html` {
+ return [
+ { key: msg("Name"), value: item.name },
+ { key: msg("Host"), value: item.host },
+ ];
+ }}
+ .usedBy=${(item: Endpoint) => {
+ return new RacApi(DEFAULT_CONFIG).racConnectionTokensUsedByList({
+ connectionTokenUuid: item.pk,
+ });
+ }}
+ .delete=${(item: Endpoint) => {
+ return new RacApi(DEFAULT_CONFIG).racConnectionTokensDestroy({
+ connectionTokenUuid: item.pk,
+ });
+ }}
+ >
+
+ ${msg("Delete")}
+
+ `;
+ }
+
+ columns(): TableColumn[] {
+ if (this.provider) {
+ return [
+ new TableColumn(msg("Endpoint"), "endpoint__name"),
+ new TableColumn(msg("User"), "session__user"),
+ ];
+ }
+ return [
+ new TableColumn(msg("Provider"), "provider__name"),
+ new TableColumn(msg("Endpoint"), "endpoint__name"),
+ ];
+ }
+
+ row(item: ConnectionToken): TemplateResult[] {
+ if (this.provider) {
+ return [html`${item.endpointObj.name}`, html`${item.user.username}`];
+ }
+ return [html`${item.providerObj.name}`, html`${item.endpointObj.name}`];
+ }
+}
diff --git a/web/src/admin/providers/rac/RACProviderForm.ts b/web/src/admin/providers/rac/RACProviderForm.ts
index e4f6b789f3..46eae9cdc9 100644
--- a/web/src/admin/providers/rac/RACProviderForm.ts
+++ b/web/src/admin/providers/rac/RACProviderForm.ts
@@ -18,23 +18,18 @@ import { ifDefined } from "lit/directives/if-defined.js";
import {
FlowsInstancesListDesignationEnum,
- PaginatedEndpointList,
PaginatedRACPropertyMappingList,
PropertymappingsApi,
ProvidersApi,
RACProvider,
- RacApi,
} from "@goauthentik/api";
@customElement("ak-provider-rac-form")
export class RACProviderFormPage extends ModelForm {
@state()
- endpoints?: PaginatedEndpointList;
-
propertyMappings?: PaginatedRACPropertyMappingList;
async load(): Promise {
- this.endpoints = await new RacApi(DEFAULT_CONFIG).racEndpointsList({});
this.propertyMappings = await new PropertymappingsApi(
DEFAULT_CONFIG,
).propertymappingsRacList({
@@ -112,6 +107,28 @@ export class RACProviderFormPage extends ModelForm {
+
+
+
+
+
+
+
+
+ ${msg("Delete authorization on disconnect")}
+
+
+ ${msg(
+ "When enabled, connection authorizations will be deleted when a client disconnects. This will force clients with flaky internet connections to re-authorize the endpoint.",
+ )}
+
+
${msg("Protocol settings")}
diff --git a/web/src/admin/providers/rac/RACProviderViewPage.ts b/web/src/admin/providers/rac/RACProviderViewPage.ts
index 393fa43755..9b9665d689 100644
--- a/web/src/admin/providers/rac/RACProviderViewPage.ts
+++ b/web/src/admin/providers/rac/RACProviderViewPage.ts
@@ -1,4 +1,5 @@
import "@goauthentik/admin/providers/RelatedApplicationButton";
+import "@goauthentik/admin/providers/rac/ConnectionTokenList";
import "@goauthentik/admin/providers/rac/EndpointForm";
import "@goauthentik/admin/providers/rac/EndpointList";
import "@goauthentik/admin/providers/rac/RACProviderForm";
@@ -86,6 +87,15 @@ export class RACProviderViewPage extends AKElement {
${this.renderTabOverview()}
+
{
row(item: SystemTask): TemplateResult[] {
return [
- html`${item.name}${item.uid ? `:${item.uid}` : ""}`,
+ html`${item.name}${item.uid ? `:${item.uid}` : ""} `,
html`${item.description}`,
html`${getRelativeTime(item.finishTimestamp)}
${item.finishTimestamp.toLocaleString()} `,
diff --git a/web/src/admin/tokens/TokenListPage.ts b/web/src/admin/tokens/TokenListPage.ts
index 576460f738..21113e8e30 100644
--- a/web/src/admin/tokens/TokenListPage.ts
+++ b/web/src/admin/tokens/TokenListPage.ts
@@ -112,7 +112,7 @@ export class TokenListPage extends TablePage {
: html``}`,
html`${item.userObj?.username} `,
html` `,
- html`${item.expires
+ html`${item.expires && item.expiring
? html`${getRelativeTime(item.expires)}
${item.expires.toLocaleString()} `
: msg("-")}`,
diff --git a/web/src/admin/users/UserViewPage.ts b/web/src/admin/users/UserViewPage.ts
index f270f6dfdf..7feb88f9cf 100644
--- a/web/src/admin/users/UserViewPage.ts
+++ b/web/src/admin/users/UserViewPage.ts
@@ -1,4 +1,5 @@
import "@goauthentik/admin/groups/RelatedGroupList";
+import "@goauthentik/admin/providers/rac/ConnectionTokenList";
import "@goauthentik/admin/users/UserActiveForm";
import "@goauthentik/admin/users/UserApplicationTable";
import "@goauthentik/admin/users/UserChart";
@@ -13,6 +14,7 @@ import { getRelativeTime } from "@goauthentik/app/common/utils";
import "@goauthentik/app/elements/oauth/UserAccessTokenList";
import "@goauthentik/app/elements/oauth/UserRefreshTokenList";
import "@goauthentik/app/elements/rbac/ObjectPermissionsPage";
+import "@goauthentik/app/elements/user/sources/SourceSettings";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EVENT_REFRESH } from "@goauthentik/common/constants";
import { userTypeToLabel } from "@goauthentik/common/labels";
@@ -318,6 +320,26 @@ export class UserViewPage extends WithCapabilitiesConfig(AKElement) {
+
+
`;
}
diff --git a/web/src/common/constants.ts b/web/src/common/constants.ts
index fe40f5a768..ad77f5a3d8 100644
--- a/web/src/common/constants.ts
+++ b/web/src/common/constants.ts
@@ -19,6 +19,7 @@ export const EVENT_LOCALE_REQUEST = "ak-locale-request";
export const EVENT_REQUEST_POST = "ak-request-post";
export const EVENT_MESSAGE = "ak-message";
export const EVENT_THEME_CHANGE = "ak-theme-change";
+export const EVENT_REFRESH_ENTERPRISE = "ak-refresh-enterprise";
export const WS_MSG_TYPE_MESSAGE = "message";
export const WS_MSG_TYPE_REFRESH = "refresh";
diff --git a/web/src/common/helpers/webauthn.ts b/web/src/common/helpers/webauthn.ts
index c10edff170..13a9894503 100644
--- a/web/src/common/helpers/webauthn.ts
+++ b/web/src/common/helpers/webauthn.ts
@@ -38,7 +38,7 @@ export function transformCredentialCreateOptions(
// Because json can't contain raw bytes, the server base64-encodes the User ID
// So to get the base64 encoded byte array, we first need to convert it to a regular
// string, then a byte array, re-encode it and wrap that in an array.
- const stringId = decodeURIComponent(escape(window.atob(userId)));
+ const stringId = decodeURIComponent(window.atob(userId));
user.id = u8arr(b64enc(u8arr(stringId)));
const challenge = u8arr(credentialCreateOptions.challenge.toString());
diff --git a/web/src/common/sentry.ts b/web/src/common/sentry.ts
index 290b4715f1..4b6ed4f5c1 100644
--- a/web/src/common/sentry.ts
+++ b/web/src/common/sentry.ts
@@ -27,7 +27,7 @@ export async function configureSentry(canDoPpi = false): Promise {
],
release: `authentik@${VERSION}`,
integrations: [
- new Sentry.BrowserTracing({
+ Sentry.browserTracingIntegration({
shouldCreateSpanForRequest: (url: string) => {
return url.startsWith(window.location.host);
},
@@ -57,9 +57,6 @@ export async function configureSentry(canDoPpi = false): Promise {
Sentry.setTag(TAG_SENTRY_CAPABILITIES, cfg.capabilities.join(","));
if (window.location.pathname.includes("if/")) {
Sentry.setTag(TAG_SENTRY_COMPONENT, `web/${currentInterface()}`);
- Sentry.configureScope((scope) =>
- scope.setTransactionName(`authentik.web.if.${currentInterface()}`),
- );
}
if (cfg.capabilities.includes(CapabilitiesEnum.CanDebug)) {
const Spotlight = await import("@spotlightjs/spotlight");
diff --git a/web/src/common/styles/authentik.css b/web/src/common/styles/authentik.css
index 4ccabd8edd..790c4c4e10 100644
--- a/web/src/common/styles/authentik.css
+++ b/web/src/common/styles/authentik.css
@@ -150,3 +150,7 @@ html > form > input {
margin-top: 13rem;
}
}
+
+.pf-c-data-list {
+ padding-inline-start: 0;
+}
diff --git a/web/src/common/styles/theme-dark.css b/web/src/common/styles/theme-dark.css
index 764f66dd09..c49c1114e2 100644
--- a/web/src/common/styles/theme-dark.css
+++ b/web/src/common/styles/theme-dark.css
@@ -292,6 +292,7 @@ input[type="date"]::-webkit-calendar-picker-indicator {
}
/* data list */
.pf-c-data-list {
+ padding-inline-start: 0;
border-top-color: var(--ak-dark-background-lighter);
}
.pf-c-data-list__item {
diff --git a/web/src/common/utils.ts b/web/src/common/utils.ts
index 3333830ae7..cbaef55f8c 100644
--- a/web/src/common/utils.ts
+++ b/web/src/common/utils.ts
@@ -25,12 +25,6 @@ export function convertToSlug(text: string): string {
.replace(/[^\w-]+/g, "");
}
-export function convertToTitle(text: string): string {
- return text.replace(/\w\S*/g, function (txt) {
- return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
- });
-}
-
/**
* Truncate a string based on maximum word count
*/
@@ -84,14 +78,6 @@ export function first(...args: Array): T {
throw new SentryIgnoredError(`No compatible arg given: ${args}`);
}
-export function hexEncode(buf: Uint8Array): string {
- return Array.from(buf)
- .map(function (x) {
- return ("0" + x.toString(16)).substr(-2);
- })
- .join("");
-}
-
// Taken from python's string module
export const ascii_lowercase = "abcdefghijklmnopqrstuvwxyz";
export const ascii_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
diff --git a/web/src/elements/Interface/Interface.ts b/web/src/elements/Interface/Interface.ts
index 687a4964b5..ce47189bc7 100644
--- a/web/src/elements/Interface/Interface.ts
+++ b/web/src/elements/Interface/Interface.ts
@@ -1,3 +1,4 @@
+import { EVENT_REFRESH_ENTERPRISE } from "@goauthentik/app/common/constants";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { brand, config } from "@goauthentik/common/api/config";
import { UIConfig, uiConfig } from "@goauthentik/common/ui/config";
@@ -66,6 +67,29 @@ export class Interface extends AKElement implements AkInterface {
return this._brand;
}
+ constructor() {
+ super();
+ document.adoptedStyleSheets = [...document.adoptedStyleSheets, ensureCSSStyleSheet(PFBase)];
+ brand().then((brand) => (this.brand = brand));
+ config().then((config) => (this.config = config));
+
+ this.dataset.akInterfaceRoot = "true";
+ }
+
+ _activateTheme(root: AdoptedStyleSheetsElement, theme: UiThemeEnum): void {
+ super._activateTheme(root, theme);
+ super._activateTheme(document, theme);
+ }
+
+ async getTheme(): Promise {
+ if (!this.uiConfig) {
+ this.uiConfig = await uiConfig();
+ }
+ return this.uiConfig.theme?.base || UiThemeEnum.Automatic;
+ }
+}
+
+export class EnterpriseAwareInterface extends Interface {
_licenseSummaryContext = new ContextProvider(this, {
context: authentikEnterpriseContext,
initialValue: undefined,
@@ -86,25 +110,16 @@ export class Interface extends AKElement implements AkInterface {
constructor() {
super();
- document.adoptedStyleSheets = [...document.adoptedStyleSheets, ensureCSSStyleSheet(PFBase)];
- brand().then((brand) => (this.brand = brand));
- config().then((config) => (this.config = config));
- new EnterpriseApi(DEFAULT_CONFIG).enterpriseLicenseSummaryRetrieve().then((enterprise) => {
- this.licenseSummary = enterprise;
+ const refreshStatus = () => {
+ new EnterpriseApi(DEFAULT_CONFIG)
+ .enterpriseLicenseSummaryRetrieve()
+ .then((enterprise) => {
+ this.licenseSummary = enterprise;
+ });
+ };
+ refreshStatus();
+ window.addEventListener(EVENT_REFRESH_ENTERPRISE, () => {
+ refreshStatus();
});
-
- this.dataset.akInterfaceRoot = "true";
- }
-
- _activateTheme(root: AdoptedStyleSheetsElement, theme: UiThemeEnum): void {
- super._activateTheme(root, theme);
- super._activateTheme(document, theme);
- }
-
- async getTheme(): Promise {
- if (!this.uiConfig) {
- this.uiConfig = await uiConfig();
- }
- return this.uiConfig.theme?.base || UiThemeEnum.Automatic;
}
}
diff --git a/web/src/elements/Interface/index.ts b/web/src/elements/Interface/index.ts
index e7d946cf62..df771286eb 100644
--- a/web/src/elements/Interface/index.ts
+++ b/web/src/elements/Interface/index.ts
@@ -1,4 +1,4 @@
-import { Interface } from "./Interface";
+import { EnterpriseAwareInterface, Interface } from "./Interface";
-export { Interface };
+export { Interface, EnterpriseAwareInterface };
export default Interface;
diff --git a/web/src/elements/forms/ModalForm.ts b/web/src/elements/forms/ModalForm.ts
index 1930b7d752..6f058ce33d 100644
--- a/web/src/elements/forms/ModalForm.ts
+++ b/web/src/elements/forms/ModalForm.ts
@@ -36,15 +36,15 @@ export class ModalForm extends ModalButton {
if (this.closeAfterSuccessfulSubmit) {
this.open = false;
form?.resetForm();
+ this.dispatchEvent(
+ new CustomEvent(EVENT_REFRESH, {
+ bubbles: true,
+ composed: true,
+ }),
+ );
}
this.loading = false;
this.locked = false;
- this.dispatchEvent(
- new CustomEvent(EVENT_REFRESH, {
- bubbles: true,
- composed: true,
- }),
- );
})
.catch((exc) => {
this.loading = false;
diff --git a/web/src/elements/forms/Radio.ts b/web/src/elements/forms/Radio.ts
index 27fbdf0b91..87e09b6f37 100644
--- a/web/src/elements/forms/Radio.ts
+++ b/web/src/elements/forms/Radio.ts
@@ -14,7 +14,7 @@ import { randomId } from "../utils/randomId";
export interface RadioOption {
label: string;
description?: TemplateResult;
- default: boolean;
+ default?: boolean;
value: T;
}
diff --git a/web/src/elements/user/UserConsentList.ts b/web/src/elements/user/UserConsentList.ts
index 96e488c9d0..606eb10e8b 100644
--- a/web/src/elements/user/UserConsentList.ts
+++ b/web/src/elements/user/UserConsentList.ts
@@ -62,7 +62,7 @@ export class UserConsentList extends Table {
row(item: UserConsent): TemplateResult[] {
return [
html`${item.application.name}`,
- html`${item.expires
+ html`${item.expires && item.expiring
? html`${getRelativeTime(item.expires)}
${item.expires.toLocaleString()} `
: msg("-")}`,
diff --git a/web/src/user/user-settings/BaseUserSettings.ts b/web/src/elements/user/sources/BaseUserSettings.ts
similarity index 100%
rename from web/src/user/user-settings/BaseUserSettings.ts
rename to web/src/elements/user/sources/BaseUserSettings.ts
diff --git a/web/src/user/user-settings/sources/SourceSettings.ts b/web/src/elements/user/sources/SourceSettings.ts
similarity index 69%
rename from web/src/user/user-settings/sources/SourceSettings.ts
rename to web/src/elements/user/sources/SourceSettings.ts
index 203eef9f3d..d276d29e58 100644
--- a/web/src/user/user-settings/sources/SourceSettings.ts
+++ b/web/src/elements/user/sources/SourceSettings.ts
@@ -1,18 +1,16 @@
import { renderSourceIcon } from "@goauthentik/app/admin/sources/utils";
+import "@goauthentik/app/elements/user/sources/SourceSettingsOAuth";
+import "@goauthentik/app/elements/user/sources/SourceSettingsPlex";
+import "@goauthentik/app/elements/user/sources/SourceSettingsSAML";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EVENT_REFRESH } from "@goauthentik/common/constants";
-import { me } from "@goauthentik/common/users";
import { AKElement } from "@goauthentik/elements/Base";
import "@goauthentik/elements/EmptyState";
-import "@goauthentik/user/user-settings/sources/SourceSettingsOAuth";
-import "@goauthentik/user/user-settings/sources/SourceSettingsPlex";
-import "@goauthentik/user/user-settings/sources/SourceSettingsSAML";
import { msg, str } from "@lit/localize";
import { CSSResult, TemplateResult, css, html } from "lit";
import { customElement, property } from "lit/decorators.js";
-import PFContent from "@patternfly/patternfly/components/Content/content.css";
import PFDataList from "@patternfly/patternfly/components/DataList/data-list.css";
import { PaginatedUserSourceConnectionList, SourcesApi, UserSetting } from "@goauthentik/api";
@@ -25,10 +23,15 @@ export class UserSourceSettingsPage extends AKElement {
@property({ attribute: false })
connections?: PaginatedUserSourceConnectionList;
+ @property({ type: Number })
+ userId?: number;
+
+ @property({ type: Boolean })
+ canConnect = true;
+
static get styles(): CSSResult[] {
return [
PFDataList,
- PFContent,
css`
.pf-c-data-list__cell {
display: flex;
@@ -57,10 +60,9 @@ export class UserSourceSettingsPage extends AKElement {
}
async firstUpdated(): Promise {
- const user = await me();
this.sourceSettings = await new SourcesApi(DEFAULT_CONFIG).sourcesAllUserSettingsList();
this.connections = await new SourcesApi(DEFAULT_CONFIG).sourcesUserConnectionsAllList({
- user: user.user.pk,
+ user: this.userId,
});
}
@@ -79,29 +81,26 @@ export class UserSourceSettingsPage extends AKElement {
switch (source.component) {
case "ak-user-settings-source-oauth":
return html`
`;
case "ak-user-settings-source-plex":
return html`
`;
case "ak-user-settings-source-saml":
return html`
`;
default:
@@ -112,23 +111,17 @@ export class UserSourceSettingsPage extends AKElement {
}
render(): TemplateResult {
- return html`
-
- ${msg(
- "Connect your user account to the services listed below, to allow you to login using the service instead of traditional credentials.",
- )}
-
-
-
- ${this.sourceSettings
- ? html`
- ${this.sourceSettings.length < 1
- ? html` `
- : html`
- ${this.sourceSettings.map((source) => {
- return html`
+ return html`
+ ${this.sourceSettings
+ ? html`
+ ${this.sourceSettings.length < 1
+ ? html` `
+ : html`
+ ${this.sourceSettings.map((source) => {
+ return html`
+
${renderSourceIcon(
@@ -141,12 +134,13 @@ export class UserSourceSettingsPage extends AKElement {
${this.renderSourceSettings(source)}
- `;
- })}
- `}
- `
- : html`
- `}
- `;
+
+ `;
+ })}
+ `}
+ `
+ : html`
+ `}
+ `;
}
}
diff --git a/web/src/user/user-settings/sources/SourceSettingsOAuth.ts b/web/src/elements/user/sources/SourceSettingsOAuth.ts
similarity index 82%
rename from web/src/user/user-settings/sources/SourceSettingsOAuth.ts
rename to web/src/elements/user/sources/SourceSettingsOAuth.ts
index 2461b487f9..141cc4cea5 100644
--- a/web/src/user/user-settings/sources/SourceSettingsOAuth.ts
+++ b/web/src/elements/user/sources/SourceSettingsOAuth.ts
@@ -1,14 +1,13 @@
+import { BaseUserSettings } from "@goauthentik/app/elements/user/sources/BaseUserSettings";
import { AndNext, DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EVENT_REFRESH } from "@goauthentik/common/constants";
import { MessageLevel } from "@goauthentik/common/messages";
import "@goauthentik/elements/Spinner";
import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
-import { BaseUserSettings } from "@goauthentik/user/user-settings/BaseUserSettings";
import { msg, str } from "@lit/localize";
import { TemplateResult, html } from "lit";
import { customElement, property } from "lit/decorators.js";
-import { ifDefined } from "lit/directives/if-defined.js";
import { SourcesApi } from "@goauthentik/api";
@@ -57,13 +56,16 @@ export class SourceSettingsOAuth extends BaseUserSettings {
${msg("Disconnect")}
`;
}
- return html`
- ${msg("Connect")}
- `;
+ if (this.configureUrl) {
+ return html`
+ ${msg("Connect")}
+ `;
+ }
+ return html`${msg("-")}`;
}
}
diff --git a/web/src/user/user-settings/sources/SourceSettingsPlex.ts b/web/src/elements/user/sources/SourceSettingsPlex.ts
similarity index 90%
rename from web/src/user/user-settings/sources/SourceSettingsPlex.ts
rename to web/src/elements/user/sources/SourceSettingsPlex.ts
index a1c23cf57a..d9492f0d75 100644
--- a/web/src/user/user-settings/sources/SourceSettingsPlex.ts
+++ b/web/src/elements/user/sources/SourceSettingsPlex.ts
@@ -1,10 +1,10 @@
+import { BaseUserSettings } from "@goauthentik/app/elements/user/sources/BaseUserSettings";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EVENT_REFRESH } from "@goauthentik/common/constants";
import { PlexAPIClient, popupCenterScreen } from "@goauthentik/common/helpers/plex";
import { MessageLevel } from "@goauthentik/common/messages";
import "@goauthentik/elements/Spinner";
import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
-import { BaseUserSettings } from "@goauthentik/user/user-settings/BaseUserSettings";
import { msg, str } from "@lit/localize";
import { TemplateResult, html } from "lit";
@@ -77,8 +77,11 @@ export class SourceSettingsPlex extends BaseUserSettings {
${msg("Disconnect")}
`;
}
- return html`
- ${msg("Connect")}
- `;
+ if (this.configureUrl) {
+ return html`
+ ${msg("Connect")}
+ `;
+ }
+ return html`${msg("-")}`;
}
}
diff --git a/web/src/user/user-settings/sources/SourceSettingsSAML.ts b/web/src/elements/user/sources/SourceSettingsSAML.ts
similarity index 82%
rename from web/src/user/user-settings/sources/SourceSettingsSAML.ts
rename to web/src/elements/user/sources/SourceSettingsSAML.ts
index da88645c3e..fe09bb1193 100644
--- a/web/src/user/user-settings/sources/SourceSettingsSAML.ts
+++ b/web/src/elements/user/sources/SourceSettingsSAML.ts
@@ -1,14 +1,13 @@
+import { BaseUserSettings } from "@goauthentik/app/elements/user/sources/BaseUserSettings";
import { AndNext, DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EVENT_REFRESH } from "@goauthentik/common/constants";
import { MessageLevel } from "@goauthentik/common/messages";
import "@goauthentik/elements/Spinner";
import { showMessage } from "@goauthentik/elements/messages/MessageContainer";
-import { BaseUserSettings } from "@goauthentik/user/user-settings/BaseUserSettings";
import { msg, str } from "@lit/localize";
import { TemplateResult, html } from "lit";
import { customElement, property } from "lit/decorators.js";
-import { ifDefined } from "lit/directives/if-defined.js";
import { SourcesApi } from "@goauthentik/api";
@@ -57,13 +56,16 @@ export class SourceSettingsSAML extends BaseUserSettings {
${msg("Disconnect")}
`;
}
- return html`
- ${msg("Connect")}
- `;
+ if (this.configureUrl) {
+ return html`
+ ${msg("Connect")}
+ `;
+ }
+ return html`${msg("-")}`;
}
}
diff --git a/web/src/user/UserInterface.ts b/web/src/user/UserInterface.ts
index f9655341b5..53cdf15c9a 100644
--- a/web/src/user/UserInterface.ts
+++ b/web/src/user/UserInterface.ts
@@ -9,7 +9,7 @@ import { UserDisplay } from "@goauthentik/common/ui/config";
import { me } from "@goauthentik/common/users";
import { first } from "@goauthentik/common/utils";
import { WebsocketClient } from "@goauthentik/common/ws";
-import { Interface } from "@goauthentik/elements/Interface";
+import { EnterpriseAwareInterface } from "@goauthentik/elements/Interface";
import "@goauthentik/elements/ak-locale-context";
import "@goauthentik/elements/buttons/ActionButton";
import "@goauthentik/elements/enterprise/EnterpriseStatusBanner";
@@ -41,7 +41,7 @@ import PFDisplay from "@patternfly/patternfly/utilities/Display/display.css";
import { CoreApi, EventsApi, SessionUser } from "@goauthentik/api";
@customElement("ak-interface-user")
-export class UserInterface extends Interface {
+export class UserInterface extends EnterpriseAwareInterface {
@property({ type: Boolean })
notificationDrawerOpen = getURLParam("notificationDrawerOpen", false);
diff --git a/web/src/user/user-settings/UserSettingsPage.ts b/web/src/user/user-settings/UserSettingsPage.ts
index 9506731728..efa28a5740 100644
--- a/web/src/user/user-settings/UserSettingsPage.ts
+++ b/web/src/user/user-settings/UserSettingsPage.ts
@@ -1,3 +1,4 @@
+import "@goauthentik/app/elements/user/sources/SourceSettings";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EVENT_REFRESH } from "@goauthentik/common/constants";
import { AKElement, rootInterface } from "@goauthentik/elements/Base";
@@ -8,7 +9,6 @@ import { UserInterface } from "@goauthentik/user/UserInterface";
import "@goauthentik/user/user-settings/details/UserPassword";
import "@goauthentik/user/user-settings/details/UserSettingsFlowExecutor";
import "@goauthentik/user/user-settings/mfa/MFADevicesPage";
-import "@goauthentik/user/user-settings/sources/SourceSettings";
import "@goauthentik/user/user-settings/tokens/UserTokenList";
import { localized, msg } from "@lit/localize";
@@ -156,9 +156,14 @@ export class UserSettingsPage extends AKElement {
class="pf-c-page__main-section pf-m-no-padding-mobile"
>
-
-
+
+ ${msg(
+ "Connect your user account to the services listed below, to allow you to login using the service instead of traditional credentials.",
+ )}
+
()?.me?.user.pk)}
+ >
Preview for user
+
+
+ Brand name
+
+
+ Remote Access Provider
+
+
+ Remotely access computers/servers via RDP/SSH/VNC
+
+
+ Configure Remote Access Provider Provider
+
+
+ Delete authorization on disconnect
+
+
+ When enabled, connection authorizations will be deleted when a client disconnects. This will force clients with flaky internet connections to re-authorize the endpoint.
+
+
+ Connection Token(s)
+
+
+ Endpoint
+
+
+ Connections
+
+
+ Unconfigured
+
+
+ This option will not be changed by this mapping.
+
+
+ RAC Connections