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")} +
+ + + + +

+ ${msg("Flow used when authorizing this provider.")} +

+
+ + + + + ${msg("Protocol settings")} +
+ + +

+ ${msg("Hold control/command to select multiple items.")} +

+
+
+
+
`; + } +} + +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, + }); + }} + > + + `; + } + + 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( + "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``; + if (this.configureUrl) { + return html``; + } + 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 diff --git a/web/xliff/en.xlf b/web/xliff/en.xlf index 12ac5aa493..db06cf2a42 100644 --- a/web/xliff/en.xlf +++ b/web/xliff/en.xlf @@ -6660,6 +6660,42 @@ Bindings to groups/users are checked against the user of the event. 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 diff --git a/web/xliff/es.xlf b/web/xliff/es.xlf index 81993ba417..3bad1c1691 100644 --- a/web/xliff/es.xlf +++ b/web/xliff/es.xlf @@ -6306,6 +6306,42 @@ Bindings to groups/users are checked against the user of the event. 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 diff --git a/web/xliff/fr.xlf b/web/xliff/fr.xlf index cf0ae33fae..effaa48980 100644 --- a/web/xliff/fr.xlf +++ b/web/xliff/fr.xlf @@ -1,4 +1,4 @@ - + @@ -596,9 +596,9 @@ - The URL "" was not found. - L'URL " - " n'a pas été trouvée. + The URL "" was not found. + L'URL " + " n'a pas été trouvée. @@ -1040,8 +1040,8 @@ - To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. - Pour permettre n'importe quelle URI de redirection, définissez cette valeur sur ".*". Soyez conscient des possibles implications de sécurité que cela peut avoir. + To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. + Pour permettre n'importe quelle URI de redirection, définissez cette valeur sur ".*". Soyez conscient des possibles implications de sécurité que cela peut avoir. @@ -1613,7 +1613,7 @@ Token to authenticate with. Currently only bearer authentication is supported. - Jeton d'authentification à utiliser. Actuellement, seule l'authentification "bearer authentication" est prise en charge. + Jeton d'authentification à utiliser. Actuellement, seule l'authentification "bearer authentication" est prise en charge. @@ -1781,8 +1781,8 @@ - Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". - Entrez une URL complète, un chemin relatif ou utilisez 'fa://fa-test' pour utiliser l'icône Font Awesome "fa-test". + Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". + Entrez une URL complète, un chemin relatif ou utilisez 'fa://fa-test' pour utiliser l'icône Font Awesome "fa-test". @@ -2870,7 +2870,7 @@ doesn't pass when either or both of the selected options are equal or above the To use SSL instead, use 'ldaps://' and disable this option. - Pour utiliser SSL à la base, utilisez "ldaps://" et désactviez cette option. + Pour utiliser SSL à la base, utilisez "ldaps://" et désactviez cette option. @@ -2959,8 +2959,8 @@ doesn't pass when either or both of the selected options are equal or above the - Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' - Champ qui contient les membres d'un groupe. Si vous utilisez le champ "memberUid", la valeur est censée contenir un nom distinctif relatif, par exemple 'memberUid=un-utilisateur' au lieu de 'memberUid=cn=un-utilisateur,ou=groups,...' + Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' + Champ qui contient les membres d'un groupe. Si vous utilisez le champ "memberUid", la valeur est censée contenir un nom distinctif relatif, par exemple 'memberUid=un-utilisateur' au lieu de 'memberUid=cn=un-utilisateur,ou=groups,...' @@ -3255,7 +3255,7 @@ doesn't pass when either or both of the selected options are equal or above the 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. - Moment où les utilisateurs temporaires doivent être supprimés. Cela ne s'applique que si votre IDP utilise le format NameID "transient" et que l'utilisateur ne se déconnecte pas manuellement. + Moment où les utilisateurs temporaires doivent être supprimés. Cela ne s'applique que si votre IDP utilise le format NameID "transient" et que l'utilisateur ne se déconnecte pas manuellement. @@ -3423,7 +3423,7 @@ doesn't pass when either or both of the selected options are equal or above the Optionally set the 'FriendlyName' value of the Assertion attribute. - Indiquer la valeur "FriendlyName" de l'attribut d'assertion (optionnel) + Indiquer la valeur "FriendlyName" de l'attribut d'assertion (optionnel) @@ -3737,8 +3737,8 @@ doesn't pass when either or both of the selected options are equal or above the - When using an external logging solution for archiving, this can be set to "minutes=5". - En cas d'utilisation d'une solution de journalisation externe pour l'archivage, cette valeur peut être fixée à "minutes=5". + When using an external logging solution for archiving, this can be set to "minutes=5". + En cas d'utilisation d'une solution de journalisation externe pour l'archivage, cette valeur peut être fixée à "minutes=5". @@ -3914,10 +3914,10 @@ doesn't pass when either or both of the selected options are equal or above the - Are you sure you want to update ""? + Are you sure you want to update ""? Êtes-vous sûr de vouloir mettre à jour - " - "? + " + "? @@ -4998,8 +4998,8 @@ doesn't pass when either or both of the selected options are equal or above the - A "roaming" authenticator, like a YubiKey - Un authentificateur "itinérant", comme une YubiKey + A "roaming" authenticator, like a YubiKey + Un authentificateur "itinérant", comme une YubiKey @@ -5324,7 +5324,7 @@ doesn't pass when either or both of the selected options are equal or above the Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable. - Afficher des champs de saisie arbitraires à l'utilisateur, par exemple pendant l'inscription. Les données sont enregistrées dans le contexte du flux sous la variable "prompt_data". + Afficher des champs de saisie arbitraires à l'utilisateur, par exemple pendant l'inscription. Les données sont enregistrées dans le contexte du flux sous la variable "prompt_data". @@ -5333,10 +5333,10 @@ doesn't pass when either or both of the selected options are equal or above the - ("", of type ) + ("", of type ) - (" - ", de type + (" + ", de type ) @@ -5385,8 +5385,8 @@ doesn't pass when either or both of the selected options are equal or above the - If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. - Si défini à une durée supérieure à 0, l'utilisateur aura la possibilité de choisir de "rester connecté", ce qui prolongera sa session jusqu'à la durée spécifiée ici. + If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. + Si défini à une durée supérieure à 0, l'utilisateur aura la possibilité de choisir de "rester connecté", ce qui prolongera sa session jusqu'à la durée spécifiée ici. @@ -6165,7 +6165,7 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti Can be in the format of 'unix://' when connecting to a local docker daemon, using 'ssh://' to connect via SSH, or 'https://:2376' when connecting to a remote system. - Peut être au format "unix://" pour une connexion à un service docker local, "ssh://" pour une connexion via SSH, ou "https://:2376" pour une connexion à un système distant. + Peut être au format "unix://" pour une connexion à un service docker local, "ssh://" pour une connexion via SSH, ou "https://:2376" pour une connexion à un système distant. @@ -7472,7 +7472,7 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a managed outpost, this is done for you). - Utilisez ce fournisseur avec l'option "auth_request" de Nginx ou "forwardAuth" de Traefik. Chaque application/domaine a besoin de son propre fournisseur. De plus, sur chaque domaine, "/outpost.goauthentik.io" doit être routé vers le poste avancé (lorsque vous utilisez un poste avancé géré, cela est fait pour vous). + Utilisez ce fournisseur avec l'option "auth_request" de Nginx ou "forwardAuth" de Traefik. Chaque application/domaine a besoin de son propre fournisseur. De plus, sur chaque domaine, "/outpost.goauthentik.io" doit être routé vers le poste avancé (lorsque vous utilisez un poste avancé géré, cela est fait pour vous). Default relay state @@ -7878,7 +7878,7 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti Utilisateur créé et ajouté au groupe avec succès - This user will be added to the group "". + This user will be added to the group "". Cet utilisateur sera ajouté au groupe &quot;&quot;. @@ -8406,7 +8406,55 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti Preview for user Prévisualisation pour un utilisateur + + + Brand name + Nom de la marque + + + Remote Access Provider + Fournisseur d'accès distant + + + Remotely access computers/servers via RDP/SSH/VNC + Accéder à des ordinateurs/serveurs via RDP/SSH/VNC + + + Configure Remote Access Provider Provider + Configurer le fournisseur d'accès distant + + + Delete authorization on disconnect + Supprimer l’autorisation à la déconnexion + + + When enabled, connection authorizations will be deleted when a client disconnects. This will force clients with flaky internet connections to re-authorize the endpoint. + Si activé, les autorisations de connexion seront supprimées lorsqu'un client se déconnecte. Cela forcera les clients avec des connexions internet instables à ré-autoriser le point de terminaison. + + + Connection Token(s) + Jeton(s) de connexion + + + Endpoint + Point de terminaison + + + Connections + Connexions + + + Unconfigured + Non-configuré + + + This option will not be changed by this mapping. + Cette option ne sera pas changée par ce mappage. + + + RAC Connections + Connexions RAC - \ No newline at end of file + diff --git a/web/xliff/ko.xlf b/web/xliff/ko.xlf index 83a4124bfe..820e681515 100644 --- a/web/xliff/ko.xlf +++ b/web/xliff/ko.xlf @@ -8254,6 +8254,42 @@ Bindings to groups/users are checked against the user of the event. 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 diff --git a/web/xliff/nl.xlf b/web/xliff/nl.xlf index e46e7f430a..21c10a19c4 100644 --- a/web/xliff/nl.xlf +++ b/web/xliff/nl.xlf @@ -8097,6 +8097,42 @@ Bindingen naar groepen/gebruikers worden gecontroleerd tegen de gebruiker van de 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 diff --git a/web/xliff/pl.xlf b/web/xliff/pl.xlf index eb0b2a8cf1..4e3b019d88 100644 --- a/web/xliff/pl.xlf +++ b/web/xliff/pl.xlf @@ -6512,6 +6512,42 @@ Bindings to groups/users are checked against the user of the event. 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 diff --git a/web/xliff/pseudo-LOCALE.xlf b/web/xliff/pseudo-LOCALE.xlf index bec6613ec8..124901d4ce 100644 --- a/web/xliff/pseudo-LOCALE.xlf +++ b/web/xliff/pseudo-LOCALE.xlf @@ -8231,4 +8231,40 @@ Bindings to groups/users are checked against the user of the event. 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 + diff --git a/web/xliff/tr.xlf b/web/xliff/tr.xlf index b306b787ce..99c28adf1a 100644 --- a/web/xliff/tr.xlf +++ b/web/xliff/tr.xlf @@ -6299,6 +6299,42 @@ Bindings to groups/users are checked against the user of the event. 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 diff --git a/web/xliff/zh-CN.xlf b/web/xliff/zh-CN.xlf index d75c53648a..9c7c3e95d6 100644 --- a/web/xliff/zh-CN.xlf +++ b/web/xliff/zh-CN.xlf @@ -5209,6 +5209,42 @@ Bindings to groups/users are checked against the user of the event. 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 + diff --git a/web/xliff/zh-Hans.xlf b/web/xliff/zh-Hans.xlf index 4baffd8568..23d30b1ed7 100644 --- a/web/xliff/zh-Hans.xlf +++ b/web/xliff/zh-Hans.xlf @@ -4,383 +4,383 @@ English 英语 - + French 法语 - + Turkish 土耳其语 - + Spanish 西班牙语 - + Polish 波兰语 - + Taiwanese Mandarin 台湾华语 - + Chinese (simplified) 简体中文 - + Chinese (traditional) 繁体中文 - + German 德语 - + Loading... 正在加载…… - + Application 应用程序 - + Logins 登录 - + Show less 显示更少 - + Show more 显示更多 - + UID UID - + Name 名称 - + App 应用 - + Model Name 模型名称 - + Message 消息 - + Subject 主题 - + From 来自 - + To - + Context 上下文 - + User 用户 - + Affected model: 受影响的模型: - + Authorized application: 已授权应用程序: - + Using flow 使用流程 - + Email info: 电子邮件信息: - + Secret: Secret: - + Open issue on GitHub... 在 GitHub 上提出议题... - + Exception 异常 - + Expression 表达式 - + Binding 绑定 - + Request 请求 - + Object 对象 - + Result 结果 - + Passing 通过 - + Messages 消息 - + Using source 使用源 - + Attempted to log in as 已尝试以 身份登录 - + No additional data available. 没有可用的额外数据。 - + Click to change value 点击以更改值 - + Select an object. 选择一个对象。 - + Loading options... 正在加载选项… - + Connection error, reconnecting... 连接错误,正在重新连接…… - + Login 登录 - + Failed login 登录失败 - + Logout 登出 - + User was written to 用户被写入 - + Suspicious request 可疑请求 - + Password set 密码已设置 - + Secret was viewed Secret 已查看 - + Secret was rotated Secret 已轮换 - + Invitation used 已使用邀请 - + Application authorized 应用程序已授权 - + Source linked 源已链接 - + Impersonation started 已开始模拟身份 - + Impersonation ended 已结束模拟身份 - + Flow execution 流程执行 - + Policy execution 策略执行 - + Policy exception 策略异常 - + Property Mapping exception 属性映射异常 - + System task execution 系统任务执行 - + System task exception 系统任务异常 - + General system exception 一般系统异常 - + Configuration error 配置错误 - + Model created 模型已创建 - + Model updated 模型已更新 - + Model deleted 模型已删除 - + Email sent 已发送电子邮件 - + Update available 更新可用 - + Unknown severity 未知严重程度 - + Alert 注意 - + Notice 通知 - + Warning 警告 - + no tabs defined 未定义选项卡 - + - of @@ -388,1207 +388,1207 @@ - / - + Go to previous page 前往上一页 - + Go to next page 前往下一页 - + Search... 搜索... - + Loading 正在加载 - + No objects found. 未找到对象。 - + Failed to fetch objects. 拉取对象失败。 - + Refresh 刷新 - + Select all rows 选择所有行 - + Action 操作 - + Creation Date 创建日期 - + Client IP 客户端 IP - + Recent events 近期事件 - + On behalf of 代表 - + - - - + No Events found. 未找到事件。 - + No matching events could be found. 未找到匹配的事件 - + Embedded outpost is not configured correctly. 嵌入式前哨配置不正确。 - + Check outposts. 检查前哨。 - + HTTPS is not detected correctly 未正确检测到 HTTPS - + Server and client are further than 5 seconds apart. 服务器和客户端的时间相差超过 5 秒。 - + OK 好的 - + Everything is ok. 一切正常。 - + System status 系统状态 - + Based on 基于 - + is available! 可用! - + Up-to-date! 最新! - + Version 版本 - + Workers Worker - + No workers connected. Background tasks will not run. 没有 Workers 连接,后台任务将无法运行。 - + Authorizations 授权 - + Failed Logins 失败登录 - + Successful Logins 成功登录 - + : - + Cancel 取消 - + LDAP Source LDAP 源 - + SCIM Provider SCIM 提供程序 - + Healthy 健康 - + Healthy outposts 健康的前哨 - + Admin 管理员 - + Not found 未找到 - + The URL "" was not found. 未找到 URL " "。 - + Return home 返回主页 - + General system status 常规系统状态 - + Welcome, . 欢迎, - + Quick actions 快速操作 - + Create a new application 创建新应用程序 - + Check the logs 检查日志 - + Explore integrations 探索集成 - + Manage users 管理用户 - + Outpost status 前哨状态 - + Sync status 同步状态 - + Logins and authorizations over the last week (per 8 hours) 过去一周的登录与身份验证次数(每 8 小时) - + Apps with most usage 使用率最高的应用 - + days ago 天前 - + Objects created 已创建对象 - + Users created per day in the last month 上个月中每天创建的用户 - + Logins per day in the last month 上个月中每天的登录次数 - + Failed Logins per day in the last month 上个月中每天的失败登录次数 - + Clear search 清除搜索 - + System Tasks 系统任务 - + Long-running operations which authentik executes in the background. authentik 在后台执行的长时间运行的操作。 - + Identifier 标识符 - + Description 描述 - + Last run 上次运行 - + Status 状态 - + Actions 操作 - + Successful 成功 - + Error 错误 - + Unknown 未知 - + Duration 时长 - + seconds - + Authentication 身份验证 - + Authorization 授权 - + Enrollment 注册 - + Invalidation 失效 - + Recovery 恢复 - + Stage Configuration 阶段配置 - + Unenrollment 删除账户 - + Unknown designation 未知用途 - + Stacked 叠放 - + Content left 内容左侧 - + Content right 内容右侧 - + Sidebar left 边栏左侧 - + Sidebar right 边栏右侧 - + Unknown layout 未知布局 - + Successfully updated provider. 已成功更新提供程序。 - + Successfully created provider. 已成功创建提供程序。 - + Bind flow Bind 流程 - + Flow used for users to authenticate. 用于验证用户身份的流程。 - + Search group 搜索组 - + Users in the selected group can do search queries. If no group is selected, no LDAP Searches are allowed. 所选组中的用户可以执行搜索查询。如果未选择任何组,则不允许 LDAP 搜索。 - + Bind mode 绑定模式 - + Cached binding 缓存绑定 - + Flow is executed and session is cached in memory. Flow is executed when session expires 流程与会话会在内存中执行与缓存。会话过期时执行流程 - + Direct binding 直接绑定 - + Always execute the configured bind flow to authenticate the user 总是执行配置的绑定流程,以验证用户的身份。 - + Configure how the outpost authenticates requests. 配置前哨如何验证请求的身份。 - + Search mode 搜索模式 - + Cached querying 缓存查询 - + The outpost holds all users and groups in-memory and will refresh every 5 Minutes 前哨将所有用户和组保存在内存中,并每 5 分钟刷新一次 - + Direct querying 直接查询 - + Always returns the latest data, but slower than cached querying 总是返回最新数据,但比缓存查询慢。 - + Configure how the outpost queries the core authentik server's users. 配置前哨如何查询核心 authentik 服务器的用户。 - + Protocol settings 协议设置 - + Base DN Base DN - + LDAP DN under which bind requests and search requests can be made. 可以发出绑定请求和搜索请求的 LDAP DN。 - + Certificate 证书 - + UID start number UID 起始编号 - + 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 起始 uidNumbers,这个数字会被添加到 user.Pk 中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 2000,以确保我们不会与本地用户的 uidNumber 发生冲突 - + GID start number GID 起始编号 - + 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. Default is 4000 to ensure that we don't collide with local groups or users primary groups gidNumber 起始 gidNumbers,这个数字会被添加到从 group.Pk 生成的数字中,以确保对于 POSIX 用户来说,这个数字不会太低。默认值为 4000,以确保我们不会与本地群组或用户主组的 gidNumber 发生冲突 - + (Format: hours=-1;minutes=-2;seconds=-3). (格式:hours=-1;minutes=-2;seconds=-3)。 - + (Format: hours=1;minutes=2;seconds=3). (格式:hours=1;minutes=2;seconds=3)。 - + The following keywords are supported: 支持以下关键字: - + Authentication flow 身份验证流程 - + Flow used when a user access this provider and is not authenticated. 当用户访问此提供程序并且尚未验证身份时使用的流程。 - + Authorization flow 授权流程 - + Flow used when authorizing this provider. 授权此提供程序时使用的流程。 - + Client type 客户端类型 - + Confidential 机密 - + Confidential clients are capable of maintaining the confidentiality of their credentials such as client secrets 机密客户端有能力维护其凭据例如客户端密钥的机密性。 - + Public 公开 - + Public clients are incapable of maintaining the confidentiality and should use methods like PKCE. 公开客户端没有能力维护其凭据的机密性,应该使用 PKCE 等方法。 - + Client ID 客户端 ID - + Client Secret 客户端 Secret - + Redirect URIs/Origins (RegEx) 重定向 URI/Origin(正则) - + Valid redirect URLs after a successful authorization flow. Also specify any origins here for Implicit flows. 授权流程成功后有效的重定向 URL。还可以在此处为隐式流程指定任何来源。 - + If no explicit redirect URIs are specified, the first successfully used redirect URI will be saved. 如果未指定显式重定向 URI,则将保存第一个成功使用的重定向 URI。 - + To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. 要允许任何重定向 URI,请将此值设置为 ".*"。请注意这可能带来的安全影响。 - + Signing Key 签名密钥 - + Key used to sign the tokens. 用于签名令牌的密钥。 - + Advanced protocol settings 高级协议设置 - + Access code validity 访问代码有效性 - + Configure how long access codes are valid for. 配置访问代码的有效期限。 - + Access Token validity 访问令牌有效性 - + Configure how long access tokens are valid for. 配置访问令牌的有效期限。 - + Refresh Token validity 刷新令牌有效性 - + Configure how long refresh tokens are valid for. 配置刷新令牌的有效期限。 - + Scopes 作用域 - + Select which scopes can be used by the client. The client still has to specify the scope to access the data. 选择客户端可以使用哪些作用域。客户端仍然需要指定访问数据的范围。 - + Hold control/command to select multiple items. 按住 ctrl/command 键可选择多个项目。 - + Subject mode Subject 模式 - + Based on the User's hashed ID 基于哈希过的用户 ID - + Based on the User's ID 基于用户 ID - + Based on the User's UUID 基于用户 UUID - + Based on the User's username 基于用户名 - + Based on the User's Email 基于用户电子邮箱 - + This is recommended over the UPN mode. 相比于 UPN,更推荐此模式。 - + Based on the User's UPN 基于用户 UPN - + Requires the user to have a 'upn' attribute set, and falls back to hashed user ID. Use this mode only if you have different UPN and Mail domains. 需要用户设置过“upn”属性,否则回退到哈希过的用户 ID。仅应在您拥有不同 UPN 和邮件域时使用此模式。 - + Configure what data should be used as unique User Identifier. For most cases, the default should be fine. 配置应将哪些数据用作唯一用户标识符。在大多数情况下保持默认值即可。 - + Include claims in id_token 在 id_token 中包含声明 - + Include User claims from scopes in the id_token, for applications that don't access the userinfo endpoint. 对于不访问 userinfo 端点的应用程序,将来自作用域的用户声明包含在 id_token 中。 - + Issuer mode Issuer 模式 - + Each provider has a different issuer, based on the application slug 根据应用程序 Slug,每个提供程序都有不同的颁发者 - + Same identifier is used for all providers 所有提供程序都使用相同的标识符 - + Configure how the issuer field of the ID Token should be filled. 配置如何填写 ID 令牌的颁发者字段。 - + Machine-to-Machine authentication settings M2M(机器到机器)身份验证设置 - + Trusted OIDC Sources 信任的 OIDC 来源 - + JWTs signed by certificates configured in the selected sources can be used to authenticate to this provider. 在选定源中配置的证书签名的 JWT 可以用于此提供程序的身份验证。 - + HTTP-Basic Username Key HTTP-Basic 用户名键 - + User/Group Attribute used for the user part of the HTTP-Basic Header. If not set, the user's Email address is used. 用于 HTTP-Basic 标头用户名部分的用户/组属性。如果未设置,则使用用户的电子邮件地址。 - + HTTP-Basic Password Key HTTP-Basic 密码键 - + User/Group Attribute used for the password part of the HTTP-Basic Header. 用于 HTTP-Basic 标头的密码部分的用户/组属性。 - + Proxy 代理 - + Forward auth (single application) Forward Auth(单应用) - + Forward auth (domain level) Forward Auth(域名级) - + This provider will behave like a transparent reverse-proxy, except requests must be authenticated. If your upstream application uses HTTPS, make sure to connect to the outpost using HTTPS as well. 除了请求必须经过身份验证外,此提供程序的行为类似于透明反向代理。如果您的上游应用程序使用 HTTPS,请确保连接到前哨时也使用 HTTPS。 - + External host 外部主机 - + The external URL you'll access the application at. Include any non-standard port. 您将通过此外部 URL 访问应用程序。请包括任何非标准端口。 - + Internal host 内部主机 - + Upstream host that the requests are forwarded to. 请求被转发到的上游主机。 - + Internal host SSL Validation 内部主机 SSL 验证 - + Validate SSL Certificates of upstream servers. 验证上游服务器的 SSL 证书。 - + Use this provider with nginx's auth_request or traefik's forwardAuth. Only a single provider is required per root domain. You can't do per-application authorization, but you don't have to create a provider for each application. 与 nginx 的 auth_request 或 traefik 的 ForwardAuth 一起使用此提供程序。每个根域名只需要一个提供程序。您无法管理每个应用程序的授权,但不必为每个应用程序分别创建提供程序。 - + An example setup can look like this: 设置示例如下所示: - + authentik running on auth.example.com auth.example.com 上运行的 authentik - + app1 running on app1.example.com app1.example.com 上运行的 app1 - + In this case, you'd set the Authentication URL to auth.example.com and Cookie domain to example.com. 在这种情况下,您需要将身份验证 URL 设置为 auth.example.com,并将 Cookie 域名设置为 example.com。 - + Authentication URL 身份验证 URL - + The external URL you'll authenticate at. The authentik core server should be reachable under this URL. 您将在此外部 URL 进行身份验证。通过此 URL 应该可以访问到 authentik 核心服务器。 - + Cookie domain Cookie 域名 - + Set this to the domain you wish the authentication to be valid for. Must be a parent domain of the URL above. If you're running applications as app1.domain.tld, app2.domain.tld, set this to 'domain.tld'. 将此设置为您希望身份验证有效的域名。必须是上述 URL 的父域名。如果您的应用部署在 app1.domain.tld、app2.domain.tld,请将其设置为 'domain.tld'。 - + Unknown proxy mode 未知代理模式 - + Token validity 令牌有效性 - + Configure how long tokens are valid for. 配置令牌的有效期限。 - + Additional scopes 额外的作用域 - + Additional scope mappings, which are passed to the proxy. 传递给代理的额外作用域映射。 - + Unauthenticated URLs 不验证身份的 URL - + Unauthenticated Paths 不验证身份的路径 - + Regular expressions for which authentication is not required. Each new line is interpreted as a new expression. 用于描述何处不需要身份验证的正则表达式。每个新行都被解释为一个新的表达式。 - + When using proxy or forward auth (single application) mode, the requested URL Path is checked against the regular expressions. When using forward auth (domain mode), the full requested URL including scheme and host is matched against the regular expressions. 使用代理或 Forward Auth(单应用)模式时,将根据正则表达式检查请求的 URL 路径。使用 Forward Auth(域名模式)时,将根据正则表达式检查请求的完整 URL(包括协议和主机名)。 - + Authentication settings 身份验证设置 - + Intercept header authentication 拦截身份验证标头 - + When enabled, authentik will intercept the Authorization header to authenticate the request. 启用时,authentik 将会拦截 Authorization 标头以认证请求。 - + Send HTTP-Basic Authentication 发送 HTTP-Basic 身份验证 - + Send a custom HTTP-Basic Authentication header based on values from authentik. 根据来自 authentik 的值发送自定义 HTTP-Basic 身份验证标头。 - + ACS URL ACS URL - + Issuer 颁发者 - + Also known as EntityID. 也称为 EntityID。 - + Service Provider Binding 服务提供程序绑定 - + Redirect 重定向 - + Post Post - + Determines how authentik sends the response back to the Service Provider. 确定 authentik 如何将响应发送回服务提供程序。 - + Audience Audience - + Signing Certificate 签名证书 - + Certificate used to sign outgoing Responses going to the Service Provider. 证书,用于签署发送给服务提供程序的传出响应。 - + Verification Certificate 验证证书 - + When selected, incoming assertion's Signatures will be validated against this certificate. To allow unsigned Requests, leave on default. 选中后,传入断言的签名将根据此证书进行验证。要允许未签名的请求,请保留默认值。 - + Property mappings 属性映射 - + NameID Property Mapping NameID 属性映射 - + Configure how the NameID value will be created. When left empty, the NameIDPolicy of the incoming request will be respected. 配置如何创建 NameID 值。如果留空,将遵守传入请求的 NameIDPolicy。 - + Assertion valid not before 不在此刻之前,断言有效 - + Configure the maximum allowed time drift for an assertion. 为断言配置允许的最大时间漂移。 - + Assertion valid not on or after 不在此刻或之后,断言有效 - + Assertion not valid on or after current time + this value. 从当前时间经过多久时或之后,断言无效。 - + Session valid not on or after 不在此刻或之后,会话有效 - + Session not valid on or after current time + this value. 从当前时间经过多久时或之后,会话无效。 - + Digest algorithm 摘要算法 - + Signature algorithm 签名算法 - + Successfully imported provider. 已成功导入提供程序。 - + Metadata 元数据 - + Apply changes 应用更改 - + Close 关闭 - + Finish 完成 - + Back 返回 - + No form found 未找到表单 - + Form didn't return a promise for submitting 表单提交未返回 Promise - + Select type 选择类型 - + Try the new application wizard 尝试新应用程序向导 - + The new application wizard greatly simplifies the steps required to create applications and providers. 新应用程序向导大幅度简化了创建应用程序和提供程序所需的操作步骤。 - + Try it now 现在尝试 - + Create 创建 - + New provider 新建提供程序 - + Create a new provider. 创建一个新提供程序。 - + Create 创建 - + Shared secret 共享密钥 - + Client Networks 客户端网络 - + List of CIDRs (comma-seperated) that clients can connect from. A more specific @@ -1600,104 +1600,104 @@ URL URL - + SCIM base url, usually ends in /v2. SCIM 基础 URL,通常以 /v2 结尾。 - + Token 令牌 - + Token to authenticate with. Currently only bearer authentication is supported. 用于验证身份的令牌。当前仅支持 Bearer 身份验证。 - + User filtering 用户过滤 - + Exclude service accounts 排除服务账户 - + Group - + Only sync users within the selected group. 只同步选定组中的用户。 - + Attribute mapping 属性映射 - + User Property Mappings 用户属性映射 - + Property mappings used to user mapping. 用于用户映射的属性映射。 - + Group Property Mappings 组属性映射 - + Property mappings used to group creation. 用于创建组的属性映射。 - + Not used by any other object. 不被任何其他对象使用。 - + object will be DELETED 对象将被删除 - + connection will be deleted 连接将被删除 - + reference will be reset to default value 引用将被重置为默认值 - + reference will be set to an empty value 引用将被设置为空值 - + () - ( + - + ID ID - + Successfully deleted @@ -1708,13 +1708,13 @@ 删除 失败: - + Delete 删除 - + Are you sure you want to delete ? @@ -1723,863 +1723,863 @@ Delete 删除 - + Providers 提供程序 - + Provide support for protocols like SAML and OAuth to assigned applications. 为分配的应用程序提供对 SAML 和 OAuth 等协议的支持。 - + Type 类型 - + Provider(s) 提供程序 - + Assigned to application 分配给应用程序 - + Assigned to application (backchannel) 绑定到应用(反向通道) - + Warning: Provider not assigned to any application. 警告:提供程序未分配给任何应用程序。 - + Update 更新 - + Update 更新 - + Select providers to add to application 选择要添加到应用的提供程序 - + Add 添加 - + Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". 输入完整 URL、相对路径,或者使用 'fa://fa-test' 来使用 Font Awesome 图标 "fa-test"。 - + Path template for users created. Use placeholders like `%(slug)s` to insert the source slug. 创建用户的路径模板。使用占位符如 `%(slug)s` 插入源 Slug。 - + Successfully updated application. 已成功更新应用程序。 - + Successfully created application. 已成功创建应用程序。 - + Application's display Name. 应用的显示名称。 - + Slug Slug - + Optionally enter a group name. Applications with identical groups are shown grouped together. 输入可选的分组名称。分组相同的应用程序会显示在一起。 - + Provider 提供程序 - + Select a provider that this application should use. 选择此应用应该使用的提供程序。 - + Select backchannel providers which augment the functionality of the main provider. 选择可为主要提供程序增强功能的反向通道提供程序。 - + Policy engine mode 策略引擎模式 - + Any policy must match to grant access 必须匹配任意策略才能授予访问权限。 - + All policies must match to grant access 必须匹配所有策略才能授予访问权限 - + UI settings 用户界面设置 - + Launch URL 启动 URL - + If left empty, authentik will try to extract the launch URL based on the selected provider. 如果留空,authentik 将尝试根据选定的提供程序提取启动 URL。 - + Open in new tab 在新标签页中打开 - + If checked, the launch URL will open in a new browser tab or window from the user's application library. 如果勾选,在用户的应用程序库中时,启动 URL 将会在新浏览器标签页或窗口中打开。 - + Icon 图标 - + Currently set to: 当前设置为: - + Clear icon 清除图标 - + Publisher 发布者 - + Create Application 创建应用程序 - + Overview 总览 - + Changelog 更新日志 - + Warning: Provider is not used by any Outpost. 警告:提供程序未被任何前哨使用。 - + Assigned to application 分配给应用程序 - + Update LDAP Provider 更新 LDAP 提供程序 - + Edit 编辑 - + How to connect 如何连接 - + Connect to the LDAP Server on port 389: 通过端口 389 连接到 LDAP 服务器: - + Check the IP of the Kubernetes service, or 检查 Kubernetes 服务的 IP,或者 - + The Host IP of the docker host Docker 宿主机的主机 IP - + Bind DN Bind DN - + Bind Password Bind 密码 - + Search base 搜索 Base - + Preview 预览 - + Warning: Provider is not used by an Application. 警告:提供程序未被任何应用程序使用。 - + Redirect URIs 重定向 URI - + Update OAuth2 Provider 更新 OAuth2 提供程序 - + OpenID Configuration URL OpenID 配置 URL - + OpenID Configuration Issuer OpenID 配置颁发者 - + Authorize URL 授权 URL - + Token URL 令牌 URL - + Userinfo URL 用户信息 URL - + Logout URL 登出 URL - + JWKS URL JWKS URL - + Forward auth (domain-level) Forward Auth(域名级) - + Nginx (Ingress) Nginx(Ingress) - + Nginx (Proxy Manager) Nginx(Proxy Manager) - + Nginx (standalone) Nginx(独立) - + Traefik (Ingress) Traefik(Ingress) - + Traefik (Compose) Traefik(Compose) - + Traefik (Standalone) Traefik(独立) - + Caddy (Standalone) Caddy(独立) - + Internal Host 内部主机 - + External Host 外部主机 - + Basic-Auth 基本身份验证 - + Yes - + Mode 模式 - + Update Proxy Provider 更新代理提供程序 - + Protocol Settings 协议设置 - + Allowed Redirect URIs 允许的重定向 URI - + Setup 设置 - + No additional setup is required. 无需进行额外设置。 - + Update Radius Provider 更新 Radius 提供程序 - + Download 下载 - + Copy download URL 复制下载 URL - + Download signing certificate 下载签名证书 - + Related objects 相关对象 - + Update SAML Provider 更新 SAML 提供程序 - + SAML Configuration SAML 配置 - + EntityID/Issuer EntityID/签发者 - + SSO URL (Post) SSO URL(Post) - + SSO URL (Redirect) SSO URL(重定向) - + SSO URL (IdP-initiated Login) SSO URL(IDP 发起的登录) - + SLO URL (Post) SLO URL(Post) - + SLO URL (Redirect) SLO URL(重定向) - + SAML Metadata SAML 元数据 - + Example SAML attributes 示例 SAML 属性 - + NameID attribute NameID 属性 - + Warning: Provider is not assigned to an application as backchannel provider. 警告:提供程序未作为反向通道分配给应用程序。 - + Update SCIM Provider 更新 SCIM 提供程序 - + Run sync again 再次运行同步 - + Modern applications, APIs and Single-page applications. 现代应用程序、API 与单页应用程序。 - + LDAP LDAP - + Provide an LDAP interface for applications and users to authenticate against. 为应用程序和用户提供 LDAP 接口以进行身份​​验证。 - + New application 新应用程序 - + Applications 应用程序 - + Provider Type 提供程序类型 - + Application(s) 应用程序 - + Application Icon 应用程序图标 - + Update Application 更新应用程序 - + Successfully sent test-request. 已成功发送测试请求。 - + Log messages 日志消息 - + No log messages. 没有日志消息。 - + Active 激活 - + Last login 上次登录 - + Select users to add 选择要添加的用户 - + Successfully updated group. 已成功更新组。 - + Successfully created group. 已成功创建组。 - + Is superuser 是超级用户 - + Users added to this group will be superusers. 添加到该组的用户均为超级用户。 - + Parent 父级 - + Attributes 属性 - + Set custom attributes using YAML or JSON. 使用 YAML 或 JSON 设置自定义属性。 - + Successfully updated binding. 已成功更新绑定。 - + Successfully created binding. 已成功创建绑定。 - + Policy 策略 - + Group mappings can only be checked if a user is already logged in when trying to access this source. 组绑定仅会在已登录用户访问此源时检查。 - + User mappings can only be checked if a user is already logged in when trying to access this source. 用户绑定仅会在已登录用户访问此源时检查。 - + Enabled 已启用 - + Negate result 反转结果 - + Negates the outcome of the binding. Messages are unaffected. 反转绑定的结果。消息不受影响。 - + Order 顺序 - + Timeout 超时 - + Successfully updated policy. 已成功更新策略。 - + Successfully created policy. 已成功创建策略。 - + A policy used for testing. Always returns the same result as specified below after waiting a random duration. 用于测试的策略。等待随机时长后,始终返回下面指定的结果。 - + Execution logging 记录执行日志 - + When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged. 启用此选项后,将记录此策略的所有执行日志。默认情况下,只记录执行错误。 - + Policy-specific settings 特定策略设置 - + Pass policy? 通过策略? - + Wait (min) 等待(最短) - + The policy takes a random time to execute. This controls the minimum time it will take. 策略需要一段随机时间来执行。这将控制所需的最短时间。 - + Wait (max) 等待(最长) - + Matches an event against a set of criteria. If any of the configured values match, the policy passes. 根据一组条件匹配事件。如果任何配置的值匹配,则策略将通过。 - + Match created events with this action type. When left empty, all action types will be matched. 将创建的事件与此操作类型匹配。留空时,所有操作类型都将匹配。 - + Matches Event's Client IP (strict matching, for network matching use an Expression Policy. 匹配事件的客户端 IP(严格匹配,要网络匹配请使用表达式策略)。 - + Match events created by selected application. When left empty, all applications are matched. 匹配选定应用程序创建的事件。如果留空,则匹配所有应用程序。 - + Checks if the request's user's password has been changed in the last x days, and denys based on settings. 检查过去 x 天内请求的用户密码是否已更改,并根据设置拒绝。 - + Maximum age (in days) 最长使用期限(单位为天) - + Only fail the policy, don't invalidate user's password 仅使策略失败,不使用户的密码失效 - + Executes the python snippet to determine whether to allow or deny a request. 执行 Python 代码段以确定是允许还是拒绝请求。 - + Expression using Python. 使用 Python 的表达式。 - + See documentation for a list of all variables. 请阅读文档了解完整变量列表。 - + Static rules 静态规则 - + Minimum length 最小长度 - + Minimum amount of Uppercase Characters 最低大写字符数 - + Minimum amount of Lowercase Characters 最低小写字符数 - + Minimum amount of Digits 最低数字字符数 - + Minimum amount of Symbols Characters 最低符号字符数 - + Error message 错误消息 - + Symbol charset 符号字符集 - + Characters which are considered as symbols. 被视为符号的字符。 - + HaveIBeenPwned settings HaveIBeenPwned 设置 - + Allowed count 允许的计数 - + Allow up to N occurrences in the HIBP database. HIBP 数据库中最多允许 N 次出现。 - + zxcvbn settings zxcvbn 设置 - + Score threshold 分数阈值 - + If the password's score is less than or equal this value, the policy will fail. 如果密码分数小于等于此值,则策略失败。 - + Checks the value from the policy request against several rules, mostly used to ensure password strength. 根据多条规则检查策略请求中的值,这些规则主要用于确保密码强度。 - + Password field 密码字段 - + Field key to check, field keys defined in Prompt stages are available. 要检查的字段键,可以使用输入阶段中定义的字段键。 - + Check static rules 检查静态规则 - + Check haveibeenpwned.com 检查 haveibeenpwned.com - + For more info see: 更多信息请看: - + Check zxcvbn 检查 zxcvbn - + Password strength estimator created by Dropbox, see: Dropbox 制作的密码强度估算器,详见: - + Allows/denys requests based on the users and/or the IPs reputation. 根据用户和/或 IP 信誉允许/拒绝请求。 - + Invalid login attempts will decrease the score for the client's IP, and the @@ -2595,782 +2595,782 @@ doesn't pass when either or both of the selected options are equal or above the Check IP 检查 IP - + Check Username 检查用户名 - + Threshold 阈值 - + New policy 新建策略 - + Create a new policy. 创建一个新策略。 - + Create Binding 创建绑定 - + Superuser 超级用户 - + Members 成员 - + Select groups to add user to 选择要添加用户的组 - + Warning: Adding the user to the selected group(s) will give them superuser permissions. 警告:将用户添加到所选的组会使其获得超级用户权限。 - + Successfully updated user. 已成功更新用户。 - + Successfully created user. 已成功创建用户。 - + Username 用户名 - + User's primary identifier. 150 characters or fewer. 用户主标识符。不超过 150 个字符。 - + User's display name. 用户的显示名称 - + Email 电子邮箱 - + Is active 已激活 - + Designates whether this user should be treated as active. Unselect this instead of deleting accounts. 指定是否应将此用户视为活动用户。取消选择此选项,而不是删除帐户。 - + Path 路径 - + Policy / User / Group 策略 / 用户 / 组 - + Policy 策略 - + Group - + User 用户 - + Edit Policy 编辑策略 - + Update Group 更新组 - + Edit Group 编辑组 - + Update User 更新用户 - + Edit User 编辑用户 - + Policy binding(s) 策略绑定 - + Update Binding 更新绑定 - + Edit Binding 编辑绑定 - + No Policies bound. 未绑定策略。 - + No policies are currently bound to this object. 当前没有策略绑定到此对象。 - + Bind existing policy 绑定已有策略 - + Warning: Application is not used by any Outpost. 警告:应用程序未被任何前哨使用。 - + Related 相关 - + Backchannel Providers 反向通道提供程序 - + Check access 检查访问权限 - + Check 检查 - + Check Application access 检查应用程序访问权限 - + Test 测试 - + Launch 启动 - + Logins over the last week (per 8 hours) 过去一周的登录次数(每 8 小时) - + Policy / Group / User Bindings 策略 / 组 / 用户绑定 - + These policies control which users can access this application. 这些策略控制哪些用户可以访问此应用程序。 - + Successfully updated source. 已成功更新源。 - + Successfully created source. 已成功创建源。 - + Sync users 同步用户 - + User password writeback 用户密码写回 - + Login password is synced from LDAP into authentik automatically. Enable this option only to write password changes in authentik back to LDAP. 登录密码会自动从 LDAP 同步到 authentik。启用此选项可将 authentik 中的密码更改写回至 LDAP。 - + Sync groups 同步组 - + Connection settings 连接设置 - + Server URI 服务器 URI - + Specify multiple server URIs by separating them with a comma. 通过用逗号分隔多个服务器 URI 来指定它们。 - + Enable StartTLS 启用 StartTLS - + To use SSL instead, use 'ldaps://' and disable this option. 要改用 SSL,请使用 'ldaps: //' 并禁用此选项。 - + TLS Verification Certificate TLS 验证证书 - + When connecting to an LDAP Server with TLS, certificates are not checked by default. Specify a keypair to validate the remote certificate. 使用 TLS 连接到 LDAP 服务器时,默认情况下不检查证书。指定密钥对以验证远程证书。 - + Bind CN Bind CN - + LDAP Attribute mapping LDAP 属性映射 - + Property mappings used to user creation. 用于创建用户的属性映射。 - + Additional settings 其他设置 - + Parent group for all the groups imported from LDAP. 从 LDAP 导入的所有组的父组。 - + User path 用户路径 - + Addition User DN 额外的用户 DN - + Additional user DN, prepended to the Base DN. 额外的用户 DN,添加到 Base DN 起始处。 - + Addition Group DN 额外的组 DN - + Additional group DN, prepended to the Base DN. 额外的组 DN,添加到 Base DN 起始处。 - + User object filter 用户对象筛选器 - + Consider Objects matching this filter to be Users. 将与此筛选器匹配的对象视为用户。 - + Group object filter 组对象过滤器 - + Consider Objects matching this filter to be Groups. 将与此过滤器匹配的对象视为组。 - + Group membership field 组成员资格字段 - + Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' 包含组成员的字段。请注意,如果使用 "memberUid" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...' - + Object uniqueness field 对象唯一性字段 - + Field which contains a unique Identifier. 包含唯一标识符的字段。 - + Link users on unique identifier 使用唯一标识符链接用户 - + Link to a user with identical email address. Can have security implications when a source doesn't validate email addresses 链接到电子邮件地址相同的用户。当源不验证电子邮件地址时,可能会有安全隐患 - + Use the user's email address, but deny enrollment when the email address already exists 使用用户的电子邮件地址,但在电子邮件地址已存在时拒绝注册 - + Link to a user with identical username. Can have security implications when a username is used with another source 链接到用户名相同的用户。当其他源使用相同用户名时,可能会有安全隐患 - + Use the user's username, but deny enrollment when the username already exists 使用用户的用户名,但在用户名已存在时拒绝注册 - + Unknown user matching mode 未知用户匹配模式 - + URL settings URL 设置 - + Authorization URL 授权 URL - + URL the user is redirect to to consent the authorization. 用户被重定向到以同意授权的 URL。 - + Access token URL 访问令牌 URL - + URL used by authentik to retrieve tokens. authentik 用来获取令牌的 URL。 - + Profile URL 个人资料 URL - + URL used by authentik to get user information. authentik 用来获取用户信息的 URL。 - + Request token URL 请求令牌 URL - + URL used to request the initial token. This URL is only required for OAuth 1. 用于请求初始令牌的 URL。只有 OAuth 1 才需要此网址。 - + OIDC Well-known URL OIDC Well-known URL - + OIDC well-known configuration URL. Can be used to automatically configure the URLs above. OIDC Well-known 配置 URL。可用于自动配置上述 URL。 - + OIDC JWKS URL OIDC JWKS URL - + JSON Web Key URL. Keys from the URL will be used to validate JWTs from this source. JSON Web Key URL。来自此 URL 的 Key 将被用于验证此身份来源的 JWT。 - + OIDC JWKS OIDC JWKS - + Raw JWKS data. 原始 JWKS 数据。 - + User matching mode 用户匹配模式 - + Delete currently set icon. 删除当前设置的图标。 - + Consumer key 消费者 Key - + Consumer secret 消费者 Secret - + Additional scopes to be passed to the OAuth Provider, separated by space. To replace existing scopes, prefix with *. 要传递给 OAuth 提供程序的其他作用域,用空格分隔。要替换已存在的作用域,请添加前缀 *。 - + Flow settings 流程设置 - + Flow to use when authenticating existing users. 认证已存在用户时所使用的流程。 - + Enrollment flow 注册流程 - + Flow to use when enrolling new users. 新用户注册的流程。 - + Load servers 加载服务器 - + Re-authenticate with plex 使用 Plex 重新验证身份 - + Allow friends to authenticate via Plex, even if you don't share any servers 允许好友通过 Plex 进行身份验证,即使您不共享任何服务器。 - + Allowed servers 允许的服务器 - + Select which server a user has to be a member of to be allowed to authenticate. 选择用户必须是哪个服务器的成员才能进行身份验证。 - + SSO URL SSO URL - + URL that the initial Login request is sent to. 初始登录请求发送到的 URL。 - + SLO URL SLO URL - + Optional URL if the IDP supports Single-Logout. 如果 IDP 支持单点登出,则为可选 URL。 - + Also known as Entity ID. Defaults the Metadata URL. 也称为 Entity ID。 默认为元数据 URL。 - + Binding Type 绑定类型 - + Redirect binding 重定向绑定 - + Post-auto binding 自动 Post 绑定 - + Post binding but the request is automatically sent and the user doesn't have to confirm. Post 绑定,但请求会被自动发送,不需要用户确认。 - + Post binding Post 绑定 - + Signing keypair 签名密钥对 - + Keypair which is used to sign outgoing requests. Leave empty to disable signing. 用于签名传出请求的密钥对。留空则禁用签名。 - + Allow IDP-initiated logins 允许 IDP 发起的登录 - + Allows authentication flows initiated by the IdP. This can be a security risk, as no validation of the request ID is done. 允许由 IdP 启动的身份验证流程。这可能存在安全风险,因为未对请求 ID 进行验证。 - + NameID Policy NameID 策略 - + Persistent 持久的 - + Email address 电子邮箱地址 - + Windows Windows - + X509 Subject X509 主题 - + Transient 暂时的 - + Delete temporary users after 多久后删除临时用户 - + 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. 删除临时用户的时间偏移。这仅适用于您的 IDP 使用 NameID 格式 'transient' 且用户未手动登出的情况。 - + Pre-authentication flow 身份验证前流程 - + Flow used before authentication. 身份验证之前使用的流程。 - + New source 新建身份来源 - + Create a new source. 创建一个新身份来源。 - + Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. 身份来源,既可以同步到 authentik 的数据库中,也可以被用户用来进行身份验证和注册。 - + Source(s) - + Disabled 已禁用 - + Built-in 内置 - + Update LDAP Source 更新 LDAP 源 - + Not synced yet. 尚未同步。 - + Task finished with warnings 任务已完成但有警告 - + Task finished with errors 任务已完成但有错误 - + Last sync: 上次同步: - + OAuth Source OAuth 源 - + Generic OpenID Connect 通用 OpenID 连接 - + Unknown provider type 未知提供程序类型 - + Details 详情 - + Callback URL 回调 URL - + Access Key 访问密钥 - + Update OAuth Source 更新 OAuth 源 - + Diagram 流程图 - + Policy Bindings 策略绑定 - + These bindings control which users can access this source. @@ -3381,433 +3381,433 @@ doesn't pass when either or both of the selected options are equal or above the Update Plex Source 更新 Plex 源 - + Update SAML Source 更新 SAML 源 - + Successfully updated mapping. 已成功更新映射。 - + Successfully created mapping. 已成功创建映射。 - + Object field 对象字段 - + Field of the user object this value is written to. 写入此值的用户对象的字段。 - + SAML Attribute Name SAML 属性名称 - + Attribute name used for SAML Assertions. Can be a URN OID, a schema reference, or a any other string. If this property mapping is used for NameID Property, this field is discarded. 用于 SAML 断言的属性名称。可以是 URN OID、Schema Reference 或任何其他字符串。如果此属性映射用于 NameID 属性,则会丢弃此字段。 - + Friendly Name 显示名称 - + Optionally set the 'FriendlyName' value of the Assertion attribute. 可选,设置断言属性的 'FriendlyName' 值。 - + Scope name 作用域名称 - + Scope which the client can specify to access these properties. 客户端可以指定的访问这些属性的范围。 - + Description shown to the user when consenting. If left empty, the user won't be informed. 同意授权时向用户显示的描述。如果留空,则不会告知用户。 - + Example context data 示例上下文数据 - + Active Directory User Active Directory 用户 - + Active Directory Group Active Directory 组 - + New property mapping 新建属性映射 - + Create a new property mapping. 创建一个新属性映射。 - + Property Mappings 属性映射 - + Control how authentik exposes and interprets information. 控制 authentik 如何公开和处理信息。 - + Property Mapping(s) 属性映射 - + Test Property Mapping 测试属性映射 - + Hide managed mappings 隐藏管理映射 - + Successfully updated token. 已成功更新令牌。 - + Successfully created token. 已成功创建令牌。 - + Unique identifier the token is referenced by. 引用令牌的唯一标识符。 - + Intent 意图 - + API Token API Token - + Used to access the API programmatically 用于编程方式访问 API - + App password. 应用密码。 - + Used to login using a flow executor 使用流程执行器登录 - + Expiring 即将过期 - + If this is selected, the token will expire. Upon expiration, the token will be rotated. 如果选择此选项,令牌将能够过期。过期时,令牌将被轮换。 - + Expires on 过期时间 - + API Access API 访问权限 - + App password 应用密码 - + Verification 验证 - + Unknown intent 未知意图 - + Tokens 令牌 - + Tokens are used throughout authentik for Email validation stages, Recovery keys and API access. 令牌在整个 authentik 中用于电子邮件验证阶段、恢复密钥和 API 访问。 - + Expires? 过期? - + Expiry date 过期日期 - + Token(s) 令牌 - + Create Token 创建令牌 - + Token is managed by authentik. 令牌由 authentik 管理。 - + Update Token 更新令牌 - + Domain 域名 - + Matching is done based on domain suffix, so if you enter domain.tld, foo.domain.tld will still match. 根据域名后缀完成匹配,因此,如果您输入 domain.tld,foo.domain.tld 仍将匹配。 - + Default 默认 - + Branding settings 品牌设置 - + Title 标题 - + Branding shown in page title and several other places. 品牌信息显示在页面标题和其他几个地方。 - + Logo Logo - + Icon shown in sidebar/header and flow executor. 在侧边栏/标题和流程执行器中显示的图标。 - + Favicon 网站图标 - + Icon shown in the browser tab. 浏览器选项卡中显示的图标。 - + Default flows 默认流程 - + Flow used to authenticate users. If left empty, the first applicable flow sorted by the slug is used. 用于对用户进行身份验证的流程。如果留空,则使用按 Slug 排序的第一个适用流程。 - + Invalidation flow 失效流程 - + Flow used to logout. If left empty, the first applicable flow sorted by the slug is used. 用于登出的流程。如果留空,则使用按 Slug 排序的第一个适用流程。 - + Recovery flow 恢复流程 - + Recovery flow. If left empty, the first applicable flow sorted by the slug is used. 恢复流程。如果留空,则使用按 Slug 排序的第一个适用流程。 - + Unenrollment flow 删除账户流程 - + If set, users are able to unenroll themselves using this flow. If no flow is set, option is not shown. 如果已设置,则用户可以使用此流程自行删除账户。如果未设置流程,则不显示选项。 - + User settings flow 用户设置流程 - + If set, users are able to configure details of their profile. 设置后,用户可以配置他们个人资料的详细信息。 - + Device code flow 设备代码流程 - + If set, the OAuth Device Code profile can be used, and the selected flow will be used to enter the code. 如果设置,则 OAuth 设备代码用户资料可用,并且选定的流程将会用于输入代码。 - + Other global settings 其他全局设置 - + Web Certificate Web 证书 - + Event retention 事件保留 - + Duration after which events will be deleted from the database. 事件从数据库中删除的时间,超过这个时间就会被删除。 - + When using an external logging solution for archiving, this can be set to "minutes=5". 使用外部日志记录解决方案进行存档时,可以将其设置为 "minutes=5"。 - + This setting only affects new Events, as the expiration is saved per-event. 此设置仅影响新事件,因为过期时间是分事件保存的。 - + Configure visual settings and defaults for different domains. 配置不同域名的可视化设置和默认值。 - + Default? 默认? - + Policies 策略 - + Allow users to use Applications based on properties, enforce Password Criteria and selectively apply Stages. 允许用户根据属性使用应用程序、强制使用密码标准以及选择性地应用阶段。 - + Assigned to object(s). 已分配给 个对象。 - + Warning: Policy is not assigned. 警告:策略未分配。 - + Test Policy 测试策略 - + Policy / Policies 策略 - + Successfully cleared policy cache 已成功清除策略缓存 - + Failed to delete policy cache 删除策略缓存失败 - + Clear cache 清除缓存 - + Clear Policy cache 清除策略缓存 - + Are you sure you want to clear the policy cache? This will cause all policies to be re-evaluated on their next usage. @@ -3816,93 +3816,93 @@ doesn't pass when either or both of the selected options are equal or above the Reputation scores 信誉分数 - + Reputation for IP and user identifiers. Scores are decreased for each failed login and increased for each successful login. IP 和用户标识符的信誉。每次登录失败分数都会降低,每次登录成功分数都会增加。 - + IP IP - + Score 分数 - + Updated 已更新 - + Reputation 信誉 - + Groups - + Group users together and give them permissions based on the membership. 将用户分组在一起,并根据成员资格为他们授予权限。 - + Superuser privileges? 超级用户权限? - + Group(s) - + Create Group 创建组 - + Create group 创建组 - + Enabling this toggle will create a group named after the user, with the user as member. 启用此开关将创建一个以用户命名的组,用户为成员。 - + Use the username and password below to authenticate. The password can be retrieved later on the Tokens page. 使用下面的用户名和密码进行身份验证。密码可以稍后在令牌页面上获取。 - + Password 密码 - + Valid for 360 days, after which the password will automatically rotate. You can copy the password from the Token List. 有效期为 360 天,之后密码将自动轮换。您可以从令牌列表中复制密码。 - + The following objects use 以下对象使用 - + connecting object will be deleted 连接对象将被删除 - + Successfully updated @@ -3913,617 +3913,617 @@ doesn't pass when either or both of the selected options are equal or above the 更新 失败: - + Are you sure you want to update ""? 您确定要更新 " " 吗? - + Successfully updated password. 已成功更新密码。 - + Successfully sent email. 已成功发送电子邮件。 - + Email stage 电子邮件阶段 - + Successfully added user(s). 成功添加用户。 - + Users to add 要添加的用户 - + User(s) 用户 - + Remove Users(s) 删除用户 - + Are you sure you want to remove the selected users from the group ? 您确定要从组 中删除选定的用户吗? - + Remove 删除 - + Impersonate 模拟身份 - + User status 用户状态 - + Change status 更改状态 - + Deactivate 停用 - + Update password 更新密码 - + Set password 设置密码 - + Successfully generated recovery link 已成功生成恢复链接 - + No recovery flow is configured. 未配置恢复流程。 - + Copy recovery link 复制恢复链接 - + Send link 发送链接 - + Send recovery link to user 向用户发送恢复链接 - + Email recovery link 电子邮件恢复链接 - + Recovery link cannot be emailed, user has no email address saved. 无法通过电子邮件发送恢复链接,用户没有保存电子邮件地址。 - + Add User 添加用户 - + Warning: This group is configured with superuser access. Added users will have superuser access. 警告:此组已配置为超级用户权限。加入的用户将会拥有超级用户权限。 - + Add existing user 添加已有用户 - + Create user 创建用户 - + Create User 创建用户 - + Create Service account 创建服务账户 - + Hide service-accounts 隐藏服务账户 - + Group Info 组信息 - + Notes 备注 - + Edit the notes attribute of this group to add notes here. 编辑该组的备注属性以在此处添加备注。 - + Users 用户 - + Root - + Warning: You're about to delete the user you're logged in as (). Proceed at your own risk. 警告:您即将删除当前登录的用户( )。如果继续,请自担风险。 - + Hide deactivated user 隐藏未激活的用户 - + User folders 用户目录 - + Successfully added user to group(s). 成功添加用户到组。 - + Groups to add 要添加的组 - + Remove from Group(s) 从组中删除 - + Are you sure you want to remove user from the following groups? 您确定要从以下组中删除用户 吗? - + Add Group 添加组 - + Add to existing group 添加到已有组 - + Add new group 添加新组 - + Application authorizations 应用程序授权 - + Revoked? 已吊销? - + Expires 过期 - + ID Token ID 令牌 - + Refresh Tokens(s) 刷新令牌 - + Last IP 上次 IP - + Session(s) 会话 - + Expiry 过期 - + (Current session) (当前会话) - + Permissions 权限 - + Consent(s) 同意授权 - + Successfully updated device. 已成功更新设备。 - + Static tokens 静态令牌 - + TOTP Device TOTP 设备 - + Enroll 注册 - + Device(s) 设备 - + Update Device 更新设备 - + Confirmed 已确认 - + User Info 用户信息 - + Actions over the last week (per 8 hours) 过去一周的操作(每 8 小时) - + Edit the notes attribute of this user to add notes here. 编辑该用户的备注属性以在此处添加备注。 - + Sessions 会话 - + User events 用户事件 - + Explicit Consent 明确同意授权 - + OAuth Refresh Tokens OAuth 刷新令牌 - + MFA Authenticators MFA 身份验证器 - + Successfully updated invitation. 已成功更新邀请。 - + Successfully created invitation. 已成功创建邀请。 - + Flow 流程 - + When selected, the invite will only be usable with the flow. By default the invite is accepted on all flows with invitation stages. 选中时,此邀请仅可在对应流程中使用。默认情况下,此邀请接受所有流程的邀请阶段。 - + Optional data which is loaded into the flow's 'prompt_data' context variable. YAML or JSON. 加载到流程的 'prompt_data' 上下文变量中的可选数据。YAML 或 JSON。 - + Single use 一次性使用 - + When enabled, the invitation will be deleted after usage. 启用后,邀请将在使用后被删除。 - + Select an enrollment flow 选择注册流程 - + Link to use the invitation. 使用邀请的链接。 - + Invitations 邀请 - + Create Invitation Links to enroll Users, and optionally force specific attributes of their account. 创建邀请链接以注册用户,并可选地强制设置其账户的特定属性。 - + Created by 创建者 - + Invitation(s) 邀请 - + Invitation not limited to any flow, and can be used with any enrollment flow. 邀请没有限制到任何流程,可以用于任何注册流程。 - + Update Invitation 更新邀请 - + Create Invitation 创建邀请 - + Warning: No invitation stage is bound to any flow. Invitations will not work as expected. 警告:没有邀请阶段绑定到任何流程。邀请将无法按预期工作。 - + Auto-detect (based on your browser) 自动检测(基于您的浏览器) - + Required. 必需。 - + Continue 继续 - + Successfully updated prompt. 已成功更新输入项。 - + Successfully created prompt. 已成功创建输入项。 - + Text: Simple Text input 文本:简单文本输入 - + Text Area: Multiline text input 文本框:多行文本输入。 - + Text (read-only): Simple Text input, but cannot be edited. 文本(只读):简单文本输入,但无法编辑。 - + Text Area (read-only): Multiline text input, but cannot be edited. 文本框(只读):多行文本输入,但无法编辑。 - + Username: Same as Text input, but checks for and prevents duplicate usernames. 用户名:与文本输入相同,但检查并防止用户名重复。 - + Email: Text field with Email type. 电子邮箱:电子邮箱类型的文本字段。 - + Password: Masked input, multiple inputs of this type on the same prompt need to be identical. 密码:屏蔽显示输入内容,多个此类型的输入如果在同一个输入项下,则内容需要相同。 - + Number 数字 - + Checkbox 复选框 - + Radio Button Group (fixed choice) 单选按钮组(固定选项) - + Dropdown (fixed choice) 下拉框(固定选项) - + Date 日期 - + Date Time 日期时间 - + File 文件 - + Separator: Static Separator Line 分隔符:静态分隔线 - + Hidden: Hidden field, can be used to insert data into form. 隐藏:隐藏字段,可用于将数据插入表单。 - + Static: Static value, displayed as-is. 静态:静态值,按原样显示。 - + authentik: Locale: Displays a list of locales authentik supports. authentik:语言:显示 authentik 支持的语言设置。 - + Preview errors 预览错误 - + Data preview 数据预览 - + Unique name of this field, used for selecting fields in prompt stages. 此字段的唯一名称,用于选择输入阶段的字段。 - + Field Key 字段键 - + Name of the form field, also used to store the value. 表单域的名称,也用于存储值。 - + When used in conjunction with a User Write stage, use attributes.foo to write attributes. 当与用户写入阶段结合使用时,请使用 attributes.foo 来编写属性。 - + Label 标签 - + Label shown next to/above the prompt. 标签会显示在输入侧方/上方。 - + Required 必需 - + Interpret placeholder as expression 将占位符解释为表达式 - + When checked, the placeholder will be evaluated in the same way a property mapping is. @@ -4534,7 +4534,7 @@ doesn't pass when either or both of the selected options are equal or above the Placeholder 占位符 - + Optionally provide a short hint that describes the expected input value. @@ -4547,7 +4547,7 @@ doesn't pass when either or both of the selected options are equal or above the Interpret initial value as expression 将初始值解释为表达式 - + When checked, the initial value will be evaluated in the same way a property mapping is. @@ -4558,7 +4558,7 @@ doesn't pass when either or both of the selected options are equal or above the Initial value 初始值 - + Optionally pre-fill the input with an initial value. @@ -4571,152 +4571,152 @@ doesn't pass when either or both of the selected options are equal or above the Help text 帮助文本 - + Any HTML can be used. 可以使用任何 HTML。 - + Prompts 输入 - + Single Prompts that can be used for Prompt Stages. 可用于输入阶段的单个输入项。 - + Field 字段 - + Stages 阶段 - + Prompt(s) 输入 - + Update Prompt 更新输入项 - + Create Prompt 创建输入 - + Target 目标 - + Stage 阶段 - + Evaluate when flow is planned 流程被规划时评估 - + Evaluate policies during the Flow planning process. 在流程规划过程中评估策略。 - + Evaluate when stage is run 阶段被运行时评估 - + Evaluate policies before the Stage is present to the user. 在阶段即将呈现给用户时评估策略。 - + Invalid response behavior 无效响应行为 - + Returns the error message and a similar challenge to the executor 向执行器返回错误消息和类似的质询 - + Restarts the flow from the beginning 从头开始重新启动流程 - + Restarts the flow from the beginning, while keeping the flow context 从头开始重新启动流程,同时保留流程上下文 - + Configure how the flow executor should handle an invalid response to a challenge given by this bound stage. 针对由此绑定阶段提供的质询,配置流程执行器应如何处理对此质询的无效响应。 - + Successfully updated stage. 已成功更新阶段。 - + Successfully created stage. 已成功创建阶段。 - + Stage used to configure a duo-based authenticator. This stage should be used for configuration flows. 用来配置基于 Duo 的身份验证器的阶段。此阶段应该用于配置流程。 - + Authenticator type name 身份验证类型名称 - + Display name of this authenticator, used by users when they enroll an authenticator. 此验证器的显示名称,在用户注册验证器时使用。 - + API Hostname API 主机名 - + Duo Auth API Duo Auth API - + Integration key 集成密钥 - + Secret key Secret 密钥 - + Duo Admin API (optional) Duo Admin API(可选) - + When using a Duo MFA, Access or Beyond plan, an Admin API application can be created. @@ -4727,612 +4727,612 @@ doesn't pass when either or both of the selected options are equal or above the Stage-specific settings 阶段特定设置 - + Configuration flow 配置流程 - + Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage. 经过身份验证的用户用来配置此阶段的流程。如果为空,用户将无法配置此阶段。 - + Twilio Account SID Twilio 账户 SID - + Get this value from https://console.twilio.com 从 https://console.twilio.com 获取此值 - + Twilio Auth Token Twilio 身份验证令牌 - + Authentication Type 身份验证类型 - + Basic Auth 基本身份验证 - + Bearer Token Bearer 令牌 - + External API URL 外部 API URL - + This is the full endpoint to send POST requests to. 这是向其发送 POST 请求的完整终端节点。 - + API Auth Username API 身份验证用户名 - + This is the username to be used with basic auth or the token when used with bearer token 这是用于 Basic 身份验证的用户名,或是使用 Bearer 令牌时的令牌 - + API Auth password API 身份验证密码 - + This is the password to be used with basic auth 这是用于 Basic 身份验证的密码 - + Mapping 映射 - + Modify the payload sent to the custom provider. 修改发送到自定义提供程序的载荷。 - + Stage used to configure an SMS-based TOTP authenticator. 用来配置基于短信的 TOTP 身份验证器的阶段。 - + Twilio Twilio - + Generic 通用 - + From number 发信人号码 - + Number the SMS will be sent from. 短信的发信人号码。 - + Hash phone number 哈希电话号码 - + If enabled, only a hash of the phone number will be saved. This can be done for data-protection reasons. Devices created from a stage with this enabled cannot be used with the authenticator validation stage. 如果启用,仅保存电话号码的哈希。这是出于数据保护的原因。如果设备创建自启用此选项的阶段,则无法在验证阶段使用身份验证器。 - + Stage used to configure a static authenticator (i.e. static tokens). This stage should be used for configuration flows. 用来配置静态身份验证器(即静态令牌)的阶段。此阶段应该用于配置流程。 - + Token count 令牌计数 - + Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator). 用来配置 TOTP 身份验证器(即 Authy/Google 身份验证器)的阶段。 - + Digits 数字 - + 6 digits, widely compatible 6 位数字,广泛兼容 - + 8 digits, not compatible with apps like Google Authenticator 8 位数字,与 Google 身份验证器等应用不兼容 - + Stage used to validate any authenticator. This stage should be used during authentication or authorization flows. 用来验证任何身份验证器的阶段。此阶段应在身份验证或授权流程中使用。 - + Device classes 设备类型 - + Static Tokens 静态令牌 - + TOTP Authenticators TOTP 身份验证器 - + WebAuthn Authenticators WebAuthn 身份验证器 - + Duo Authenticators Duo 身份验证器 - + SMS-based Authenticators 基于短信的身份验证器 - + Device classes which can be used to authenticate. 可用于进行身份验证的设备类型。 - + Last validation threshold 上次验证阈值 - + If any of the devices user of the types selected above have been used within this duration, this stage will be skipped. 如果上面所选类型的任意设备在此期限内被使用,此阶段会被跳过。 - + Not configured action 未配置操作 - + Force the user to configure an authenticator 强制用户配置身份验证器 - + Deny the user access 拒绝用户访问 - + WebAuthn User verification WebAuthn 用户验证 - + User verification must occur. 必须进行用户验证。 - + User verification is preferred if available, but not required. 如果可用,则首选用户验证,但不是必需的。 - + User verification should not occur. 不应进行用户验证。 - + Configuration stages 配置阶段 - + Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again. 当用户没有任何兼容的设备时,用来配置身份验证器的阶段。此阶段通过后,将不再请求此用户。 - + When multiple stages are selected, the user can choose which one they want to enroll. 选中多个阶段时,用户可以选择要注册哪个。 - + User verification 用户验证 - + Resident key requirement 常驻钥匙要求 - + Authenticator Attachment 身份验证器附件 - + No preference is sent 不发送偏好 - + A non-removable authenticator, like TouchID or Windows Hello 不可移除的身份验证器,例如 TouchID 或 Windows Hello - + A "roaming" authenticator, like a YubiKey 像 YubiKey 这样的“漫游”身份验证器 - + This stage checks the user's current session against the Google reCaptcha (or compatible) service. 此阶段会根据 Google reCaptcha(或兼容的)服务检查用户的当前会话。 - + Public Key 公钥 - + Public key, acquired from https://www.google.com/recaptcha/intro/v3.html. 公钥,从 https://www.google.com/recaptcha/intro/v3.html 获取。 - + Private Key 私钥 - + Private key, acquired from https://www.google.com/recaptcha/intro/v3.html. 私钥,从 https://www.google.com/recaptcha/intro/v3.html 获取。 - + Advanced settings 高级设置 - + JS URL JS URL - + URL to fetch JavaScript from, defaults to recaptcha. Can be replaced with any compatible alternative. 拉取 JavaScript 的 URL,默认为 recaptcha。可以替换为任何兼容替代。 - + API URL API URL - + URL used to validate captcha response, defaults to recaptcha. Can be replaced with any compatible alternative. 用于校验验证码响应的 URL,默认为 recaptcha。可以替换为任何兼容替代。 - + Prompt for the user's consent. The consent can either be permanent or expire in a defined amount of time. 请求用户同意授权。同意授权可以是永久性的,也可以在规定的时间后过期。 - + Always require consent 始终需要征得同意授权 - + Consent given last indefinitely 无限期同意授权 - + Consent expires. 同意授权会过期。 - + Consent expires in 同意授权过期时间 - + Offset after which consent expires. 同意过期后的偏移。 - + Dummy stage used for testing. Shows a simple continue button and always passes. 用于测试的虚拟阶段。显示一个简单的“继续”按钮,并且始终通过。 - + Throw error? 抛出错误? - + SMTP Host SMTP 主机 - + SMTP Port SMTP 端口 - + SMTP Username SMTP 用户名 - + SMTP Password SMTP 密码 - + Use TLS 使用 TLS - + Use SSL 使用 SSL - + From address 发件人地址 - + Verify the user's email address by sending them a one-time-link. Can also be used for recovery to verify the user's authenticity. 通过向用户发送一次性链接来验证用户的电子邮件地址。也可用于在恢复时验证用户的真实性。 - + Activate pending user on success 成功时激活待处理用户 - + When a user returns from the email successfully, their account will be activated. 当用户成功自电子邮件中返回时,其账户将被激活。 - + Use global settings 使用全局设置 - + When enabled, global Email connection settings will be used and connection settings below will be ignored. 启用后,将使用全局电子邮件连接设置,下面的连接设置将被忽略。 - + Token expiry 令牌过期 - + Time in minutes the token sent is valid. 发出令牌的有效时间(单位为分钟)。 - + Template 模板 - + Let the user identify themselves with their username or Email address. 让用户使用用户名或电子邮件地址来标识自己。 - + User fields 用户字段 - + UPN UPN - + Fields a user can identify themselves with. If no fields are selected, the user will only be able to use sources. 用户可以用来标识自己的字段。如果未选择任何字段,则用户将只能使用源。 - + Password stage 密码阶段 - + When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks. 选中后,密码字段将显示在同一页面,而不是单独的页面上。这样可以防止用户名枚举攻击。 - + Case insensitive matching 不区分大小写的匹配 - + When enabled, user fields are matched regardless of their casing. 启用后,无论大小写如何,都将匹配用户字段。 - + Show matched user 显示匹配的用户 - + 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. 如果输入了有效的用户名/电子邮箱,并且启用了此选项,则会显示用户的用户名和头像。否则,将显示用户输入的文本。 - + Source settings 源设置 - + Sources - + Select sources should be shown for users to authenticate with. This only affects web-based sources, not LDAP. 选择的源应显示给用户进行身份验证。这只会影响基于 Web 的源,而不影响 LDAP。 - + Show sources' labels 显示源的标签 - + By default, only icons are shown for sources. Enable this to show their full names. 默认情况下,只为源显示图标。启用此选项可显示它们的全名。 - + Passwordless flow 无密码流程 - + Optional passwordless flow, which is linked at the bottom of the page. When configured, users can use this flow to authenticate with a WebAuthn authenticator, without entering any details. 可选的无密码流程,链接在页面底部。配置后,用户可以使用此流程通过 WebAuthn 身份验证器进行验证,无需输入任何详细信息。 - + Optional enrollment flow, which is linked at the bottom of the page. 可选注册流程,链接在页面底部。 - + Optional recovery flow, which is linked at the bottom of the page. 可选的恢复流程,链接在页面底部。 - + This stage can be included in enrollment flows to accept invitations. 此阶段可以包含在注册流程中以接受邀请。 - + Continue flow without invitation 在没有邀请的情况下继续流程 - + 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. 如果设置了此标志,则当没有发出邀请时,此阶段将跳转到下一个阶段。默认情况下,当没有发出邀请时,此阶段将取消流程。 - + Validate the user's password against the selected backend(s). 根据选定的后端验证用户的密码。 - + Backends 后端 - + User database + standard password 用户数据库 + 标准密码 - + User database + app passwords 用户数据库 + 应用程序密码 - + User database + LDAP password 用户数据库 + LDAP 密码 - + Selection of backends to test the password against. 选择用于测试密码的后端。 - + Flow used by an authenticated user to configure their password. If empty, user will not be able to configure change their password. 经过身份验证的用户用来配置其密码的流程。如果为空,用户将无法配置更改其密码。 - + Failed attempts before cancel 取消前的的尝试失败 - + 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. 在取消流程之前,用户可以尝试多少次。要锁定用户,请使用信誉策略和 user_write 阶段。 - + Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable. 向用户显示任意输入字段,例如在注册期间。数据保存在流程上下文中的 'prompt_data' 变量下。 - + Fields 字段 - + ("", of type ) @@ -5340,17 +5340,17 @@ doesn't pass when either or both of the selected options are equal or above the (" ",类型为 ) - + Validation Policies 验证策略 - + Selected policies are executed when the stage is submitted to validate the data. 当阶段被提交以验证数据时,执行选定的策略。 - + Delete the currently pending user. CAUTION, this stage does not ask for confirmation. Use a consent stage to ensure the user is aware of their actions. @@ -5359,52 +5359,52 @@ doesn't pass when either or both of the selected options are equal or above the Log the currently pending user in. 登录当前待处理的用户。 - + Session duration 会话持续时间 - + Determines how long a session lasts. Default of 0 seconds means that the sessions lasts until the browser is closed. 确定会话持续多长时间。默认为 0 秒意味着会话持续到浏览器关闭为止。 - + Different browsers handle session cookies differently, and might not remove them even when the browser is closed. 不同浏览器处理会话 Cookie 的方式不同,即使关闭浏览器,也不能保证它们会被删除。 - + See here. 详见这里。 - + Stay signed in offset 保持登录偏移量 - + If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. 如果设置时长大于 0,用户可以选择“保持登录”选项,这将使用户的会话延长此处设置的时间。 - + Terminate other sessions 终止其他会话 - + When enabled, all previous sessions of the user will be terminated. 启用时,此用户的所有过往会话将会被终止。 - + Remove the user from the current session. 从当前会话中移除用户。 - + Write any data from the flow's context's 'prompt_data' to the currently pending user. If no user @@ -5415,308 +5415,308 @@ doesn't pass when either or both of the selected options are equal or above the Never create users 从不创建用户 - + When no user is present in the flow context, the stage will fail. 如果流程上下文中没有出现用户,此阶段失败。 - + Create users when required 如果需要则创建用户 - + When no user is present in the the flow context, a new user is created. 如果流程上下文中没有出现用户,则创建新用户。 - + Always create new users 总是创建新用户 - + Create a new user even if a user is in the flow context. 即使用户在流程上下文中,仍然创建新用户。 - + Create users as inactive 创建未激活用户 - + Mark newly created users as inactive. 将新创建的用户标记为未激活。 - + User path template 用户路径模板 - + Path new users will be created under. If left blank, the default path will be used. 新用户将会在此路径下创建。如果留空,则使用默认路径。 - + Newly created users are added to this group, if a group is selected. 如果选择了组,则会将新创建的用户添加到该组。 - + New stage 新建阶段 - + Create a new stage. 创建一个新阶段。 - + Successfully imported device. 已成功导入设备。 - + The user in authentik this device will be assigned to. 此设备要绑定的 authentik 用户。 - + Duo User ID Duo 用户 ID - + The user ID in Duo, can be found in the URL after clicking on a user. Duo 中的用户 ID,可以点击用户之后,在 URL 中找到。 - + Automatic import 自动导入 - + Successfully imported devices. 已成功导入 个设备。 - + Start automatic import 开始自动导入 - + Or manually import 或者手动导入 - + Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow. 阶段是引导用户完成流程的单个步骤。阶段只能在流程内部执行。 - + Flows 流程 - + Stage(s) 阶段 - + Import 导入 - + Import Duo device 导入 Duo 设备 - + Successfully updated flow. 已成功更新流程。 - + Successfully created flow. 已成功创建流程。 - + Shown as the Title in Flow pages. 显示为流程页面中的标题。 - + Visible in the URL. 在 URL 中可见。 - + Designation 指定 - + Decides what this Flow is used for. For example, the Authentication flow is redirect to when an un-authenticated user visits authentik. 决定此流程的用途。例如,当未经身份验证的用户访问 authentik 时,会重定向到身份验证流程。 - + No requirement 无要求 - + Require authentication 需要身份验证 - + Require no authentication. 需要无身份验证。 - + Require superuser. 需要管理员用户。 - + Required authentication level for this flow. 此流程需要身份验证等级。 - + Behavior settings 行为设置 - + Compatibility mode 兼容模式 - + Increases compatibility with password managers and mobile devices. 增强与移动设备与密码管理器的兼容性。 - + Denied action 拒绝操作 - + Will follow the ?next parameter if set, otherwise show a message 将会首先遵循 ?next 参数,如果不存在则显示一条消息 - + Will either follow the ?next parameter or redirect to the default interface 将会遵循 ?next 参数或者重定向到默认接口 - + Will notify the user the flow isn't applicable 将会通知用户此流程不适用 - + Decides the response when a policy denies access to this flow for a user. 当一条策略拒绝用户访问此流程时决定响应。 - + Appearance settings 外观设置 - + Layout 布局 - + Background 背景 - + Background shown during execution. 执行过程中显示的背景。 - + Clear background 清除背景 - + Delete currently set background image. 删除当前设置的背景图片。 - + Successfully imported flow. 已成功导入流程。 - + .yaml files, which can be found on goauthentik.io and can be exported by authentik. .yaml 文件,可以在 goauthentik.io 上找到,也可以通过 authentik 导出。 - + Flows describe a chain of Stages to authenticate, enroll or recover a user. Stages are chosen based on policies applied to them. 流程描述了一系列用于对用户进行身份验证、注册或恢复的阶段。阶段是根据应用于它们的策略来选择的。 - + Flow(s) 流程 - + Update Flow 更新流程 - + Create Flow 创建流程 - + Import Flow 导入流程 - + Successfully cleared flow cache 已成功清除流程缓存 - + Failed to delete flow cache 删除流程缓存失败 - + Clear Flow cache 清除流程缓存 - + Are you sure you want to clear the flow cache? @@ -5727,258 +5727,258 @@ doesn't pass when either or both of the selected options are equal or above the Stage binding(s) 阶段绑定 - + Stage type 阶段类型 - + Edit Stage 编辑阶段 - + Update Stage binding 更新阶段绑定 - + These bindings control if this stage will be applied to the flow. 这些绑定控制是否将此阶段应用于流程。 - + No Stages bound 未绑定阶段 - + No stages are currently bound to this flow. 目前没有阶段绑定到此流程。 - + Create Stage binding 创建阶段绑定 - + Bind stage 绑定阶段 - + Bind existing stage 绑定已有阶段 - + Flow Overview 流程总览 - + Related actions 相关操作 - + Execute flow 执行流程 - + Normal 正常 - + with current user 以当前用户 - + with inspector 附加检视器 - + Export flow 导出流程 - + Export 导出 - + Stage Bindings 阶段绑定 - + These bindings control which users can access this flow. 这些绑定控制哪些用户可以访问此流程。 - + Event Log 事件日志 - + Event 事件 - + Event info 事件信息 - + Created 创建时间 - + Successfully updated transport. 已成功更新传输。 - + Successfully created transport. 已成功创建传输。 - + Local (notifications will be created within authentik) 本地(通知在 authentik 内创建) - + Webhook (generic) Webhook(通用) - + Webhook (Slack/Discord) Webhook(Slack/Discord) - + Webhook URL Webhook URL - + Webhook Mapping Webhook 映射 - + Send once 发送一次 - + Only send notification once, for example when sending a webhook into a chat channel. 仅发送一次通知,例如在向聊天频道发送 Webhook 时。 - + Notification Transports 通知传输 - + Define how notifications are sent to users, like Email or Webhook. 定义如何向用户发送通知,例如电子邮件或 Webhook。 - + Notification transport(s) 通知传输 - + Update Notification Transport 更新通知传输 - + Create Notification Transport 创建通知传输 - + Successfully updated rule. 已成功更新规则。 - + Successfully created rule. 已成功创建规则。 - + Select the group of users which the alerts are sent to. If no group is selected the rule is disabled. 选择一组用于发送警告的用户。如果未选择组,则此规则被禁用。 - + Transports 传输 - + Select which transports should be used to notify the user. If none are selected, the notification will only be shown in the authentik UI. 选择应使用哪些传输方式来通知用户。如果未选择任何内容,则通知将仅显示在 authentik UI 中。 - + Severity 严重程度 - + Notification Rules 通知规则 - + Send notifications whenever a specific Event is created and matched by policies. 每当特定事件被创建并匹配策略时,都会发送通知。 - + Sent to group 已发送到组 - + Notification rule(s) 通知规则 - + None (rule disabled) 无(规则已禁用) - + Update Notification Rule 更新通知规则 - + Create Notification Rule 创建通知规则 - + These bindings control upon which events this rule triggers. @@ -5989,959 +5989,959 @@ Bindings to groups/users are checked against the user of the event. Outpost Deployment Info 前哨部署信息 - + View deployment documentation 查看部署文档 - + Click to copy token 点击复制令牌 - + If your authentik Instance is using a self-signed certificate, set this value. 如果您的 authentik 实例正在使用自签名证书,请设置此值。 - + If your authentik_host setting does not match the URL you want to login with, add this setting. 如果您的 authentik_host 设置与您要登录时使用的网址不匹配,请添加此设置。 - + Successfully updated outpost. 已成功更新前哨。 - + Successfully created outpost. 已成功创建前哨。 - + Radius Radius - + Integration 集成 - + Selecting an integration enables the management of the outpost by authentik. 选择集成使 authentik 能够管理前哨。 - + Configuration 配置 - + See more here: 了解更多: - + Documentation 文档 - + Last seen 上次出现 - + , should be ,应该是 - + Hostname 主机名 - + Not available 不可用 - + Last seen: 上次出现: - + Unknown type 未知类型 - + Outposts 前哨 - + Outposts are deployments of authentik components to support different environments and protocols, like reverse proxies. 前哨是对 authentik 组件的部署,用于支持不同的环境和协议,例如反向代理。 - + Health and Version 健康状态与版本 - + Warning: authentik Domain is not configured, authentication will not work. 警告:未配置 authentik 域名,身份验证将不起作用。 - + Logging in via . 通过 登录。 - + No integration active 没有激活的集成 - + Update Outpost 更新前哨 - + View Deployment Info 查看部署信息 - + Detailed health (one instance per column, data is cached so may be out of date) 详细健康状况(每列一个实例,数据经过缓存,因此可能会过时) - + Outpost(s) 前哨 - + Create Outpost 创建前哨 - + Successfully updated integration. 已成功更新集成。 - + Successfully created integration. 已成功创建集成。 - + Local 本地 - + If enabled, use the local connection. Required Docker socket/Kubernetes Integration. 如果启用,请使用本地连接。需要 Docker Socket/Kubernetes 集成。 - + Docker URL Docker URL - + Can be in the format of 'unix://' when connecting to a local docker daemon, using 'ssh://' to connect via SSH, or 'https://:2376' when connecting to a remote system. 连接到本地 Docker 守护进程时可以采用 'unix://' 格式,通过 SSH 连接时采用 'ssh://' 格式,或者在连接到远程系统时采用 'https://:2376' 格式。 - + CA which the endpoint's Certificate is verified against. Can be left empty for no validation. 验证端点证书所依据的 CA。可以留空,表示不进行验证。 - + TLS Authentication Certificate/SSH Keypair TLS 身份验证证书/SSH 密钥对 - + Certificate/Key used for authentication. Can be left empty for no authentication. 用于身份验证的证书/密钥。可以留空表示不验证。 - + When connecting via SSH, this keypair is used for authentication. 通过 SSH 连接时,此密钥对用于身份验证。 - + Kubeconfig Kubeconfig - + Verify Kubernetes API SSL Certificate 验证 Kubernetes API SSL 证书 - + New outpost integration 新建前哨集成 - + Create a new outpost integration. 创建一个新前哨集成。 - + State 状态 - + Unhealthy 不健康 - + Outpost integration(s) 前哨集成 - + Successfully generated certificate-key pair. 已成功生成证书密钥对。 - + Common Name 常用名 - + Subject-alt name 替代名称 - + Optional, comma-separated SubjectAlt Names. 可选,逗号分隔的替代名称。 - + Validity days 有效天数 - + Successfully updated certificate-key pair. 已成功更新证书密钥对。 - + Successfully created certificate-key pair. 已成功创建证书密钥对。 - + PEM-encoded Certificate data. PEM 编码的证书数据。 - + Optional Private Key. If this is set, you can use this keypair for encryption. 可选私钥。如果设置,则可以使用此密钥对来加密。 - + Certificate-Key Pairs 证书密钥对 - + Import certificates of external providers or create certificates to sign requests with. 导入外部提供商的证书或创建用于签名请求的证书。 - + Private key available? 私钥可用吗? - + Certificate-Key Pair(s) 证书密钥对 - + Managed by authentik 由 authentik 管理 - + Managed by authentik (Discovered) 由 authentik 管理(已发现) - + Yes () 是( - + No - + Update Certificate-Key Pair 更新证书密钥对 - + Certificate Fingerprint (SHA1) 证书指纹(SHA1) - + Certificate Fingerprint (SHA256) 证书指纹(SHA256) - + Certificate Subject 证书主题 - + Download Certificate 下载证书 - + Download Private key 下载私钥 - + Create Certificate-Key Pair 创建证书密钥对 - + Generate 生成 - + Generate Certificate-Key Pair 生成证书密钥对 - + Successfully updated instance. 已成功更新实例。 - + Successfully created instance. 已成功创建实例。 - + Disabled blueprints are never applied. 禁用的蓝图永远不会应用。 - + Local path 本地路径 - + OCI Registry OCI Registry - + Internal 内部 - + OCI URL, in the format of oci://registry.domain.tld/path/to/manifest. OCI URL,格式为 oci://registry.domain.tld/path/to/manifest。 - + See more about OCI support here: 在这里了解更多 OCI 支持: - + Blueprint 蓝图 - + Configure the blueprint context, used for templating. 配置蓝图上下文,用于模板操作。 - + Orphaned 孤立 - + Blueprints 蓝图 - + Automate and template configuration within authentik. 在 authentik 内的自动化与模板配置。 - + Last applied 上次应用 - + Blueprint(s) 蓝图 - + Update Blueprint 更新蓝图 - + Create Blueprint Instance 创建蓝图实例 - + API Requests API 请求 - + Open API Browser 打开 API 浏览器 - + Notifications 通知 - + unread 未读 - + Successfully cleared notifications 已成功清除通知 - + Clear all 全部清除 - + A newer version of the frontend is available. 有较新版本的前端可用。 - + You're currently impersonating . Click to stop. 您目前正在模拟 的身份。点击以停止。 - + User interface 用户界面 - + Dashboards 仪表板 - + Events 事件 - + Logs 日志 - + Customisation 自定义 - + Directory 目录 - + System 系统 - + Certificates 证书 - + Outpost Integrations 前哨集成 - + API request failed API 请求失败 - + User's avatar 用户的头像 - + Something went wrong! Please try again later. 发生了某些错误!请稍后重试。 - + Request ID 请求 ID - + You may close this page now. 您可以关闭此页面了。 - + You're about to be redirect to the following URL. 您将被重定向到以下 URL。 - + Follow redirect 跟随重定向 - + Request has been denied. 请求被拒绝。 - + Not you? 不是您? - + Need an account? 需要一个账户? - + Sign up. 注册。 - + Forgot username or password? 忘记用户名或密码? - + Select one of the sources below to login. 选择以下源之一进行登录。 - + Or 或者 - + Use a security key 使用安全密钥 - + Login to continue to . 登录以继续前往 - + Please enter your password 请输入您的密码 - + Forgot password? 忘记密码了吗? - + Application requires following permissions: 应用程序需要以下权限: - + Application already has access to the following permissions: 应用程序已经获得以下权限: - + Application requires following new permissions: 应用程序需要以下新权限: - + Check your Inbox for a verification email. 检查您的收件箱是否有验证电子邮件。 - + Send Email again. 再次发送电子邮件。 - + Successfully copied TOTP Config. 已成功复制 TOTP 配置。 - + Copy 复制 - + Code 代码 - + Please enter your TOTP Code 请输入您的 TOTP 代码 - + Duo activation QR code Duo 激活二维码 - + Alternatively, if your current device has Duo installed, click on this link: 或者,如果您当前的设备已安装 Duo,请点击此链接: - + Duo activation Duo 激活 - + Check status 检查状态 - + Make sure to keep these tokens in a safe place. 确保将这些令牌保存在安全的地方。 - + Phone number 电话号码 - + Please enter your Phone number. 请输入您的电话号码。 - + Please enter the code you received via SMS 请输入您通过短信收到的验证码 - + A code has been sent to you via SMS. 验证码已通过短信发送给您。 - + Open your two-factor authenticator app to view your authentication code. 打开您的两步验证应用查看身份验证代码。 - + Static token 静态令牌 - + Authentication code 身份验证代码 - + Please enter your code 请输入您的代码 - + Return to device picker 返回设备选择器 - + Sending Duo push notification 发送 Duo 推送通知 - + Assertions is empty 断言为空 - + Error when creating credential: 创建凭据时出错: - + Error when validating assertion on server: 在服务器上验证断言时出错: - + Retry authentication 重试身份验证 - + Duo push-notifications Duo 推送通知 - + Receive a push notification on your device. 在您的设备上接收推送通知。 - + Authenticator 身份验证器 - + Use a security key to prove your identity. 使用安全密钥证明您的身份。 - + Traditional authenticator 传统身份验证器 - + Use a code-based authenticator. 使用基于代码的身份验证器。 - + Recovery keys 恢复密钥 - + In case you can't access any other method. 以防万一您无法使用任何其他方法。 - + SMS 短信 - + Tokens sent via SMS. 通过短信发送的令牌。 - + Select an authentication method. 选择一种身份验证方法。 - + Stay signed in? 保持登录? - + Select Yes to reduce the number of times you're asked to sign in. 选择“是”以减少您被要求登录的次数。 - + Authenticating with Plex... 正在使用 Plex 进行身份验证... - + Waiting for authentication... 正在等待身份验证… - + If no Plex popup opens, click the button below. 如果 Plex 没有弹出窗口,则点击下面的按钮。 - + Open login 打开登录 - + Authenticating with Apple... 正在使用 Apple 进行身份验证... - + Retry 重试 - + Enter the code shown on your device. 请输入您设备上显示的代码。 - + Please enter your Code 请输入您的验证码 - + You've successfully authenticated your device. 您成功验证了此设备的身份。 - + Flow inspector 流程检视器 - + Next stage 下一阶段 - + Stage name 阶段名称 - + Stage kind 阶段种类 - + Stage object 阶段对象 - + This flow is completed. 此流程已完成。 - + Plan history 规划历史记录 - + Current plan context 当前计划上下文 - + Session ID 会话 ID - + Powered by authentik 由 authentik 强力驱动 - + Background image 背景图片 - + Error creating credential: 创建凭据时出错: - + Server validation of credential failed: 服务器验证凭据失败: - + Register device 注册设备 - + Refer to documentation @@ -6950,7 +6950,7 @@ Bindings to groups/users are checked against the user of the event. No Applications available. 没有可用的应用程序。 - + Either no applications are defined, or you don’t have access to any. @@ -6959,186 +6959,186 @@ Bindings to groups/users are checked against the user of the event. My Applications 我的应用 - + My applications 我的应用 - + Change your password 更改您的密码 - + Change password 更改密码 - + - + Save 保存 - + Delete account 删除账户 - + Successfully updated details 已成功更新详情 - + Open settings 打开设置 - + No settings flow configured. 未配置设置流程 - + Update details 更新详情 - + Successfully disconnected source 解绑成功 - + Failed to disconnected source: 解绑源失败: - + Disconnect 断开连接 - + Connect 连接 - + Error: unsupported source settings: 错误:不支持的源设置: - + Connect your user account to the services listed below, to allow you to login using the service instead of traditional credentials. 将您的用户账户连接到下面列出的服务,以允许您使用该服务而不是传统凭据登录。 - + No services available. 没有可用的服务。 - + Create App password 创建应用密码 - + User details 用户详情 - + Consent 同意授权 - + MFA Devices MFA 设备 - + Connected services 已连接服务 - + Tokens and App passwords 令牌和应用程序密码 - + Unread notifications 未读通知 - + Admin interface 管理员界面 - + Stop impersonation 停止模拟身份 - + Avatar image 头像图片 - + Failed 已失败 - + Unsynced / N/A 未同步 / N/A - + Outdated outposts 过时的前哨 - + Unhealthy outposts 不健康的前哨 - + Next 下一步 - + Inactive 未激活 - + Regular user 普通用户 - + Activate 激活 - + Use Server URI for SNI verification @@ -8351,7 +8351,7 @@ Bindings to groups/users are checked against the user of the event. item(s) marked to remove. - 项被标记为删除。 + 项被标记为删除。 Available Applications @@ -8408,7 +8408,55 @@ Bindings to groups/users are checked against the user of the event. Preview for user 用户预览 + + + Brand name + 品牌名称 + + + Remote Access Provider + 远程访问提供程序 + + + Remotely access computers/servers via RDP/SSH/VNC + 通过 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 + RAC 连接 - + \ No newline at end of file diff --git a/web/xliff/zh-Hant.xlf b/web/xliff/zh-Hant.xlf index 67eb41ef69..831d290466 100644 --- a/web/xliff/zh-Hant.xlf +++ b/web/xliff/zh-Hant.xlf @@ -6347,6 +6347,42 @@ Bindings to groups/users are checked against the user of the event. 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 diff --git a/web/xliff/zh_CN.xlf b/web/xliff/zh_CN.xlf index 61a4ad3818..a754555b6b 100644 --- a/web/xliff/zh_CN.xlf +++ b/web/xliff/zh_CN.xlf @@ -8408,6 +8408,54 @@ Bindings to groups/users are checked against the user of the event. Preview for user 用户预览 + + + Brand name + 品牌名称 + + + Remote Access Provider + 远程访问提供程序 + + + Remotely access computers/servers via RDP/SSH/VNC + 通过 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 + RAC 连接 diff --git a/web/xliff/zh_TW.xlf b/web/xliff/zh_TW.xlf index 4b970d85ec..ba30848b19 100644 --- a/web/xliff/zh_TW.xlf +++ b/web/xliff/zh_TW.xlf @@ -8215,6 +8215,42 @@ Bindings to groups/users are checked against the user of the event. 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 diff --git a/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/content-creator.png b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/content-creator.png new file mode 100644 index 0000000000..6f4416f82c Binary files /dev/null and b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/content-creator.png differ diff --git a/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image1.png b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image1.png new file mode 100644 index 0000000000..32ec67d1ac Binary files /dev/null and b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image1.png differ diff --git a/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image2.png b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image2.png new file mode 100644 index 0000000000..9386b39a08 Binary files /dev/null and b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image2.png differ diff --git a/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image3.png b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image3.png new file mode 100644 index 0000000000..85156dd624 Binary files /dev/null and b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image3.png differ diff --git a/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image4.png b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image4.png new file mode 100644 index 0000000000..e4d6f0029a Binary files /dev/null and b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/image4.png differ diff --git a/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/item.md b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/item.md new file mode 100644 index 0000000000..7f27cd7666 --- /dev/null +++ b/website/blog/2024-02-07-open-source-devs-are-the-original-content-creators/item.md @@ -0,0 +1,201 @@ +--- +title: Open source developers are the original content creators +slug: 2024-02-07-open-source-devs-are-the-original-content-creators +authors: + - name: Jens Langhammer + title: CTO at Authentik Security Inc + url: https://github.com/BeryJu + image_url: https://github.com/BeryJu.png + - name: Nick Moore + title: Contributing Writer + url: https://nickmoore.me/ + image_url: https://nickmoore.me/assets/images/image01.jpg?v=128b1f3c + +tags: + - authentik + - access management + - open source + - content creators + - software + - GNU + - identity provider + - authentication + - Authentik Security +hide_table_of_contents: false +image: content-creator.png +--- + +> **_authentik is an open source Identity Provider that unifies your identity needs into a single platform, replacing Okta, Active Directory, and auth0. Authentik Security is a [public benefit company](https://github.com/OpenCoreVentures/ocv-public-benefit-company/blob/main/ocv-public-benefit-company-charter.md) building on top of the open source project._** + +--- + +In 2024, Tom Scott and Jynn Nelson, otherwise different people in different worlds, faced very similar problems. + +- Tom Scott is a YouTuber who, as of this writing, has gotten nearly 2 billion views across over 700 videos. Nearly 6.5 million people subscribe to Tom Scott’s [YouTube channel](https://www.youtube.com/@TomScottGo/videos). +- Jynn Nelson, a senior engineer, is a major maintainer of Rust, an open-source project that 2023 StackOverflow research showed was the [most admired language](https://survey.stackoverflow.co/2023/#productivity-impacts-knowledge-ic) among developers. About [2.2 million people](https://yalantis.com/blog/rust-market-overview/) are Rust developers. + +In a [goodbye video](https://youtu.be/7DKv5H5Frt0?feature=shared), Scott announced an extended break from his channel, saying, "I am so tired. There's nothing in my life right now except work.” + +In a post called [the rust project has a burnout problem](https://jyn.dev/the-rust-project-has-a-burnout-problem/), Nelson wrote, articulating sentiments across the Rust community, “you want a break, but you have a voice in the back of your head: ‘_the project would be worse without you_.’” + +It’s unfortunate that this comparison makes the best opening to the point of this post: open source developers are much more like content creators than most people tend to assume. + +> If anything, when you look at the history of the Internet and the history of distributing content online, open source developers might be the _original_ content creators. + +By looking at the paths they have both paved and recontextualizing their work within a broader view of the creator economy, we can come to a better understanding of the shared futures of content creators and open source developers. + +![Image by rawpixel.com on Freepik](./content-creator.png) + + + +## Open-source maintainers were creating content before it was cool + +In the past decade, a series of similar “economies” have risen and fallen, including the creator economy, the passion economy, and much of web3. + +Evan Armstrong captured these collapses well, writing about the [crash of the creator economy](https://every.to/napkin-math/what-happened-to-the-creator-economy) in 2023. “Dollars invested are down 86% to $123M,” he wrote. “Next came the layoffs. The giants of the space have had issues: Patreon laid off 17% of staff, Linktree first sacked 17% of staff, then a few months later another 27%, Cameo has laid off 160 (probably 33%+ of staff).” + +But unlike other economies, say, [the paper industry in Maine](https://www.jstor.org/stable/10.7591/j.ctvxkn85v), the factories haven’t left: influencers are still posting on Instagram, newsletter writers are still growing subscriber numbers on Substack, and TikTok creators are still going viral. + +> It’s a contradiction with a simple answer: typical conceptualizations of the creator economy are too limited, and the history of content creation is much longer and broader than most thought leaders and investors realize. + +### A very brief history of open source + +In 1974, software became copyrightable and it quickly shifted from free-by-default to paid. Once companies could control it, closed-source software took off. + +Companies enforced copyrights and trademarks and leased the right to use their software. In 1976, Bill Gates wrote an [open letter to hobbyists](https://archive.nytimes.com/www.nytimes.com/library/cyber/surf/072397mind-letter.html), arguing that “most of you steal your software,” and in 1983, IBM stopped distributing source code to people who purchased IBM software. + +In reaction to developments like these, Richard Stallman founded the GNU Project in 1983 and the Free Software Foundation in 1985. + +He wrote in [The GNU Manifesto](https://www.gnu.org/gnu/manifesto.html) that “Many programmers are unhappy about the commercialization of system software. It may enable them to make more money, but it requires them to feel in conflict with other programmers in general rather than feel as comrades.” + +Here, Stallman laid out one of the visions that’s continued driving open source to this day: “Once GNU is written, everyone will be able to obtain good system software free, just like air.” + +Over the following decades, open-source developers and maintainers used the nascent and eventually mature Internet to build software projects that were hobbies, industry-supporting keystones, and everything in between. + +[![cartoon of abstract machine, with unsteady building blocks supporting it.](./image1.png)](https://xkcd.com/2347/) + +Amongst this growth, another economy surfaced, too: a huge crop of companies that built tooling and platforms for open source as well as a variety of business models, such as open core, to support open source. Open source, once primarily adversarial to private industry, has become integral to it. + +### Is software content? + +Open-source developers were creating content and distributing it on the Internet long before everyone else. The pioneering work of what we might now call the creator economy often goes unrecognized for three major reasons: + +- Software isn’t always seen as content in the same way video content and text content are. +- The original philosophy of open source emphasized community and collaboration – emphasizing a movement that extended beyond any individual developer. +- Early open-source developers emphasized a “[gift culture](http://www.catb.org/~esr/writings/cathedral-bazaar/homesteading/index.html),” with people like Eric Raymond arguing that software should be “freely shared.” Content creators, however, have long depended on centralized platforms like YouTube that often offer built-in monetization tools. + +These distinctions, as significant as they might seem at first glance, are collapsing. Two decades after Raymond’s _The Cathedral and the Bazaar_, Nadia Eghbal wrote _Working in Public,_ and in it, she notes: “Like any other creator, these developers create work that is intertwined with, and influenced by, their users, but it’s not collaborative in the way that we typically think of online communities. Rather than the users of forums or Facebook groups, GitHub’s open source developers have more in common with solo creators on Twitter, Instagram, YouTube, or Twitch.” + +Of all people, considering the open letter cited earlier, Bill Gates might have been the first to realize this, [writing in 1996](https://medium.com/@HeathEvans/content-is-king-essay-by-bill-gates-1996-df74552f80d9) that “When it comes to an interactive network such as the Internet, the definition of ‘content’ becomes very wide. For example, computer software is a form of content–an extremely important one, and the one that for Microsoft will remain by far the most important.” + +Open source led the way, but now, this pioneering work is curling back on itself and the future of open source requires recognizing its connection to the creator economy as a whole. + +## 5 ways open source paved the way for content creators + +Open source developers pioneered new ways of creating and distributing content on the Internet – lessons that are worth re-contextualizing and re-learning for the sake of open source and for a new, larger understanding of the creator economy. + +### 1. Misleading margins abound + +One of the major reasons the creator economy took off as a target for venture capital is because content creation has zero margin – in theory. Like software, these venture capitalists proposed, you could create once and reproduce freely forever. + +Theoretically, a YouTube creator should be able to make a library of great videos and make ad money for as long as the videos remain online. Unless it’s covering breaking news, a great video should still be great in six months, two years, and five years. Create once. Profit forever. + +This isn’t how it works. On YouTube, views can plummet if you don’t stay in people’s minds and if you don’t keep on trend. YouTube creators are building a brand and benefit from uploading regularly – even if it leads to creators like Tom Scott uploading a video every week for ten years without break. + +Of course, investors could have learned this lesson sooner by looking at open source. A similar mistaken assumption applies: build the software once and distribute it forever. But, again, this isn’t how it works. + +As Eghbal writes, open source maintainers are “expected to maintain the code they published for as long as people use it. In some cases, this could be literally decades, unless the maintainer formally steps away from the project.” + +![screenshot of Apache website's download page.](./image2.png) + +[Apache](https://httpd.apache.org/), for example, launched in 1995, celebrated its 25th anniversary in 2020, and released its most recent version in 2023. + +Software degrades over time (think of tech debt, integration issues, changing standards, etc.) in much the same way a YouTuber’s brand degrades over time. Both need maintenance just to persist, much less grow. + +### 2. Firewalls require vigilance + +In traditional journalism, the “firewall” (sometimes referred to as a separation between church and state) is a conceptual and logistical distinction between the editorial department and the advertising department. If the two were to mix, advertising needs would bias editorial goals and subscribers wouldn’t trust the publisher that mixed them. + +The same distinction extends to content creation and open source. + +In content creation, the trust a creator has built with their audience is paramount, and maintaining the firewall between their content and their sponsors is essential. + +On Instagram, for example, an influencer needs to be very clear about whether a given post is an ad or not. There are legal standards around this issue – the [SEC charged Kim Kardashian](https://www.sec.gov/news/press-release/2022-183) a fine in 2022, for example, for not disclosing that the crypto company she was promoting had paid her – but the bigger issue is maintaining audience trust. + +Without trust, you can’t influence. + +These kinds of controversies are not novel for open source developers. Similar discussions arise when vendors offer to support or acquire an open source project and when an open source maintainer starts taking sponsorships. + +Charity Majors, CEO and cofounder of Honeycomb, came up through open source and when she founded a for-profit company, the firewall singed her. “I came from open source,” she writes in a [2023 post](https://charity.wtf/2023/03/29/questionable-advice-people-used-to-take-me-seriously-then-i-became-a-software-vendor/), “where contempt for software vendors was apparently _de rigueur_.” + +Back then, she writes, she and others assumed vendors were “liars” that would “say anything to get you to buy.” Majors eventually learned that vendors weren’t all bad, but her experience exemplifies how the separation between open source and vendors (as well as content creators and advertisers) can be fraught. + +She now recommends vendors “lead with [their] bias” and says that she “discloses [her] own vested interest up front.” The boundaries can be crossed, either by projects seeking sponsorships or by developers seeking employment, but the boundary requires respect. + +### 3. Audiences are a source of survival and stress + +Influencers require a significant level of fame to achieve success: enough viewers to earn brand deals, enough fans to clamor outside makeup stores, enough listeners to sell out live shows. + +But even though creators depend on their audiences, those same audiences can be a huge source of stress. A big audience can mean pressure and it can also sometimes mean a [public pillorying](https://www.distractify.com/p/influencers-canceled-quickly). + +Open source developers rarely have fans in the same way but they frequently run into a similar dynamic. As an open source project becomes popular, more people want to contribute but because contributions are rarely perfect, PR review can become a job unto itself. + +Nolan Lawson, for example, a major contributor to PouchDB told Eghbal that open source popularity can create “a perverse effect where, the more successful you are, the more you get ‘punished’ with GitHub notifications.” + +[![screenshot showing number of notifications at 2,495, from blog page of Anthony Fu writing about how he manages GitHub notifications.](./image3.png)](https://antfu.me/posts/manage-github-notifcations-2023) + +As [Alex Danco writes](https://danco.substack.com/p/making-is-show-business-now), “Success brings attention, interaction, and maintenance - both of the code itself, and of the creator’s reputation. This all takes work, and it’s often not the kind of work the creators like doing.” + +Success can then breed disillusionment and sometimes burnout. Many early open source proponents imagined free-flowing collaboration sustaining the movement, but many maintainers aren’t finding as much collaboration as they’d like or need. As Eghbal writes, “It’s not the excessive consumption of code but the excessive participation from users vying for a maintainer’s attention that has made the work untenable for maintainers today.” + +Both open source developers and content creators can suffer from success. + +### 4. Sustainability vs. selling out + +Open-source maintainers faced the issue of “selling out” long before content creators faced it. And yet, ironically, even current open source developers struggle with monetization more than content creators do. + +The modern, if limited, definition of the creator economy arose after numerous important creator platforms were established (YouTube, Instagram, etc.). With YouTube, especially, monetization was eventually built in. The highest-earning creators tend to seek partnerships but advertising money flows through the platform itself. + +In open source, the original culture has proven much more resistant to monetization. Raymond emphasized an abundance mindset and a gift culture, fostering a perspective that sometimes prioritizes the movement above any individual maintainer’s sustainability. + +But things might be changing. When Majors worked at Facebook, for example, she realized that “Open source successes like Apache, Haproxy, Nginx, etc. are exceptions, not the norm; that this model is only viable for certain types of general-purpose infrastructure software… If steady progress is being made, at the end of the day, somewhere somebody is probably paying those developers.” + +On the other side of these success stories are open source developers working for little recompense. Alex Clark, for example, maintains Pillow, an open source project that has been downloaded millions of times and has even been used by NASA in its Mars Ingenuity helicopter. + +But the income didn’t [keep up with the influence](https://www.techtarget.com/searchitoperations/feature/Who-profits-from-open-source-maintainers-work). “Our income is disproportionate if this thing is everywhere – across the entire globe, used by Fortune-whatever companies,” Clark said. “It's disproportionate. And there's no easy way to fix that." + +This isn’t an isolated feeling. According to [2023 Tidelift research](https://4008838.fs1.hubspotusercontent-na1.net/hubfs/4008838/Tidelift-2023-open-source-maintainer-survey.pdf), 77% of the maintainers who are not paid would prefer to get paid, 22% have quit open source, and 36% have considered quitting. + +[![graphic depicted poll showing that 77% of unpaid maintainers of open source projects would prefer to be paid.](./image4.png)](https://4008838.fs1.hubspotusercontent-na1.net/hubfs/4008838/Tidelift-2023-open-source-maintainer-survey.pdf) + +Open source developers learned the hard way that monetization is hard – even if influence is indisputable. + +### 5. Building despite the bus factor + +Mr. Beast, the YouTube channel, has gotten over 42 billion views across nearly 800 videos and [employs about 250 people](https://www.businessinsider.com/whats-it-like-to-work-for-mrbeast-biggest-youtuber-world-2023-11#:~:text=MrBeast%20is%20likely%20the%20most,June%202023%2C%20according%20to%20Forbes.). + +But if Mr. Beast, the person, were hit by a bus tomorrow, a channel that routinely earns hundreds of millions of views per video would likely plummet in popularity. It’s a grim example of the [bus factor](https://en.wikipedia.org/wiki/Bus_factor) – the idea that companies with employees who have centralized knowledge or power create immense risk for the companies as a whole. + +Few open source maintainers have anything nearing the celebrity status of Mr. Beast and few open source projects could even really be considered personality-driven. And yet, many open source projects would suffer a similar fate from a similar bus factor. + +Tidelift research shows that nearly half of all open source maintainers work alone; [Synopsis research](https://thenewstack.io/open-source-needs-maintainers-but-how-can-they-get-paid/) shows that 91% of codebases contained open source software that had had no developer activity in the past two years; and [Linux Foundation research](https://thenewstack.io/open-source-needs-maintainers-but-how-can-they-get-paid/) found that only 35% of projects had a strong new contributor pipeline. + +In other words, the bus factor is alive and well in open source. If anything, the differences between open source and content creation make the result of this dynamic relatively worse for open source. + +If Mr. Beast retires, every one of his fans will know; if a key open source maintainer retires, their project could continue on, zombie-like, until a security issue reveals everyone was depending on a project with no one at the helm. + +## The bazaar will outlast the creator economy + +Open source developers are frequently undervalued but between Raymond and Eghbal, as well as some lessons from traditional content creators, we can see a path toward greater recognition. + +Raymond writes that in open source, “the only available measure of competitive success is reputation among one's peers,” but reputation is not automatically granted upon merging code. + +Eghbal clarifies, writing that “Open source developers are chronically undervalued because, unlike other creators, they’re tied to a platform that doesn’t enable them to realize the value of their work. Instead of operating quietly in the background, open source developers ought to come to the forefront again.” + +More and more open source developers are coming to the foreground, including [Cassidy Williams](https://cassidoo.co/), who has a strong Twitter and TikTok presence, and Shawn Wang (popularly known as @swyx) who runs an influential blog and advocates for devs [learning in public](https://www.swyx.io/learn-in-public). + +As Danco writes, “Making technology seems like a world apart from entertainment and show business. But in this new world, making _is_ show business.” + +The more that open source developers and the content creators that came up after them can learn from each other, the more sustainable the whole creator economy will be. + +As always, we want to hear your thoughts. Reach out to us via email at [hello@goauthentik.io](mailto:hello@goauthentik.io) or on [Discord](https://discord.com/channels/809154715984199690/809154716507963434)! diff --git a/website/docs/advanced/tenancy.md b/website/docs/advanced/tenancy.md index 222f437201..5f3e1d1ca8 100644 --- a/website/docs/advanced/tenancy.md +++ b/website/docs/advanced/tenancy.md @@ -2,17 +2,23 @@ title: Tenancy --- +Enterprise + +--- + ::::warning This feature is in alpha. Use at your own risk. :::: ::::info -This feature is available from 2024.1.1 and is not to be confused with brands, which used to be called tenants. +This feature is available from 2024.2 and is not to be confused with brands, which used to be called tenants. :::: ## Preparations -Starting with 2024.1.1, authentik allows for multiple tenants to be created. This allows an operator to manage several authentik installations without having to deploy additional instances. +Starting with 2024.2, authentik allows an administrator or operator to create multiple tenants. This means that an operator can manage several authentik installations without having to deploy additional instances. + +Note that creating and managing tenants is handled using authentik APIs, not in the Admin interface. authentik manages tenants by storing data for each tenant in a separate PostgreSQL schema. diff --git a/website/docs/core/applications.md b/website/docs/core/applications.md index 5798d986b9..1cf8da196f 100644 --- a/website/docs/core/applications.md +++ b/website/docs/core/applications.md @@ -33,7 +33,7 @@ The following aspects can be configured: If the authentik server does not have a volume mounted under `/media`, you'll get a text input. This accepts absolute URLs. If you've mounted single files into the container, you can reference them using `https://authentik.company/media/my-file.png`. - If there is a mount under `/media`, you'll instead see a field to upload a file. + If there is a mount under `/media` or if [S3 storage](../installation/storage-s3.md) is configured, you'll instead see a field to upload a file. - _Publisher_: Text shown below the application - _Description_: Subtext shown on the application card below the publisher diff --git a/website/docs/events/index.md b/website/docs/events/index.md index d9f3af567f..51678d87be 100644 --- a/website/docs/events/index.md +++ b/website/docs/events/index.md @@ -306,7 +306,7 @@ A configuration error occurs, for example during the authorization of an applica Logged when any model is created/updated/deleted, including the user that sent the request. :::info -Starting with authentik Enterprise 2024.1, `model_*` events also include which fields have been changed and their previous and new values. +Starting with authentik 2024.2, when a valid enterprise license is installed, these entries will contain additional audit data, including which fields were changed with this event, their previous values and their new values. ::: ### `email_sent` diff --git a/website/docs/flow/stages/email/index.mdx b/website/docs/flow/stages/email/index.mdx index 556b45878e..33b09bf810 100644 --- a/website/docs/flow/stages/email/index.mdx +++ b/website/docs/flow/stages/email/index.mdx @@ -26,7 +26,7 @@ return True You can also use custom email templates, to use your own design or layout. :::info -Starting with authentik 2024.1, it is possible to create `.txt` files with the same name as the `.html` template. If a matching `.txt` file exists, the email sent will be a multipart email with both the text and HTML template. +Starting with authentik 2024.2, it is possible to create `.txt` files with the same name as the `.html` template. If a matching `.txt` file exists, the email sent will be a multipart email with both the text and HTML template. ::: import Tabs from "@theme/Tabs"; diff --git a/website/docs/flow/stages/identification/index.md b/website/docs/flow/stages/identification/index.md index 3b9d647412..5c0046f376 100644 --- a/website/docs/flow/stages/identification/index.md +++ b/website/docs/flow/stages/identification/index.md @@ -25,7 +25,7 @@ These fields specify if and which flows are linked on the form. The enrollment f ## Pretend user exists :::info -Requires authentik 2024.1 +Requires authentik 2024.2 ::: When enabled, any user identifier will be accepted as valid (as long as they match the correct format, i.e. when [User fields](#user-fields) is set to only allow Emails, then the identifier still needs to be an Email). The stage will succeed and the flow will continue to the next stage. Stages like the [Password stage](../password/index.md) and [Email stage](../email/index.mdx) are aware of this "pretend" user and will behave the same as if the user would exist. diff --git a/website/docs/flow/stages/user_login/index.md b/website/docs/flow/stages/user_login/index.md index 92d655093b..a9f00bb5bc 100644 --- a/website/docs/flow/stages/user_login/index.md +++ b/website/docs/flow/stages/user_login/index.md @@ -39,8 +39,6 @@ When configured, all sessions authenticated by this stage will be bound to the s Sessions which break this binding will be terminated on use. The created [`logout`](../../../events/index.md#logout) event will contain additional data related to what caused the binding to be broken: ```json - -Context { "asn": { "asn": 6805, @@ -65,7 +63,7 @@ Context }, "ip": { "previous": "1.2.3.4", - "new": "5.6.7.8", + "new": "5.6.7.8" }, "http_request": { "args": {}, diff --git a/website/docs/installation/configuration.mdx b/website/docs/installation/configuration.mdx index c42290995e..e994837c08 100644 --- a/website/docs/installation/configuration.mdx +++ b/website/docs/installation/configuration.mdx @@ -426,7 +426,7 @@ Defaults to 2. ## System settings :::info -Requires authentik 2024.1.0 +Requires authentik 2024.2 ::: Additional settings are configurable using the Admin interface, under **System** -> **Settings** or using the API. diff --git a/website/docs/policies/expression.mdx b/website/docs/policies/expression.mdx index aaf8506080..68aa595fe4 100644 --- a/website/docs/policies/expression.mdx +++ b/website/docs/policies/expression.mdx @@ -59,6 +59,12 @@ import Objects from "../expressions/_objects.md"; return context["geoip"].country.iso_code == "US" ``` +- `asn`: ASN object, see [GeoIP](https://geoip2.readthedocs.io/en/latest/#geoip2.models.ASN) + + ```python + return context["asn"].autonomous_system_number == 64496 + ``` + - `ak_is_sso_flow`: Boolean which is true if request was initiated by authenticating through an external provider. - `ak_client_ip`: Client's IP Address or 255.255.255.255 if no IP Address could be extracted. Can be [compared](#comparing-ip-addresses), for example diff --git a/website/docs/providers/oauth2/index.md b/website/docs/providers/oauth2/index.md index 90ce757787..556f865f50 100644 --- a/website/docs/providers/oauth2/index.md +++ b/website/docs/providers/oauth2/index.md @@ -38,7 +38,7 @@ To access the user's email address, a scope of `user:email` is required. To acce This grant is used to convert an authorization code to an access token (and optionally refresh token). The authorization code is retrieved through the Authorization flow, and can only be used once, and expires quickly. :::info -Starting with authentik 2024.1, applications only receive an access token. To receive a refresh token, applications must be allowed to request the `offline_access` scope in authentik and also be configured to request the scope. +Starting with authentik 2024.2, applications only receive an access token. To receive a refresh token, both applications and authentik must be configured to request the `offline_access` scope. In authentik this can be done by selecting the `offline_access` Scope mapping in the provider settings. ::: ### `refresh_token`: @@ -46,7 +46,7 @@ Starting with authentik 2024.1, applications only receive an access token. To re Refresh tokens can be used as long-lived tokens to access user data, and further renew the refresh token down the road. :::info -Starting with authentik 2024.1, this grant requires the `offline_access` scope. +Starting with authentik 2024.2, this grant requires the `offline_access` scope. ::: ### `client_credentials`: diff --git a/website/docs/releases/2024/v2024.1.md b/website/docs/releases/2024/v2024.1.md deleted file mode 100644 index fe82074cea..0000000000 --- a/website/docs/releases/2024/v2024.1.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Release 2024.1 -slug: /releases/2024.1 ---- - -## Breaking changes - -- Tenants have been renamed to brands - - The API endpoints associated with brands have also been renamed. - - Blueprints using `authentik_tenants.tenant` will need to be changed to use `authentik_brands.brand`. - -- The following config options have been moved from the config file and can now be set using the admin interface (under **System** -> **Settings**) or the API: - - - `AUTHENTIK_AVATARS` - - `AUTHENTIK_DEFAULT_USER_CHANGE_NAME` - - `AUTHENTIK_DEFAULT_USER_CHANGE_EMAIL` - - `AUTHENTIK_DEFAULT_USER_CHANGE_USERNAME` - - `AUTHENTIK_GDPR_COMPLIANCE` - - `AUTHENTIK_IMPERSONATION` - - `AUTHENTIK_FOOTER_LINKS` - - `AUTHENTIK_REPUTATION__EXPIRY` - - When upgrading to 2024.1, the currently configured options will be automatically migrated to the database, and can be removed from the `.env` or helm values file afterwards. - -- Required `offline_access` scope for Refresh tokens - - The OAuth2 provider ships with a new default scope called `offline_access`, which must be requested by applications that need a refresh token. Previously, authentik would always issue a refresh token for the _Authorization code_ and _Device code_ OAuth grants. - - Applications which require will need their configuration update to include the `offline_access` scope mapping. - -- The event retention settings configured in brands (previously tenants, see above) has been removed and is now a system settings, managed in the admin interface or via the API (see above). - - There is no built-in migration path for this change. If you set something other than the default (`days=365`), you will need to update the setting in the admin interface. - -- authentik now uses PostgreSQL schemas other than `public`. - - If you have a custom PostgreSQL deployment, please ensure that the authentik user is allowed to create schemas. Usually, if the authentik user is owner of the database, it already can. - -- Removal of deprecated metrics - - - `authentik_outpost_flow_timing_get` -> `authentik_outpost_flow_timing_get_seconds` - - `authentik_outpost_flow_timing_post` -> `authentik_outpost_flow_timing_post_seconds` - - `authentik_outpost_ldap_requests` -> `authentik_outpost_ldap_request_duration_seconds` - - `authentik_outpost_ldap_requests_rejected` -> `authentik_outpost_ldap_requests_rejected_total` - - `authentik_outpost_proxy_requests` -> `authentik_outpost_proxy_request_duration_seconds` - - `authentik_outpost_proxy_upstream_time` -> `authentik_outpost_proxy_upstream_response_duration_seconds` - - `authentik_outpost_radius_requests` -> `authentik_outpost_radius_request_duration_seconds` - - `authentik_outpost_radius_requests_rejected` -> `authentik_outpost_radius_requests_rejected_total` - - `authentik_main_requests` -> `authentik_main_request_duration_seconds` - -- Icons are now in a `public/` subfolder - - If your media folder is `/media`, icons are now stored in `/media/public`. authentik will automatically migrate the icons upon upgrading. - -- The shorthand parameter for `--stage`, `-s` for the `ak test_email` command has been changed to `-S` - -- User sessions will be invalidated after this upgrade. As such, users will need to log back in. - -- The Helm Chart has a number of breaking changes. Find out more in the [chart release notes](https://github.com/goauthentik/helm/releases/tag/authentik-2024.1.0). - -## New features - -- Tenancy Enterprise - - :::warning - This feature is in early preview. Use at your own risk. - ::: - - It allows for authentik operators to manage several authentik installations without having to deploy additional instances. - -- Audit log Enterprise - - authentik instances which have a valid enterprise license installed will log changes made to models including which fields were changed with previous and new values of the fields. The values are censored if they are sensitive (for example a password hash), however a hash of the changed value will still be logged. - -- "Pretend user exists" option for Identification stage - - Previously the identification stage would only continue if a user matching the user identifier exists. While this was the intended functionality, this release adds an option to continue to the next stage even if no matching user was found. "Pretend" users cannot authenticate nor receive emails, and don't exist in the database. **This feature is enabled by default.** - -- S3 file storage - - Media files can now be stored on S3. Follow the [setup guide](../../installation/storage-s3.md) to get started. - -## Upgrading - -This release does not introduce any new requirements. - -### docker-compose - -To upgrade, download the new docker-compose file and update the Docker stack with the new version, using these commands: - -``` -wget -O docker-compose.yml https://goauthentik.io/version/2024.1/docker-compose.yml -docker compose up -d -``` - -The `-O` flag retains the downloaded file's name, overwriting any existing local file with the same name. - -### Kubernetes - -Upgrade the Helm Chart to the new version, using the following commands: - -```shell -helm repo update -helm upgrade authentik authentik/authentik -f values.yaml --version ^2024.1 -``` - -## Minor changes/fixes - - - -## API Changes - - diff --git a/website/docs/releases/2024/v2024.2.md b/website/docs/releases/2024/v2024.2.md new file mode 100644 index 0000000000..e698e6925f --- /dev/null +++ b/website/docs/releases/2024/v2024.2.md @@ -0,0 +1,10211 @@ +--- +title: Release 2024.2 (unreleased) +slug: /releases/2024.2 +--- + +:::::note +2024.2 has not been released yet! We're publishing these release notes as a preview of what's to come, and for our awesome beta testers trying out release candidates. + +To try out the release candidate, replace your Docker image tag with the latest release candidate number, such as 2024.2.0-rc1. You can find the latest one in [the latest releases on GitHub](https://github.com/goauthentik/authentik/releases). If you don't find any, it means we haven't released one yet. +::::: + +## Highlights + +- **Remote Access Control** Enterprise Access machines over RDP, SSH, and VNC from authentik + +- **Audit logging** Enterprise See what fields were changed when objects are updated + +- **Session location and network binding** Increase security by preventing session theft + +- **Wizard to simplify creating applications and providers** + +## Breaking changes + +### Manual action is required + +- **Tenants have been renamed to brands** + + Tenants, which were previously used to change branding configuration, default flows, and several other settings have been renamed to _brands_. This name change is due to this release including full tenancy (see [New Features](#new-features)). Additionally, brands now more accurately reflect their usage; to configure branding, logos, colors, and overall login flow behavior. + + Existing _tenant_ objects will automatically be renamed to _brand_ objects. The API endpoints associated with _brands_ have also been renamed. + + Blueprints using `authentik_tenants.tenant` will need to be changed to use `authentik_brands.brand`. + + For more information, refer to the [documentation for _brands_](../../core/brands.md). + + Also, **the event retention settings configured in brands (previously tenants, see above) has been removed and is now a system setting**, managed in the Admin interface or via the API (see below). + + **There is no built-in migration path for this change.** If you set something other than the default (`days=365`), you will need to update the setting in the admin interface. + +- **Helm chart breaking changes** + + The Helm Chart has a number of breaking changes. Find out more in the [chart release notes](https://github.com/goauthentik/helm/releases/tag/authentik-2024.2.0-rc1). + +### Manual action may be required + +- **Required `offline_access` scope for Refresh tokens** + + The OAuth2 provider ships with a new default scope called `offline_access`, which must be requested by applications that need a refresh token. Previously, authentik would always issue a refresh token for the _Authorization code_ and _Device code_ OAuth grants. + + Applications that require a refresh token will need their configuration to be updated to include the `offline_access` scope mapping. + +- **Database requirement changes** + + authentik now uses PostgreSQL schemas other than `public`. + + If you have a custom PostgreSQL deployment, please ensure that the authentik user is allowed to create schemas. Usually, if the authentik user is owner of the database, it already can. + +- **Redis and cache configuration options have been improved** + + Thank you @PKizzle for this contribution! + + Cache settings have been moved from the `redis` top-level config key to their own `cache` top-level config key. + + Settings have also been added to configure the Redis instance/database used for tasks and websockets separately from cache. See [here](../../installation/configuration.mdx#redis-settings). + + Typically, _no changes to the configuration are required_. + +- **Configuration options migrated to the Admin interface** + + The following config options have been moved from the config file and can now be set using the Admin interface (under **System** -> **Settings**) or the API: + + - `AUTHENTIK_AVATARS` + - `AUTHENTIK_DEFAULT_USER_CHANGE_NAME` + - `AUTHENTIK_DEFAULT_USER_CHANGE_EMAIL` + - `AUTHENTIK_DEFAULT_USER_CHANGE_USERNAME` + - `AUTHENTIK_GDPR_COMPLIANCE` + - `AUTHENTIK_IMPERSONATION` + - `AUTHENTIK_FOOTER_LINKS` + - `AUTHENTIK_REPUTATION__EXPIRY` + + When upgrading to 2024.2, the currently configured options will be automatically migrated to the database, and can be removed from the `.env` or helm values file afterwards. + +- **Icons are now in a `public/` subfolder** + + If your media folder is `/media`, icons are now stored in `/media/public`. authentik will automatically migrate the icons upon upgrading. + + Note that even though that folder is named `public`, the files stored here are not automatically public. This is due to the naming of the default PostgreSQL schema. + +- **User sessions will be invalidated after this upgrade.** + + As such, users will need to log back in. Immediately after the upgrade completes, users are logged out automatically and are then prompted to log in again. This only occurs once. + +- **Removal of deprecated metrics** + + These metrics were renamed because they did not adhere to Prometheus best practices. The old metrics were kept for backwards compatibility and have now been removed. + + - `authentik_outpost_flow_timing_get` -> `authentik_outpost_flow_timing_get_seconds` + - `authentik_outpost_flow_timing_post` -> `authentik_outpost_flow_timing_post_seconds` + - `authentik_outpost_ldap_requests` -> `authentik_outpost_ldap_request_duration_seconds` + - `authentik_outpost_ldap_requests_rejected` -> `authentik_outpost_ldap_requests_rejected_total` + - `authentik_outpost_proxy_requests` -> `authentik_outpost_proxy_request_duration_seconds` + - `authentik_outpost_proxy_upstream_time` -> `authentik_outpost_proxy_upstream_response_duration_seconds` + - `authentik_outpost_radius_requests` -> `authentik_outpost_radius_request_duration_seconds` + - `authentik_outpost_radius_requests_rejected` -> `authentik_outpost_radius_requests_rejected_total` + - `authentik_main_requests` -> `authentik_main_request_duration_seconds` + +- The shorthand parameter for `--stage`, `-s` for the `ak test_email` command has been changed to `-S` + +## New features + +- **New provider: Remote Access Control** Enterprise + + The Remote Access Control provider allows you to remotely connect to remote machines over RDP, SSH and VNC through authentik. As such, you can use the same policy engine and customization options that are possible with other providers using the same user and admin interface. + +- **Audit logging** Enterprise + + authentik instances that have a valid enterprise license installed will log any changes made to models, including which fields were changed with previous and new values of the fields. The values are censored if they are sensitive (for example a password hash), however a hash of the changed value will still be logged. + +- **Session location and network binding** + + Sessions for any users can now be bound to a specific geolocation (Continent, Country, City) or network (Autonomous System, subnet, IP address). If the session is accessed from a location/network that is different than that from which it was initially created, the session will be terminated. + + Configuration steps are available [here](../../flow/stages/user_login/index.md#network-bindinggeoip-binding). + +- **S3 file storage** + + Media files can now be stored on S3. Follow the [setup guide](../../installation/storage-s3.md) to get started. + +- **_Pretend user exists_ option for Identification stage** + + Previously the Identification stage would only continue if a user matching the user identifier exists. While this was the intended functionality, this release adds an option to continue to the next stage even if no matching user was found. "Pretend" users cannot authenticate nor receive emails, and don't exist in the database. + + **This feature is enabled by default.** + +- **Tenancy** Enterprise + + :::warning + This feature is in early preview. Use at your own risk. + ::: + + With the release of 2024.2, an administrator or operator can now create multiple tenants. This means that an operator can manage several authentik installations without having to deploy additional instances. + + For more information about tenants, refer to the [documentation](../../advanced/tenancy.md). Refer to the [brands documentation](../../core/brands.md) for information about the updated process for configuring an instance's branding, colors, logos, etc. + +### UX features + +- **Simplified workflow for creating applications and providers** + + Applications and providers can now be created at the same time using the **Application Wizard**, found on the **Applications** -> **Applications** page of the Admin interface. The new wizard removes the previous requirement of first creating the provider, then the application, and then manually linking the two together. + +- **Ability to select more than 20 providers in an outpost** + + We have introduced a new way of selecting providers in the outpost configuration form, which allows for more than 20 providers to be selected for a single outpost. + + This dual-list multiselect prompt is only available for outposts for now, but we plan on extending it to other forms. + +- **Attribute preview per user** + + You can now preview attributes transmitted to SAML and OAuth applications for a specific user. + +- **Display applications a user has access to** + + An administrator can now see all applications a user has access to on the user's page in the Admin interface. + +### Other noteworthy features + +- **New graph for event volume** + + In the **Events** -> **Log** page in the Admin interface, you can see a graph of the event volume matching the search query over the last 7 days. + +- **Flows can now be restricted to outposts** + + You can now restrict a flow to be used only by an outpost using the **Require Outpost** setting on the flow. This would mainly be used for LDAP flows. + +- **System tasks improvements** + + You can now search through system tasks. We have also improved the task duration calculation and display. + +- **LDAP provider: allow overriding gidNumber** + + Previously, the `gidNumber` attribute on a user was set to the same as `uidNumber`. You can now override this behaviour. + +- **LDAP source: new command to check connectivity** + + Examples on how to use are available [here](../..//troubleshooting/ldap_source.md). + +--- + +## Upgrading + +This release does not introduce any new requirements. + +### docker-compose + +To upgrade, download the new docker-compose file and update the Docker stack with the new version, using these commands: + +``` +wget -O docker-compose.yml https://goauthentik.io/version/2024.2/docker-compose.yml +docker compose up -d +``` + +The `-O` flag retains the downloaded file's name, overwriting any existing local file with the same name. + +### Kubernetes + +Upgrade the Helm Chart to the new version, using the following commands: + +```shell +helm repo update +helm upgrade authentik authentik/authentik -f values.yaml --version ^2024.2 +``` + +## Minor changes/fixes + +- blueprints: improve file change handler (#7813) +- blueprints: only watch for fs events we're interested in (#7810) +- core: fix PropertyMapping context not being available in request context +- core: fix pagination in applications list being ignored (#8512) +- core: fix worker beat toggle inverted (#7508) +- core: optimise user list endpoint (#8353) +- core: show all applications a user can access in admin interface (#8343) +- core: use correct .evaluate implementation for testing PropertyMappings (#8459) +- core: use correct .evaluate implementation for testing PropertyMappings (#8459) +- enterprise/providers/rac: add alert that enterprise is required for RAC (#8057) +- enterprise/providers/rac: add option to limit concurrent connections to endpoint (#8053) +- enterprise/providers/rac: connection token management (#8467) +- enterprise/providers/rac: create authorize_application event when creating token (#8050) +- enterprise/providers/rac: fix maximum_connections set to -1 not being effective (#8456) +- enterprise/providers/rac: fix maximum_connections set to -1 not being effective (#8456) +- enterprise/providers: Add RAC (#7291) +- enterprise: add full audit log (#8177) +- enterprise: fix system task missing set_status (#8455) +- enterprise: rework license summary caching (#8501) +- enterrpise: exclude inactive users from license (#8294) +- events: add ASN Database reader (#7793) +- events: add better fallback for sanitize_item to ensure everything can be saved as JSON (#7694) +- events: add graph for event volume (#7639) +- events: fix SystemTask timestamps and scheduling (#8435) +- events: include user agent in events (#7693) +- events: migrate SystemTasks to DB (#8159) +- flows: add "require outpost" authentication_requirement (#7921) +- internal: remove deprecated metrics (#7540) +- internal: remove special route for /outpost.goauthentik.io (#7539) +- outposts/ldap: allow overriding gidNumber for a user (#8003) +- outposts/ldap: avoid nil ptr deref in MemorySearcher (#7767) +- outposts/proxy: better Redis error message (#8044) +- outposts: disable deployment and secret reconciler for embedded outpost in code instead of in config (#8021)(#8024) +- outposts: fix Outpost reconcile not re-assigning managed attribute (#8014) +- providers/oauth2: fix CVE-2024-21637 (#8104) +- providers/oauth2: fix missing nonce in id_token (#8072) +- providers/oauth2: fix missing nonce in token endpoint not being saved (#8073) +- providers/oauth2: offline access (#8026) +- providers/oauth2: remember session_id from initial token (#7976) +- providers/oauth2: set auth_via for token and other endpoints (#7417) +- providers/proxy: Fix duplicate cookies when using file system store. (#7541) +- providers/proxy: fix closed redis client (#7385) +- providers/proxy: use access token (#8022) +- providers/rac: fix property mapping without enterprise (#8144) +- providers/scim: change familyName default (#7904) +- providers/scim: fix missing schemas attribute for User and Group (#7477) +- providers/scim: set timeout based on page and page count (#7941) +- providers/scim: use lock for sync (#7948) +- providers: allow previewing mappings for other users (#8297) +- rbac: fix error when looking up permissions for now uninstalled apps (#8068) +- rbac: fix invitations listing with restricted permissions (#8227) +- root: Multi-tenancy (#7590) +- root: Restructure broker / cache / channel / result configuration (#7097) +- root: bump python deps (django 5) (#7862) +- root: fix listen trusted_proxy_cidrs config loading from environment (#8075) +- root: fix redis config not being updated to match previous change +- root: fix system check warnings (#8277) +- root: include ca-certificates in container (#7763) +- root: make test database name configurable (#7591) +- root: simplify task signal imports (#8454) +- security: fix CVE-2023-48228 (#7666) +- security: fix CVE-2024-23647 (#8345) +- sources/ldap: add check command to verify ldap connectivity (#7263) +- sources/ldap: clean-up certs written from db (#7617) +- sources/ldap: fix Issue with changing passwords with eDirectory (#7997) +- sources/oauth: fix OAuth source type serializer (#8140) +- sources/oauth: fix URLs being overwritten by OIDC urls (#8147) +- sources/oauth: fix azure_ad user_id and add test and fallback (#8146) +- sources/oauth: fix missing get_user_id for OIDC-like sources (Azure AD) (#7970) +- sources/oauth: fix patreon (#7454) +- sources/oauth: revert azure_ad profile URL change (#8139) +- stages/authenticator_totp: fix API validation error due to choices (#7608) +- stages/authenticator_validate: fix error when using pretend_user (#8447) +- stages/authenticator_validate: fix error when using pretend_user (#8447) +- stages/authenticator_validate: use friendly_name for stage selector when enrolling (#8255) +- stages/email: fix duplicate querystring encoding (#7386) +- stages/email: improve error handling for incorrect template syntax (#7758) +- stages/email: prevent authentik emails from being marked as spam (also add text template support) (#7949) +- stages/email: use uuid for email confirmation token instead of username (#7581) +- stages/identification: add option to pretend user exists (#7610) +- stages/user_login: only set last_ip in session if a binding is given (#8074) +- stages/user_login: session binding (#7881) +- web/admin: add RAC Provider to the list of providers understood by the wizard (#8149) +- web/admin: always show oidc well-known URL fields when they're set (#7560) +- web/admin: contextually add user to group when creating user from group page (#7586) +- web/admin: fix admins not able to delete MFA devices (#7660) +- web/admin: fix chart label on dashboard user page (#7434) +- web/admin: fix footer links not being parsed on settings page (#8289) +- web/admin: fix html error on oauth2 provider page (#7384) +- web/admin: fix incorrectly encoded chars in translation (#7580) +- web/admin: hide expiry time if item is set to not expire (#8457) +- web/admin: hide expiry time if item is set to not expire (#8457) +- web/admin: revamped rbac and user settings tabs (#8299) +- web/admin: revise wizard form handling (#7331) +- web/admin: show connected services on user view page, fix styling (#8416) +- web/components: improve error handling in ak-search-select (#8228) +- web/elements: keep selected elements in table when fetching (#7519) +- web/flows: attempt to fix bitwareden android compatibility (#7455) +- web/flows: don't auto-redirect to first source when passwordless is configured (#7579) +- web/flows: fix device picker incorrect foreground color (#8067) +- web/flows: fix icon for generic oauth source with dark theme (#8148) +- web/flows: fix logo height (#7834) +- web/flows: show logo in card (#7824) +- web/flows: use aria-invalid attribute to better show invalid input fields (#7661) +- web/user: fix search not updating selected app in user interface (#7825) +- web: clear "blanked" placeholder when present (#15) (#5948) +- web: clear out selecteds list after an API event to ensure a fresh copy of the policies-to-delete list (#8125) +- web: dark/light theme fixes (#7872) +- web: fix broken backchannel selector (#7480) +- web: fix labels on group view page (#7677) +- web: fix overflow glitch on ak-page-header (#7883) +- web: provide dual-list multiselect with pagination (#8004) + +## API Changes + +#### What's New + +--- + +##### `GET` /admin/settings/ + +##### `PUT` /admin/settings/ + +##### `PATCH` /admin/settings/ + +##### `GET` /core/brands/ + +##### `POST` /core/brands/ + +##### `GET` /core/brands/{brand_uuid}/ + +##### `PUT` /core/brands/{brand_uuid}/ + +##### `DELETE` /core/brands/{brand_uuid}/ + +##### `PATCH` /core/brands/{brand_uuid}/ + +##### `GET` /core/brands/{brand_uuid}/used_by/ + +##### `GET` /core/brands/current/ + +##### `GET` /events/events/volume/ + +##### `GET` /events/system_tasks/ + +##### `GET` /events/system_tasks/{uuid}/ + +##### `POST` /events/system_tasks/{uuid}/run/ + +##### `GET` /propertymappings/rac/ + +##### `POST` /propertymappings/rac/ + +##### `GET` /propertymappings/rac/{pm_uuid}/ + +##### `PUT` /propertymappings/rac/{pm_uuid}/ + +##### `DELETE` /propertymappings/rac/{pm_uuid}/ + +##### `PATCH` /propertymappings/rac/{pm_uuid}/ + +##### `GET` /propertymappings/rac/{pm_uuid}/used_by/ + +##### `GET` /providers/rac/ + +##### `POST` /providers/rac/ + +##### `GET` /providers/rac/{id}/ + +##### `PUT` /providers/rac/{id}/ + +##### `DELETE` /providers/rac/{id}/ + +##### `PATCH` /providers/rac/{id}/ + +##### `GET` /providers/rac/{id}/used_by/ + +##### `GET` /rac/connection_tokens/ + +##### `GET` /rac/connection_tokens/{connection_token_uuid}/ + +##### `PUT` /rac/connection_tokens/{connection_token_uuid}/ + +##### `DELETE` /rac/connection_tokens/{connection_token_uuid}/ + +##### `PATCH` /rac/connection_tokens/{connection_token_uuid}/ + +##### `GET` /rac/connection_tokens/{connection_token_uuid}/used_by/ + +##### `GET` /rac/endpoints/ + +##### `POST` /rac/endpoints/ + +##### `GET` /rac/endpoints/{pbm_uuid}/ + +##### `PUT` /rac/endpoints/{pbm_uuid}/ + +##### `DELETE` /rac/endpoints/{pbm_uuid}/ + +##### `PATCH` /rac/endpoints/{pbm_uuid}/ + +##### `GET` /rac/endpoints/{pbm_uuid}/used_by/ + +##### `GET` /tenants/domains/ + +##### `POST` /tenants/domains/ + +##### `GET` /tenants/domains/{id}/ + +##### `PUT` /tenants/domains/{id}/ + +##### `DELETE` /tenants/domains/{id}/ + +##### `PATCH` /tenants/domains/{id}/ + +##### `GET` /tenants/tenants/ + +##### `POST` /tenants/tenants/ + +##### `GET` /tenants/tenants/{tenant_uuid}/ + +##### `PUT` /tenants/tenants/{tenant_uuid}/ + +##### `DELETE` /tenants/tenants/{tenant_uuid}/ + +##### `PATCH` /tenants/tenants/{tenant_uuid}/ + +##### `POST` /tenants/tenants/{tenant_uuid}/create_admin_group/ + +##### `POST` /tenants/tenants/{tenant_uuid}/create_recovery_key/ + +#### What's Deleted + +--- + +##### `GET` /admin/system_tasks/ + +##### `GET` /admin/system_tasks/{id}/ + +##### `POST` /admin/system_tasks/{id}/retry/ + +##### `GET` /core/tenants/ + +##### `POST` /core/tenants/ + +##### `GET` /core/tenants/{tenant_uuid}/ + +##### `PUT` /core/tenants/{tenant_uuid}/ + +##### `DELETE` /core/tenants/{tenant_uuid}/ + +##### `PATCH` /core/tenants/{tenant_uuid}/ + +##### `GET` /core/tenants/{tenant_uuid}/used_by/ + +##### `GET` /core/tenants/current/ + +#### What's Changed + +--- + +##### `GET` /admin/system/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + New required properties: + + - `brand` + - `embedded_outpost_disabled` + + New optional properties: + + - `tenant` + + * Added property `brand` (string) + + > Currently active brand + + * Added property `embedded_outpost_disabled` (boolean) + + > Whether the embedded outpost is disabled + + * Deleted property `tenant` (string) + > Currently active tenant + +##### `POST` /admin/system/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + New required properties: + + - `brand` + - `embedded_outpost_disabled` + + New optional properties: + + - `tenant` + + * Added property `brand` (string) + + > Currently active brand + + * Added property `embedded_outpost_disabled` (boolean) + + > Whether the embedded outpost is disabled + + * Deleted property `tenant` (string) + > Currently active tenant + +##### `GET` /core/applications/{slug}/check_access/ + +###### Return Type: + +Deleted response : **404 Not Found** + +> for_user user not found + +##### `GET` /core/authenticated_sessions/{uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + New required properties: + + - `asn` + + * Added property `asn` (object) + + > Get ASN Data + + - Property `asn` (integer) + + - Property `as_org` (string) + + - Property `network` (string) + + * Changed property `geo_ip` (object) + > Get GeoIP Data + +##### `GET` /events/events/actions/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > Types of an object that can be created + + - Added property `requires_enterprise` (boolean) + +##### `GET` /managed/blueprints/{instance_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `context` (object -> object) + + - Changed property `metadata` (object -> object) + +##### `PUT` /managed/blueprints/{instance_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `context` (object -> object) + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `context` (object -> object) + + - Changed property `metadata` (object -> object) + +##### `PATCH` /managed/blueprints/{instance_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `context` (object -> object) + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `context` (object -> object) + + - Changed property `metadata` (object -> object) + +##### `POST` /managed/blueprints/{instance_uuid}/apply/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `context` (object -> object) + + - Changed property `metadata` (object -> object) + +##### `GET` /outposts/service_connections/all/types/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > Types of an object that can be created + + - Added property `requires_enterprise` (boolean) + +##### `GET` /outposts/service_connections/kubernetes/{uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `kubeconfig` (object -> object) + > Paste your kubeconfig here. authentik will automatically use the currently selected context. + +##### `PUT` /outposts/service_connections/kubernetes/{uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `kubeconfig` (object -> object) + > Paste your kubeconfig here. authentik will automatically use the currently selected context. + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `kubeconfig` (object -> object) + > Paste your kubeconfig here. authentik will automatically use the currently selected context. + +##### `PATCH` /outposts/service_connections/kubernetes/{uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `kubeconfig` (object -> object) + > Paste your kubeconfig here. authentik will automatically use the currently selected context. + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `kubeconfig` (object -> object) + > Paste your kubeconfig here. authentik will automatically use the currently selected context. + +##### `GET` /policies/all/types/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > Types of an object that can be created + + - Added property `requires_enterprise` (boolean) + +##### `GET` /policies/event_matcher/{policy_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `app` (string) + + > - `authentik.tenants` - authentik Tenants + > - `authentik.admin` - authentik Admin + > - `authentik.api` - authentik API + > - `authentik.crypto` - authentik Crypto + > - `authentik.flows` - authentik Flows + > - `authentik.outposts` - authentik Outpost + > - `authentik.policies.dummy` - authentik Policies.Dummy + > - `authentik.policies.event_matcher` - authentik Policies.Event Matcher + > - `authentik.policies.expiry` - authentik Policies.Expiry + > - `authentik.policies.expression` - authentik Policies.Expression + > - `authentik.policies.password` - authentik Policies.Password + > - `authentik.policies.reputation` - authentik Policies.Reputation + > - `authentik.policies` - authentik Policies + > - `authentik.providers.ldap` - authentik Providers.LDAP + > - `authentik.providers.oauth2` - authentik Providers.OAuth2 + > - `authentik.providers.proxy` - authentik Providers.Proxy + > - `authentik.providers.radius` - authentik Providers.Radius + > - `authentik.providers.saml` - authentik Providers.SAML + > - `authentik.providers.scim` - authentik Providers.SCIM + > - `authentik.rbac` - authentik RBAC + > - `authentik.recovery` - authentik Recovery + > - `authentik.sources.ldap` - authentik Sources.LDAP + > - `authentik.sources.oauth` - authentik Sources.OAuth + > - `authentik.sources.plex` - authentik Sources.Plex + > - `authentik.sources.saml` - authentik Sources.SAML + > - `authentik.stages.authenticator` - authentik Stages.Authenticator + > - `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo + > - `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS + > - `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static + > - `authentik.stages.authenticator_totp` - authentik Stages.Authenticator.TOTP + > - `authentik.stages.authenticator_validate` - authentik Stages.Authenticator.Validate + > - `authentik.stages.authenticator_webauthn` - authentik Stages.Authenticator.WebAuthn + > - `authentik.stages.captcha` - authentik Stages.Captcha + > - `authentik.stages.consent` - authentik Stages.Consent + > - `authentik.stages.deny` - authentik Stages.Deny + > - `authentik.stages.dummy` - authentik Stages.Dummy + > - `authentik.stages.email` - authentik Stages.Email + > - `authentik.stages.identification` - authentik Stages.Identification + > - `authentik.stages.invitation` - authentik Stages.User Invitation + > - `authentik.stages.password` - authentik Stages.Password + > - `authentik.stages.prompt` - authentik Stages.Prompt + > - `authentik.stages.user_delete` - authentik Stages.User Delete + > - `authentik.stages.user_login` - authentik Stages.User Login + > - `authentik.stages.user_logout` - authentik Stages.User Logout + > - `authentik.stages.user_write` - authentik Stages.User Write + > - `authentik.brands` - authentik Brands + > - `authentik.blueprints` - authentik Blueprints + > - `authentik.core` - authentik Core + > - `authentik.enterprise` - authentik Enterprise + > - `authentik.enterprise.audit` - authentik Enterprise.Audit + > - `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC + > - `authentik.events` - authentik Events + + Added enum values: + + - `authentik.brands` + - `authentik.enterprise.audit` + - `authentik.enterprise.providers.rac` + + - Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +##### `PUT` /policies/event_matcher/{policy_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `app` (string) + + > - `authentik.tenants` - authentik Tenants + > - `authentik.admin` - authentik Admin + > - `authentik.api` - authentik API + > - `authentik.crypto` - authentik Crypto + > - `authentik.flows` - authentik Flows + > - `authentik.outposts` - authentik Outpost + > - `authentik.policies.dummy` - authentik Policies.Dummy + > - `authentik.policies.event_matcher` - authentik Policies.Event Matcher + > - `authentik.policies.expiry` - authentik Policies.Expiry + > - `authentik.policies.expression` - authentik Policies.Expression + > - `authentik.policies.password` - authentik Policies.Password + > - `authentik.policies.reputation` - authentik Policies.Reputation + > - `authentik.policies` - authentik Policies + > - `authentik.providers.ldap` - authentik Providers.LDAP + > - `authentik.providers.oauth2` - authentik Providers.OAuth2 + > - `authentik.providers.proxy` - authentik Providers.Proxy + > - `authentik.providers.radius` - authentik Providers.Radius + > - `authentik.providers.saml` - authentik Providers.SAML + > - `authentik.providers.scim` - authentik Providers.SCIM + > - `authentik.rbac` - authentik RBAC + > - `authentik.recovery` - authentik Recovery + > - `authentik.sources.ldap` - authentik Sources.LDAP + > - `authentik.sources.oauth` - authentik Sources.OAuth + > - `authentik.sources.plex` - authentik Sources.Plex + > - `authentik.sources.saml` - authentik Sources.SAML + > - `authentik.stages.authenticator` - authentik Stages.Authenticator + > - `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo + > - `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS + > - `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static + > - `authentik.stages.authenticator_totp` - authentik Stages.Authenticator.TOTP + > - `authentik.stages.authenticator_validate` - authentik Stages.Authenticator.Validate + > - `authentik.stages.authenticator_webauthn` - authentik Stages.Authenticator.WebAuthn + > - `authentik.stages.captcha` - authentik Stages.Captcha + > - `authentik.stages.consent` - authentik Stages.Consent + > - `authentik.stages.deny` - authentik Stages.Deny + > - `authentik.stages.dummy` - authentik Stages.Dummy + > - `authentik.stages.email` - authentik Stages.Email + > - `authentik.stages.identification` - authentik Stages.Identification + > - `authentik.stages.invitation` - authentik Stages.User Invitation + > - `authentik.stages.password` - authentik Stages.Password + > - `authentik.stages.prompt` - authentik Stages.Prompt + > - `authentik.stages.user_delete` - authentik Stages.User Delete + > - `authentik.stages.user_login` - authentik Stages.User Login + > - `authentik.stages.user_logout` - authentik Stages.User Logout + > - `authentik.stages.user_write` - authentik Stages.User Write + > - `authentik.brands` - authentik Brands + > - `authentik.blueprints` - authentik Blueprints + > - `authentik.core` - authentik Core + > - `authentik.enterprise` - authentik Enterprise + > - `authentik.enterprise.audit` - authentik Enterprise.Audit + > - `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC + > - `authentik.events` - authentik Events + + Added enum values: + + - `authentik.brands` + - `authentik.enterprise.audit` + - `authentik.enterprise.providers.rac` + +- Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `app` (string) + + > - `authentik.tenants` - authentik Tenants + > - `authentik.admin` - authentik Admin + > - `authentik.api` - authentik API + > - `authentik.crypto` - authentik Crypto + > - `authentik.flows` - authentik Flows + > - `authentik.outposts` - authentik Outpost + > - `authentik.policies.dummy` - authentik Policies.Dummy + > - `authentik.policies.event_matcher` - authentik Policies.Event Matcher + > - `authentik.policies.expiry` - authentik Policies.Expiry + > - `authentik.policies.expression` - authentik Policies.Expression + > - `authentik.policies.password` - authentik Policies.Password + > - `authentik.policies.reputation` - authentik Policies.Reputation + > - `authentik.policies` - authentik Policies + > - `authentik.providers.ldap` - authentik Providers.LDAP + > - `authentik.providers.oauth2` - authentik Providers.OAuth2 + > - `authentik.providers.proxy` - authentik Providers.Proxy + > - `authentik.providers.radius` - authentik Providers.Radius + > - `authentik.providers.saml` - authentik Providers.SAML + > - `authentik.providers.scim` - authentik Providers.SCIM + > - `authentik.rbac` - authentik RBAC + > - `authentik.recovery` - authentik Recovery + > - `authentik.sources.ldap` - authentik Sources.LDAP + > - `authentik.sources.oauth` - authentik Sources.OAuth + > - `authentik.sources.plex` - authentik Sources.Plex + > - `authentik.sources.saml` - authentik Sources.SAML + > - `authentik.stages.authenticator` - authentik Stages.Authenticator + > - `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo + > - `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS + > - `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static + > - `authentik.stages.authenticator_totp` - authentik Stages.Authenticator.TOTP + > - `authentik.stages.authenticator_validate` - authentik Stages.Authenticator.Validate + > - `authentik.stages.authenticator_webauthn` - authentik Stages.Authenticator.WebAuthn + > - `authentik.stages.captcha` - authentik Stages.Captcha + > - `authentik.stages.consent` - authentik Stages.Consent + > - `authentik.stages.deny` - authentik Stages.Deny + > - `authentik.stages.dummy` - authentik Stages.Dummy + > - `authentik.stages.email` - authentik Stages.Email + > - `authentik.stages.identification` - authentik Stages.Identification + > - `authentik.stages.invitation` - authentik Stages.User Invitation + > - `authentik.stages.password` - authentik Stages.Password + > - `authentik.stages.prompt` - authentik Stages.Prompt + > - `authentik.stages.user_delete` - authentik Stages.User Delete + > - `authentik.stages.user_login` - authentik Stages.User Login + > - `authentik.stages.user_logout` - authentik Stages.User Logout + > - `authentik.stages.user_write` - authentik Stages.User Write + > - `authentik.brands` - authentik Brands + > - `authentik.blueprints` - authentik Blueprints + > - `authentik.core` - authentik Core + > - `authentik.enterprise` - authentik Enterprise + > - `authentik.enterprise.audit` - authentik Enterprise.Audit + > - `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC + > - `authentik.events` - authentik Events + + Added enum values: + + - `authentik.brands` + - `authentik.enterprise.audit` + - `authentik.enterprise.providers.rac` + + - Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +##### `PATCH` /policies/event_matcher/{policy_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `app` (string) + + > - `authentik.tenants` - authentik Tenants + > - `authentik.admin` - authentik Admin + > - `authentik.api` - authentik API + > - `authentik.crypto` - authentik Crypto + > - `authentik.flows` - authentik Flows + > - `authentik.outposts` - authentik Outpost + > - `authentik.policies.dummy` - authentik Policies.Dummy + > - `authentik.policies.event_matcher` - authentik Policies.Event Matcher + > - `authentik.policies.expiry` - authentik Policies.Expiry + > - `authentik.policies.expression` - authentik Policies.Expression + > - `authentik.policies.password` - authentik Policies.Password + > - `authentik.policies.reputation` - authentik Policies.Reputation + > - `authentik.policies` - authentik Policies + > - `authentik.providers.ldap` - authentik Providers.LDAP + > - `authentik.providers.oauth2` - authentik Providers.OAuth2 + > - `authentik.providers.proxy` - authentik Providers.Proxy + > - `authentik.providers.radius` - authentik Providers.Radius + > - `authentik.providers.saml` - authentik Providers.SAML + > - `authentik.providers.scim` - authentik Providers.SCIM + > - `authentik.rbac` - authentik RBAC + > - `authentik.recovery` - authentik Recovery + > - `authentik.sources.ldap` - authentik Sources.LDAP + > - `authentik.sources.oauth` - authentik Sources.OAuth + > - `authentik.sources.plex` - authentik Sources.Plex + > - `authentik.sources.saml` - authentik Sources.SAML + > - `authentik.stages.authenticator` - authentik Stages.Authenticator + > - `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo + > - `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS + > - `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static + > - `authentik.stages.authenticator_totp` - authentik Stages.Authenticator.TOTP + > - `authentik.stages.authenticator_validate` - authentik Stages.Authenticator.Validate + > - `authentik.stages.authenticator_webauthn` - authentik Stages.Authenticator.WebAuthn + > - `authentik.stages.captcha` - authentik Stages.Captcha + > - `authentik.stages.consent` - authentik Stages.Consent + > - `authentik.stages.deny` - authentik Stages.Deny + > - `authentik.stages.dummy` - authentik Stages.Dummy + > - `authentik.stages.email` - authentik Stages.Email + > - `authentik.stages.identification` - authentik Stages.Identification + > - `authentik.stages.invitation` - authentik Stages.User Invitation + > - `authentik.stages.password` - authentik Stages.Password + > - `authentik.stages.prompt` - authentik Stages.Prompt + > - `authentik.stages.user_delete` - authentik Stages.User Delete + > - `authentik.stages.user_login` - authentik Stages.User Login + > - `authentik.stages.user_logout` - authentik Stages.User Logout + > - `authentik.stages.user_write` - authentik Stages.User Write + > - `authentik.brands` - authentik Brands + > - `authentik.blueprints` - authentik Blueprints + > - `authentik.core` - authentik Core + > - `authentik.enterprise` - authentik Enterprise + > - `authentik.enterprise.audit` - authentik Enterprise.Audit + > - `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC + > - `authentik.events` - authentik Events + + Added enum values: + + - `authentik.brands` + - `authentik.enterprise.audit` + - `authentik.enterprise.providers.rac` + +- Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `app` (string) + + > - `authentik.tenants` - authentik Tenants + > - `authentik.admin` - authentik Admin + > - `authentik.api` - authentik API + > - `authentik.crypto` - authentik Crypto + > - `authentik.flows` - authentik Flows + > - `authentik.outposts` - authentik Outpost + > - `authentik.policies.dummy` - authentik Policies.Dummy + > - `authentik.policies.event_matcher` - authentik Policies.Event Matcher + > - `authentik.policies.expiry` - authentik Policies.Expiry + > - `authentik.policies.expression` - authentik Policies.Expression + > - `authentik.policies.password` - authentik Policies.Password + > - `authentik.policies.reputation` - authentik Policies.Reputation + > - `authentik.policies` - authentik Policies + > - `authentik.providers.ldap` - authentik Providers.LDAP + > - `authentik.providers.oauth2` - authentik Providers.OAuth2 + > - `authentik.providers.proxy` - authentik Providers.Proxy + > - `authentik.providers.radius` - authentik Providers.Radius + > - `authentik.providers.saml` - authentik Providers.SAML + > - `authentik.providers.scim` - authentik Providers.SCIM + > - `authentik.rbac` - authentik RBAC + > - `authentik.recovery` - authentik Recovery + > - `authentik.sources.ldap` - authentik Sources.LDAP + > - `authentik.sources.oauth` - authentik Sources.OAuth + > - `authentik.sources.plex` - authentik Sources.Plex + > - `authentik.sources.saml` - authentik Sources.SAML + > - `authentik.stages.authenticator` - authentik Stages.Authenticator + > - `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo + > - `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS + > - `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static + > - `authentik.stages.authenticator_totp` - authentik Stages.Authenticator.TOTP + > - `authentik.stages.authenticator_validate` - authentik Stages.Authenticator.Validate + > - `authentik.stages.authenticator_webauthn` - authentik Stages.Authenticator.WebAuthn + > - `authentik.stages.captcha` - authentik Stages.Captcha + > - `authentik.stages.consent` - authentik Stages.Consent + > - `authentik.stages.deny` - authentik Stages.Deny + > - `authentik.stages.dummy` - authentik Stages.Dummy + > - `authentik.stages.email` - authentik Stages.Email + > - `authentik.stages.identification` - authentik Stages.Identification + > - `authentik.stages.invitation` - authentik Stages.User Invitation + > - `authentik.stages.password` - authentik Stages.Password + > - `authentik.stages.prompt` - authentik Stages.Prompt + > - `authentik.stages.user_delete` - authentik Stages.User Delete + > - `authentik.stages.user_login` - authentik Stages.User Login + > - `authentik.stages.user_logout` - authentik Stages.User Logout + > - `authentik.stages.user_write` - authentik Stages.User Write + > - `authentik.brands` - authentik Brands + > - `authentik.blueprints` - authentik Blueprints + > - `authentik.core` - authentik Core + > - `authentik.enterprise` - authentik Enterprise + > - `authentik.enterprise.audit` - authentik Enterprise.Audit + > - `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC + > - `authentik.events` - authentik Events + + Added enum values: + + - `authentik.brands` + - `authentik.enterprise.audit` + - `authentik.enterprise.providers.rac` + + - Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +##### `GET` /policies/reputation/scores/{reputation_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `ip_asn_data` (object) + + - Changed property `ip_geo_data` (object -> object) + +##### `GET` /propertymappings/all/types/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > Types of an object that can be created + + - Added property `requires_enterprise` (boolean) + +##### `GET` /providers/all/types/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > Types of an object that can be created + + - Added property `requires_enterprise` (boolean) + +##### `GET` /providers/oauth2/{id}/preview_user/ + +###### Parameters: + +Added: `for_user` in `query` + +##### `GET` /providers/saml/{id}/preview_user/ + +###### Parameters: + +Added: `for_user` in `query` + +##### `GET` /providers/scim/{id}/sync_status/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + New required properties: + + - `is_running` + - `tasks` + + New optional properties: + + - `messages` + - `status` + - `task_description` + - `task_duration` + - `task_finish_timestamp` + - `task_name` + + * Added property `is_running` (boolean) + + * Added property `tasks` (array) + + Items (object): > Serialize TaskInfo and TaskResult + + - Property `uuid` (string) + + - Property `name` (string) + + - Property `full_name` (string) + + > Get full name with UID + + - Property `uid` (string) + + - Property `description` (string) + + - Property `start_timestamp` (string) + + - Property `finish_timestamp` (string) + + - Property `duration` (number) + + - Property `status` (string) + + > - `unknown` - UNKNOWN + > - `successful` - SUCCESSFUL + > - `warning` - WARNING + > - `error` - ERROR + + Enum values: + + - `unknown` + - `successful` + - `warning` + - `error` + + - Property `messages` (array) + + Items (string): + + * Deleted property `task_name` (string) + + * Deleted property `task_description` (string) + + * Deleted property `task_finish_timestamp` (string) + + * Deleted property `task_duration` (integer) + + > Get the duration a task took to run + + * Deleted property `status` (object) + + * Deleted property `messages` (array) + +##### `GET` /schema/ + +###### Parameters: + +Changed: `lang` in `query` + +##### `GET` /sources/all/types/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > Types of an object that can be created + + - Added property `requires_enterprise` (boolean) + +##### `GET` /sources/ldap/{slug}/sync_status/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + +##### `GET` /sources/oauth/source_types/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > Serializer for SourceType + + New required properties: + + - `verbose_name` + + New optional properties: + + - `slug` + + * Added property `verbose_name` (string) + + * Deleted property `slug` (string) + +##### `GET` /stages/all/types/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > Types of an object that can be created + + - Added property `requires_enterprise` (boolean) + +##### `GET` /stages/email/templates/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > Types of an object that can be created + + - Added property `requires_enterprise` (boolean) + +##### `GET` /authenticators/duo/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /authenticators/sms/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /authenticators/static/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /authenticators/totp/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /authenticators/webauthn/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /core/applications/{slug}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /core/authenticated_sessions/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > AuthenticatedSession Serializer + + New required properties: + + - `asn` + + * Added property `asn` (object) + + > Get ASN Data + + * Changed property `geo_ip` (object) + > Get GeoIP Data + +##### `GET` /core/authenticated_sessions/{uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /core/groups/{group_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /core/tokens/{identifier}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `PUT` /core/tokens/{identifier}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `PATCH` /core/tokens/{identifier}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /core/tokens/{identifier}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /core/user_consent/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /core/users/{id}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `PUT` /core/users/{id}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `PATCH` /core/users/{id}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /core/users/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /crypto/certificatekeypairs/{kp_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /enterprise/license/{license_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /events/events/{event_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +##### `PUT` /events/events/{event_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Added property `brand` (object) + +- Deleted property `tenant` (object) + +- Changed property `user` (object -> object) + +- Changed property `context` (object -> object) + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +##### `PATCH` /events/events/{event_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Added property `brand` (object) + +- Deleted property `tenant` (object) + +- Changed property `user` (object -> object) + +- Changed property `context` (object -> object) + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +##### `GET` /events/notifications/{uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /events/rules/{pbm_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /events/transports/{uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /flows/bindings/{fsb_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /flows/instances/{slug}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /flows/instances/{slug}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + +- Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /flows/instances/{slug}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + +- Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /flows/instances/{slug}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `POST` /managed/blueprints/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `context` (object -> object) + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `context` (object -> object) + + - Changed property `metadata` (object -> object) + +##### `GET` /managed/blueprints/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Info about a single blueprint instance file + + - Changed property `context` (object -> object) + + - Changed property `metadata` (object -> object) + +##### `GET` /managed/blueprints/{instance_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /oauth2/access_tokens/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /oauth2/authorization_codes/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /oauth2/refresh_tokens/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /outposts/instances/{uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `type` (string) + + > - `proxy` - Proxy + > - `ldap` - Ldap + > - `radius` - Radius + > - `rac` - Rac + + Added enum value: + + - `rac` + +##### `PUT` /outposts/instances/{uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `type` (string) + + > - `proxy` - Proxy + > - `ldap` - Ldap + > - `radius` - Radius + > - `rac` - Rac + + Added enum value: + + - `rac` + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `type` (string) + + > - `proxy` - Proxy + > - `ldap` - Ldap + > - `radius` - Radius + > - `rac` - Rac + + Added enum value: + + - `rac` + +##### `PATCH` /outposts/instances/{uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `type` (string) + + > - `proxy` - Proxy + > - `ldap` - Ldap + > - `radius` - Radius + > - `rac` - Rac + + Added enum value: + + - `rac` + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `type` (string) + + > - `proxy` - Proxy + > - `ldap` - Ldap + > - `radius` - Radius + > - `rac` - Rac + + Added enum value: + + - `rac` + +##### `GET` /outposts/instances/{uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /outposts/service_connections/all/{uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /outposts/service_connections/docker/{uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `POST` /outposts/service_connections/kubernetes/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `kubeconfig` (object -> object) + > Paste your kubeconfig here. authentik will automatically use the currently selected context. + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `kubeconfig` (object -> object) + > Paste your kubeconfig here. authentik will automatically use the currently selected context. + +##### `GET` /outposts/service_connections/kubernetes/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > KubernetesServiceConnection Serializer + + - Changed property `kubeconfig` (object -> object) + > Paste your kubeconfig here. authentik will automatically use the currently selected context. + +##### `GET` /outposts/service_connections/kubernetes/{uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /policies/all/{policy_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /policies/bindings/{policy_binding_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `PUT` /policies/bindings/{policy_binding_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `PATCH` /policies/bindings/{policy_binding_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /policies/bindings/{policy_binding_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /policies/dummy/{policy_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `POST` /policies/event_matcher/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `app` (string) + + > - `authentik.tenants` - authentik Tenants + > - `authentik.admin` - authentik Admin + > - `authentik.api` - authentik API + > - `authentik.crypto` - authentik Crypto + > - `authentik.flows` - authentik Flows + > - `authentik.outposts` - authentik Outpost + > - `authentik.policies.dummy` - authentik Policies.Dummy + > - `authentik.policies.event_matcher` - authentik Policies.Event Matcher + > - `authentik.policies.expiry` - authentik Policies.Expiry + > - `authentik.policies.expression` - authentik Policies.Expression + > - `authentik.policies.password` - authentik Policies.Password + > - `authentik.policies.reputation` - authentik Policies.Reputation + > - `authentik.policies` - authentik Policies + > - `authentik.providers.ldap` - authentik Providers.LDAP + > - `authentik.providers.oauth2` - authentik Providers.OAuth2 + > - `authentik.providers.proxy` - authentik Providers.Proxy + > - `authentik.providers.radius` - authentik Providers.Radius + > - `authentik.providers.saml` - authentik Providers.SAML + > - `authentik.providers.scim` - authentik Providers.SCIM + > - `authentik.rbac` - authentik RBAC + > - `authentik.recovery` - authentik Recovery + > - `authentik.sources.ldap` - authentik Sources.LDAP + > - `authentik.sources.oauth` - authentik Sources.OAuth + > - `authentik.sources.plex` - authentik Sources.Plex + > - `authentik.sources.saml` - authentik Sources.SAML + > - `authentik.stages.authenticator` - authentik Stages.Authenticator + > - `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo + > - `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS + > - `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static + > - `authentik.stages.authenticator_totp` - authentik Stages.Authenticator.TOTP + > - `authentik.stages.authenticator_validate` - authentik Stages.Authenticator.Validate + > - `authentik.stages.authenticator_webauthn` - authentik Stages.Authenticator.WebAuthn + > - `authentik.stages.captcha` - authentik Stages.Captcha + > - `authentik.stages.consent` - authentik Stages.Consent + > - `authentik.stages.deny` - authentik Stages.Deny + > - `authentik.stages.dummy` - authentik Stages.Dummy + > - `authentik.stages.email` - authentik Stages.Email + > - `authentik.stages.identification` - authentik Stages.Identification + > - `authentik.stages.invitation` - authentik Stages.User Invitation + > - `authentik.stages.password` - authentik Stages.Password + > - `authentik.stages.prompt` - authentik Stages.Prompt + > - `authentik.stages.user_delete` - authentik Stages.User Delete + > - `authentik.stages.user_login` - authentik Stages.User Login + > - `authentik.stages.user_logout` - authentik Stages.User Logout + > - `authentik.stages.user_write` - authentik Stages.User Write + > - `authentik.brands` - authentik Brands + > - `authentik.blueprints` - authentik Blueprints + > - `authentik.core` - authentik Core + > - `authentik.enterprise` - authentik Enterprise + > - `authentik.enterprise.audit` - authentik Enterprise.Audit + > - `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC + > - `authentik.events` - authentik Events + + Added enum values: + + - `authentik.brands` + - `authentik.enterprise.audit` + - `authentik.enterprise.providers.rac` + +- Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `app` (string) + + > - `authentik.tenants` - authentik Tenants + > - `authentik.admin` - authentik Admin + > - `authentik.api` - authentik API + > - `authentik.crypto` - authentik Crypto + > - `authentik.flows` - authentik Flows + > - `authentik.outposts` - authentik Outpost + > - `authentik.policies.dummy` - authentik Policies.Dummy + > - `authentik.policies.event_matcher` - authentik Policies.Event Matcher + > - `authentik.policies.expiry` - authentik Policies.Expiry + > - `authentik.policies.expression` - authentik Policies.Expression + > - `authentik.policies.password` - authentik Policies.Password + > - `authentik.policies.reputation` - authentik Policies.Reputation + > - `authentik.policies` - authentik Policies + > - `authentik.providers.ldap` - authentik Providers.LDAP + > - `authentik.providers.oauth2` - authentik Providers.OAuth2 + > - `authentik.providers.proxy` - authentik Providers.Proxy + > - `authentik.providers.radius` - authentik Providers.Radius + > - `authentik.providers.saml` - authentik Providers.SAML + > - `authentik.providers.scim` - authentik Providers.SCIM + > - `authentik.rbac` - authentik RBAC + > - `authentik.recovery` - authentik Recovery + > - `authentik.sources.ldap` - authentik Sources.LDAP + > - `authentik.sources.oauth` - authentik Sources.OAuth + > - `authentik.sources.plex` - authentik Sources.Plex + > - `authentik.sources.saml` - authentik Sources.SAML + > - `authentik.stages.authenticator` - authentik Stages.Authenticator + > - `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo + > - `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS + > - `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static + > - `authentik.stages.authenticator_totp` - authentik Stages.Authenticator.TOTP + > - `authentik.stages.authenticator_validate` - authentik Stages.Authenticator.Validate + > - `authentik.stages.authenticator_webauthn` - authentik Stages.Authenticator.WebAuthn + > - `authentik.stages.captcha` - authentik Stages.Captcha + > - `authentik.stages.consent` - authentik Stages.Consent + > - `authentik.stages.deny` - authentik Stages.Deny + > - `authentik.stages.dummy` - authentik Stages.Dummy + > - `authentik.stages.email` - authentik Stages.Email + > - `authentik.stages.identification` - authentik Stages.Identification + > - `authentik.stages.invitation` - authentik Stages.User Invitation + > - `authentik.stages.password` - authentik Stages.Password + > - `authentik.stages.prompt` - authentik Stages.Prompt + > - `authentik.stages.user_delete` - authentik Stages.User Delete + > - `authentik.stages.user_login` - authentik Stages.User Login + > - `authentik.stages.user_logout` - authentik Stages.User Logout + > - `authentik.stages.user_write` - authentik Stages.User Write + > - `authentik.brands` - authentik Brands + > - `authentik.blueprints` - authentik Blueprints + > - `authentik.core` - authentik Core + > - `authentik.enterprise` - authentik Enterprise + > - `authentik.enterprise.audit` - authentik Enterprise.Audit + > - `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC + > - `authentik.events` - authentik Events + + Added enum values: + + - `authentik.brands` + - `authentik.enterprise.audit` + - `authentik.enterprise.providers.rac` + + - Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +##### `GET` /policies/event_matcher/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Event Matcher Policy Serializer + + - Changed property `app` (string) + + > - `authentik.tenants` - authentik Tenants + > - `authentik.admin` - authentik Admin + > - `authentik.api` - authentik API + > - `authentik.crypto` - authentik Crypto + > - `authentik.flows` - authentik Flows + > - `authentik.outposts` - authentik Outpost + > - `authentik.policies.dummy` - authentik Policies.Dummy + > - `authentik.policies.event_matcher` - authentik Policies.Event Matcher + > - `authentik.policies.expiry` - authentik Policies.Expiry + > - `authentik.policies.expression` - authentik Policies.Expression + > - `authentik.policies.password` - authentik Policies.Password + > - `authentik.policies.reputation` - authentik Policies.Reputation + > - `authentik.policies` - authentik Policies + > - `authentik.providers.ldap` - authentik Providers.LDAP + > - `authentik.providers.oauth2` - authentik Providers.OAuth2 + > - `authentik.providers.proxy` - authentik Providers.Proxy + > - `authentik.providers.radius` - authentik Providers.Radius + > - `authentik.providers.saml` - authentik Providers.SAML + > - `authentik.providers.scim` - authentik Providers.SCIM + > - `authentik.rbac` - authentik RBAC + > - `authentik.recovery` - authentik Recovery + > - `authentik.sources.ldap` - authentik Sources.LDAP + > - `authentik.sources.oauth` - authentik Sources.OAuth + > - `authentik.sources.plex` - authentik Sources.Plex + > - `authentik.sources.saml` - authentik Sources.SAML + > - `authentik.stages.authenticator` - authentik Stages.Authenticator + > - `authentik.stages.authenticator_duo` - authentik Stages.Authenticator.Duo + > - `authentik.stages.authenticator_sms` - authentik Stages.Authenticator.SMS + > - `authentik.stages.authenticator_static` - authentik Stages.Authenticator.Static + > - `authentik.stages.authenticator_totp` - authentik Stages.Authenticator.TOTP + > - `authentik.stages.authenticator_validate` - authentik Stages.Authenticator.Validate + > - `authentik.stages.authenticator_webauthn` - authentik Stages.Authenticator.WebAuthn + > - `authentik.stages.captcha` - authentik Stages.Captcha + > - `authentik.stages.consent` - authentik Stages.Consent + > - `authentik.stages.deny` - authentik Stages.Deny + > - `authentik.stages.dummy` - authentik Stages.Dummy + > - `authentik.stages.email` - authentik Stages.Email + > - `authentik.stages.identification` - authentik Stages.Identification + > - `authentik.stages.invitation` - authentik Stages.User Invitation + > - `authentik.stages.password` - authentik Stages.Password + > - `authentik.stages.prompt` - authentik Stages.Prompt + > - `authentik.stages.user_delete` - authentik Stages.User Delete + > - `authentik.stages.user_login` - authentik Stages.User Login + > - `authentik.stages.user_logout` - authentik Stages.User Logout + > - `authentik.stages.user_write` - authentik Stages.User Write + > - `authentik.brands` - authentik Brands + > - `authentik.blueprints` - authentik Blueprints + > - `authentik.core` - authentik Core + > - `authentik.enterprise` - authentik Enterprise + > - `authentik.enterprise.audit` - authentik Enterprise.Audit + > - `authentik.enterprise.providers.rac` - authentik Enterprise.Providers.RAC + > - `authentik.events` - authentik Events + + Added enum values: + + - `authentik.brands` + - `authentik.enterprise.audit` + - `authentik.enterprise.providers.rac` + + - Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +##### `GET` /policies/event_matcher/{policy_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /policies/expression/{policy_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /policies/password/{policy_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /policies/password_expiry/{policy_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /policies/reputation/{policy_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /policies/reputation/scores/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Reputation Serializer + + - Added property `ip_asn_data` (object) + + - Changed property `ip_geo_data` (object -> object) + +##### `GET` /policies/reputation/scores/{reputation_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /propertymappings/all/{pm_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /propertymappings/ldap/{pm_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /propertymappings/notification/{pm_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /propertymappings/saml/{pm_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /propertymappings/scim/{pm_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /propertymappings/scope/{pm_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /providers/all/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /providers/ldap/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /providers/oauth2/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /providers/proxy/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /providers/radius/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /providers/saml/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /providers/scim/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `POST` /rbac/permissions/assigned_by_roles/{uuid}/assign/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +##### `PATCH` /rbac/permissions/assigned_by_roles/{uuid}/unassign/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +##### `POST` /rbac/permissions/assigned_by_users/{id}/assign/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +##### `PATCH` /rbac/permissions/assigned_by_users/{id}/unassign/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `model` (string) + + > - `authentik_tenants.domain` - Domain + > - `authentik_crypto.certificatekeypair` - Certificate-Key Pair + > - `authentik_flows.flow` - Flow + > - `authentik_flows.flowstagebinding` - Flow Stage Binding + > - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection + > - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection + > - `authentik_outposts.outpost` - Outpost + > - `authentik_policies_dummy.dummypolicy` - Dummy Policy + > - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy + > - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy + > - `authentik_policies_expression.expressionpolicy` - Expression Policy + > - `authentik_policies_password.passwordpolicy` - Password Policy + > - `authentik_policies_reputation.reputationpolicy` - Reputation Policy + > - `authentik_policies.policybinding` - Policy Binding + > - `authentik_providers_ldap.ldapprovider` - LDAP Provider + > - `authentik_providers_oauth2.scopemapping` - Scope Mapping + > - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider + > - `authentik_providers_proxy.proxyprovider` - Proxy Provider + > - `authentik_providers_radius.radiusprovider` - Radius Provider + > - `authentik_providers_saml.samlprovider` - SAML Provider + > - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping + > - `authentik_providers_scim.scimprovider` - SCIM Provider + > - `authentik_providers_scim.scimmapping` - SCIM Mapping + > - `authentik_rbac.role` - Role + > - `authentik_sources_ldap.ldapsource` - LDAP Source + > - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping + > - `authentik_sources_oauth.oauthsource` - OAuth Source + > - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection + > - `authentik_sources_plex.plexsource` - Plex Source + > - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection + > - `authentik_sources_saml.samlsource` - SAML Source + > - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection + > - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage + > - `authentik_stages_authenticator_duo.duodevice` - Duo Device + > - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage + > - `authentik_stages_authenticator_sms.smsdevice` - SMS Device + > - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage + > - `authentik_stages_authenticator_static.staticdevice` - Static Device + > - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage + > - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device + > - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage + > - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage + > - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device + > - `authentik_stages_captcha.captchastage` - Captcha Stage + > - `authentik_stages_consent.consentstage` - Consent Stage + > - `authentik_stages_consent.userconsent` - User Consent + > - `authentik_stages_deny.denystage` - Deny Stage + > - `authentik_stages_dummy.dummystage` - Dummy Stage + > - `authentik_stages_email.emailstage` - Email Stage + > - `authentik_stages_identification.identificationstage` - Identification Stage + > - `authentik_stages_invitation.invitationstage` - Invitation Stage + > - `authentik_stages_invitation.invitation` - Invitation + > - `authentik_stages_password.passwordstage` - Password Stage + > - `authentik_stages_prompt.prompt` - Prompt + > - `authentik_stages_prompt.promptstage` - Prompt Stage + > - `authentik_stages_user_delete.userdeletestage` - User Delete Stage + > - `authentik_stages_user_login.userloginstage` - User Login Stage + > - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage + > - `authentik_stages_user_write.userwritestage` - User Write Stage + > - `authentik_brands.brand` - Brand + > - `authentik_blueprints.blueprintinstance` - Blueprint Instance + > - `authentik_core.group` - Group + > - `authentik_core.user` - User + > - `authentik_core.application` - Application + > - `authentik_core.token` - Token + > - `authentik_enterprise.license` - License + > - `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 + + Added enum values: + + - `authentik_tenants.domain` + - `authentik_brands.brand` + - `authentik_providers_rac.racprovider` + - `authentik_providers_rac.endpoint` + - `authentik_providers_rac.racpropertymapping` + Removed enum values: + + - `authentik_policies_reputation.reputation` + - `authentik_providers_oauth2.authorizationcode` + - `authentik_providers_oauth2.accesstoken` + - `authentik_providers_oauth2.refreshtoken` + - `authentik_tenants.tenant` + +##### `GET` /rbac/roles/{uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /root/config/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `capabilities` (array) + + Changed items (string): > _ `can_save_media` - Can Save Media > _ `can_geo_ip` - Can Geo Ip > _ `can_asn` - Can Asn > _ `can_impersonate` - Can Impersonate > _ `can_debug` - Can Debug > _ `is_enterprise` - Is Enterprise + + Added enum value: + + - `can_asn` + +##### `GET` /sources/all/{slug}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /sources/ldap/{slug}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + New required properties: + + - `connectivity` + + * Added property `connectivity` (object) + > Get cached source connectivity + +##### `PUT` /sources/ldap/{slug}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + New required properties: + + - `connectivity` + + * Added property `connectivity` (object) + > Get cached source connectivity + +##### `PATCH` /sources/ldap/{slug}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + New required properties: + + - `connectivity` + + * Added property `connectivity` (object) + > Get cached source connectivity + +##### `GET` /sources/ldap/{slug}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /sources/oauth/{slug}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `type` (object) + + > Serializer for SourceType + + New required properties: + + - `verbose_name` + + New optional properties: + + - `slug` + + * Added property `verbose_name` (string) + + * Deleted property `slug` (string) + + - Changed property `oidc_jwks` (object -> object) + + - Changed property `provider_type` (string) + > - `apple` - Apple + > - `openidconnect` - OpenID Connect + > - `azuread` - Azure AD + > - `discord` - Discord + > - `facebook` - Facebook + > - `github` - GitHub + > - `google` - Google + > - `mailcow` - Mailcow + > - `okta` - Okta + > - `patreon` - Patreon + > - `reddit` - Reddit + > - `twitch` - Twitch + > - `twitter` - Twitter + +##### `PUT` /sources/oauth/{slug}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `oidc_jwks` (object -> object) + +- Changed property `provider_type` (string) + > - `apple` - Apple + > - `openidconnect` - OpenID Connect + > - `azuread` - Azure AD + > - `discord` - Discord + > - `facebook` - Facebook + > - `github` - GitHub + > - `google` - Google + > - `mailcow` - Mailcow + > - `okta` - Okta + > - `patreon` - Patreon + > - `reddit` - Reddit + > - `twitch` - Twitch + > - `twitter` - Twitter + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `type` (object) + + > Serializer for SourceType + + New required properties: + + - `verbose_name` + + New optional properties: + + - `slug` + + * Added property `verbose_name` (string) + + * Deleted property `slug` (string) + + - Changed property `oidc_jwks` (object -> object) + + - Changed property `provider_type` (string) + > - `apple` - Apple + > - `openidconnect` - OpenID Connect + > - `azuread` - Azure AD + > - `discord` - Discord + > - `facebook` - Facebook + > - `github` - GitHub + > - `google` - Google + > - `mailcow` - Mailcow + > - `okta` - Okta + > - `patreon` - Patreon + > - `reddit` - Reddit + > - `twitch` - Twitch + > - `twitter` - Twitter + +##### `PATCH` /sources/oauth/{slug}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `oidc_jwks` (object -> object) + +- Changed property `provider_type` (string) + > - `apple` - Apple + > - `openidconnect` - OpenID Connect + > - `azuread` - Azure AD + > - `discord` - Discord + > - `facebook` - Facebook + > - `github` - GitHub + > - `google` - Google + > - `mailcow` - Mailcow + > - `okta` - Okta + > - `patreon` - Patreon + > - `reddit` - Reddit + > - `twitch` - Twitch + > - `twitter` - Twitter + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `type` (object) + + > Serializer for SourceType + + New required properties: + + - `verbose_name` + + New optional properties: + + - `slug` + + * Added property `verbose_name` (string) + + * Deleted property `slug` (string) + + - Changed property `oidc_jwks` (object -> object) + + - Changed property `provider_type` (string) + > - `apple` - Apple + > - `openidconnect` - OpenID Connect + > - `azuread` - Azure AD + > - `discord` - Discord + > - `facebook` - Facebook + > - `github` - GitHub + > - `google` - Google + > - `mailcow` - Mailcow + > - `okta` - Okta + > - `patreon` - Patreon + > - `reddit` - Reddit + > - `twitch` - Twitch + > - `twitter` - Twitter + +##### `GET` /sources/oauth/{slug}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /sources/plex/{slug}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /sources/saml/{slug}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /sources/user_connections/all/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /sources/user_connections/oauth/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /sources/user_connections/plex/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /sources/user_connections/saml/{id}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/all/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/authenticator/duo/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/authenticator/sms/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/authenticator/static/{stage_uuid}/used_by/ + +###### Parameters: + +Changed: `stage_uuid` in `path` + +> A UUID string identifying this Static Authenticator Setup Stage. + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/authenticator/totp/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/authenticator/validate/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/authenticator/webauthn/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/captcha/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/consent/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/deny/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/dummy/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/email/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/identification/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/invitation/invitations/{invite_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_obj` (object) + + > Flow Serializer + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/invitation/invitations/{invite_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_obj` (object) + + > Flow Serializer + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/invitation/invitations/{invite_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_obj` (object) + + > Flow Serializer + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/invitation/invitations/{invite_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/invitation/stages/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/password/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/prompt/prompts/{prompt_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/prompt/stages/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/user_delete/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/user_login/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/user_logout/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /stages/user_write/{stage_uuid}/used_by/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + Changed items (object): > A list of all objects referencing the queried object + + - Changed property `action` (string) + + > - `cascade` - CASCADE + > - `cascade_many` - CASCADE_MANY + > - `set_null` - SET_NULL + > - `set_default` - SET_DEFAULT + + Added enum values: + + - `cascade` + - `cascade_many` + - `set_null` + - `set_default` + Removed enum values: + + - `CASCADE` + - `CASCADE_MANY` + - `SET_NULL` + - `SET_DEFAULT` + +##### `GET` /core/applications/ + +###### Parameters: + +Added: `for_user` in `query` + +##### `POST` /core/tokens/ + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /core/tokens/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Token Serializer + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /core/user_consent/{id}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `expiring` (boolean) + + - Changed property `user` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `POST` /core/users/ + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /core/users/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /core/users/me/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user` (object) + + > User Serializer for information a user can retrieve about themselves + + - Changed property `avatar` (string) + + > User's avatar, either a http/https URL or a data URI + + - Changed property `settings` (object) + > Get user settings with brand and group settings applied + +##### `POST` /events/events/ + +###### Request: + +Changed content type : `application/json` + +- Added property `brand` (object) + +- Deleted property `tenant` (object) + +- Changed property `user` (object -> object) + +- Changed property `context` (object -> object) + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +##### `GET` /events/events/ + +###### Parameters: + +Added: `brand_name` in `query` + +> Brand name + +Deleted: `tenant_name` in `query` + +> Tenant name + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Event Serializer + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +##### `GET` /events/notifications/{uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `event` (object) + + > Event Serializer + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +##### `PUT` /events/notifications/{uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `event` (object) + + > Event Serializer + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `event` (object) + + > Event Serializer + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +##### `PATCH` /events/notifications/{uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `event` (object) + + > Event Serializer + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `event` (object) + + > Event Serializer + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +##### `GET` /flows/bindings/{fsb_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `stage_obj` (object) + + > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /flows/bindings/{fsb_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `stage_obj` (object) + + > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /flows/bindings/{fsb_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `stage_obj` (object) + + > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /flows/instances/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + +- Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /flows/instances/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Flow Serializer + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /oauth2/access_tokens/{id}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /oauth2/authorization_codes/{id}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /oauth2/refresh_tokens/{id}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `user` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `POST` /outposts/instances/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `type` (string) + + > - `proxy` - Proxy + > - `ldap` - Ldap + > - `radius` - Radius + > - `rac` - Rac + + Added enum value: + + - `rac` + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `type` (string) + + > - `proxy` - Proxy + > - `ldap` - Ldap + > - `radius` - Radius + > - `rac` - Rac + + Added enum value: + + - `rac` + +##### `GET` /outposts/instances/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Outpost Serializer + + - Changed property `type` (string) + + > - `proxy` - Proxy + > - `ldap` - Ldap + > - `radius` - Radius + > - `rac` - Rac + + Added enum value: + + - `rac` + +##### `POST` /policies/bindings/ + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /policies/bindings/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > PolicyBinding Serializer + + - Changed property `user_obj` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /rbac/permissions/assigned_by_roles/ + +###### Parameters: + +Changed: `model` in `query` + +> - `authentik_tenants.domain` - Domain +> - `authentik_crypto.certificatekeypair` - Certificate-Key Pair +> - `authentik_flows.flow` - Flow +> - `authentik_flows.flowstagebinding` - Flow Stage Binding +> - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection +> - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection +> - `authentik_outposts.outpost` - Outpost +> - `authentik_policies_dummy.dummypolicy` - Dummy Policy +> - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy +> - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy +> - `authentik_policies_expression.expressionpolicy` - Expression Policy +> - `authentik_policies_password.passwordpolicy` - Password Policy +> - `authentik_policies_reputation.reputationpolicy` - Reputation Policy +> - `authentik_policies.policybinding` - Policy Binding +> - `authentik_providers_ldap.ldapprovider` - LDAP Provider +> - `authentik_providers_oauth2.scopemapping` - Scope Mapping +> - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider +> - `authentik_providers_proxy.proxyprovider` - Proxy Provider +> - `authentik_providers_radius.radiusprovider` - Radius Provider +> - `authentik_providers_saml.samlprovider` - SAML Provider +> - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping +> - `authentik_providers_scim.scimprovider` - SCIM Provider +> - `authentik_providers_scim.scimmapping` - SCIM Mapping +> - `authentik_rbac.role` - Role +> - `authentik_sources_ldap.ldapsource` - LDAP Source +> - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping +> - `authentik_sources_oauth.oauthsource` - OAuth Source +> - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection +> - `authentik_sources_plex.plexsource` - Plex Source +> - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection +> - `authentik_sources_saml.samlsource` - SAML Source +> - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection +> - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage +> - `authentik_stages_authenticator_duo.duodevice` - Duo Device +> - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage +> - `authentik_stages_authenticator_sms.smsdevice` - SMS Device +> - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage +> - `authentik_stages_authenticator_static.staticdevice` - Static Device +> - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage +> - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device +> - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage +> - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage +> - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device +> - `authentik_stages_captcha.captchastage` - Captcha Stage +> - `authentik_stages_consent.consentstage` - Consent Stage +> - `authentik_stages_consent.userconsent` - User Consent +> - `authentik_stages_deny.denystage` - Deny Stage +> - `authentik_stages_dummy.dummystage` - Dummy Stage +> - `authentik_stages_email.emailstage` - Email Stage +> - `authentik_stages_identification.identificationstage` - Identification Stage +> - `authentik_stages_invitation.invitationstage` - Invitation Stage +> - `authentik_stages_invitation.invitation` - Invitation +> - `authentik_stages_password.passwordstage` - Password Stage +> - `authentik_stages_prompt.prompt` - Prompt +> - `authentik_stages_prompt.promptstage` - Prompt Stage +> - `authentik_stages_user_delete.userdeletestage` - User Delete Stage +> - `authentik_stages_user_login.userloginstage` - User Login Stage +> - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage +> - `authentik_stages_user_write.userwritestage` - User Write Stage +> - `authentik_brands.brand` - Brand +> - `authentik_blueprints.blueprintinstance` - Blueprint Instance +> - `authentik_core.group` - Group +> - `authentik_core.user` - User +> - `authentik_core.application` - Application +> - `authentik_core.token` - Token +> - `authentik_enterprise.license` - License +> - `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 + +##### `GET` /rbac/permissions/assigned_by_users/ + +###### Parameters: + +Changed: `model` in `query` + +> - `authentik_tenants.domain` - Domain +> - `authentik_crypto.certificatekeypair` - Certificate-Key Pair +> - `authentik_flows.flow` - Flow +> - `authentik_flows.flowstagebinding` - Flow Stage Binding +> - `authentik_outposts.dockerserviceconnection` - Docker Service-Connection +> - `authentik_outposts.kubernetesserviceconnection` - Kubernetes Service-Connection +> - `authentik_outposts.outpost` - Outpost +> - `authentik_policies_dummy.dummypolicy` - Dummy Policy +> - `authentik_policies_event_matcher.eventmatcherpolicy` - Event Matcher Policy +> - `authentik_policies_expiry.passwordexpirypolicy` - Password Expiry Policy +> - `authentik_policies_expression.expressionpolicy` - Expression Policy +> - `authentik_policies_password.passwordpolicy` - Password Policy +> - `authentik_policies_reputation.reputationpolicy` - Reputation Policy +> - `authentik_policies.policybinding` - Policy Binding +> - `authentik_providers_ldap.ldapprovider` - LDAP Provider +> - `authentik_providers_oauth2.scopemapping` - Scope Mapping +> - `authentik_providers_oauth2.oauth2provider` - OAuth2/OpenID Provider +> - `authentik_providers_proxy.proxyprovider` - Proxy Provider +> - `authentik_providers_radius.radiusprovider` - Radius Provider +> - `authentik_providers_saml.samlprovider` - SAML Provider +> - `authentik_providers_saml.samlpropertymapping` - SAML Property Mapping +> - `authentik_providers_scim.scimprovider` - SCIM Provider +> - `authentik_providers_scim.scimmapping` - SCIM Mapping +> - `authentik_rbac.role` - Role +> - `authentik_sources_ldap.ldapsource` - LDAP Source +> - `authentik_sources_ldap.ldappropertymapping` - LDAP Property Mapping +> - `authentik_sources_oauth.oauthsource` - OAuth Source +> - `authentik_sources_oauth.useroauthsourceconnection` - User OAuth Source Connection +> - `authentik_sources_plex.plexsource` - Plex Source +> - `authentik_sources_plex.plexsourceconnection` - User Plex Source Connection +> - `authentik_sources_saml.samlsource` - SAML Source +> - `authentik_sources_saml.usersamlsourceconnection` - User SAML Source Connection +> - `authentik_stages_authenticator_duo.authenticatorduostage` - Duo Authenticator Setup Stage +> - `authentik_stages_authenticator_duo.duodevice` - Duo Device +> - `authentik_stages_authenticator_sms.authenticatorsmsstage` - SMS Authenticator Setup Stage +> - `authentik_stages_authenticator_sms.smsdevice` - SMS Device +> - `authentik_stages_authenticator_static.authenticatorstaticstage` - Static Authenticator Setup Stage +> - `authentik_stages_authenticator_static.staticdevice` - Static Device +> - `authentik_stages_authenticator_totp.authenticatortotpstage` - TOTP Authenticator Setup Stage +> - `authentik_stages_authenticator_totp.totpdevice` - TOTP Device +> - `authentik_stages_authenticator_validate.authenticatorvalidatestage` - Authenticator Validation Stage +> - `authentik_stages_authenticator_webauthn.authenticatewebauthnstage` - WebAuthn Authenticator Setup Stage +> - `authentik_stages_authenticator_webauthn.webauthndevice` - WebAuthn Device +> - `authentik_stages_captcha.captchastage` - Captcha Stage +> - `authentik_stages_consent.consentstage` - Consent Stage +> - `authentik_stages_consent.userconsent` - User Consent +> - `authentik_stages_deny.denystage` - Deny Stage +> - `authentik_stages_dummy.dummystage` - Dummy Stage +> - `authentik_stages_email.emailstage` - Email Stage +> - `authentik_stages_identification.identificationstage` - Identification Stage +> - `authentik_stages_invitation.invitationstage` - Invitation Stage +> - `authentik_stages_invitation.invitation` - Invitation +> - `authentik_stages_password.passwordstage` - Password Stage +> - `authentik_stages_prompt.prompt` - Prompt +> - `authentik_stages_prompt.promptstage` - Prompt Stage +> - `authentik_stages_user_delete.userdeletestage` - User Delete Stage +> - `authentik_stages_user_login.userloginstage` - User Login Stage +> - `authentik_stages_user_logout.userlogoutstage` - User Logout Stage +> - `authentik_stages_user_write.userwritestage` - User Write Stage +> - `authentik_brands.brand` - Brand +> - `authentik_blueprints.blueprintinstance` - Blueprint Instance +> - `authentik_core.group` - Group +> - `authentik_core.user` - User +> - `authentik_core.application` - Application +> - `authentik_core.token` - Token +> - `authentik_enterprise.license` - License +> - `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 + +##### `POST` /sources/ldap/ + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + New required properties: + + - `connectivity` + + * Added property `connectivity` (object) + > Get cached source connectivity + +##### `GET` /sources/ldap/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > LDAP Source Serializer + + New required properties: + + - `connectivity` + + * Added property `connectivity` (object) + > Get cached source connectivity + +##### `POST` /sources/oauth/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `oidc_jwks` (object -> object) + +- Changed property `provider_type` (string) + > - `apple` - Apple + > - `openidconnect` - OpenID Connect + > - `azuread` - Azure AD + > - `discord` - Discord + > - `facebook` - Facebook + > - `github` - GitHub + > - `google` - Google + > - `mailcow` - Mailcow + > - `okta` - Okta + > - `patreon` - Patreon + > - `reddit` - Reddit + > - `twitch` - Twitch + > - `twitter` - Twitter + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `type` (object) + + > Serializer for SourceType + + New required properties: + + - `verbose_name` + + New optional properties: + + - `slug` + + * Added property `verbose_name` (string) + + * Deleted property `slug` (string) + + - Changed property `oidc_jwks` (object -> object) + + - Changed property `provider_type` (string) + > - `apple` - Apple + > - `openidconnect` - OpenID Connect + > - `azuread` - Azure AD + > - `discord` - Discord + > - `facebook` - Facebook + > - `github` - GitHub + > - `google` - Google + > - `mailcow` - Mailcow + > - `okta` - Okta + > - `patreon` - Patreon + > - `reddit` - Reddit + > - `twitch` - Twitch + > - `twitter` - Twitter + +##### `GET` /sources/oauth/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > OAuth Source Serializer + + - Changed property `type` (object) + + > Serializer for SourceType + + New required properties: + + - `verbose_name` + + New optional properties: + + - `slug` + + * Added property `verbose_name` (string) + + * Deleted property `slug` (string) + + - Changed property `oidc_jwks` (object -> object) + + - Changed property `provider_type` (string) + > - `apple` - Apple + > - `openidconnect` - OpenID Connect + > - `azuread` - Azure AD + > - `discord` - Discord + > - `facebook` - Facebook + > - `github` - GitHub + > - `google` - Google + > - `mailcow` - Mailcow + > - `okta` - Okta + > - `patreon` - Patreon + > - `reddit` - Reddit + > - `twitch` - Twitch + > - `twitter` - Twitter + +##### `GET` /stages/all/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/duo/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/authenticator/duo/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/authenticator/duo/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/sms/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/authenticator/sms/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/authenticator/sms/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `DELETE` /stages/authenticator/static/{stage_uuid}/ + +###### Parameters: + +Changed: `stage_uuid` in `path` + +> A UUID string identifying this Static Authenticator Setup Stage. + +##### `GET` /stages/authenticator/static/{stage_uuid}/ + +###### Parameters: + +Changed: `stage_uuid` in `path` + +> A UUID string identifying this Static Authenticator Setup Stage. + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/authenticator/static/{stage_uuid}/ + +###### Parameters: + +Changed: `stage_uuid` in `path` + +> A UUID string identifying this Static Authenticator Setup Stage. + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/authenticator/static/{stage_uuid}/ + +###### Parameters: + +Changed: `stage_uuid` in `path` + +> A UUID string identifying this Static Authenticator Setup Stage. + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/totp/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `digits` (integer -> string) + + > - `6` - 6 digits, widely compatible + > - `8` - 8 digits, not compatible with apps like Google Authenticator + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/authenticator/totp/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `digits` (integer -> string) + + > - `6` - 6 digits, widely compatible + > - `8` - 8 digits, not compatible with apps like Google Authenticator + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `digits` (integer -> string) + + > - `6` - 6 digits, widely compatible + > - `8` - 8 digits, not compatible with apps like Google Authenticator + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/authenticator/totp/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `digits` (integer -> string) + + > - `6` - 6 digits, widely compatible + > - `8` - 8 digits, not compatible with apps like Google Authenticator + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `digits` (integer -> string) + + > - `6` - 6 digits, widely compatible + > - `8` - 8 digits, not compatible with apps like Google Authenticator + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/validate/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/authenticator/validate/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/authenticator/validate/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/webauthn/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/authenticator/webauthn/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/authenticator/webauthn/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/captcha/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/captcha/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/captcha/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/consent/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/consent/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/consent/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/deny/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/deny/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/deny/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/dummy/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/dummy/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/dummy/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/email/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/email/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/email/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/identification/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `pretend_user_exists` (boolean) + + > When enabled, the stage will succeed and continue even when incorrect user info is entered. + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/identification/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Added property `pretend_user_exists` (boolean) + + > When enabled, the stage will succeed and continue even when incorrect user info is entered. + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `pretend_user_exists` (boolean) + + > When enabled, the stage will succeed and continue even when incorrect user info is entered. + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/identification/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Added property `pretend_user_exists` (boolean) + + > When enabled, the stage will succeed and continue even when incorrect user info is entered. + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `pretend_user_exists` (boolean) + + > When enabled, the stage will succeed and continue even when incorrect user info is entered. + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/invitation/invitations/ + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_obj` (object) + + > Flow Serializer + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/invitation/invitations/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Invitation Serializer + + - Changed property `flow_obj` (object) + + > Flow Serializer + + - Changed property `authentication` (string) + + > - `none` - None + > - `require_authenticated` - Require Authenticated + > - `require_unauthenticated` - Require Unauthenticated + > - `require_superuser` - Require Superuser + > - `require_outpost` - Require Outpost + + Added enum value: + + - `require_outpost` + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/invitation/stages/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/invitation/stages/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/invitation/stages/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/password/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/password/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/password/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/prompt/stages/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/prompt/stages/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/prompt/stages/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/user_delete/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/user_delete/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/user_delete/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/user_login/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `network_binding` (object) + + > Bind sessions created by this stage to the configured network + > + > - `no_binding` - No Binding + > - `bind_asn` - Bind Asn + > - `bind_asn_network` - Bind Asn Network + > - `bind_asn_network_ip` - Bind Asn Network Ip + + Enum values: + + - `no_binding` + - `bind_asn` + - `bind_asn_network` + - `bind_asn_network_ip` + + - Added property `geoip_binding` (object) + + > Bind sessions created by this stage to the configured GeoIP location + > + > - `no_binding` - No Binding + > - `bind_continent` - Bind Continent + > - `bind_continent_country` - Bind Continent Country + > - `bind_continent_country_city` - Bind Continent Country City + + Enum values: + + - `no_binding` + - `bind_continent` + - `bind_continent_country` + - `bind_continent_country_city` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/user_login/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Added property `network_binding` (object) + + > Bind sessions created by this stage to the configured network + > + > - `no_binding` - No Binding + > - `bind_asn` - Bind Asn + > - `bind_asn_network` - Bind Asn Network + > - `bind_asn_network_ip` - Bind Asn Network Ip + +- Added property `geoip_binding` (object) + + > Bind sessions created by this stage to the configured GeoIP location + > + > - `no_binding` - No Binding + > - `bind_continent` - Bind Continent + > - `bind_continent_country` - Bind Continent Country + > - `bind_continent_country_city` - Bind Continent Country City + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `network_binding` (object) + + > Bind sessions created by this stage to the configured network + > + > - `no_binding` - No Binding + > - `bind_asn` - Bind Asn + > - `bind_asn_network` - Bind Asn Network + > - `bind_asn_network_ip` - Bind Asn Network Ip + + - Added property `geoip_binding` (object) + + > Bind sessions created by this stage to the configured GeoIP location + > + > - `no_binding` - No Binding + > - `bind_continent` - Bind Continent + > - `bind_continent_country` - Bind Continent Country + > - `bind_continent_country_city` - Bind Continent Country City + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/user_login/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Added property `network_binding` (object) + + > Bind sessions created by this stage to the configured network + > + > - `no_binding` - No Binding + > - `bind_asn` - Bind Asn + > - `bind_asn_network` - Bind Asn Network + > - `bind_asn_network_ip` - Bind Asn Network Ip + +- Added property `geoip_binding` (object) + + > Bind sessions created by this stage to the configured GeoIP location + > + > - `no_binding` - No Binding + > - `bind_continent` - Bind Continent + > - `bind_continent_country` - Bind Continent Country + > - `bind_continent_country_city` - Bind Continent Country City + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Added property `network_binding` (object) + + > Bind sessions created by this stage to the configured network + > + > - `no_binding` - No Binding + > - `bind_asn` - Bind Asn + > - `bind_asn_network` - Bind Asn Network + > - `bind_asn_network_ip` - Bind Asn Network Ip + + - Added property `geoip_binding` (object) + + > Bind sessions created by this stage to the configured GeoIP location + > + > - `no_binding` - No Binding + > - `bind_continent` - Bind Continent + > - `bind_continent_country` - Bind Continent Country + > - `bind_continent_country_city` - Bind Continent Country City + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/user_logout/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/user_logout/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/user_logout/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/user_write/{stage_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/user_write/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/user_write/{stage_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /core/transactional/applications/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `provider_model` (string) + + > - `authentik_providers_ldap.ldapprovider` - authentik_providers_ldap.ldapprovider + > - `authentik_providers_oauth2.oauth2provider` - authentik_providers_oauth2.oauth2provider + > - `authentik_providers_proxy.proxyprovider` - authentik_providers_proxy.proxyprovider + > - `authentik_providers_rac.racprovider` - authentik_providers_rac.racprovider + > - `authentik_providers_radius.radiusprovider` - authentik_providers_radius.radiusprovider + > - `authentik_providers_saml.samlprovider` - authentik_providers_saml.samlprovider + > - `authentik_providers_scim.scimprovider` - authentik_providers_scim.scimprovider + + Added enum value: + + - `authentik_providers_rac.racprovider` + +- Changed property `provider` (object) + + Added 'authentik_providers_rac.racprovider' provider_model: + + - Property `name` (string) + + - Property `authentication_flow` (string) + + > Flow used for authentication when the associated application is accessed by an un-authenticated user. + + - Property `authorization_flow` (string) + + > Flow used when authorizing this provider. + + - Property `property_mappings` (array) + + Items (string): + + - Property `settings` (object) + + - Property `connection_expiry` (string) + + > 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) + + - Property `delete_token_on_disconnect` (boolean) + > When set to true, connection tokens will be deleted upon disconnect. + +##### `GET` /core/user_consent/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > UserConsent Serializer + + - Added property `expiring` (boolean) + + - Changed property `user` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /events/notifications/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Notification Serializer + + - Changed property `event` (object) + + > Event Serializer + + - Added property `brand` (object) + + - Deleted property `tenant` (object) + + - Changed property `user` (object -> object) + + - Changed property `context` (object -> object) + +##### `POST` /flows/bindings/ + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `stage_obj` (object) + + > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /flows/bindings/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > FlowStageBinding Serializer + + - Changed property `stage_obj` (object) + + > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /flows/inspector/{flow_slug}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `plans` (array) + + Changed items (object): > Serializer for an active FlowPlan + + - Changed property `current_stage` (object) + + > FlowStageBinding Serializer + + - Changed property `stage_obj` (object) + + > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /oauth2/access_tokens/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Serializer for BaseGrantModel and RefreshToken + + - Changed property `user` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /oauth2/authorization_codes/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Serializer for BaseGrantModel and ExpiringBaseGrant + + - Changed property `user` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /oauth2/refresh_tokens/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Serializer for BaseGrantModel and RefreshToken + + - Changed property `user` (object) + + > User Serializer + + - Changed property `avatar` (string) + > User's avatar, either a http/https URL or a data URI + +##### `GET` /stages/all/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/authenticator/duo/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/duo/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > AuthenticatorDuoStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/authenticator/sms/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/sms/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > AuthenticatorSMSStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/authenticator/static/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/static/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > AuthenticatorStaticStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/authenticator/totp/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `digits` (integer -> string) + + > - `6` - 6 digits, widely compatible + > - `8` - 8 digits, not compatible with apps like Google Authenticator + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `digits` (integer -> string) + + > - `6` - 6 digits, widely compatible + > - `8` - 8 digits, not compatible with apps like Google Authenticator + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/totp/ + +###### Parameters: + +Changed: `digits` in `query` + +> - `6` - 6 digits, widely compatible +> - `8` - 8 digits, not compatible with apps like Google Authenticator + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > AuthenticatorTOTPStage Serializer + + - Changed property `digits` (integer -> string) + + > - `6` - 6 digits, widely compatible + > - `8` - 8 digits, not compatible with apps like Google Authenticator + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/authenticator/validate/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/validate/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > AuthenticatorValidateStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/authenticator/webauthn/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/authenticator/webauthn/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > AuthenticateWebAuthnStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/captcha/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/captcha/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > CaptchaStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/consent/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/consent/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > ConsentStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/deny/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/deny/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > DenyStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/dummy/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/dummy/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > DummyStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/email/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/email/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > EmailStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/identification/ + +###### Request: + +Changed content type : `application/json` + +- Added property `pretend_user_exists` (boolean) + + > When enabled, the stage will succeed and continue even when incorrect user info is entered. + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Added property `pretend_user_exists` (boolean) + + > When enabled, the stage will succeed and continue even when incorrect user info is entered. + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/identification/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > IdentificationStage Serializer + + - Added property `pretend_user_exists` (boolean) + + > When enabled, the stage will succeed and continue even when incorrect user info is entered. + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/invitation/stages/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/invitation/stages/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > InvitationStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/password/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/password/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > PasswordStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/prompt/prompts/{prompt_uuid}/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `promptstage_set` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PUT` /stages/prompt/prompts/{prompt_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `promptstage_set` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `promptstage_set` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `PATCH` /stages/prompt/prompts/{prompt_uuid}/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `promptstage_set` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `promptstage_set` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/prompt/prompts/preview/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `promptstage_set` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/prompt/stages/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/prompt/stages/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > PromptStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/user_delete/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/user_delete/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > UserDeleteStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/user_login/ + +###### Request: + +Changed content type : `application/json` + +- Added property `network_binding` (object) + + > Bind sessions created by this stage to the configured network + > + > - `no_binding` - No Binding + > - `bind_asn` - Bind Asn + > - `bind_asn_network` - Bind Asn Network + > - `bind_asn_network_ip` - Bind Asn Network Ip + +- Added property `geoip_binding` (object) + + > Bind sessions created by this stage to the configured GeoIP location + > + > - `no_binding` - No Binding + > - `bind_continent` - Bind Continent + > - `bind_continent_country` - Bind Continent Country + > - `bind_continent_country_city` - Bind Continent Country City + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Added property `network_binding` (object) + + > Bind sessions created by this stage to the configured network + > + > - `no_binding` - No Binding + > - `bind_asn` - Bind Asn + > - `bind_asn_network` - Bind Asn Network + > - `bind_asn_network_ip` - Bind Asn Network Ip + + - Added property `geoip_binding` (object) + + > Bind sessions created by this stage to the configured GeoIP location + > + > - `no_binding` - No Binding + > - `bind_continent` - Bind Continent + > - `bind_continent_country` - Bind Continent Country + > - `bind_continent_country_city` - Bind Continent Country City + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/user_login/ + +###### Parameters: + +Added: `geoip_binding` in `query` + +> Bind sessions created by this stage to the configured GeoIP location +> +> - `no_binding` - No Binding +> - `bind_continent` - Bind Continent +> - `bind_continent_country` - Bind Continent Country +> - `bind_continent_country_city` - Bind Continent Country City + +Added: `network_binding` in `query` + +> Bind sessions created by this stage to the configured network +> +> - `no_binding` - No Binding +> - `bind_asn` - Bind Asn +> - `bind_asn_network` - Bind Asn Network +> - `bind_asn_network_ip` - Bind Asn Network Ip + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > UserLoginStage Serializer + + - Added property `network_binding` (object) + + > Bind sessions created by this stage to the configured network + > + > - `no_binding` - No Binding + > - `bind_asn` - Bind Asn + > - `bind_asn_network` - Bind Asn Network + > - `bind_asn_network_ip` - Bind Asn Network Ip + + - Added property `geoip_binding` (object) + + > Bind sessions created by this stage to the configured GeoIP location + > + > - `no_binding` - No Binding + > - `bind_continent` - Bind Continent + > - `bind_continent_country` - Bind Continent Country + > - `bind_continent_country_city` - Bind Continent Country City + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/user_logout/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/user_logout/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > UserLogoutStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/user_write/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/user_write/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > UserWriteStage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `POST` /stages/prompt/prompts/ + +###### Request: + +Changed content type : `application/json` + +- Changed property `promptstage_set` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +###### Return Type: + +Changed response : **201 Created** + +- Changed content type : `application/json` + + - Changed property `promptstage_set` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right + +##### `GET` /stages/prompt/prompts/ + +###### Return Type: + +Changed response : **200 OK** + +- Changed content type : `application/json` + + - Changed property `results` (array) + + Changed items (object): > Prompt Serializer + + - Changed property `promptstage_set` (array) + + Changed items (object): > Stage Serializer + + - Changed property `flow_set` (array) + + Changed items (object): > Stripped down flow serializer + + - Changed property `layout` (string) + > - `stacked` - Stacked + > - `content_left` - Content Left + > - `content_right` - Content Right + > - `sidebar_left` - Sidebar Left + > - `sidebar_right` - Sidebar Right diff --git a/website/docs/user-group-role/access-control/flow-page.png b/website/docs/user-group-role/access-control/flow-page.png index fcf4e8318b..8b2636353f 100644 Binary files a/website/docs/user-group-role/access-control/flow-page.png and b/website/docs/user-group-role/access-control/flow-page.png differ diff --git a/website/docs/user-group-role/access-control/manage_permissions.md b/website/docs/user-group-role/access-control/manage_permissions.md index 49d6c05bcb..4aa701c132 100644 --- a/website/docs/user-group-role/access-control/manage_permissions.md +++ b/website/docs/user-group-role/access-control/manage_permissions.md @@ -32,9 +32,9 @@ To view _object_ permissions for a specific user or role: \_These instructions apply to all objects that **do not** have a detail page.\_\_ -1. Go to the Admin interface and navigate to **Flows and Stages -> Stagess**. -2. On the row for the specific stage whose permissions you want to view, click the lock icon. -3. On the **Update Permissions** tab, you can view the assigned permissions using the **User Object Permissions** and the **Role Object Permissions** tabs. +1. Go to the Admin interface and navigate to **Flows and Stages -> Stages**. +2. On the row for the specific stage whose permissions you want to view, click the **lock icon**. +3. On the **Update Permissions** window, you can view the assigned permissions using the **User Object Permissions** and the **Role Object Permissions** tabs. ## Manage permissions @@ -48,21 +48,25 @@ To assign or remove _object_ permissions for a specific user: 2. Select a specific user by clicking on the user's name. 3. Click the **Permissions** tab at the top of the page. 4. To assign or remove permissions that another _user_ has on this specific user: - 1. Click the **User Object Permissions** tab, click **Assign to new user**. + 1. Click the **User Object Permissions** tab, and then click **Assign to new user**. 2. In the **User** drop-down, select the user object. 3. Use the toggles to set which permissions on that selected user object you want to grant to (or remove from) the specific user. 4. Click **Assign** to save your settings and close the modal. 5. To assign or remove permissions that another _role_ has on this specific user: - Click the **Role Object Permissions** tab, click **Assign to new role**. 2. In the **User** drop-down, select the user object. 3. Use the toggles to set which permissions you want to grant to (or remove from) the selected role. 4. Click **Assign** to save your settings and close the modal. + 1. Click the **Role Object Permissions** tab, and then click **Assign to new role**. + 2. In the **User** drop-down, select the user object. + 3. Use the toggles to set which permissions you want to grant to (or remove from) the selected role. + 4. Click **Assign** to save your settings and close the modal. To assign or remove _global_ permissions for a user: 1. Go to the Admin interface and navigate to **Directory -> Users**. 2. Select a specific user the clicking on the user's name. -3. Click the **Assigned Permissions** tab at the top of the page (to the right of the **Permissions** tab). -4. In the **Assigned Global Permissions** area, click **Assign Permission**. -5. In the **Assign permissions to user** modal, click the plus sign (**+**) and then click the checkbox beside each permission that you want to assign to the user. To remove permissions, deselect the checkbox. -6. Click **Add**, and then click **Assign** to save your changes and close the modal. +3. Click the **Permissions** tab at the top of the page. +4. Click **Assigned Global Permissions** to the left. +5. In the **Assign permissions** area, click **Assign Permission**. +6. In the **Assign permission to user** modal box, click the plus sign (**+**) and then click the checkbox beside each permission that you want to assign to the user. To remove permissions, deselect the checkbox. +7. Click **Add**, and then click **Assign** to save your changes and close the modal. ### Assign or remove permissions on a specific group @@ -74,15 +78,18 @@ Also there are no global permissions for groups. To assign or remove _object_ permissions on a specific group by users and roles: 1. Go to the Admin interface and navigate to **Directory -> Groups**. -2. Select a specific group by clicking the the group's name. +2. Select a specific group by clicking the group's name. 3. Click the **Permissions** tab at the top of the page. To assign or remove permissions that another _user_ has on this specific group: - 1. Click the **User Object Permissions** tab, click **Assign to new user**. + 1. Click **User Object Permissions** to the left, and then click **Assign to new user**. 2. In the **User** drop-down, select the user object. 3. Use the toggles to set which permissions on that selected group you want to grant to (or remove from) the specific user. 4. Click **Assign** to save your settings and close the modal. 4. To assign or remove permissions that another _role_ has on this specific group: - Click the **Role Object Permissions** tab, click **Assign to new role**. 2. In the **Role** drop-down, select the role. 3. Use the toggles to set which permissions you want to grant to (or remove from ) the selected role. 4. Click **Assign** to save your settings and close the modal. + 1. Click **Role Object Permissions** to the left, and then click **Assign to new role**. + 2. In the **Role** drop-down, select the role. + 3. Use the toggles to set which permissions you want to grant to (or remove from ) the selected role. + 4. Click **Assign** to save your settings and close the modal. ### Assign or remove permissions for a specific role @@ -91,16 +98,23 @@ To assign or remove _object_ permissions for a specific role: 1. Go to the Admin interface and navigate to **Directory -> Roles**. 2. Select a specific role the clicking on the role's name. 3. Click the **Permissions** tab at the top of the page. - To assign or remove permissions that another _user_ has on this specific role: 1. Click the **User Object Permissions** tab, click **Assign to new user**. 2. In the **User** drop-down, select the user object. 3. Use the toggles to set which permissions on that role you want to grant to (or remove from) the selected user. 4. Click **Assign** to save your settings and close the modal. + To assign or remove permissions that another _user_ has on this specific role: + 1. Click **User Object Permissions** to the left, and then click **Assign to new user**. + 2. In the **User** drop-down, select the user object. + 3. Use the toggles to set which permissions on that role you want to grant to (or remove from) the selected user. + 4. Click **Assign** to save your settings and close the modal. 4. To assign or remove permissions that another _role_ has on this specific group: - Click the **Role Object Permissions** tab, click **Assign to new role**. 2. In the **Role** drop-down, select the role. 3. Use the toggles to set which permissions you want to grant to (or remove from) the selected role. 4. Click **Assign** to save your settings and close the modal. + 1. Click **Role Object Permissions** to the left, and then click **Assign to new role**. + 2. In the **Role** drop-down, select the role. + 3. Use the toggles to set which permissions you want to grant to (or remove from) the selected role. + 4. Click **Assign** to save your settings and close the modal. To assign or remove _global_ permissions for a role: 1. Go to the Admin interface and navigate to **Directory -> Roles**. 2. Select a specific role by clicking on the role's name. -3. The **Overview** tab at the top of the page displays all assigned global permissions for the role. -4. In the **Assigned Global Permissions** area, click **Assign Permission**. +3. Click the **Permissions** tab at the top of the page. +4. Click **Assigned Global Permissions** to the left, and then click **Assign Permission**. 5. In the **Assign permissions to role** modal, click the plus sign (**+**) and then click the checkbox beside each permission that you want to assign to the role. To remove permissions, deselect the checkbox. 6. Click **Assign** to save your changes and close the modal. @@ -114,5 +128,5 @@ To assign or remove _global_ permissions for a role: ### Assign or remove stage permissions 1. Go to the Admin interface and navigate to **Flows and Stages -> Stagess**. -2. On the row for the specific stage that you want to manage permissions, click the lock icon. -3. On the **Update Permissions** tab, you can add or remove the assigned permissions using the **User Object Permissions** and the **Role Object Permissions** tabs. +2. On the row for the specific stage that you want to manage permissions, click the **lock icon**. +3. On the **Update Permissions** modal window, you can add or remove the assigned permissions using the **User Object Permissions** and the **Role Object Permissions** tabs. diff --git a/website/docs/user-group-role/access-control/permissions.md b/website/docs/user-group-role/access-control/permissions.md index 57c0f7ae87..8393500cc1 100644 --- a/website/docs/user-group-role/access-control/permissions.md +++ b/website/docs/user-group-role/access-control/permissions.md @@ -29,16 +29,16 @@ Object permissions have two categories: - **_User_ object permissions**: defines WHO (which user) can change the **_object_** - **_Role_ object permissions**: defines which ROLE can change the **_object_** -Object permissions are assigned, as the name indicates, to an object (users, [groups](../groups/index.mdx), roles, flows, and stages), and the assigned permissions state exactly what a user or role can do TO the object (i.e. what permissions does the user or role have on that object). +Object permissions are assigned, as the name indicates, to an object ([users](../user/index.mdx), [groups](../groups/index.mdx), [roles](../roles/index.mdx), [flows](../../flow/index.md), and stages), and the assigned permissions state exactly what a user or role can do TO the object (i.e. what permissions does the user or role have on that object). -When working with object permissions, it is important to understand that when you are viewing the page for an object the permissions table shows which users or roles have permissions ON that object. Those permissions describe what those users or roles can do TO the object detailed on the page. +When working with object permissions it is important to understand that when you are viewing the page for an object, the permissions table shows which users or roles have permissions ON that specific object. Those permissions describe what those users or roles can do TO the object detailed on the page. -For example, the UI below shows a user page for the user named Peter. +For example, the Admin interface UI shown below shows a user page for the user named Peter. ![](./user-page.png) -You can see in the **User Object Permissions** table that another user, roberto, has permissions on Peter (that is, on the user object Peter). +You can see in the **User Object Permissions** table that the Admin user (`akadmin`) and one other user (roberto) has permissions on Peter (that is, on the user object named Peter). -Looking at another example, with a flow object called `default-recovery-flow` you can see that the Admin user (akadmin) has all object permissions on the flow, but roberto only has a few permissions on that flow. +Looking at another example, with a flow object called `default-recovery-flow`, you can see that the Admin user (akadmin) has all object permissions on the flow, but roberto only has a few permissions on that flow. ![](./flow-page.png) diff --git a/website/docs/user-group-role/access-control/user-page.png b/website/docs/user-group-role/access-control/user-page.png index 904062b974..942ade2f73 100644 Binary files a/website/docs/user-group-role/access-control/user-page.png and b/website/docs/user-group-role/access-control/user-page.png differ diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index aca3c94552..037754a553 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -156,7 +156,8 @@ module.exports = async function (): Promise { repository: "goauthentik/authentik", // Only replace issues and PR links buildUrl: function (values) { - return values.type === "issue" + return values.type === "issue" || + values.type === "mention" ? defaultBuildUrl(values) : false; }, diff --git a/website/package-lock.json b/website/package-lock.json index 6ac5fa40aa..d24c41d646 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -15,10 +15,10 @@ "@docusaurus/preset-classic": "^3.1.1", "@docusaurus/theme-common": "^3.1.1", "@docusaurus/theme-mermaid": "^3.1.1", - "@mdx-js/react": "^3.0.0", + "@mdx-js/react": "^3.0.1", "clsx": "^2.1.0", "disqus-react": "^1.1.5", - "postcss": "^8.4.33", + "postcss": "^8.4.35", "prism-react-renderer": "^2.3.1", "rapidoc": "^9.3.4", "react": "^18.2.0", @@ -26,15 +26,15 @@ "react-dom": "^18.2.0", "react-feather": "^2.0.10", "react-toggle": "^4.1.3", - "react-tooltip": "^5.26.0", + "react-tooltip": "^5.26.2", "remark-github": "^12.0.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.1.1", "@docusaurus/tsconfig": "3.1.1", "@docusaurus/types": "3.1.1", - "@types/react": "^18.2.48", - "prettier": "3.2.4", + "@types/react": "^18.2.55", + "prettier": "3.2.5", "typescript": "~5.3.3" }, "engines": { @@ -3119,26 +3119,26 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "@floating-ui/utils": "^0.1.3" + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.2.tgz", + "integrity": "sha512-xymkSSowKdGqo0SRr2Mp4czH5A8o2Pum35PAD0ftb3gCcPacWzwhvtUeUqmVXm9EVtm2hThD/lRrFNcahMOaSQ==", "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "node_modules/@hapi/hoek": { "version": "9.3.0", @@ -3285,9 +3285,9 @@ } }, "node_modules/@mdx-js/react": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.0.tgz", - "integrity": "sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", "dependencies": { "@types/mdx": "^2.0.0" }, @@ -4374,9 +4374,9 @@ "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==" }, "node_modules/@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "version": "18.2.55", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", + "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -13161,9 +13161,9 @@ } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "funding": [ { "type": "opencollective", @@ -13778,9 +13778,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" @@ -14389,11 +14389,11 @@ } }, "node_modules/react-tooltip": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.0.tgz", - "integrity": "sha512-UBbwy3fo1KYDwRCOWwM6AEfQsk9shgVfNkXFqgwS33QHplzg7xao/7mX/6wd+lE6KSZzhUNTkB5TNk9SMaBV/A==", + "version": "5.26.2", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.2.tgz", + "integrity": "sha512-C1qHiqWYn6l5c98kL/NKFyJSw5G11vUVJkgOPcKgn306c5iL5317LxMNn5Qg1GSSM7Qvtsd6KA5MvwfgxFF7Dg==", "dependencies": { - "@floating-ui/dom": "^1.0.0", + "@floating-ui/dom": "^1.6.1", "classnames": "^2.3.0" }, "peerDependencies": { diff --git a/website/package.json b/website/package.json index f9ea6adf92..b0d5905b61 100644 --- a/website/package.json +++ b/website/package.json @@ -22,17 +22,17 @@ "@docusaurus/preset-classic": "^3.1.1", "@docusaurus/theme-common": "^3.1.1", "@docusaurus/theme-mermaid": "^3.1.1", - "@mdx-js/react": "^3.0.0", + "@mdx-js/react": "^3.0.1", "clsx": "^2.1.0", "disqus-react": "^1.1.5", - "postcss": "^8.4.33", + "postcss": "^8.4.35", "prism-react-renderer": "^2.3.1", "rapidoc": "^9.3.4", "react-before-after-slider-component": "^1.1.8", "react-dom": "^18.2.0", "react-feather": "^2.0.10", "react-toggle": "^4.1.3", - "react-tooltip": "^5.26.0", + "react-tooltip": "^5.26.2", "react": "^18.2.0", "remark-github": "^12.0.0" }, @@ -52,8 +52,8 @@ "@docusaurus/module-type-aliases": "3.1.1", "@docusaurus/tsconfig": "3.1.1", "@docusaurus/types": "3.1.1", - "@types/react": "^18.2.48", - "prettier": "3.2.4", + "@types/react": "^18.2.55", + "prettier": "3.2.5", "typescript": "~5.3.3" }, "engines": { diff --git a/website/sidebars.js b/website/sidebars.js index 922ae2eae9..b8ce3b663d 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -318,13 +318,14 @@ const docsSidebar = { description: "Release notes for recent authentik versions", }, items: [ + "releases/2024/v2024.2", "releases/2023/v2023.10", "releases/2023/v2023.8", - "releases/2023/v2023.6", { type: "category", label: "Previous versions", items: [ + "releases/2023/v2023.6", "releases/2023/v2023.5", "releases/2023/v2023.4", "releases/2023/v2023.3",