Compare commits
	
		
			178 Commits
		
	
	
		
			safari-loc
			...
			website/in
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b5e0577569 | |||
| 121f2c609d | |||
| 365affc28e | |||
| f367822779 | |||
| 848198125d | |||
| 497ac5e3d0 | |||
| 1773d4d681 | |||
| 4edbb51939 | |||
| c7e97ab48e | |||
| 31f7faae1c | |||
| f5dae2ae92 | |||
| 2c043dba0b | |||
| bda10e5db1 | |||
| be9ae7d4f7 | |||
| b4a6189bfa | |||
| bfdb827ff9 | |||
| 488a58e1c5 | |||
| 3f83e69453 | |||
| e92fa5df0b | |||
| f8c22170df | |||
| e3d08a8434 | |||
| 97d3e9afdc | |||
| 1eb08def73 | |||
| 6e3b379e4a | |||
| 264f59775c | |||
| d048f1ecbd | |||
| eb31f31584 | |||
| fe5c842e92 | |||
| b82d3100c9 | |||
| 49bb668036 | |||
| 52c70c7700 | |||
| b99fd36f86 | |||
| 8a5381eca3 | |||
| 2c77830179 | |||
| ffcd7def60 | |||
| ed121bc2a3 | |||
| d5ab9d9167 | |||
| a983321ad6 | |||
| 9c3420ede4 | |||
| 91b40350aa | |||
| 1912991682 | |||
| 71b9117f53 | |||
| b5f947f460 | |||
| 3a2f7e9549 | |||
| 1582ce0920 | |||
| 6d3eea5266 | |||
| e987208bd1 | |||
| 0efab8eef7 | |||
| 9402dac8ae | |||
| f57a290eee | |||
| 5dab0d2b7a | |||
| 2da6036248 | |||
| cdba94cea4 | |||
| c59eca664a | |||
| d5b205f9c0 | |||
| 8ad9ad833e | |||
| 599ce15f68 | |||
| 91310eff52 | |||
| b522d6732a | |||
| 17d96f204e | |||
| 65e4667bc3 | |||
| f67f9e5ed0 | |||
| 62dd6a4393 | |||
| a46eae8276 | |||
| c4acc9fc24 | |||
| e748a03082 | |||
| e473f28e21 | |||
| f70635c295 | |||
| 70d60c7ab2 | |||
| 61a26c02b7 | |||
| a06645d558 | |||
| 7730ecbd37 | |||
| 80e1be8db7 | |||
| c528c74e48 | |||
| 6d7bf36afe | |||
| 44fb59eb18 | |||
| 8f8d924935 | |||
| 602adaa5c5 | |||
| 5c9e97e11c | |||
| 2e7c620c9c | |||
| 30a2770781 | |||
| ef49fa0e79 | |||
| ac524ef425 | |||
| 6f3c1c4537 | |||
| 87886ca1b6 | |||
| 7ff96e30f9 | |||
| b26271557a | |||
| 15c99ff129 | |||
| 2a38e08e31 | |||
| 3696706466 | |||
| d0c9635033 | |||
| 7731014e1c | |||
| d478582a5c | |||
| 6255f380aa | |||
| 1f02e67c5c | |||
| d0bfb894b4 | |||
| c5dfdc6deb | |||
| d04a66ad9a | |||
| a5edaabec0 | |||
| daa367bc62 | |||
| 78345853c2 | |||
| f0fa8a3226 | |||
| 3335fdc6ad | |||
| 29c2c0f7dc | |||
| ada4254f52 | |||
| 39035de552 | |||
| e76d388ce4 | |||
| a52f887692 | |||
| d8b12a9a07 | |||
| ec01f16e99 | |||
| 9e3aaefc20 | |||
| 4454592442 | |||
| 593c953ecc | |||
| bcefe7123c | |||
| 812cf6c4f2 | |||
| 73b6ef6a73 | |||
| b58ebcddbf | |||
| 8b6ac3c806 | |||
| c6aa792076 | |||
| ee4792734e | |||
| 445f11ca6b | |||
| 8e4810fb20 | |||
| 96a122c5d1 | |||
| 3c6b8b10e5 | |||
| 15999caa5d | |||
| 57d8375de1 | |||
| 07ec787076 | |||
| bc96bef097 | |||
| 28869858b5 | |||
| cbc5a1c39d | |||
| 5f6b69c998 | |||
| cf065db3d5 | |||
| 86c65325ce | |||
| 2b8e10e979 | |||
| 9298807275 | |||
| ed56d6ac50 | |||
| 8c07b385ad | |||
| 880db7a86c | |||
| 99c1250ba5 | |||
| 5ce126ac83 | |||
| dfa21d0725 | |||
| e7e4af3894 | |||
| 931d6ec579 | |||
| ff45acb25c | |||
| c96557ff2d | |||
| 734feac4ae | |||
| b17a9ed145 | |||
| 2bef7695db | |||
| df472dd842 | |||
| 98d201d34c | |||
| 47e89602ab | |||
| ceb0851452 | |||
| cac2593658 | |||
| 1c9705bfaa | |||
| 9e2566cec4 | |||
| 5bdef1c4f6 | |||
| ae41ccd862 | |||
| 337956672f | |||
| cf160f800d | |||
| e9822cd937 | |||
| 5244f64be4 | |||
| 0df4824fd4 | |||
| ea22abc75d | |||
| b09bab7543 | |||
| 5aedc8a5f2 | |||
| 2f3ae0f607 | |||
| e3674426b7 | |||
| df915d3a5e | |||
| 4949c31860 | |||
| 4580dec06b | |||
| 56de969640 | |||
| 413902508d | |||
| 64af0ccba6 | |||
| 673db53777 | |||
| 8df7716d90 | |||
| 19bb2de13f | |||
| a218fd7628 | |||
| 78cfb50a90 | 
@ -1,5 +1,5 @@
 | 
				
			|||||||
[bumpversion]
 | 
					[bumpversion]
 | 
				
			||||||
current_version = 2025.2.4
 | 
					current_version = 2025.4.0
 | 
				
			||||||
tag = True
 | 
					tag = True
 | 
				
			||||||
commit = True
 | 
					commit = True
 | 
				
			||||||
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(?:-(?P<rc_t>[a-zA-Z-]+)(?P<rc_n>[1-9]\\d*))?
 | 
					parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(?:-(?P<rc_t>[a-zA-Z-]+)(?P<rc_n>[1-9]\\d*))?
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							@ -118,3 +118,15 @@ updates:
 | 
				
			|||||||
      prefix: "core:"
 | 
					      prefix: "core:"
 | 
				
			||||||
    labels:
 | 
					    labels:
 | 
				
			||||||
      - dependencies
 | 
					      - dependencies
 | 
				
			||||||
 | 
					  - package-ecosystem: docker-compose
 | 
				
			||||||
 | 
					    directories:
 | 
				
			||||||
 | 
					      # - /scripts # Maybe
 | 
				
			||||||
 | 
					      - /tests/e2e
 | 
				
			||||||
 | 
					    schedule:
 | 
				
			||||||
 | 
					      interval: daily
 | 
				
			||||||
 | 
					      time: "04:00"
 | 
				
			||||||
 | 
					    open-pull-requests-limit: 10
 | 
				
			||||||
 | 
					    commit-message:
 | 
				
			||||||
 | 
					      prefix: "core:"
 | 
				
			||||||
 | 
					    labels:
 | 
				
			||||||
 | 
					      - dependencies
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								.github/workflows/ci-main.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/ci-main.yml
									
									
									
									
										vendored
									
									
								
							@ -70,22 +70,18 @@ jobs:
 | 
				
			|||||||
      - name: checkout stable
 | 
					      - name: checkout stable
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          # Copy current, latest config to local
 | 
					          # Copy current, latest config to local
 | 
				
			||||||
          # Temporarly comment the .github backup while migrating to uv
 | 
					 | 
				
			||||||
          cp authentik/lib/default.yml local.env.yml
 | 
					          cp authentik/lib/default.yml local.env.yml
 | 
				
			||||||
          # cp -R .github ..
 | 
					          cp -R .github ..
 | 
				
			||||||
          cp -R scripts ..
 | 
					          cp -R scripts ..
 | 
				
			||||||
          git checkout $(git tag --sort=version:refname | grep '^version/' | grep -vE -- '-rc[0-9]+$' | tail -n1)
 | 
					          git checkout $(git tag --sort=version:refname | grep '^version/' | grep -vE -- '-rc[0-9]+$' | tail -n1)
 | 
				
			||||||
          # rm -rf .github/ scripts/
 | 
					          rm -rf .github/ scripts/
 | 
				
			||||||
          # mv ../.github ../scripts .
 | 
					          mv ../.github ../scripts .
 | 
				
			||||||
          rm -rf scripts/
 | 
					 | 
				
			||||||
          mv ../scripts .
 | 
					 | 
				
			||||||
      - name: Setup authentik env (stable)
 | 
					      - name: Setup authentik env (stable)
 | 
				
			||||||
        uses: ./.github/actions/setup
 | 
					        uses: ./.github/actions/setup
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          postgresql_version: ${{ matrix.psql }}
 | 
					          postgresql_version: ${{ matrix.psql }}
 | 
				
			||||||
        continue-on-error: true
 | 
					 | 
				
			||||||
      - name: run migrations to stable
 | 
					      - name: run migrations to stable
 | 
				
			||||||
        run: poetry run python -m lifecycle.migrate
 | 
					        run: uv run python -m lifecycle.migrate
 | 
				
			||||||
      - name: checkout current code
 | 
					      - name: checkout current code
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          set -x
 | 
					          set -x
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/ci-outpost.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/ci-outpost.yml
									
									
									
									
										vendored
									
									
								
							@ -29,7 +29,7 @@ jobs:
 | 
				
			|||||||
      - name: Generate API
 | 
					      - name: Generate API
 | 
				
			||||||
        run: make gen-client-go
 | 
					        run: make gen-client-go
 | 
				
			||||||
      - name: golangci-lint
 | 
					      - name: golangci-lint
 | 
				
			||||||
        uses: golangci/golangci-lint-action@v7
 | 
					        uses: golangci/golangci-lint-action@v8
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          version: latest
 | 
					          version: latest
 | 
				
			||||||
          args: --timeout 5000s --verbose
 | 
					          args: --timeout 5000s --verbose
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										8
									
								
								.github/workflows/packages-npm-publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/packages-npm-publish.yml
									
									
									
									
										vendored
									
									
								
							@ -3,10 +3,10 @@ on:
 | 
				
			|||||||
  push:
 | 
					  push:
 | 
				
			||||||
    branches: [main]
 | 
					    branches: [main]
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
      - packages/docusaurus-config
 | 
					      - packages/docusaurus-config/**
 | 
				
			||||||
      - packages/eslint-config
 | 
					      - packages/eslint-config/**
 | 
				
			||||||
      - packages/prettier-config
 | 
					      - packages/prettier-config/**
 | 
				
			||||||
      - packages/tsconfig
 | 
					      - packages/tsconfig/**
 | 
				
			||||||
  workflow_dispatch:
 | 
					  workflow_dispatch:
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  publish:
 | 
					  publish:
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							@ -16,7 +16,7 @@
 | 
				
			|||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "typescript.preferences.importModuleSpecifier": "non-relative",
 | 
					    "typescript.preferences.importModuleSpecifier": "non-relative",
 | 
				
			||||||
    "typescript.preferences.importModuleSpecifierEnding": "index",
 | 
					    "typescript.preferences.importModuleSpecifierEnding": "index",
 | 
				
			||||||
    "typescript.tsdk": "./web/node_modules/typescript/lib",
 | 
					    "typescript.tsdk": "./node_modules/typescript/lib",
 | 
				
			||||||
    "typescript.enablePromptUseWorkspaceTsdk": true,
 | 
					    "typescript.enablePromptUseWorkspaceTsdk": true,
 | 
				
			||||||
    "yaml.schemas": {
 | 
					    "yaml.schemas": {
 | 
				
			||||||
        "./blueprints/schema.json": "blueprints/**/*.yaml"
 | 
					        "./blueprints/schema.json": "blueprints/**/*.yaml"
 | 
				
			||||||
@ -30,7 +30,5 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "go.testFlags": ["-count=1"],
 | 
					    "go.testFlags": ["-count=1"],
 | 
				
			||||||
    "github-actions.workflows.pinned.workflows": [
 | 
					    "github-actions.workflows.pinned.workflows": [".github/workflows/ci-main.yml"]
 | 
				
			||||||
        ".github/workflows/ci-main.yml"
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -85,18 +85,17 @@ FROM --platform=${BUILDPLATFORM} ghcr.io/maxmind/geoipupdate:v7.1.0 AS geoip
 | 
				
			|||||||
ENV GEOIPUPDATE_EDITION_IDS="GeoLite2-City GeoLite2-ASN"
 | 
					ENV GEOIPUPDATE_EDITION_IDS="GeoLite2-City GeoLite2-ASN"
 | 
				
			||||||
ENV GEOIPUPDATE_VERBOSE="1"
 | 
					ENV GEOIPUPDATE_VERBOSE="1"
 | 
				
			||||||
ENV GEOIPUPDATE_ACCOUNT_ID_FILE="/run/secrets/GEOIPUPDATE_ACCOUNT_ID"
 | 
					ENV GEOIPUPDATE_ACCOUNT_ID_FILE="/run/secrets/GEOIPUPDATE_ACCOUNT_ID"
 | 
				
			||||||
ENV GEOIPUPDATE_LICENSE_KEY_FILE="/run/secrets/GEOIPUPDATE_LICENSE_KEY"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
USER root
 | 
					USER root
 | 
				
			||||||
RUN --mount=type=secret,id=GEOIPUPDATE_ACCOUNT_ID \
 | 
					RUN --mount=type=secret,id=GEOIPUPDATE_ACCOUNT_ID \
 | 
				
			||||||
    --mount=type=secret,id=GEOIPUPDATE_LICENSE_KEY \
 | 
					    --mount=type=secret,id=GEOIPUPDATE_LICENSE_KEY \
 | 
				
			||||||
    mkdir -p /usr/share/GeoIP && \
 | 
					    mkdir -p /usr/share/GeoIP && \
 | 
				
			||||||
    /bin/sh -c "/usr/bin/entry.sh || echo 'Failed to get GeoIP database, disabling'; exit 0"
 | 
					    /bin/sh -c "GEOIPUPDATE_LICENSE_KEY_FILE=/run/secrets/GEOIPUPDATE_LICENSE_KEY /usr/bin/entry.sh || echo 'Failed to get GeoIP database, disabling'; exit 0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Stage 5: Download uv
 | 
					# Stage 5: Download uv
 | 
				
			||||||
FROM ghcr.io/astral-sh/uv:0.6.16 AS uv
 | 
					FROM ghcr.io/astral-sh/uv:0.7.2 AS uv
 | 
				
			||||||
# Stage 6: Base python image
 | 
					# Stage 6: Base python image
 | 
				
			||||||
FROM ghcr.io/goauthentik/fips-python:3.12.10-slim-bookworm-fips AS python-base
 | 
					FROM ghcr.io/goauthentik/fips-python:3.13.3-slim-bookworm-fips AS python-base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENV VENV_PATH="/ak-root/.venv" \
 | 
					ENV VENV_PATH="/ak-root/.venv" \
 | 
				
			||||||
    PATH="/lifecycle:/ak-root/.venv/bin:$PATH" \
 | 
					    PATH="/lifecycle:/ak-root/.venv/bin:$PATH" \
 | 
				
			||||||
 | 
				
			|||||||
@ -42,4 +42,4 @@ See [SECURITY.md](SECURITY.md)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Adoption and Contributions
 | 
					## Adoption and Contributions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Your organization uses authentik? We'd love to add your logo to the readme and our website! Email us @ hello@goauthentik.io or open a GitHub Issue/PR! For more information on how to contribute to authentik, please refer to our [CONTRIBUTING.md file](./CONTRIBUTING.md).
 | 
					Your organization uses authentik? We'd love to add your logo to the readme and our website! Email us @ hello@goauthentik.io or open a GitHub Issue/PR! For more information on how to contribute to authentik, please refer to our [contribution guide](https://docs.goauthentik.io/docs/developer-docs?utm_source=github).
 | 
				
			||||||
 | 
				
			|||||||
@ -20,8 +20,8 @@ Even if the issue is not a CVE, we still greatly appreciate your help in hardeni
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
| Version   | Supported |
 | 
					| Version   | Supported |
 | 
				
			||||||
| --------- | --------- |
 | 
					| --------- | --------- |
 | 
				
			||||||
| 2024.12.x | ✅        |
 | 
					 | 
				
			||||||
| 2025.2.x  | ✅        |
 | 
					| 2025.2.x  | ✅        |
 | 
				
			||||||
 | 
					| 2025.4.x  | ✅        |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Reporting a Vulnerability
 | 
					## Reporting a Vulnerability
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from os import environ
 | 
					from os import environ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__version__ = "2025.2.4"
 | 
					__version__ = "2025.4.0"
 | 
				
			||||||
ENV_GIT_HASH_KEY = "GIT_BUILD_HASH"
 | 
					ENV_GIT_HASH_KEY = "GIT_BUILD_HASH"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -54,7 +54,7 @@ def create_component(generator: SchemaGenerator, name, schema, type_=ResolvedCom
 | 
				
			|||||||
    return component
 | 
					    return component
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def postprocess_schema_responses(result, generator: SchemaGenerator, **kwargs):  # noqa: W0613
 | 
					def postprocess_schema_responses(result, generator: SchemaGenerator, **kwargs):
 | 
				
			||||||
    """Workaround to set a default response for endpoints.
 | 
					    """Workaround to set a default response for endpoints.
 | 
				
			||||||
    Workaround suggested at
 | 
					    Workaround suggested at
 | 
				
			||||||
    <https://github.com/tfranzel/drf-spectacular/issues/119#issuecomment-656970357>
 | 
					    <https://github.com/tfranzel/drf-spectacular/issues/119#issuecomment-656970357>
 | 
				
			||||||
 | 
				
			|||||||
@ -164,9 +164,7 @@ class BlueprintEntry:
 | 
				
			|||||||
        """Get the blueprint model, with yaml tags resolved if present"""
 | 
					        """Get the blueprint model, with yaml tags resolved if present"""
 | 
				
			||||||
        return str(self.tag_resolver(self.model, blueprint))
 | 
					        return str(self.tag_resolver(self.model, blueprint))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_permissions(
 | 
					    def get_permissions(self, blueprint: "Blueprint") -> Generator[BlueprintEntryPermission]:
 | 
				
			||||||
        self, blueprint: "Blueprint"
 | 
					 | 
				
			||||||
    ) -> Generator[BlueprintEntryPermission, None, None]:
 | 
					 | 
				
			||||||
        """Get permissions of this entry, with all yaml tags resolved"""
 | 
					        """Get permissions of this entry, with all yaml tags resolved"""
 | 
				
			||||||
        for perm in self.permissions:
 | 
					        for perm in self.permissions:
 | 
				
			||||||
            yield BlueprintEntryPermission(
 | 
					            yield BlueprintEntryPermission(
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,7 @@ def migrate_custom_css(apps: Apps, schema_editor: BaseDatabaseSchemaEditor):
 | 
				
			|||||||
    if not path.exists():
 | 
					    if not path.exists():
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
    css = path.read_text()
 | 
					    css = path.read_text()
 | 
				
			||||||
    Brand.objects.using(db_alias).update(branding_custom_css=css)
 | 
					    Brand.objects.using(db_alias).all().update(branding_custom_css=css)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Migration(migrations.Migration):
 | 
					class Migration(migrations.Migration):
 | 
				
			||||||
 | 
				
			|||||||
@ -57,7 +57,7 @@ class LogEventSerializer(PassiveSerializer):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@contextmanager
 | 
					@contextmanager
 | 
				
			||||||
def capture_logs(log_default_output=True) -> Generator[list[LogEvent], None, None]:
 | 
					def capture_logs(log_default_output=True) -> Generator[list[LogEvent]]:
 | 
				
			||||||
    """Capture log entries created"""
 | 
					    """Capture log entries created"""
 | 
				
			||||||
    logs = []
 | 
					    logs = []
 | 
				
			||||||
    cap = LogCapture()
 | 
					    cap = LogCapture()
 | 
				
			||||||
 | 
				
			|||||||
@ -59,7 +59,7 @@ class PropertyMappingManager:
 | 
				
			|||||||
        request: HttpRequest | None,
 | 
					        request: HttpRequest | None,
 | 
				
			||||||
        return_mapping: bool = False,
 | 
					        return_mapping: bool = False,
 | 
				
			||||||
        **kwargs,
 | 
					        **kwargs,
 | 
				
			||||||
    ) -> Generator[tuple[dict, PropertyMapping], None]:
 | 
					    ) -> Generator[tuple[dict, PropertyMapping]]:
 | 
				
			||||||
        """Iterate over all mappings that were pre-compiled and
 | 
					        """Iterate over all mappings that were pre-compiled and
 | 
				
			||||||
        execute all of them with the given context"""
 | 
					        execute all of them with the given context"""
 | 
				
			||||||
        if not self.__has_compiled:
 | 
					        if not self.__has_compiled:
 | 
				
			||||||
 | 
				
			|||||||
@ -74,6 +74,8 @@ class OutpostConfig:
 | 
				
			|||||||
    kubernetes_ingress_annotations: dict[str, str] = field(default_factory=dict)
 | 
					    kubernetes_ingress_annotations: dict[str, str] = field(default_factory=dict)
 | 
				
			||||||
    kubernetes_ingress_secret_name: str = field(default="authentik-outpost-tls")
 | 
					    kubernetes_ingress_secret_name: str = field(default="authentik-outpost-tls")
 | 
				
			||||||
    kubernetes_ingress_class_name: str | None = field(default=None)
 | 
					    kubernetes_ingress_class_name: str | None = field(default=None)
 | 
				
			||||||
 | 
					    kubernetes_httproute_annotations: dict[str, str] = field(default_factory=dict)
 | 
				
			||||||
 | 
					    kubernetes_httproute_parent_refs: list[dict[str, str]] = field(default_factory=list)
 | 
				
			||||||
    kubernetes_service_type: str = field(default="ClusterIP")
 | 
					    kubernetes_service_type: str = field(default="ClusterIP")
 | 
				
			||||||
    kubernetes_disabled_components: list[str] = field(default_factory=list)
 | 
					    kubernetes_disabled_components: list[str] = field(default_factory=list)
 | 
				
			||||||
    kubernetes_image_pull_secrets: list[str] = field(default_factory=list)
 | 
					    kubernetes_image_pull_secrets: list[str] = field(default_factory=list)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										234
									
								
								authentik/providers/proxy/controllers/k8s/httproute.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								authentik/providers/proxy/controllers/k8s/httproute.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,234 @@
 | 
				
			|||||||
 | 
					from dataclasses import asdict, dataclass, field
 | 
				
			||||||
 | 
					from typing import TYPE_CHECKING
 | 
				
			||||||
 | 
					from urllib.parse import urlparse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from dacite.core import from_dict
 | 
				
			||||||
 | 
					from kubernetes.client import ApiextensionsV1Api, CustomObjectsApi, V1ObjectMeta
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from authentik.outposts.controllers.base import FIELD_MANAGER
 | 
				
			||||||
 | 
					from authentik.outposts.controllers.k8s.base import KubernetesObjectReconciler
 | 
				
			||||||
 | 
					from authentik.outposts.controllers.k8s.triggers import NeedsUpdate
 | 
				
			||||||
 | 
					from authentik.outposts.controllers.kubernetes import KubernetesController
 | 
				
			||||||
 | 
					from authentik.providers.proxy.models import ProxyMode, ProxyProvider
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if TYPE_CHECKING:
 | 
				
			||||||
 | 
					    from authentik.outposts.controllers.kubernetes import KubernetesController
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dataclass(slots=True)
 | 
				
			||||||
 | 
					class RouteBackendRef:
 | 
				
			||||||
 | 
					    name: str
 | 
				
			||||||
 | 
					    port: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dataclass(slots=True)
 | 
				
			||||||
 | 
					class RouteSpecParentRefs:
 | 
				
			||||||
 | 
					    name: str
 | 
				
			||||||
 | 
					    sectionName: str | None = None
 | 
				
			||||||
 | 
					    port: int | None = None
 | 
				
			||||||
 | 
					    namespace: str | None = None
 | 
				
			||||||
 | 
					    kind: str = "Gateway"
 | 
				
			||||||
 | 
					    group: str = "gateway.networking.k8s.io"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dataclass(slots=True)
 | 
				
			||||||
 | 
					class HTTPRouteSpecRuleMatchPath:
 | 
				
			||||||
 | 
					    type: str
 | 
				
			||||||
 | 
					    value: str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dataclass(slots=True)
 | 
				
			||||||
 | 
					class HTTPRouteSpecRuleMatchHeader:
 | 
				
			||||||
 | 
					    name: str
 | 
				
			||||||
 | 
					    value: str
 | 
				
			||||||
 | 
					    type: str = "Exact"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dataclass(slots=True)
 | 
				
			||||||
 | 
					class HTTPRouteSpecRuleMatch:
 | 
				
			||||||
 | 
					    path: HTTPRouteSpecRuleMatchPath
 | 
				
			||||||
 | 
					    headers: list[HTTPRouteSpecRuleMatchHeader]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dataclass(slots=True)
 | 
				
			||||||
 | 
					class HTTPRouteSpecRule:
 | 
				
			||||||
 | 
					    backendRefs: list[RouteBackendRef]
 | 
				
			||||||
 | 
					    matches: list[HTTPRouteSpecRuleMatch]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dataclass(slots=True)
 | 
				
			||||||
 | 
					class HTTPRouteSpec:
 | 
				
			||||||
 | 
					    parentRefs: list[RouteSpecParentRefs]
 | 
				
			||||||
 | 
					    hostnames: list[str]
 | 
				
			||||||
 | 
					    rules: list[HTTPRouteSpecRule]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dataclass(slots=True)
 | 
				
			||||||
 | 
					class HTTPRouteMetadata:
 | 
				
			||||||
 | 
					    name: str
 | 
				
			||||||
 | 
					    namespace: str
 | 
				
			||||||
 | 
					    annotations: dict = field(default_factory=dict)
 | 
				
			||||||
 | 
					    labels: dict = field(default_factory=dict)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dataclass(slots=True)
 | 
				
			||||||
 | 
					class HTTPRoute:
 | 
				
			||||||
 | 
					    apiVersion: str
 | 
				
			||||||
 | 
					    kind: str
 | 
				
			||||||
 | 
					    metadata: HTTPRouteMetadata
 | 
				
			||||||
 | 
					    spec: HTTPRouteSpec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class HTTPRouteReconciler(KubernetesObjectReconciler):
 | 
				
			||||||
 | 
					    """Kubernetes Gateway API HTTPRoute Reconciler"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, controller: "KubernetesController") -> None:
 | 
				
			||||||
 | 
					        super().__init__(controller)
 | 
				
			||||||
 | 
					        self.api_ex = ApiextensionsV1Api(controller.client)
 | 
				
			||||||
 | 
					        self.api = CustomObjectsApi(controller.client)
 | 
				
			||||||
 | 
					        self.crd_group = "gateway.networking.k8s.io"
 | 
				
			||||||
 | 
					        self.crd_version = "v1"
 | 
				
			||||||
 | 
					        self.crd_plural = "httproutes"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def reconciler_name() -> str:
 | 
				
			||||||
 | 
					        return "httproute"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def noop(self) -> bool:
 | 
				
			||||||
 | 
					        if not self.crd_exists():
 | 
				
			||||||
 | 
					            self.logger.debug("CRD doesn't exist")
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					        if not self.controller.outpost.config.kubernetes_httproute_parent_refs:
 | 
				
			||||||
 | 
					            self.logger.debug("HTTPRoute parentRefs not set.")
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					        return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def crd_exists(self) -> bool:
 | 
				
			||||||
 | 
					        """Check if the Gateway API resources exists"""
 | 
				
			||||||
 | 
					        return bool(
 | 
				
			||||||
 | 
					            len(
 | 
				
			||||||
 | 
					                self.api_ex.list_custom_resource_definition(
 | 
				
			||||||
 | 
					                    field_selector=f"metadata.name={self.crd_plural}.{self.crd_group}"
 | 
				
			||||||
 | 
					                ).items
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def reconcile(self, current: HTTPRoute, reference: HTTPRoute):
 | 
				
			||||||
 | 
					        super().reconcile(current, reference)
 | 
				
			||||||
 | 
					        if current.metadata.annotations != reference.metadata.annotations:
 | 
				
			||||||
 | 
					            raise NeedsUpdate()
 | 
				
			||||||
 | 
					        if current.spec.parentRefs != reference.spec.parentRefs:
 | 
				
			||||||
 | 
					            raise NeedsUpdate()
 | 
				
			||||||
 | 
					        if current.spec.hostnames != reference.spec.hostnames:
 | 
				
			||||||
 | 
					            raise NeedsUpdate()
 | 
				
			||||||
 | 
					        if current.spec.rules != reference.spec.rules:
 | 
				
			||||||
 | 
					            raise NeedsUpdate()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_object_meta(self, **kwargs) -> V1ObjectMeta:
 | 
				
			||||||
 | 
					        return super().get_object_meta(
 | 
				
			||||||
 | 
					            **kwargs,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_reference_object(self) -> HTTPRoute:
 | 
				
			||||||
 | 
					        hostnames = []
 | 
				
			||||||
 | 
					        rules = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for proxy_provider in ProxyProvider.objects.filter(outpost__in=[self.controller.outpost]):
 | 
				
			||||||
 | 
					            proxy_provider: ProxyProvider
 | 
				
			||||||
 | 
					            external_host_name = urlparse(proxy_provider.external_host)
 | 
				
			||||||
 | 
					            if proxy_provider.mode in [ProxyMode.FORWARD_SINGLE, ProxyMode.FORWARD_DOMAIN]:
 | 
				
			||||||
 | 
					                rule = HTTPRouteSpecRule(
 | 
				
			||||||
 | 
					                    backendRefs=[RouteBackendRef(name=self.name, port=9000)],
 | 
				
			||||||
 | 
					                    matches=[
 | 
				
			||||||
 | 
					                        HTTPRouteSpecRuleMatch(
 | 
				
			||||||
 | 
					                            headers=[
 | 
				
			||||||
 | 
					                                HTTPRouteSpecRuleMatchHeader(
 | 
				
			||||||
 | 
					                                    name="Host",
 | 
				
			||||||
 | 
					                                    value=external_host_name.hostname,
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
 | 
					                            ],
 | 
				
			||||||
 | 
					                            path=HTTPRouteSpecRuleMatchPath(
 | 
				
			||||||
 | 
					                                type="PathPrefix", value="/outpost.goauthentik.io"
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                rule = HTTPRouteSpecRule(
 | 
				
			||||||
 | 
					                    backendRefs=[RouteBackendRef(name=self.name, port=9000)],
 | 
				
			||||||
 | 
					                    matches=[
 | 
				
			||||||
 | 
					                        HTTPRouteSpecRuleMatch(
 | 
				
			||||||
 | 
					                            headers=[
 | 
				
			||||||
 | 
					                                HTTPRouteSpecRuleMatchHeader(
 | 
				
			||||||
 | 
					                                    name="Host",
 | 
				
			||||||
 | 
					                                    value=external_host_name.hostname,
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
 | 
					                            ],
 | 
				
			||||||
 | 
					                            path=HTTPRouteSpecRuleMatchPath(type="PathPrefix", value="/"),
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            hostnames.append(external_host_name.hostname)
 | 
				
			||||||
 | 
					            rules.append(rule)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return HTTPRoute(
 | 
				
			||||||
 | 
					            apiVersion=f"{self.crd_group}/{self.crd_version}",
 | 
				
			||||||
 | 
					            kind="HTTPRoute",
 | 
				
			||||||
 | 
					            metadata=HTTPRouteMetadata(
 | 
				
			||||||
 | 
					                name=self.name,
 | 
				
			||||||
 | 
					                namespace=self.namespace,
 | 
				
			||||||
 | 
					                annotations=self.controller.outpost.config.kubernetes_httproute_annotations,
 | 
				
			||||||
 | 
					                labels=self.get_object_meta().labels,
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            spec=HTTPRouteSpec(
 | 
				
			||||||
 | 
					                parentRefs=[
 | 
				
			||||||
 | 
					                    from_dict(RouteSpecParentRefs, spec)
 | 
				
			||||||
 | 
					                    for spec in self.controller.outpost.config.kubernetes_httproute_parent_refs
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                hostnames=hostnames,
 | 
				
			||||||
 | 
					                rules=rules,
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def create(self, reference: HTTPRoute):
 | 
				
			||||||
 | 
					        return self.api.create_namespaced_custom_object(
 | 
				
			||||||
 | 
					            group=self.crd_group,
 | 
				
			||||||
 | 
					            version=self.crd_version,
 | 
				
			||||||
 | 
					            plural=self.crd_plural,
 | 
				
			||||||
 | 
					            namespace=self.namespace,
 | 
				
			||||||
 | 
					            body=asdict(reference),
 | 
				
			||||||
 | 
					            field_manager=FIELD_MANAGER,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def delete(self, reference: HTTPRoute):
 | 
				
			||||||
 | 
					        return self.api.delete_namespaced_custom_object(
 | 
				
			||||||
 | 
					            group=self.crd_group,
 | 
				
			||||||
 | 
					            version=self.crd_version,
 | 
				
			||||||
 | 
					            plural=self.crd_plural,
 | 
				
			||||||
 | 
					            namespace=self.namespace,
 | 
				
			||||||
 | 
					            name=self.name,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def retrieve(self) -> HTTPRoute:
 | 
				
			||||||
 | 
					        return from_dict(
 | 
				
			||||||
 | 
					            HTTPRoute,
 | 
				
			||||||
 | 
					            self.api.get_namespaced_custom_object(
 | 
				
			||||||
 | 
					                group=self.crd_group,
 | 
				
			||||||
 | 
					                version=self.crd_version,
 | 
				
			||||||
 | 
					                plural=self.crd_plural,
 | 
				
			||||||
 | 
					                namespace=self.namespace,
 | 
				
			||||||
 | 
					                name=self.name,
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def update(self, current: HTTPRoute, reference: HTTPRoute):
 | 
				
			||||||
 | 
					        return self.api.patch_namespaced_custom_object(
 | 
				
			||||||
 | 
					            group=self.crd_group,
 | 
				
			||||||
 | 
					            version=self.crd_version,
 | 
				
			||||||
 | 
					            plural=self.crd_plural,
 | 
				
			||||||
 | 
					            namespace=self.namespace,
 | 
				
			||||||
 | 
					            name=self.name,
 | 
				
			||||||
 | 
					            body=asdict(reference),
 | 
				
			||||||
 | 
					            field_manager=FIELD_MANAGER,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
@ -3,6 +3,7 @@
 | 
				
			|||||||
from authentik.outposts.controllers.base import DeploymentPort
 | 
					from authentik.outposts.controllers.base import DeploymentPort
 | 
				
			||||||
from authentik.outposts.controllers.kubernetes import KubernetesController
 | 
					from authentik.outposts.controllers.kubernetes import KubernetesController
 | 
				
			||||||
from authentik.outposts.models import KubernetesServiceConnection, Outpost
 | 
					from authentik.outposts.models import KubernetesServiceConnection, Outpost
 | 
				
			||||||
 | 
					from authentik.providers.proxy.controllers.k8s.httproute import HTTPRouteReconciler
 | 
				
			||||||
from authentik.providers.proxy.controllers.k8s.ingress import IngressReconciler
 | 
					from authentik.providers.proxy.controllers.k8s.ingress import IngressReconciler
 | 
				
			||||||
from authentik.providers.proxy.controllers.k8s.traefik import TraefikMiddlewareReconciler
 | 
					from authentik.providers.proxy.controllers.k8s.traefik import TraefikMiddlewareReconciler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -18,8 +19,10 @@ class ProxyKubernetesController(KubernetesController):
 | 
				
			|||||||
            DeploymentPort(9443, "https", "tcp"),
 | 
					            DeploymentPort(9443, "https", "tcp"),
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
        self.reconcilers[IngressReconciler.reconciler_name()] = IngressReconciler
 | 
					        self.reconcilers[IngressReconciler.reconciler_name()] = IngressReconciler
 | 
				
			||||||
 | 
					        self.reconcilers[HTTPRouteReconciler.reconciler_name()] = HTTPRouteReconciler
 | 
				
			||||||
        self.reconcilers[TraefikMiddlewareReconciler.reconciler_name()] = (
 | 
					        self.reconcilers[TraefikMiddlewareReconciler.reconciler_name()] = (
 | 
				
			||||||
            TraefikMiddlewareReconciler
 | 
					            TraefikMiddlewareReconciler
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.reconcile_order.append(IngressReconciler.reconciler_name())
 | 
					        self.reconcile_order.append(IngressReconciler.reconciler_name())
 | 
				
			||||||
 | 
					        self.reconcile_order.append(HTTPRouteReconciler.reconciler_name())
 | 
				
			||||||
        self.reconcile_order.append(TraefikMiddlewareReconciler.reconciler_name())
 | 
					        self.reconcile_order.append(TraefikMiddlewareReconciler.reconciler_name())
 | 
				
			||||||
 | 
				
			|||||||
@ -199,7 +199,7 @@ class SCIMGroupClient(SCIMClient[Group, SCIMProviderGroup, SCIMGroupSchema]):
 | 
				
			|||||||
            chunk_size = len(ops)
 | 
					            chunk_size = len(ops)
 | 
				
			||||||
        if len(ops) < 1:
 | 
					        if len(ops) < 1:
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
        for chunk in batched(ops, chunk_size):
 | 
					        for chunk in batched(ops, chunk_size, strict=False):
 | 
				
			||||||
            req = PatchRequest(Operations=list(chunk))
 | 
					            req = PatchRequest(Operations=list(chunk))
 | 
				
			||||||
            self._request(
 | 
					            self._request(
 | 
				
			||||||
                "PATCH",
 | 
					                "PATCH",
 | 
				
			||||||
 | 
				
			|||||||
@ -99,6 +99,7 @@ class RBACPermissionViewSet(ReadOnlyModelViewSet):
 | 
				
			|||||||
    filterset_class = PermissionFilter
 | 
					    filterset_class = PermissionFilter
 | 
				
			||||||
    permission_classes = [IsAuthenticated]
 | 
					    permission_classes = [IsAuthenticated]
 | 
				
			||||||
    search_fields = [
 | 
					    search_fields = [
 | 
				
			||||||
 | 
					        "name",
 | 
				
			||||||
        "codename",
 | 
					        "codename",
 | 
				
			||||||
        "content_type__model",
 | 
					        "content_type__model",
 | 
				
			||||||
        "content_type__app_label",
 | 
					        "content_type__app_label",
 | 
				
			||||||
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -2,7 +2,7 @@
 | 
				
			|||||||
    "$schema": "http://json-schema.org/draft-07/schema",
 | 
					    "$schema": "http://json-schema.org/draft-07/schema",
 | 
				
			||||||
    "$id": "https://goauthentik.io/blueprints/schema.json",
 | 
					    "$id": "https://goauthentik.io/blueprints/schema.json",
 | 
				
			||||||
    "type": "object",
 | 
					    "type": "object",
 | 
				
			||||||
    "title": "authentik 2025.2.4 Blueprint schema",
 | 
					    "title": "authentik 2025.4.0 Blueprint schema",
 | 
				
			||||||
    "required": [
 | 
					    "required": [
 | 
				
			||||||
        "version",
 | 
					        "version",
 | 
				
			||||||
        "entries"
 | 
					        "entries"
 | 
				
			||||||
 | 
				
			|||||||
@ -31,7 +31,7 @@ services:
 | 
				
			|||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - redis:/data
 | 
					      - redis:/data
 | 
				
			||||||
  server:
 | 
					  server:
 | 
				
			||||||
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.2.4}
 | 
					    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.4.0}
 | 
				
			||||||
    restart: unless-stopped
 | 
					    restart: unless-stopped
 | 
				
			||||||
    command: server
 | 
					    command: server
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
@ -55,7 +55,7 @@ services:
 | 
				
			|||||||
      redis:
 | 
					      redis:
 | 
				
			||||||
        condition: service_healthy
 | 
					        condition: service_healthy
 | 
				
			||||||
  worker:
 | 
					  worker:
 | 
				
			||||||
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.2.4}
 | 
					    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.4.0}
 | 
				
			||||||
    restart: unless-stopped
 | 
					    restart: unless-stopped
 | 
				
			||||||
    command: worker
 | 
					    command: worker
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										14
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								go.mod
									
									
									
									
									
								
							@ -19,18 +19,18 @@ require (
 | 
				
			|||||||
	github.com/jellydator/ttlcache/v3 v3.3.0
 | 
						github.com/jellydator/ttlcache/v3 v3.3.0
 | 
				
			||||||
	github.com/mitchellh/mapstructure v1.5.0
 | 
						github.com/mitchellh/mapstructure v1.5.0
 | 
				
			||||||
	github.com/nmcclain/asn1-ber v0.0.0-20170104154839-2661553a0484
 | 
						github.com/nmcclain/asn1-ber v0.0.0-20170104154839-2661553a0484
 | 
				
			||||||
	github.com/pires/go-proxyproto v0.8.0
 | 
						github.com/pires/go-proxyproto v0.8.1
 | 
				
			||||||
	github.com/prometheus/client_golang v1.22.0
 | 
						github.com/prometheus/client_golang v1.22.0
 | 
				
			||||||
	github.com/redis/go-redis/v9 v9.7.3
 | 
						github.com/redis/go-redis/v9 v9.8.0
 | 
				
			||||||
	github.com/sethvargo/go-envconfig v1.2.0
 | 
						github.com/sethvargo/go-envconfig v1.3.0
 | 
				
			||||||
	github.com/sirupsen/logrus v1.9.3
 | 
						github.com/sirupsen/logrus v1.9.3
 | 
				
			||||||
	github.com/spf13/cobra v1.9.1
 | 
						github.com/spf13/cobra v1.9.1
 | 
				
			||||||
	github.com/stretchr/testify v1.10.0
 | 
						github.com/stretchr/testify v1.10.0
 | 
				
			||||||
	github.com/wwt/guac v1.3.2
 | 
						github.com/wwt/guac v1.3.2
 | 
				
			||||||
	goauthentik.io/api/v3 v3.2025024.9
 | 
						goauthentik.io/api/v3 v3.2025040.1
 | 
				
			||||||
	golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab
 | 
						golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab
 | 
				
			||||||
	golang.org/x/oauth2 v0.29.0
 | 
						golang.org/x/oauth2 v0.30.0
 | 
				
			||||||
	golang.org/x/sync v0.13.0
 | 
						golang.org/x/sync v0.14.0
 | 
				
			||||||
	gopkg.in/yaml.v2 v2.4.0
 | 
						gopkg.in/yaml.v2 v2.4.0
 | 
				
			||||||
	layeh.com/radius v0.0.0-20210819152912-ad72663a72ab
 | 
						layeh.com/radius v0.0.0-20210819152912-ad72663a72ab
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@ -75,7 +75,7 @@ require (
 | 
				
			|||||||
	go.opentelemetry.io/otel/trace v1.24.0 // indirect
 | 
						go.opentelemetry.io/otel/trace v1.24.0 // indirect
 | 
				
			||||||
	golang.org/x/crypto v0.36.0 // indirect
 | 
						golang.org/x/crypto v0.36.0 // indirect
 | 
				
			||||||
	golang.org/x/sys v0.31.0 // indirect
 | 
						golang.org/x/sys v0.31.0 // indirect
 | 
				
			||||||
	golang.org/x/text v0.23.0 // indirect
 | 
						golang.org/x/text v0.24.0 // indirect
 | 
				
			||||||
	google.golang.org/protobuf v1.36.5 // indirect
 | 
						google.golang.org/protobuf v1.36.5 // indirect
 | 
				
			||||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
						gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										32
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								go.sum
									
									
									
									
									
								
							@ -230,8 +230,8 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+
 | 
				
			|||||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 | 
					github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 | 
				
			||||||
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
 | 
					github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
 | 
				
			||||||
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
 | 
					github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
 | 
				
			||||||
github.com/pires/go-proxyproto v0.8.0 h1:5unRmEAPbHXHuLjDg01CxJWf91cw3lKHc/0xzKpXEe0=
 | 
					github.com/pires/go-proxyproto v0.8.1 h1:9KEixbdJfhrbtjpz/ZwCdWDD2Xem0NZ38qMYaASJgp0=
 | 
				
			||||||
github.com/pires/go-proxyproto v0.8.0/go.mod h1:iknsfgnH8EkjrMeMyvfKByp9TiBZCKZM0jx2xmKqnVY=
 | 
					github.com/pires/go-proxyproto v0.8.1/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU=
 | 
				
			||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
					github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
				
			||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
				
			||||||
@ -245,14 +245,14 @@ github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ
 | 
				
			|||||||
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
 | 
					github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
 | 
				
			||||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
 | 
					github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
 | 
				
			||||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
 | 
					github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
 | 
				
			||||||
github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM=
 | 
					github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI=
 | 
				
			||||||
github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA=
 | 
					github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
					github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
 | 
					github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
 | 
					github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
					github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
				
			||||||
github.com/sethvargo/go-envconfig v1.2.0 h1:q3XkOZWkC+G1sMLCrw9oPGTjYexygLOXDmGUit1ti8Q=
 | 
					github.com/sethvargo/go-envconfig v1.3.0 h1:gJs+Fuv8+f05omTpwWIu6KmuseFAXKrIaOZSh8RMt0U=
 | 
				
			||||||
github.com/sethvargo/go-envconfig v1.2.0/go.mod h1:JLd0KFWQYzyENqnEPWWZ49i4vzZo/6nRidxI8YvGiHw=
 | 
					github.com/sethvargo/go-envconfig v1.3.0/go.mod h1:JLd0KFWQYzyENqnEPWWZ49i4vzZo/6nRidxI8YvGiHw=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
					github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
				
			||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
 | 
					github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
 | 
				
			||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 | 
					github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 | 
				
			||||||
@ -290,8 +290,8 @@ go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y
 | 
				
			|||||||
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
 | 
					go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
 | 
				
			||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 | 
					go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 | 
				
			||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 | 
					go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 | 
				
			||||||
goauthentik.io/api/v3 v3.2025024.9 h1:i3tbkyotE32ZpJ729BsPWTuLQUdtZ54Li4aP1amZzsM=
 | 
					goauthentik.io/api/v3 v3.2025040.1 h1:rQEcMNpz84/LPX8LVFteOJuserrd4PnU4k1Iu/wWqhs=
 | 
				
			||||||
goauthentik.io/api/v3 v3.2025024.9/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw=
 | 
					goauthentik.io/api/v3 v3.2025040.1/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-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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
@ -358,16 +358,16 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/
 | 
				
			|||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
 | 
					golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
 | 
				
			||||||
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
 | 
					golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
					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-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-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-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-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.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
				
			||||||
golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98=
 | 
					golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
 | 
				
			||||||
golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
 | 
					golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					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-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
@ -376,8 +376,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
 | 
				
			|||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
 | 
					golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
 | 
				
			||||||
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 | 
					golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
@ -412,8 +412,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			|||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
					golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
				
			||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
					golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
				
			||||||
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
 | 
					golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
 | 
				
			||||||
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
 | 
					golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
 | 
				
			||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
 | 
				
			|||||||
@ -29,4 +29,4 @@ func UserAgent() string {
 | 
				
			|||||||
	return fmt.Sprintf("authentik@%s", FullVersion())
 | 
						return fmt.Sprintf("authentik@%s", FullVersion())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const VERSION = "2025.2.4"
 | 
					const VERSION = "2025.4.0"
 | 
				
			||||||
 | 
				
			|||||||
@ -62,7 +62,8 @@ function prepare_debug {
 | 
				
			|||||||
    export DEBIAN_FRONTEND=noninteractive
 | 
					    export DEBIAN_FRONTEND=noninteractive
 | 
				
			||||||
    apt-get update
 | 
					    apt-get update
 | 
				
			||||||
    apt-get install -y --no-install-recommends krb5-kdc krb5-user krb5-admin-server libkrb5-dev gcc
 | 
					    apt-get install -y --no-install-recommends krb5-kdc krb5-user krb5-admin-server libkrb5-dev gcc
 | 
				
			||||||
    VIRTUAL_ENV=/ak-root/.venv uv sync --frozen
 | 
					    source "${VENV_PATH}/bin/activate"
 | 
				
			||||||
 | 
					    uv sync --active --frozen
 | 
				
			||||||
    touch /unittest.xml
 | 
					    touch /unittest.xml
 | 
				
			||||||
    chown authentik:authentik /unittest.xml
 | 
					    chown authentik:authentik /unittest.xml
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										8
									
								
								lifecycle/aws/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								lifecycle/aws/package-lock.json
									
									
									
										generated
									
									
									
								
							@ -9,7 +9,7 @@
 | 
				
			|||||||
            "version": "0.0.0",
 | 
					            "version": "0.0.0",
 | 
				
			||||||
            "license": "MIT",
 | 
					            "license": "MIT",
 | 
				
			||||||
            "devDependencies": {
 | 
					            "devDependencies": {
 | 
				
			||||||
                "aws-cdk": "^2.1010.0",
 | 
					                "aws-cdk": "^2.1013.0",
 | 
				
			||||||
                "cross-env": "^7.0.3"
 | 
					                "cross-env": "^7.0.3"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
@ -17,9 +17,9 @@
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "node_modules/aws-cdk": {
 | 
					        "node_modules/aws-cdk": {
 | 
				
			||||||
            "version": "2.1010.0",
 | 
					            "version": "2.1013.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1010.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1013.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-kYNzBXVUZoRrTuYxRRA2Loz/Uvay0MqHobg8KPZaWylIbw/meUDgtoATRNt+stOdJ9PHODTjWmlDKI+2/KoF+w==",
 | 
					            "integrity": "sha512-cbq4cOoEIZueMWenGgfI4RujS+AQ9GaMCTlW/3CnvEIhMD8j/tgZx7PTtgMuvwYrRoEeb/wTxgLPgUd5FhsoHA==",
 | 
				
			||||||
            "dev": true,
 | 
					            "dev": true,
 | 
				
			||||||
            "license": "Apache-2.0",
 | 
					            "license": "Apache-2.0",
 | 
				
			||||||
            "bin": {
 | 
					            "bin": {
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@
 | 
				
			|||||||
        "node": ">=20"
 | 
					        "node": ">=20"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "devDependencies": {
 | 
					    "devDependencies": {
 | 
				
			||||||
        "aws-cdk": "^2.1010.0",
 | 
					        "aws-cdk": "^2.1013.0",
 | 
				
			||||||
        "cross-env": "^7.0.3"
 | 
					        "cross-env": "^7.0.3"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,7 @@ Parameters:
 | 
				
			|||||||
    Description: authentik Docker image
 | 
					    Description: authentik Docker image
 | 
				
			||||||
  AuthentikVersion:
 | 
					  AuthentikVersion:
 | 
				
			||||||
    Type: String
 | 
					    Type: String
 | 
				
			||||||
    Default: 2025.2.4
 | 
					    Default: 2025.4.0
 | 
				
			||||||
    Description: authentik Docker image tag
 | 
					    Description: authentik Docker image tag
 | 
				
			||||||
  AuthentikServerCPU:
 | 
					  AuthentikServerCPU:
 | 
				
			||||||
    Type: Number
 | 
					    Type: Number
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ from lifecycle.migrate import BaseMigration
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SQL_STATEMENT = """
 | 
					SQL_STATEMENT = """
 | 
				
			||||||
BEGIN TRANSACTION;
 | 
					BEGIN TRANSACTION;
 | 
				
			||||||
ALTER TABLE authentik_tenants_tenant RENAME TO authentik_brands_brand;
 | 
					ALTER TABLE IF EXISTS authentik_tenants_tenant RENAME TO authentik_brands_brand;
 | 
				
			||||||
UPDATE django_migrations SET app = replace(app, 'authentik_tenants', 'authentik_brands');
 | 
					UPDATE django_migrations SET app = replace(app, 'authentik_tenants', 'authentik_brands');
 | 
				
			||||||
UPDATE django_content_type SET app_label = replace(app_label, 'authentik_tenants', 'authentik_brands');
 | 
					UPDATE django_content_type SET app_label = replace(app_label, 'authentik_tenants', 'authentik_brands');
 | 
				
			||||||
COMMIT;
 | 
					COMMIT;
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -8,7 +8,6 @@
 | 
				
			|||||||
# Jens L. <jens@goauthentik.io>, 2022
 | 
					# Jens L. <jens@goauthentik.io>, 2022
 | 
				
			||||||
# Lars Lehmann <lars@lars-lehmann.net>, 2023
 | 
					# Lars Lehmann <lars@lars-lehmann.net>, 2023
 | 
				
			||||||
# Johannes —/—, 2023
 | 
					# Johannes —/—, 2023
 | 
				
			||||||
# Dominic Wagner <mail@dominic-wagner.de>, 2023
 | 
					 | 
				
			||||||
# fde4f289d99ed356ff5cfdb762dc44aa_a8a971d, 2023
 | 
					# fde4f289d99ed356ff5cfdb762dc44aa_a8a971d, 2023
 | 
				
			||||||
# Christian Foellmann <foellmann@foe-services.de>, 2023
 | 
					# Christian Foellmann <foellmann@foe-services.de>, 2023
 | 
				
			||||||
# kidhab, 2023
 | 
					# kidhab, 2023
 | 
				
			||||||
@ -30,17 +29,18 @@
 | 
				
			|||||||
# Alexander Möbius, 2025
 | 
					# Alexander Möbius, 2025
 | 
				
			||||||
# Jonas, 2025
 | 
					# Jonas, 2025
 | 
				
			||||||
# Niklas Kroese, 2025
 | 
					# Niklas Kroese, 2025
 | 
				
			||||||
# 97cce0ae0cad2a2cc552d3165d04643e_de3d740, 2025
 | 
					 | 
				
			||||||
# datenschmutz, 2025
 | 
					# datenschmutz, 2025
 | 
				
			||||||
 | 
					# 97cce0ae0cad2a2cc552d3165d04643e_de3d740, 2025
 | 
				
			||||||
 | 
					# Dominic Wagner <mail@dominic-wagner.de>, 2025
 | 
				
			||||||
# 
 | 
					# 
 | 
				
			||||||
#, fuzzy
 | 
					#, fuzzy
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-11 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: datenschmutz, 2025\n"
 | 
					"Last-Translator: Dominic Wagner <mail@dominic-wagner.de>, 2025\n"
 | 
				
			||||||
"Language-Team: German (https://app.transifex.com/authentik/teams/119923/de/)\n"
 | 
					"Language-Team: German (https://app.transifex.com/authentik/teams/119923/de/)\n"
 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
@ -214,6 +214,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "Anzeigename"
 | 
					msgstr "Anzeigename"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "Benutzer"
 | 
					msgstr "Benutzer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -402,6 +403,18 @@ msgstr "Eigenschaft"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "Eigenschaften"
 | 
					msgstr "Eigenschaften"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr "Sitzung"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr "Sitzungen"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "Authentifizierte Sitzung"
 | 
					msgstr "Authentifizierte Sitzung"
 | 
				
			||||||
@ -511,6 +524,38 @@ msgstr "Lizenzverwendung"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "Lizenzverwendung Aufzeichnungen"
 | 
					msgstr "Lizenzverwendung Aufzeichnungen"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Zu prüfender Feldschlüssel, die in den Aufforderungsstufen definierten "
 | 
				
			||||||
 | 
					"Feldschlüssel sind verfügbar."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "Passwort nicht im Kontext festgelegt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "Enterprise ist erforderlich, um auf diese Funktion zuzugreifen."
 | 
					msgstr "Enterprise ist erforderlich, um auf diese Funktion zuzugreifen."
 | 
				
			||||||
@ -1303,12 +1348,6 @@ msgstr "Richtlinien Cache Metriken anzeigen"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "Richtlinien Cache Metriken löschen"
 | 
					msgstr "Richtlinien Cache Metriken löschen"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Zu prüfender Feldschlüssel, die in den Aufforderungsstufen definierten "
 | 
					 | 
				
			||||||
"Feldschlüssel sind verfügbar."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr "Wie häufig der Passwort-Hash auf haveibeenpwned vertreten sein darf"
 | 
					msgstr "Wie häufig der Passwort-Hash auf haveibeenpwned vertreten sein darf"
 | 
				
			||||||
@ -1320,10 +1359,6 @@ msgstr ""
 | 
				
			|||||||
"Die Richtlinie wird verweigert, wenn die zxcvbn-Bewertung gleich oder "
 | 
					"Die Richtlinie wird verweigert, wenn die zxcvbn-Bewertung gleich oder "
 | 
				
			||||||
"kleiner diesem Wert ist."
 | 
					"kleiner diesem Wert ist."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "Passwort nicht im Kontext festgelegt"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr "Ungültiges Passwort."
 | 
					msgstr "Ungültiges Passwort."
 | 
				
			||||||
@ -1365,20 +1400,6 @@ msgstr "Reputationswert"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "Reputationswert"
 | 
					msgstr "Reputationswert"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "Erlaubnis verweigert"
 | 
					msgstr "Erlaubnis verweigert"
 | 
				
			||||||
@ -2208,6 +2229,10 @@ msgstr "Rolle"
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr "Rollen"
 | 
					msgstr "Rollen"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "Systemberechtigung"
 | 
					msgstr "Systemberechtigung"
 | 
				
			||||||
@ -2478,6 +2503,22 @@ msgstr "LDAP Quelle Eigenschafts-Zuordnung"
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr "LDAP Quelle Eigenschafts-Zuordnungen"
 | 
					msgstr "LDAP Quelle Eigenschafts-Zuordnungen"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -2487,6 +2528,14 @@ msgstr ""
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "Kein Token empfangen."
 | 
					msgstr "Kein Token empfangen."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "Token-URL anfordern"
 | 
					msgstr "Token-URL anfordern"
 | 
				
			||||||
@ -2528,6 +2577,12 @@ msgstr ""
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "zusätzliche Scopes"
 | 
					msgstr "zusätzliche Scopes"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "Outh Quelle"
 | 
					msgstr "Outh Quelle"
 | 
				
			||||||
@ -3434,6 +3489,12 @@ msgstr ""
 | 
				
			|||||||
"Wenn aktiviert, wird die Phase auch dann erfolgreich abgeschlossen und "
 | 
					"Wenn aktiviert, wird die Phase auch dann erfolgreich abgeschlossen und "
 | 
				
			||||||
"fortgesetzt, wenn falsche Benutzerdaten eingegeben wurden."
 | 
					"fortgesetzt, wenn falsche Benutzerdaten eingegeben wurden."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr "Optionaler Registrierungs-Flow, der unten auf der Seite verlinkt ist."
 | 
					msgstr "Optionaler Registrierungs-Flow, der unten auf der Seite verlinkt ist."
 | 
				
			||||||
@ -3826,6 +3887,14 @@ msgstr ""
 | 
				
			|||||||
"Die Ereignisse werden nach dieser Dauer gelöscht (Format: "
 | 
					"Die Ereignisse werden nach dieser Dauer gelöscht (Format: "
 | 
				
			||||||
"Wochen=3;Tage=2;Stunden=3,Sekunden=2)."
 | 
					"Wochen=3;Tage=2;Stunden=3,Sekunden=2)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -15,7 +15,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-11 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: Jens L. <jens@goauthentik.io>, 2025\n"
 | 
					"Last-Translator: Jens L. <jens@goauthentik.io>, 2025\n"
 | 
				
			||||||
"Language-Team: Spanish (https://app.transifex.com/authentik/teams/119923/es/)\n"
 | 
					"Language-Team: Spanish (https://app.transifex.com/authentik/teams/119923/es/)\n"
 | 
				
			||||||
@ -190,6 +190,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "Nombre para mostrar del usuario."
 | 
					msgstr "Nombre para mostrar del usuario."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "Usuario"
 | 
					msgstr "Usuario"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -378,6 +379,18 @@ msgstr "Asignación de Propiedades"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "Asignaciones de Propiedades"
 | 
					msgstr "Asignaciones de Propiedades"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr "Sesión"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr "Sesiones"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "Sesión autenticada"
 | 
					msgstr "Sesión autenticada"
 | 
				
			||||||
@ -485,6 +498,38 @@ msgstr "Uso de Licencias"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "Registro de Uso de Licencias"
 | 
					msgstr "Registro de Uso de Licencias"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Clave de campo a verificar, las claves de campo definidas en las etapas de "
 | 
				
			||||||
 | 
					"Solicitud están disponibles."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "La contraseña no se ha establecido en contexto"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "Se requiere de Enterprise para acceder esta característica."
 | 
					msgstr "Se requiere de Enterprise para acceder esta característica."
 | 
				
			||||||
@ -1268,12 +1313,6 @@ msgstr "Ver las métricas de caché de la Política"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "Borrar las métricas de caché de la Política"
 | 
					msgstr "Borrar las métricas de caché de la Política"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Clave de campo a verificar, las claves de campo definidas en las etapas de "
 | 
					 | 
				
			||||||
"Solicitud están disponibles."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1287,10 +1326,6 @@ msgstr ""
 | 
				
			|||||||
"Si la puntuación zxcvbn es igual o menor que este valor, la política "
 | 
					"Si la puntuación zxcvbn es igual o menor que este valor, la política "
 | 
				
			||||||
"fallará."
 | 
					"fallará."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "La contraseña no se ha establecido en contexto"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr "Contraseña inválida."
 | 
					msgstr "Contraseña inválida."
 | 
				
			||||||
@ -1332,20 +1367,6 @@ msgstr "Puntuación de Reputacion"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "Puntuaciones de Reputacion"
 | 
					msgstr "Puntuaciones de Reputacion"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "Permiso denegado"
 | 
					msgstr "Permiso denegado"
 | 
				
			||||||
@ -2175,6 +2196,10 @@ msgstr "Rol"
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr "Roles"
 | 
					msgstr "Roles"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "Permiso de sistema"
 | 
					msgstr "Permiso de sistema"
 | 
				
			||||||
@ -2443,6 +2468,22 @@ msgstr "Asignación de Propiedades de Fuente de LDAP"
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr "Asignaciones de Propiedades de Fuente de LDAP"
 | 
					msgstr "Asignaciones de Propiedades de Fuente de LDAP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr "La contraseña no coincide con la complejidad de Active Directory."
 | 
					msgstr "La contraseña no coincide con la complejidad de Active Directory."
 | 
				
			||||||
@ -2451,6 +2492,14 @@ msgstr "La contraseña no coincide con la complejidad de Active Directory."
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "No se recibió ningún token."
 | 
					msgstr "No se recibió ningún token."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "Solicitar URL de token"
 | 
					msgstr "Solicitar URL de token"
 | 
				
			||||||
@ -2491,6 +2540,12 @@ msgstr "URL utilizada por authentik para obtener información del usuario."
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "Alcances Adicionales"
 | 
					msgstr "Alcances Adicionales"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "Fuente de OAuth"
 | 
					msgstr "Fuente de OAuth"
 | 
				
			||||||
@ -3407,6 +3462,12 @@ msgstr ""
 | 
				
			|||||||
"Cuando está habilitado, la etapa tendrá éxito y continuará incluso cuando se"
 | 
					"Cuando está habilitado, la etapa tendrá éxito y continuará incluso cuando se"
 | 
				
			||||||
" ingrese información de usuario incorrecta."
 | 
					" ingrese información de usuario incorrecta."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -3794,6 +3855,14 @@ msgstr ""
 | 
				
			|||||||
"Los Eventos serán eliminados después de este periodo. (Formato: "
 | 
					"Los Eventos serán eliminados después de este periodo. (Formato: "
 | 
				
			||||||
"weeks=3;days=2;hours=3,seconds=2)."
 | 
					"weeks=3;days=2;hours=3,seconds=2)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -15,7 +15,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-11 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: Ville Ranki, 2025\n"
 | 
					"Last-Translator: Ville Ranki, 2025\n"
 | 
				
			||||||
"Language-Team: Finnish (https://app.transifex.com/authentik/teams/119923/fi/)\n"
 | 
					"Language-Team: Finnish (https://app.transifex.com/authentik/teams/119923/fi/)\n"
 | 
				
			||||||
@ -186,6 +186,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "Käyttäjän näytettävä nimi"
 | 
					msgstr "Käyttäjän näytettävä nimi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "Käyttäjä"
 | 
					msgstr "Käyttäjä"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -371,6 +372,18 @@ msgstr "Ominaisuuskytkentä"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "Ominaisuuskytkennät"
 | 
					msgstr "Ominaisuuskytkennät"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr "Istunto"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "Autentikoitu istunto"
 | 
					msgstr "Autentikoitu istunto"
 | 
				
			||||||
@ -478,6 +491,38 @@ msgstr "Lisenssin käyttö"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "Lisenssin käyttötiedot"
 | 
					msgstr "Lisenssin käyttötiedot"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Kentän avain, joka tarkistetaan. Kysymysvaiheissa määritellyt kenttien "
 | 
				
			||||||
 | 
					"avaimet ovat käytettävissä."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "Salasanaa ei ole asetettu kontekstissa"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "Tämän ominaisuuden käyttöön tarvitaan Enterprise-versiota."
 | 
					msgstr "Tämän ominaisuuden käyttöön tarvitaan Enterprise-versiota."
 | 
				
			||||||
@ -1251,12 +1296,6 @@ msgstr "Näytä käytäntövälimuistitilastot"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "Tyhjennä käytäntövälimuistitilastot"
 | 
					msgstr "Tyhjennä käytäntövälimuistitilastot"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Kentän avain, joka tarkistetaan. Kysymysvaiheissa määritellyt kenttien "
 | 
					 | 
				
			||||||
"avaimet ovat käytettävissä."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1269,10 +1308,6 @@ msgstr ""
 | 
				
			|||||||
"Jos zxcvbn-pistemäärä on tämä arvo tai pienempi, käytännön suorittaminen "
 | 
					"Jos zxcvbn-pistemäärä on tämä arvo tai pienempi, käytännön suorittaminen "
 | 
				
			||||||
"epäonnistuu."
 | 
					"epäonnistuu."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "Salasanaa ei ole asetettu kontekstissa"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr "Virheellinen salasana."
 | 
					msgstr "Virheellinen salasana."
 | 
				
			||||||
@ -1314,20 +1349,6 @@ msgstr "Mainepistemäärä"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "Mainepistemäärät"
 | 
					msgstr "Mainepistemäärät"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "Käyttö evätty"
 | 
					msgstr "Käyttö evätty"
 | 
				
			||||||
@ -2155,6 +2176,10 @@ msgstr "Rooli"
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr "Roolit"
 | 
					msgstr "Roolit"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "Järjestelmän käyttöoikeus"
 | 
					msgstr "Järjestelmän käyttöoikeus"
 | 
				
			||||||
@ -2420,6 +2445,22 @@ msgstr "LDAP-lähteen ominaisuuskytkentä"
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr "LDAP-lähteen ominaisuuskytkennät"
 | 
					msgstr "LDAP-lähteen ominaisuuskytkennät"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr "Salasana ei vastaa Active Directoryn monimutkaisuusmääritystä."
 | 
					msgstr "Salasana ei vastaa Active Directoryn monimutkaisuusmääritystä."
 | 
				
			||||||
@ -2428,6 +2469,14 @@ msgstr "Salasana ei vastaa Active Directoryn monimutkaisuusmääritystä."
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "Tunnistetta ei saatu."
 | 
					msgstr "Tunnistetta ei saatu."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "Pyyntötunnisteen URL"
 | 
					msgstr "Pyyntötunnisteen URL"
 | 
				
			||||||
@ -2468,6 +2517,12 @@ msgstr "URL, jota authentik käyttää käyttäjätiedon hakemiseksi."
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "Lisäkäyttöalueet"
 | 
					msgstr "Lisäkäyttöalueet"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "OAuth-lähde"
 | 
					msgstr "OAuth-lähde"
 | 
				
			||||||
@ -3377,6 +3432,12 @@ msgstr ""
 | 
				
			|||||||
"Kun tämä on käytössä, vaihe onnistuu ja suoritus jatkuu, vaikka olisi "
 | 
					"Kun tämä on käytössä, vaihe onnistuu ja suoritus jatkuu, vaikka olisi "
 | 
				
			||||||
"syötetty virheelliset käyttäjätiedot."
 | 
					"syötetty virheelliset käyttäjätiedot."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -3754,6 +3815,14 @@ msgstr ""
 | 
				
			|||||||
"Tapahtumat poistetaan tämän ajan jälkeen. (Muoto: "
 | 
					"Tapahtumat poistetaan tämän ajan jälkeen. (Muoto: "
 | 
				
			||||||
"weeks=3;days=2;hours=3;seconds=2)."
 | 
					"weeks=3;days=2;hours=3;seconds=2)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -9,8 +9,8 @@
 | 
				
			|||||||
# Kyllian Delaye-Maillot, 2023
 | 
					# Kyllian Delaye-Maillot, 2023
 | 
				
			||||||
# Manuel Viens, 2023
 | 
					# Manuel Viens, 2023
 | 
				
			||||||
# Mordecai, 2023
 | 
					# Mordecai, 2023
 | 
				
			||||||
 | 
					# Tina, 2024
 | 
				
			||||||
# Charles Leclerc, 2025
 | 
					# Charles Leclerc, 2025
 | 
				
			||||||
# Tina, 2025
 | 
					 | 
				
			||||||
# nerdinator <florian.dupret@gmail.com>, 2025
 | 
					# nerdinator <florian.dupret@gmail.com>, 2025
 | 
				
			||||||
# Marc Schmitt, 2025
 | 
					# Marc Schmitt, 2025
 | 
				
			||||||
# 
 | 
					# 
 | 
				
			||||||
@ -19,7 +19,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-17 00:09+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: Marc Schmitt, 2025\n"
 | 
					"Last-Translator: Marc Schmitt, 2025\n"
 | 
				
			||||||
"Language-Team: French (https://app.transifex.com/authentik/teams/119923/fr/)\n"
 | 
					"Language-Team: French (https://app.transifex.com/authentik/teams/119923/fr/)\n"
 | 
				
			||||||
@ -502,6 +502,38 @@ msgstr "Utilisation de la licence"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "Registre d'utilisation de la licence"
 | 
					msgstr "Registre d'utilisation de la licence"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: 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/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr "Nombre de mots de passe à vérifier."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "Mot de passe non défini dans le contexte"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr "Ce mot de passe a déjà été utilisé. Veuillez en choisir un autre."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr "Politique d'unicité des mots de passe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr "Politiques d'unicité des mots de passe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr "Historique des mots de passe utilisateur"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "Entreprise est requis pour accéder à cette fonctionnalité."
 | 
					msgstr "Entreprise est requis pour accéder à cette fonctionnalité."
 | 
				
			||||||
@ -1296,12 +1328,6 @@ msgstr "Voir les métriques de cache de la politique"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "Nettoyer les métriques de cache de la politique"
 | 
					msgstr "Nettoyer les métriques de cache de la politique"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: 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
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1315,10 +1341,6 @@ msgstr ""
 | 
				
			|||||||
"Si le score zxcvbn est égal ou inférieur à cette valeur, la politique "
 | 
					"Si le score zxcvbn est égal ou inférieur à cette valeur, la politique "
 | 
				
			||||||
"échouera."
 | 
					"échouera."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: 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
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr "Mot de passe invalide."
 | 
					msgstr "Mot de passe invalide."
 | 
				
			||||||
@ -1360,22 +1382,6 @@ msgstr "Score de Réputation"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "Scores de Réputation"
 | 
					msgstr "Scores de Réputation"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr "En attente de l'authentification..."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Vous êtes déjà en cours d'authentification dans un autre onglet. Cette page "
 | 
					 | 
				
			||||||
"se rafraîchira lorsque l'authentification sera terminée."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr "S'authentifier dans cet onglet"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "Permission refusée"
 | 
					msgstr "Permission refusée"
 | 
				
			||||||
@ -3485,6 +3491,15 @@ msgstr ""
 | 
				
			|||||||
"Lorsqu'activé, l'étape réussira et continuera même lorsque les informations "
 | 
					"Lorsqu'activé, l'étape réussira et continuera même lorsque les informations "
 | 
				
			||||||
"utilisateurs entrées sont invalides."
 | 
					"utilisateurs entrées sont invalides."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Afficher à l'utilisateur l'option \"Se souvenir de moi sur cet appareil\", "
 | 
				
			||||||
 | 
					"afin de permettre aux utilisateurs réguliers de passer directement à la "
 | 
				
			||||||
 | 
					"saisie de leur mot de passe."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					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."
 | 
					msgstr "Flux d'inscription facultatif, qui sera accessible en bas de page."
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -20,7 +20,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-11 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: Kowalski Dragon (kowalski7cc) <kowalski.7cc@gmail.com>, 2025\n"
 | 
					"Last-Translator: Kowalski Dragon (kowalski7cc) <kowalski.7cc@gmail.com>, 2025\n"
 | 
				
			||||||
"Language-Team: Italian (https://app.transifex.com/authentik/teams/119923/it/)\n"
 | 
					"Language-Team: Italian (https://app.transifex.com/authentik/teams/119923/it/)\n"
 | 
				
			||||||
@ -194,6 +194,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "Nome visualizzato dell'utente."
 | 
					msgstr "Nome visualizzato dell'utente."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "Utente"
 | 
					msgstr "Utente"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -380,6 +381,18 @@ msgstr "Mappatura della proprietà"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "Mappatura delle proprietà"
 | 
					msgstr "Mappatura delle proprietà"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr "dati sessione"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr "Sessione"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr "Sessioni"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "Sessione Autenticata"
 | 
					msgstr "Sessione Autenticata"
 | 
				
			||||||
@ -487,6 +500,39 @@ msgstr "Utilizzo della licenza"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "Registri sull'utilizzo della licenza"
 | 
					msgstr "Registri sull'utilizzo della licenza"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Chiave di campo da verificare, sono disponibili le chiavi di campo definite "
 | 
				
			||||||
 | 
					"nelle fasi Richiesta."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr "Numero di password da verificare."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "Password non impostata nel contesto"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Questa password è già stata utilizzata in precedenza. Scegline una diversa."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr "Politica di unicità della password"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr "Criteri di unicità delle password"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr "Cronologia password utente"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "Versione Enterprise richiesta per accedere a questa funzione"
 | 
					msgstr "Versione Enterprise richiesta per accedere a questa funzione"
 | 
				
			||||||
@ -1274,12 +1320,6 @@ msgstr "Visualizza le metriche della cache della Policy"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "Cancellare le metriche della cache della Policy"
 | 
					msgstr "Cancellare le metriche della cache della Policy"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Chiave di campo da verificare, sono disponibili le chiavi di campo definite "
 | 
					 | 
				
			||||||
"nelle fasi Richiesta."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1292,10 +1332,6 @@ msgstr ""
 | 
				
			|||||||
"Se il punteggio zxcvbn è inferiore o uguale a questo valore, il criterio non"
 | 
					"Se il punteggio zxcvbn è inferiore o uguale a questo valore, il criterio non"
 | 
				
			||||||
" verrà soddisfatto."
 | 
					" verrà soddisfatto."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "Password non impostata nel contesto"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr "Password invalida."
 | 
					msgstr "Password invalida."
 | 
				
			||||||
@ -1337,22 +1373,6 @@ msgstr "Punteggio di reputazione"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "Punteggi di reputazione"
 | 
					msgstr "Punteggi di reputazione"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr "In attesa di autenticazione..."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Ti stai già autenticando in un'altra scheda. Questa pagina si aggiornerà una"
 | 
					 | 
				
			||||||
" volta completata l'autenticazione."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr "Autenticati in questa scheda"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "Permesso negato"
 | 
					msgstr "Permesso negato"
 | 
				
			||||||
@ -2182,6 +2202,10 @@ msgstr "Ruolo"
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr "Ruoli"
 | 
					msgstr "Ruoli"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr "Permessi Iniziali"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "Autorizzazione di sistema"
 | 
					msgstr "Autorizzazione di sistema"
 | 
				
			||||||
@ -2435,6 +2459,9 @@ msgid ""
 | 
				
			|||||||
"attribute. This allows nested group resolution on systems like FreeIPA and "
 | 
					"attribute. This allows nested group resolution on systems like FreeIPA and "
 | 
				
			||||||
"Active Directory"
 | 
					"Active Directory"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Cerca l'appartenenza al gruppo in base a un attributo utente anziché a un "
 | 
				
			||||||
 | 
					"attributo di gruppo. Questo consente la risoluzione di gruppi nidificati su "
 | 
				
			||||||
 | 
					"sistemi come FreeIPA e Active Directory."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/models.py
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
msgid "LDAP Source"
 | 
					msgid "LDAP Source"
 | 
				
			||||||
@ -2452,6 +2479,22 @@ msgstr "Mappatura delle proprietà sorgente LDAP"
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr "Mappature delle proprietà della sorgente LDAP"
 | 
					msgstr "Mappature delle proprietà della sorgente LDAP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr "Connessione Sorgente LDAP Utente"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr "Connessioni Sorgente LDAP Utente"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr "Connessione Sorgente LDAP Gruppo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr "Connessioni Sorgente LDAP Gruppo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr "La password non soddisfa la complessità Active Directory."
 | 
					msgstr "La password non soddisfa la complessità Active Directory."
 | 
				
			||||||
@ -2460,6 +2503,14 @@ msgstr "La password non soddisfa la complessità Active Directory."
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "Nessun token ricevuto."
 | 
					msgstr "Nessun token ricevuto."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr "Includi il client ID e il segreto come parametri di richiesta"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "URL di Richiesta Token"
 | 
					msgstr "URL di Richiesta Token"
 | 
				
			||||||
@ -2500,6 +2551,14 @@ msgstr "URL utilizzato da authentik per ottenere le informazioni dell'utente."
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "Ambiti aggiuntivi"
 | 
					msgstr "Ambiti aggiuntivi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Come eseguire l'autenticazione durante un flusso di richiesta del token "
 | 
				
			||||||
 | 
					"authorization_code"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "Sorgente OAuth"
 | 
					msgstr "Sorgente OAuth"
 | 
				
			||||||
@ -3426,6 +3485,15 @@ msgstr ""
 | 
				
			|||||||
"Quando abilitato, la fase avrà successo e continuerà anche quando vengono "
 | 
					"Quando abilitato, la fase avrà successo e continuerà anche quando vengono "
 | 
				
			||||||
"inserite informazioni utente errate."
 | 
					"inserite informazioni utente errate."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Mostra all'utente il pulsante \"Ricordami su questo dispositivo\", "
 | 
				
			||||||
 | 
					"consentendo agli utenti abituali di passare direttamente all'inserimento "
 | 
				
			||||||
 | 
					"della password."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr "Flusso di iscrizione opzionale, che è collegato in fondo alla pagina."
 | 
					msgstr "Flusso di iscrizione opzionale, che è collegato in fondo alla pagina."
 | 
				
			||||||
@ -3812,6 +3880,14 @@ msgstr ""
 | 
				
			|||||||
"Gli eventi saranno cancellati dopo questa durata. (Formato: "
 | 
					"Gli eventi saranno cancellati dopo questa durata. (Formato: "
 | 
				
			||||||
"weeks=3;days=2;hours=3,seconds=2)."
 | 
					"weeks=3;days=2;hours=3,seconds=2)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr "La reputazione non può scendere sotto questo valore. Zero o negativo."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr "La reputazione non può superare questo valore. Zero o positivo."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -12,7 +12,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-03-31 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: NavyStack, 2023\n"
 | 
					"Last-Translator: NavyStack, 2023\n"
 | 
				
			||||||
"Language-Team: Korean (https://app.transifex.com/authentik/teams/119923/ko/)\n"
 | 
					"Language-Team: Korean (https://app.transifex.com/authentik/teams/119923/ko/)\n"
 | 
				
			||||||
@ -176,6 +176,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "사용자의 표시 이름"
 | 
					msgstr "사용자의 표시 이름"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "사용자"
 | 
					msgstr "사용자"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -344,6 +345,18 @@ msgstr "속성 매핑"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "속성 매핑"
 | 
					msgstr "속성 매핑"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "인증된 세션"
 | 
					msgstr "인증된 세션"
 | 
				
			||||||
@ -447,6 +460,36 @@ msgstr "라이선스 사용"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "라이선스 사용 기록"
 | 
					msgstr "라이선스 사용 기록"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr "확인하려는 필드 키, 프롬프트 스테이지에서 정의된 필드 키를 사용할 수 있습니다."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "비밀번호가 컨텍스트에 설정되지 않음"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1182,10 +1225,6 @@ msgstr "정책의 캐시 메트릭 보기"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "정책의 캐시 메트릭 삭제"
 | 
					msgstr "정책의 캐시 메트릭 삭제"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr "확인하려는 필드 키, 프롬프트 스테이지에서 정의된 필드 키를 사용할 수 있습니다."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr "비밀번호 해시가 허용되는 해시 횟수"
 | 
					msgstr "비밀번호 해시가 허용되는 해시 횟수"
 | 
				
			||||||
@ -1195,10 +1234,6 @@ msgid ""
 | 
				
			|||||||
"If the zxcvbn score is equal or less than this value, the policy will fail."
 | 
					"If the zxcvbn score is equal or less than this value, the policy will fail."
 | 
				
			||||||
msgstr "만약 zxcvbn 점수가 이 값과 같거나 이 값보다 작다면, 정책이 실패합니다."
 | 
					msgstr "만약 zxcvbn 점수가 이 값과 같거나 이 값보다 작다면, 정책이 실패합니다."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "비밀번호가 컨텍스트에 설정되지 않음"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1240,20 +1275,6 @@ msgstr "평판 점수"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "평판 점수"
 | 
					msgstr "평판 점수"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "권한 거부됨"
 | 
					msgstr "권한 거부됨"
 | 
				
			||||||
@ -2013,6 +2034,10 @@ msgstr "역할"
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr "역할"
 | 
					msgstr "역할"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "시스템 권한"
 | 
					msgstr "시스템 권한"
 | 
				
			||||||
@ -2231,6 +2256,13 @@ msgid ""
 | 
				
			|||||||
"enabled on a single LDAP source."
 | 
					"enabled on a single LDAP source."
 | 
				
			||||||
msgstr "사용자가 비밀번호를 변경하면 LDAP로 다시 동기화합니다. 이 기능은 단일의 LDAP 소스에서만 활성화할 수 있습니다."
 | 
					msgstr "사용자가 비밀번호를 변경하면 LDAP로 다시 동기화합니다. 이 기능은 단일의 LDAP 소스에서만 활성화할 수 있습니다."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Lookup group membership based on a user attribute instead of a group "
 | 
				
			||||||
 | 
					"attribute. This allows nested group resolution on systems like FreeIPA and "
 | 
				
			||||||
 | 
					"Active Directory"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/models.py
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
msgid "LDAP Source"
 | 
					msgid "LDAP Source"
 | 
				
			||||||
msgstr "LDAP 소스"
 | 
					msgstr "LDAP 소스"
 | 
				
			||||||
@ -2247,6 +2279,22 @@ msgstr ""
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr "비밀번호가 Active Directory 복잡도와 일치하지 않습니다."
 | 
					msgstr "비밀번호가 Active Directory 복잡도와 일치하지 않습니다."
 | 
				
			||||||
@ -2255,6 +2303,14 @@ msgstr "비밀번호가 Active Directory 복잡도와 일치하지 않습니다.
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "수신된 토큰이 없습니다."
 | 
					msgstr "수신된 토큰이 없습니다."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "토큰 요청 URL"
 | 
					msgstr "토큰 요청 URL"
 | 
				
			||||||
@ -2293,6 +2349,12 @@ msgstr "사용자 정보를 가져오기 위해 authentik에서 사용하는 URL
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "추가 스코프"
 | 
					msgstr "추가 스코프"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "OAuth 소스"
 | 
					msgstr "OAuth 소스"
 | 
				
			||||||
@ -3149,6 +3211,12 @@ msgid ""
 | 
				
			|||||||
"info is entered."
 | 
					"info is entered."
 | 
				
			||||||
msgstr "활성화되면 잘못된 사용자 정보가 입력되더라도 단계가 성공하고 계속됩니다."
 | 
					msgstr "활성화되면 잘못된 사용자 정보가 입력되더라도 단계가 성공하고 계속됩니다."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr "페이지 하단에 링크된,  선택적 등록 플로우를 참조하세요."
 | 
					msgstr "페이지 하단에 링크된,  선택적 등록 플로우를 참조하세요."
 | 
				
			||||||
@ -3500,6 +3568,14 @@ msgid ""
 | 
				
			|||||||
"weeks=3;days=2;hours=3,seconds=2)."
 | 
					"weeks=3;days=2;hours=3,seconds=2)."
 | 
				
			||||||
msgstr "이 기간이 지나면 이벤트가 삭제됩니다. (서식: hours=-1;minutes=-2;seconds=-3)"
 | 
					msgstr "이 기간이 지나면 이벤트가 삭제됩니다. (서식: hours=-1;minutes=-2;seconds=-3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -7,18 +7,18 @@
 | 
				
			|||||||
# Bartosz Karpiński, 2023
 | 
					# Bartosz Karpiński, 2023
 | 
				
			||||||
# Michał Jastrzębski, 2024
 | 
					# Michał Jastrzębski, 2024
 | 
				
			||||||
# Tomci 12 <drizztes@gmail.com>, 2024
 | 
					# Tomci 12 <drizztes@gmail.com>, 2024
 | 
				
			||||||
 | 
					# Darek “NeroPcStation” NeroPcStation <dareknowacki2001@gmail.com>, 2024
 | 
				
			||||||
# Marc Schmitt, 2025
 | 
					# Marc Schmitt, 2025
 | 
				
			||||||
# Jens L. <jens@goauthentik.io>, 2025
 | 
					# Jens L. <jens@goauthentik.io>, 2025
 | 
				
			||||||
# Darek “NeroPcStation” NeroPcStation <dareknowacki2001@gmail.com>, 2025
 | 
					 | 
				
			||||||
# 
 | 
					# 
 | 
				
			||||||
#, fuzzy
 | 
					#, fuzzy
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-11 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: Darek “NeroPcStation” NeroPcStation <dareknowacki2001@gmail.com>, 2025\n"
 | 
					"Last-Translator: Jens L. <jens@goauthentik.io>, 2025\n"
 | 
				
			||||||
"Language-Team: Polish (https://app.transifex.com/authentik/teams/119923/pl/)\n"
 | 
					"Language-Team: Polish (https://app.transifex.com/authentik/teams/119923/pl/)\n"
 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
@ -189,6 +189,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "Wyświetlana nazwa użytkownika."
 | 
					msgstr "Wyświetlana nazwa użytkownika."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "Użytkownik"
 | 
					msgstr "Użytkownik"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -371,6 +372,18 @@ msgstr "Mapowanie właściwości"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "Mapowanie właściwości"
 | 
					msgstr "Mapowanie właściwości"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr "Sesja"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr "Sesje"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "Sesja uwierzytelniona"
 | 
					msgstr "Sesja uwierzytelniona"
 | 
				
			||||||
@ -479,6 +492,38 @@ msgstr "Wykorzystanie licencji"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "Rejestr wykorzystania licencji"
 | 
					msgstr "Rejestr wykorzystania licencji"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Klucz pola do sprawdzenia, dostępne są klucze pola zdefiniowane w etapach "
 | 
				
			||||||
 | 
					"monitu."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "Hasło nie jest ustawione w kontekście"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "Wymagane jest konto Enterprise, aby uzyskać dostęp do tej funkcji."
 | 
					msgstr "Wymagane jest konto Enterprise, aby uzyskać dostęp do tej funkcji."
 | 
				
			||||||
@ -1257,12 +1302,6 @@ msgstr "Wyświetl metryki pamięci podręcznej Zasady"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "Wyczyść metryki pamięci podręcznej Zasady"
 | 
					msgstr "Wyczyść metryki pamięci podręcznej Zasady"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Klucz pola do sprawdzenia, dostępne są klucze pola zdefiniowane w etapach "
 | 
					 | 
				
			||||||
"monitu."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr "Ile razy skrót hasła może być na haveibeenpwned"
 | 
					msgstr "Ile razy skrót hasła może być na haveibeenpwned"
 | 
				
			||||||
@ -1274,10 +1313,6 @@ msgstr ""
 | 
				
			|||||||
"Jeśli wynik zxcvbn jest równy lub mniejszy od tej wartości, zasada zakończy "
 | 
					"Jeśli wynik zxcvbn jest równy lub mniejszy od tej wartości, zasada zakończy "
 | 
				
			||||||
"się niepowodzeniem."
 | 
					"się niepowodzeniem."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "Hasło nie jest ustawione w kontekście"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1319,20 +1354,6 @@ msgstr "Punkty reputacji"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "Punkty reputacji"
 | 
					msgstr "Punkty reputacji"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr "Oczekiwanie na uwierzytelnienie..."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "Odmowa uprawnień"
 | 
					msgstr "Odmowa uprawnień"
 | 
				
			||||||
@ -2141,6 +2162,10 @@ msgstr "Rola"
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr "Role"
 | 
					msgstr "Role"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "Uprawnienie systemowe"
 | 
					msgstr "Uprawnienie systemowe"
 | 
				
			||||||
@ -2390,6 +2415,22 @@ msgstr ""
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr "Hasło nie pasuje do złożoności usługi Active Directory."
 | 
					msgstr "Hasło nie pasuje do złożoności usługi Active Directory."
 | 
				
			||||||
@ -2398,6 +2439,14 @@ msgstr "Hasło nie pasuje do złożoności usługi Active Directory."
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "Nie otrzymano tokena."
 | 
					msgstr "Nie otrzymano tokena."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "URL żądania tokena"
 | 
					msgstr "URL żądania tokena"
 | 
				
			||||||
@ -2440,6 +2489,12 @@ msgstr "URL używany przez authentik do uzyskania informacji o użytkowniku."
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "Dodatkowe zakresy"
 | 
					msgstr "Dodatkowe zakresy"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "Źródło OAuth"
 | 
					msgstr "Źródło OAuth"
 | 
				
			||||||
@ -3344,6 +3399,12 @@ msgstr ""
 | 
				
			|||||||
"Po włączeniu tej opcji etap zakończy się powodzeniem i będzie kontynuowany "
 | 
					"Po włączeniu tej opcji etap zakończy się powodzeniem i będzie kontynuowany "
 | 
				
			||||||
"nawet po wprowadzeniu nieprawidłowych danych użytkownika."
 | 
					"nawet po wprowadzeniu nieprawidłowych danych użytkownika."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -3727,6 +3788,14 @@ msgstr ""
 | 
				
			|||||||
"Zdarzenia zostaną usunięte po upływie tego czasu. (Format: "
 | 
					"Zdarzenia zostaną usunięte po upływie tego czasu. (Format: "
 | 
				
			||||||
"weeks=3;days=2;hours=3,seconds=2)."
 | 
					"weeks=3;days=2;hours=3,seconds=2)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr "Opcja ta konfiguruje łącza stopki na stronach wykonawców przepływu."
 | 
					msgstr "Opcja ta konfiguruje łącza stopki na stronach wykonawców przepływu."
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								locale/pt/LC_MESSAGES/django.mo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								locale/pt/LC_MESSAGES/django.mo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										3924
									
								
								locale/pt/LC_MESSAGES/django.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3924
									
								
								locale/pt/LC_MESSAGES/django.po
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -18,7 +18,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-11 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: Gil Poiares-Oliveira, 2025\n"
 | 
					"Last-Translator: Gil Poiares-Oliveira, 2025\n"
 | 
				
			||||||
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/authentik/teams/119923/pt_BR/)\n"
 | 
					"Language-Team: Portuguese (Brazil) (https://app.transifex.com/authentik/teams/119923/pt_BR/)\n"
 | 
				
			||||||
@ -192,6 +192,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "Nome de exibição do usuário."
 | 
					msgstr "Nome de exibição do usuário."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "Usuário"
 | 
					msgstr "Usuário"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -376,6 +377,18 @@ msgstr "Mapeamento de propriedades"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "Mapeamentos de propriedades"
 | 
					msgstr "Mapeamentos de propriedades"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "Sessão Autenticada"
 | 
					msgstr "Sessão Autenticada"
 | 
				
			||||||
@ -483,6 +496,38 @@ msgstr "Uso de licença"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "Registros de uso de licença"
 | 
					msgstr "Registros de uso de licença"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Chave de campo para verificar, as chaves de campo definidas nos estágios de "
 | 
				
			||||||
 | 
					"prompt estão disponíveis."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "Senha não definida no contexto"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "Entrerprise é necessário para acessar essa funcionalidade"
 | 
					msgstr "Entrerprise é necessário para acessar essa funcionalidade"
 | 
				
			||||||
@ -1252,12 +1297,6 @@ msgstr ""
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Chave de campo para verificar, as chaves de campo definidas nos estágios de "
 | 
					 | 
				
			||||||
"prompt estão disponíveis."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr "Quantas vezes o hash da senha pode estar em haveibeenpwned"
 | 
					msgstr "Quantas vezes o hash da senha pode estar em haveibeenpwned"
 | 
				
			||||||
@ -1268,10 +1307,6 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Se a pontuação zxcvbn for igual ou menor que esse valor, a política falhará."
 | 
					"Se a pontuação zxcvbn for igual ou menor que esse valor, a política falhará."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "Senha não definida no contexto"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1313,20 +1348,6 @@ msgstr "Pontuação de reputação"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "Pontuações de reputação"
 | 
					msgstr "Pontuações de reputação"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "Permissão negada"
 | 
					msgstr "Permissão negada"
 | 
				
			||||||
@ -2141,6 +2162,10 @@ msgstr ""
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "Permissão do sistema"
 | 
					msgstr "Permissão do sistema"
 | 
				
			||||||
@ -2387,6 +2412,22 @@ msgstr ""
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr "A senha não corresponde à complexidade do Active Directory."
 | 
					msgstr "A senha não corresponde à complexidade do Active Directory."
 | 
				
			||||||
@ -2395,6 +2436,14 @@ msgstr "A senha não corresponde à complexidade do Active Directory."
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "Nenhum token recebido."
 | 
					msgstr "Nenhum token recebido."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "URL do token de solicitação"
 | 
					msgstr "URL do token de solicitação"
 | 
				
			||||||
@ -2435,6 +2484,12 @@ msgstr "URL usado pelo authentik para obter informações do usuário."
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "Escopos Adicionais"
 | 
					msgstr "Escopos Adicionais"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "Fonte OAuth"
 | 
					msgstr "Fonte OAuth"
 | 
				
			||||||
@ -3318,6 +3373,12 @@ msgid ""
 | 
				
			|||||||
"info is entered."
 | 
					"info is entered."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgstr "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
@ -3678,6 +3739,14 @@ msgstr ""
 | 
				
			|||||||
"Os eventos serão excluídos após esta duração.(Formato: "
 | 
					"Os eventos serão excluídos após esta duração.(Formato: "
 | 
				
			||||||
"semanas=3;dias=2;horas=3,segundos=2)."
 | 
					"semanas=3;dias=2;horas=3,segundos=2)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
@ -18,7 +18,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-11 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: Marc Schmitt, 2025\n"
 | 
					"Last-Translator: Marc Schmitt, 2025\n"
 | 
				
			||||||
"Language-Team: Russian (https://app.transifex.com/authentik/teams/119923/ru/)\n"
 | 
					"Language-Team: Russian (https://app.transifex.com/authentik/teams/119923/ru/)\n"
 | 
				
			||||||
@ -191,6 +191,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "Отображаемое имя пользователя."
 | 
					msgstr "Отображаемое имя пользователя."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "Пользователь"
 | 
					msgstr "Пользователь"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -379,6 +380,18 @@ msgstr "Сопоставление свойств"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "Сопоставление свойств"
 | 
					msgstr "Сопоставление свойств"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "Аутентифицированная Сессия"
 | 
					msgstr "Аутентифицированная Сессия"
 | 
				
			||||||
@ -487,6 +500,37 @@ msgstr "Использование лицензии"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "Записи использования лицензии"
 | 
					msgstr "Записи использования лицензии"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Ключ поля для проверки, доступны ключи поля, определенные в этапах запроса."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "Пароль не задан в контексте"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "Для доступа к этой функции требуется Enterprise."
 | 
					msgstr "Для доступа к этой функции требуется Enterprise."
 | 
				
			||||||
@ -1267,11 +1311,6 @@ msgstr "Просмотр показателей кэша политики"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "Очистка показателей кэша политики"
 | 
					msgstr "Очистка показателей кэша политики"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Ключ поля для проверки, доступны ключи поля, определенные в этапах запроса."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr "Как часто хэш пароля может быть представлен на haveibeenpwned"
 | 
					msgstr "Как часто хэш пароля может быть представлен на haveibeenpwned"
 | 
				
			||||||
@ -1283,10 +1322,6 @@ msgstr ""
 | 
				
			|||||||
"Если показатель zxcvbn равен или меньше этого значения, политика будет "
 | 
					"Если показатель zxcvbn равен или меньше этого значения, политика будет "
 | 
				
			||||||
"провалена."
 | 
					"провалена."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "Пароль не задан в контексте"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr "Неправильный пароль"
 | 
					msgstr "Неправильный пароль"
 | 
				
			||||||
@ -1328,20 +1363,6 @@ msgstr "Оценка репутации"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "Оценка репутации"
 | 
					msgstr "Оценка репутации"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "Доступ запрещен"
 | 
					msgstr "Доступ запрещен"
 | 
				
			||||||
@ -2164,6 +2185,10 @@ msgstr "Роль"
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr "Роли"
 | 
					msgstr "Роли"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "Системное разрешение"
 | 
					msgstr "Системное разрешение"
 | 
				
			||||||
@ -2421,6 +2446,22 @@ msgstr "Сопоставление свойства LDAP источника"
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr "Сопоставление свойств LDAP источника"
 | 
					msgstr "Сопоставление свойств LDAP источника"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr "Пароль не соответствует сложности Active Directory."
 | 
					msgstr "Пароль не соответствует сложности Active Directory."
 | 
				
			||||||
@ -2429,6 +2470,14 @@ msgstr "Пароль не соответствует сложности Active D
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "Токен не был получен."
 | 
					msgstr "Токен не был получен."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "URL-адрес запроса токена"
 | 
					msgstr "URL-адрес запроса токена"
 | 
				
			||||||
@ -2471,6 +2520,12 @@ msgstr ""
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "Дополнительные области"
 | 
					msgstr "Дополнительные области"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "Источник OAuth"
 | 
					msgstr "Источник OAuth"
 | 
				
			||||||
@ -3376,6 +3431,12 @@ msgstr ""
 | 
				
			|||||||
"При включении этап будет завершаться успешно и продолжаться даже в случае "
 | 
					"При включении этап будет завершаться успешно и продолжаться даже в случае "
 | 
				
			||||||
"ввода неправильной информации о пользователе."
 | 
					"ввода неправильной информации о пользователе."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -3767,6 +3828,14 @@ msgstr ""
 | 
				
			|||||||
"По истечении этого времени события будут удалены. (Формат: недели=3; дни=2; "
 | 
					"По истечении этого времени события будут удалены. (Формат: недели=3; дни=2; "
 | 
				
			||||||
"часы=3, секунды=2)."
 | 
					"часы=3, секунды=2)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -13,7 +13,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-03-31 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: Jens L. <jens@goauthentik.io>, 2025\n"
 | 
					"Last-Translator: Jens L. <jens@goauthentik.io>, 2025\n"
 | 
				
			||||||
"Language-Team: Turkish (https://app.transifex.com/authentik/teams/119923/tr/)\n"
 | 
					"Language-Team: Turkish (https://app.transifex.com/authentik/teams/119923/tr/)\n"
 | 
				
			||||||
@ -187,6 +187,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "Kullanıcının görünen adı."
 | 
					msgstr "Kullanıcının görünen adı."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "Kullanıcı"
 | 
					msgstr "Kullanıcı"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -372,6 +373,18 @@ msgstr "Özellik Eşleme"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "Özellik Eşlemeleri"
 | 
					msgstr "Özellik Eşlemeleri"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr "Oturum"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr "Oturumlar"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "Kimliği Doğrulanmış Oturum"
 | 
					msgstr "Kimliği Doğrulanmış Oturum"
 | 
				
			||||||
@ -479,6 +492,38 @@ msgstr "Lisans Kullanımı"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "Lisans Kullanım Kayıtları"
 | 
					msgstr "Lisans Kullanım Kayıtları"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Alan tuşu kontrol etmek için, İstem aşamalarında tanımlanan alan tuşları "
 | 
				
			||||||
 | 
					"mevcuttur."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "Parola bağlam içinde ayarlanmamış"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "Bu özelliğe erişmek için Kurumsal Paket gereklidir."
 | 
					msgstr "Bu özelliğe erişmek için Kurumsal Paket gereklidir."
 | 
				
			||||||
@ -1253,12 +1298,6 @@ msgstr "İlke'nin önbellek ölçümlerini görüntüleme"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "İlke'nin önbellek ölçümlerini temizleyin"
 | 
					msgstr "İlke'nin önbellek ölçümlerini temizleyin"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
"Alan tuşu kontrol etmek için, İstem aşamalarında tanımlanan alan tuşları "
 | 
					 | 
				
			||||||
"mevcuttur."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1271,10 +1310,6 @@ msgstr ""
 | 
				
			|||||||
"Eğer zxcvbn puanı bu değere eşit veya daha az ise, politika başarısız "
 | 
					"Eğer zxcvbn puanı bu değere eşit veya daha az ise, politika başarısız "
 | 
				
			||||||
"olacaktır."
 | 
					"olacaktır."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "Parola bağlam içinde ayarlanmamış"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1316,20 +1351,6 @@ msgstr "İtibar Puanı"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "İtibar Puanları"
 | 
					msgstr "İtibar Puanları"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "İzin reddedildi"
 | 
					msgstr "İzin reddedildi"
 | 
				
			||||||
@ -2155,6 +2176,10 @@ msgstr "Rol"
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr "Roller"
 | 
					msgstr "Roller"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "Sistem yetkisi"
 | 
					msgstr "Sistem yetkisi"
 | 
				
			||||||
@ -2398,6 +2423,13 @@ msgstr ""
 | 
				
			|||||||
"Bir kullanıcı parolasını değiştirdiğinde, parolayı LDAP ile geri eşitleyin. "
 | 
					"Bir kullanıcı parolasını değiştirdiğinde, parolayı LDAP ile geri eşitleyin. "
 | 
				
			||||||
"Bu yalnızca tek bir LDAP kaynağında etkinleştirilebilir."
 | 
					"Bu yalnızca tek bir LDAP kaynağında etkinleştirilebilir."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Lookup group membership based on a user attribute instead of a group "
 | 
				
			||||||
 | 
					"attribute. This allows nested group resolution on systems like FreeIPA and "
 | 
				
			||||||
 | 
					"Active Directory"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/models.py
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
msgid "LDAP Source"
 | 
					msgid "LDAP Source"
 | 
				
			||||||
msgstr "LDAP Kaynağı"
 | 
					msgstr "LDAP Kaynağı"
 | 
				
			||||||
@ -2414,6 +2446,22 @@ msgstr "LDAP Kaynak Özellik Eşlemesi"
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr "LDAP Kaynak Özellik Eşlemeleri"
 | 
					msgstr "LDAP Kaynak Özellik Eşlemeleri"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr "Parola Active Directory Karmaşıklığıyla eşleşmiyor."
 | 
					msgstr "Parola Active Directory Karmaşıklığıyla eşleşmiyor."
 | 
				
			||||||
@ -2422,6 +2470,14 @@ msgstr "Parola Active Directory Karmaşıklığıyla eşleşmiyor."
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "Jeton alınmadı."
 | 
					msgstr "Jeton alınmadı."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "Jeton URL'si İste"
 | 
					msgstr "Jeton URL'si İste"
 | 
				
			||||||
@ -2462,6 +2518,12 @@ msgstr "Kullanıcı bilgilerini almak için authentik tarafından kullanılan UR
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "Ek Kapsamlar"
 | 
					msgstr "Ek Kapsamlar"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "OAuth Kaynağı"
 | 
					msgstr "OAuth Kaynağı"
 | 
				
			||||||
@ -3360,6 +3422,12 @@ msgstr ""
 | 
				
			|||||||
"Etkinleştirildiğinde, yanlış kullanıcı bilgisi girilse bile aşama başarılı "
 | 
					"Etkinleştirildiğinde, yanlış kullanıcı bilgisi girilse bile aşama başarılı "
 | 
				
			||||||
"olur ve devam eder."
 | 
					"olur ve devam eder."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr "Sayfanın alt kısmında bağlanan isteğe bağlı kayıt akışı."
 | 
					msgstr "Sayfanın alt kısmında bağlanan isteğe bağlı kayıt akışı."
 | 
				
			||||||
@ -3734,6 +3802,14 @@ msgstr ""
 | 
				
			|||||||
"Olaylar bu süreden sonra silinecektir (Format: "
 | 
					"Olaylar bu süreden sonra silinecektir (Format: "
 | 
				
			||||||
"weeks=3;days=2;hours=3,seconds=2)."
 | 
					"weeks=3;days=2;hours=3,seconds=2)."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -15,7 +15,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-18 00:09+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: deluxghost, 2025\n"
 | 
					"Last-Translator: deluxghost, 2025\n"
 | 
				
			||||||
"Language-Team: Chinese Simplified (https://app.transifex.com/authentik/teams/119923/zh-Hans/)\n"
 | 
					"Language-Team: Chinese Simplified (https://app.transifex.com/authentik/teams/119923/zh-Hans/)\n"
 | 
				
			||||||
@ -461,6 +461,36 @@ msgstr "许可证使用情况"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "许可证使用情况记录"
 | 
					msgstr "许可证使用情况记录"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr "要检查的字段键,可以使用输入阶段中定义的字段键。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr "检查指定数量的密码。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "未在上下文中设置密码"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr "此密码被使用过。请选择其他密码。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr "密码唯一性策略"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr "密码唯一性策略"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr "用户密码历史记录"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "访问此功能需要企业版。"
 | 
					msgstr "访问此功能需要企业版。"
 | 
				
			||||||
@ -1190,10 +1220,6 @@ msgstr "查看策略缓存指标"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "清除策略缓存指标"
 | 
					msgstr "清除策略缓存指标"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr "要检查的字段键,可以使用输入阶段中定义的字段键。"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr "密码哈希允许出现在 HaveIBeenPwned 中多少次"
 | 
					msgstr "密码哈希允许出现在 HaveIBeenPwned 中多少次"
 | 
				
			||||||
@ -1203,10 +1229,6 @@ msgid ""
 | 
				
			|||||||
"If the zxcvbn score is equal or less than this value, the policy will fail."
 | 
					"If the zxcvbn score is equal or less than this value, the policy will fail."
 | 
				
			||||||
msgstr "如果 zxcvbn 分数小于等于此值,则策略失败。"
 | 
					msgstr "如果 zxcvbn 分数小于等于此值,则策略失败。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "未在上下文中设置密码"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr "无效密码。"
 | 
					msgstr "无效密码。"
 | 
				
			||||||
@ -1248,20 +1270,6 @@ msgstr "信誉分数"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "信誉分数"
 | 
					msgstr "信誉分数"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr "正在等待身份验证…"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr "您正在另一个标签页中验证身份。身份验证完成后,此页面会刷新。"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr "在此标签页中验证身份"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "权限被拒绝"
 | 
					msgstr "权限被拒绝"
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -14,7 +14,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-18 00:09+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: deluxghost, 2025\n"
 | 
					"Last-Translator: deluxghost, 2025\n"
 | 
				
			||||||
"Language-Team: Chinese (China) (https://app.transifex.com/authentik/teams/119923/zh_CN/)\n"
 | 
					"Language-Team: Chinese (China) (https://app.transifex.com/authentik/teams/119923/zh_CN/)\n"
 | 
				
			||||||
@ -460,6 +460,36 @@ msgstr "许可证使用情况"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "许可证使用情况记录"
 | 
					msgstr "许可证使用情况记录"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr "要检查的字段键,可以使用输入阶段中定义的字段键。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr "检查指定数量的密码。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "未在上下文中设置密码"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr "此密码被使用过。请选择其他密码。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr "密码唯一性策略"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr "密码唯一性策略"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr "用户密码历史记录"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "访问此功能需要企业版。"
 | 
					msgstr "访问此功能需要企业版。"
 | 
				
			||||||
@ -1189,10 +1219,6 @@ msgstr "查看策略缓存指标"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "清除策略缓存指标"
 | 
					msgstr "清除策略缓存指标"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr "要检查的字段键,可以使用输入阶段中定义的字段键。"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr "密码哈希允许出现在 HaveIBeenPwned 中多少次"
 | 
					msgstr "密码哈希允许出现在 HaveIBeenPwned 中多少次"
 | 
				
			||||||
@ -1202,10 +1228,6 @@ msgid ""
 | 
				
			|||||||
"If the zxcvbn score is equal or less than this value, the policy will fail."
 | 
					"If the zxcvbn score is equal or less than this value, the policy will fail."
 | 
				
			||||||
msgstr "如果 zxcvbn 分数小于等于此值,则策略失败。"
 | 
					msgstr "如果 zxcvbn 分数小于等于此值,则策略失败。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "未在上下文中设置密码"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr "无效密码。"
 | 
					msgstr "无效密码。"
 | 
				
			||||||
@ -1247,20 +1269,6 @@ msgstr "信誉分数"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "信誉分数"
 | 
					msgstr "信誉分数"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr "正在等待身份验证…"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr "您正在另一个标签页中验证身份。身份验证完成后,此页面会刷新。"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr "在此标签页中验证身份"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "权限被拒绝"
 | 
					msgstr "权限被拒绝"
 | 
				
			||||||
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@ -14,7 +14,7 @@ msgid ""
 | 
				
			|||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
					"Project-Id-Version: PACKAGE VERSION\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: \n"
 | 
				
			||||||
"POT-Creation-Date: 2025-04-11 00:10+0000\n"
 | 
					"POT-Creation-Date: 2025-04-23 09:00+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
					"PO-Revision-Date: 2022-09-26 16:47+0000\n"
 | 
				
			||||||
"Last-Translator: 刘松, 2025\n"
 | 
					"Last-Translator: 刘松, 2025\n"
 | 
				
			||||||
"Language-Team: Chinese (Taiwan) (https://app.transifex.com/authentik/teams/119923/zh_TW/)\n"
 | 
					"Language-Team: Chinese (Taiwan) (https://app.transifex.com/authentik/teams/119923/zh_TW/)\n"
 | 
				
			||||||
@ -178,6 +178,7 @@ msgid "User's display name."
 | 
				
			|||||||
msgstr "使用者的顯示名稱。"
 | 
					msgstr "使用者的顯示名稱。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
					#: authentik/core/models.py authentik/providers/oauth2/models.py
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "User"
 | 
					msgid "User"
 | 
				
			||||||
msgstr "使用者"
 | 
					msgstr "使用者"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -344,6 +345,18 @@ msgstr "屬性對應"
 | 
				
			|||||||
msgid "Property Mappings"
 | 
					msgid "Property Mappings"
 | 
				
			||||||
msgstr "屬性對應"
 | 
					msgstr "屬性對應"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "session data"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Session"
 | 
				
			||||||
 | 
					msgstr "会话"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/core/models.py
 | 
				
			||||||
 | 
					msgid "Sessions"
 | 
				
			||||||
 | 
					msgstr "会话"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/core/models.py
 | 
					#: authentik/core/models.py
 | 
				
			||||||
msgid "Authenticated Session"
 | 
					msgid "Authenticated Session"
 | 
				
			||||||
msgstr "已認證會談"
 | 
					msgstr "已認證會談"
 | 
				
			||||||
@ -447,6 +460,36 @@ msgstr "授權使用情況"
 | 
				
			|||||||
msgid "License Usage Records"
 | 
					msgid "License Usage Records"
 | 
				
			||||||
msgstr "授權使用紀錄"
 | 
					msgstr "授權使用紀錄"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
				
			||||||
 | 
					msgstr "要檢查的欄位鍵,在提示階段中有可用的已定義欄位鍵。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Number of passwords to check against."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
 | 
					msgid "Password not set in context"
 | 
				
			||||||
 | 
					msgstr "未在上下文中設定密碼"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "This password has been used previously. Please choose a different one."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policy"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "Password Uniqueness Policies"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/enterprise/policies/unique_password/models.py
 | 
				
			||||||
 | 
					msgid "User Password History"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/enterprise/policy.py
 | 
					#: authentik/enterprise/policy.py
 | 
				
			||||||
msgid "Enterprise required to access this feature."
 | 
					msgid "Enterprise required to access this feature."
 | 
				
			||||||
msgstr "企業版才能存取此功能。"
 | 
					msgstr "企業版才能存取此功能。"
 | 
				
			||||||
@ -1176,10 +1219,6 @@ msgstr "檢視原則的快取指標"
 | 
				
			|||||||
msgid "Clear Policy's cache metrics"
 | 
					msgid "Clear Policy's cache metrics"
 | 
				
			||||||
msgstr "清除原則的快取指標"
 | 
					msgstr "清除原則的快取指標"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Field key to check, field keys defined in Prompt stages are available."
 | 
					 | 
				
			||||||
msgstr "要檢查的欄位鍵,在提示階段中有可用的已定義欄位鍵。"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
					msgid "How many times the password hash is allowed to be on haveibeenpwned"
 | 
				
			||||||
msgstr "密碼雜湊在 haveibeenpwned 上允許出現的次數"
 | 
					msgstr "密碼雜湊在 haveibeenpwned 上允許出現的次數"
 | 
				
			||||||
@ -1189,10 +1228,6 @@ msgid ""
 | 
				
			|||||||
"If the zxcvbn score is equal or less than this value, the policy will fail."
 | 
					"If the zxcvbn score is equal or less than this value, the policy will fail."
 | 
				
			||||||
msgstr "如果 zxcvbn 分數等於或小於此值,則該政策將失敗。"
 | 
					msgstr "如果 zxcvbn 分數等於或小於此值,則該政策將失敗。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					 | 
				
			||||||
msgid "Password not set in context"
 | 
					 | 
				
			||||||
msgstr "未在上下文中設定密碼"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/password/models.py
 | 
					#: authentik/policies/password/models.py
 | 
				
			||||||
msgid "Invalid password."
 | 
					msgid "Invalid password."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
@ -1234,20 +1269,6 @@ msgstr "信譽分數"
 | 
				
			|||||||
msgid "Reputation Scores"
 | 
					msgid "Reputation Scores"
 | 
				
			||||||
msgstr "信譽分數"
 | 
					msgstr "信譽分數"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Waiting for authentication..."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid ""
 | 
					 | 
				
			||||||
"You're already authenticating in another tab. This page will refresh once "
 | 
					 | 
				
			||||||
"authentication is completed."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/buffer.html
 | 
					 | 
				
			||||||
msgid "Authenticate in this tab"
 | 
					 | 
				
			||||||
msgstr ""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: authentik/policies/templates/policies/denied.html
 | 
					#: authentik/policies/templates/policies/denied.html
 | 
				
			||||||
msgid "Permission denied"
 | 
					msgid "Permission denied"
 | 
				
			||||||
msgstr "權限不足。"
 | 
					msgstr "權限不足。"
 | 
				
			||||||
@ -1999,6 +2020,10 @@ msgstr "角色"
 | 
				
			|||||||
msgid "Roles"
 | 
					msgid "Roles"
 | 
				
			||||||
msgstr "角色"
 | 
					msgstr "角色"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
 | 
					msgid "Initial Permissions"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/rbac/models.py
 | 
					#: authentik/rbac/models.py
 | 
				
			||||||
msgid "System permission"
 | 
					msgid "System permission"
 | 
				
			||||||
msgstr "系統權限"
 | 
					msgstr "系統權限"
 | 
				
			||||||
@ -2240,6 +2265,22 @@ msgstr ""
 | 
				
			|||||||
msgid "LDAP Source Property Mappings"
 | 
					msgid "LDAP Source Property Mappings"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "User LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connection"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/ldap/models.py
 | 
				
			||||||
 | 
					msgid "Group LDAP Source Connections"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/ldap/signals.py
 | 
					#: authentik/sources/ldap/signals.py
 | 
				
			||||||
msgid "Password does not match Active Directory Complexity."
 | 
					msgid "Password does not match Active Directory Complexity."
 | 
				
			||||||
msgstr "密碼不符合 Active Directory 的複雜性要求。"
 | 
					msgstr "密碼不符合 Active Directory 的複雜性要求。"
 | 
				
			||||||
@ -2248,6 +2289,14 @@ msgstr "密碼不符合 Active Directory 的複雜性要求。"
 | 
				
			|||||||
msgid "No token received."
 | 
					msgid "No token received."
 | 
				
			||||||
msgstr "未收到權杖。"
 | 
					msgstr "未收到權杖。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "HTTP Basic Authentication"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid "Include the client ID and secret as request parameters"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "Request Token URL"
 | 
					msgid "Request Token URL"
 | 
				
			||||||
msgstr "請求權杖的網址"
 | 
					msgstr "請求權杖的網址"
 | 
				
			||||||
@ -2286,6 +2335,12 @@ msgstr "authentik 用來擷取使用者資訊的網址。"
 | 
				
			|||||||
msgid "Additional Scopes"
 | 
					msgid "Additional Scopes"
 | 
				
			||||||
msgstr "附加範圍"
 | 
					msgstr "附加範圍"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"How to perform authentication during an authorization_code token request "
 | 
				
			||||||
 | 
					"flow"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/sources/oauth/models.py
 | 
					#: authentik/sources/oauth/models.py
 | 
				
			||||||
msgid "OAuth Source"
 | 
					msgid "OAuth Source"
 | 
				
			||||||
msgstr "OAuth 來源"
 | 
					msgstr "OAuth 來源"
 | 
				
			||||||
@ -3137,6 +3192,12 @@ msgid ""
 | 
				
			|||||||
"info is entered."
 | 
					"info is entered."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"Show the user the 'Remember me on this device' toggle, allowing repeat users"
 | 
				
			||||||
 | 
					" to skip straight to entering their password."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/stages/identification/models.py
 | 
					#: authentik/stages/identification/models.py
 | 
				
			||||||
msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
					msgid "Optional enrollment flow, which is linked at the bottom of the page."
 | 
				
			||||||
msgstr "可選的註冊流程,連結在頁面的底部。"
 | 
					msgstr "可選的註冊流程,連結在頁面的底部。"
 | 
				
			||||||
@ -3481,6 +3542,14 @@ msgid ""
 | 
				
			|||||||
"weeks=3;days=2;hours=3,seconds=2)."
 | 
					"weeks=3;days=2;hours=3,seconds=2)."
 | 
				
			||||||
msgstr "事件將在此期間後刪除。(格式:weeks=3;days=2;hours=3,seconds=2)"
 | 
					msgstr "事件將在此期間後刪除。(格式:weeks=3;days=2;hours=3,seconds=2)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot decrease lower than this value. Zero or negative."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
 | 
					msgid "Reputation cannot increase higher than this value. Zero or positive."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: authentik/tenants/models.py
 | 
					#: authentik/tenants/models.py
 | 
				
			||||||
msgid "The option configures the footer links on the flow executor pages."
 | 
					msgid "The option configures the footer links on the flow executor pages."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										538
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										538
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -1,12 +1,546 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "name": "@goauthentik/authentik",
 | 
					    "name": "@goauthentik/authentik",
 | 
				
			||||||
    "version": "2025.2.1",
 | 
					    "version": "2025.4.0",
 | 
				
			||||||
    "lockfileVersion": 3,
 | 
					    "lockfileVersion": 3,
 | 
				
			||||||
    "requires": true,
 | 
					    "requires": true,
 | 
				
			||||||
    "packages": {
 | 
					    "packages": {
 | 
				
			||||||
        "": {
 | 
					        "": {
 | 
				
			||||||
            "name": "@goauthentik/authentik",
 | 
					            "name": "@goauthentik/authentik",
 | 
				
			||||||
            "version": "2025.2.1"
 | 
					            "version": "2025.4.0",
 | 
				
			||||||
 | 
					            "devDependencies": {
 | 
				
			||||||
 | 
					                "@trivago/prettier-plugin-sort-imports": "^5.2.2",
 | 
				
			||||||
 | 
					                "prettier": "^3.3.3",
 | 
				
			||||||
 | 
					                "prettier-plugin-organize-imports": "^4.1.0",
 | 
				
			||||||
 | 
					                "prettier-plugin-packagejson": "^2.5.10",
 | 
				
			||||||
 | 
					                "typescript": "^5.6.2"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@babel/code-frame": {
 | 
				
			||||||
 | 
					            "version": "7.26.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@babel/helper-validator-identifier": "^7.25.9",
 | 
				
			||||||
 | 
					                "js-tokens": "^4.0.0",
 | 
				
			||||||
 | 
					                "picocolors": "^1.0.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.9.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@babel/generator": {
 | 
				
			||||||
 | 
					            "version": "7.27.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@babel/parser": "^7.27.0",
 | 
				
			||||||
 | 
					                "@babel/types": "^7.27.0",
 | 
				
			||||||
 | 
					                "@jridgewell/gen-mapping": "^0.3.5",
 | 
				
			||||||
 | 
					                "@jridgewell/trace-mapping": "^0.3.25",
 | 
				
			||||||
 | 
					                "jsesc": "^3.0.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.9.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@babel/helper-string-parser": {
 | 
				
			||||||
 | 
					            "version": "7.25.9",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.9.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@babel/helper-validator-identifier": {
 | 
				
			||||||
 | 
					            "version": "7.25.9",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.9.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@babel/parser": {
 | 
				
			||||||
 | 
					            "version": "7.27.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@babel/types": "^7.27.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "bin": {
 | 
				
			||||||
 | 
					                "parser": "bin/babel-parser.js"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.0.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@babel/template": {
 | 
				
			||||||
 | 
					            "version": "7.27.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@babel/code-frame": "^7.26.2",
 | 
				
			||||||
 | 
					                "@babel/parser": "^7.27.0",
 | 
				
			||||||
 | 
					                "@babel/types": "^7.27.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.9.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@babel/traverse": {
 | 
				
			||||||
 | 
					            "version": "7.27.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@babel/code-frame": "^7.26.2",
 | 
				
			||||||
 | 
					                "@babel/generator": "^7.27.0",
 | 
				
			||||||
 | 
					                "@babel/parser": "^7.27.0",
 | 
				
			||||||
 | 
					                "@babel/template": "^7.27.0",
 | 
				
			||||||
 | 
					                "@babel/types": "^7.27.0",
 | 
				
			||||||
 | 
					                "debug": "^4.3.1",
 | 
				
			||||||
 | 
					                "globals": "^11.1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.9.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@babel/types": {
 | 
				
			||||||
 | 
					            "version": "7.27.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@babel/helper-string-parser": "^7.25.9",
 | 
				
			||||||
 | 
					                "@babel/helper-validator-identifier": "^7.25.9"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.9.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@jridgewell/gen-mapping": {
 | 
				
			||||||
 | 
					            "version": "0.3.8",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@jridgewell/set-array": "^1.2.1",
 | 
				
			||||||
 | 
					                "@jridgewell/sourcemap-codec": "^1.4.10",
 | 
				
			||||||
 | 
					                "@jridgewell/trace-mapping": "^0.3.24"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.0.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@jridgewell/resolve-uri": {
 | 
				
			||||||
 | 
					            "version": "3.1.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.0.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@jridgewell/set-array": {
 | 
				
			||||||
 | 
					            "version": "1.2.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.0.0"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@jridgewell/sourcemap-codec": {
 | 
				
			||||||
 | 
					            "version": "1.5.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@jridgewell/trace-mapping": {
 | 
				
			||||||
 | 
					            "version": "0.3.25",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@jridgewell/resolve-uri": "^3.1.0",
 | 
				
			||||||
 | 
					                "@jridgewell/sourcemap-codec": "^1.4.14"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@pkgr/core": {
 | 
				
			||||||
 | 
					            "version": "0.1.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": {
 | 
				
			||||||
 | 
					                "url": "https://opencollective.com/unts"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@trivago/prettier-plugin-sort-imports": {
 | 
				
			||||||
 | 
					            "version": "5.2.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-5.2.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "Apache-2.0",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@babel/generator": "^7.26.5",
 | 
				
			||||||
 | 
					                "@babel/parser": "^7.26.7",
 | 
				
			||||||
 | 
					                "@babel/traverse": "^7.26.7",
 | 
				
			||||||
 | 
					                "@babel/types": "^7.26.7",
 | 
				
			||||||
 | 
					                "javascript-natural-sort": "^0.7.1",
 | 
				
			||||||
 | 
					                "lodash": "^4.17.21"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">18.12"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "@vue/compiler-sfc": "3.x",
 | 
				
			||||||
 | 
					                "prettier": "2.x - 3.x",
 | 
				
			||||||
 | 
					                "prettier-plugin-svelte": "3.x",
 | 
				
			||||||
 | 
					                "svelte": "4.x || 5.x"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "@vue/compiler-sfc": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "prettier-plugin-svelte": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "svelte": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/debug": {
 | 
				
			||||||
 | 
					            "version": "4.4.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "ms": "^2.1.3"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "supports-color": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/detect-indent": {
 | 
				
			||||||
 | 
					            "version": "7.0.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=12.20"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/detect-newline": {
 | 
				
			||||||
 | 
					            "version": "4.0.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": {
 | 
				
			||||||
 | 
					                "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/fdir": {
 | 
				
			||||||
 | 
					            "version": "6.4.4",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "picomatch": "^3 || ^4"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "picomatch": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/get-stdin": {
 | 
				
			||||||
 | 
					            "version": "9.0.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=12"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": {
 | 
				
			||||||
 | 
					                "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/git-hooks-list": {
 | 
				
			||||||
 | 
					            "version": "3.2.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.2.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "funding": {
 | 
				
			||||||
 | 
					                "url": "https://github.com/fisker/git-hooks-list?sponsor=1"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/globals": {
 | 
				
			||||||
 | 
					            "version": "11.12.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=4"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/is-plain-obj": {
 | 
				
			||||||
 | 
					            "version": "4.1.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=12"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": {
 | 
				
			||||||
 | 
					                "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/javascript-natural-sort": {
 | 
				
			||||||
 | 
					            "version": "0.7.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/js-tokens": {
 | 
				
			||||||
 | 
					            "version": "4.0.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/jsesc": {
 | 
				
			||||||
 | 
					            "version": "3.1.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "bin": {
 | 
				
			||||||
 | 
					                "jsesc": "bin/jsesc"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=6"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/lodash": {
 | 
				
			||||||
 | 
					            "version": "4.17.21",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/ms": {
 | 
				
			||||||
 | 
					            "version": "2.1.3",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/picocolors": {
 | 
				
			||||||
 | 
					            "version": "1.1.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "ISC"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/picomatch": {
 | 
				
			||||||
 | 
					            "version": "4.0.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=12"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": {
 | 
				
			||||||
 | 
					                "url": "https://github.com/sponsors/jonschlinkert"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/prettier": {
 | 
				
			||||||
 | 
					            "version": "3.5.3",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "bin": {
 | 
				
			||||||
 | 
					                "prettier": "bin/prettier.cjs"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=14"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": {
 | 
				
			||||||
 | 
					                "url": "https://github.com/prettier/prettier?sponsor=1"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/prettier-plugin-organize-imports": {
 | 
				
			||||||
 | 
					            "version": "4.1.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "prettier": ">=2.0",
 | 
				
			||||||
 | 
					                "typescript": ">=2.9",
 | 
				
			||||||
 | 
					                "vue-tsc": "^2.1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "vue-tsc": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/prettier-plugin-packagejson": {
 | 
				
			||||||
 | 
					            "version": "2.5.10",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.10.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-LUxATI5YsImIVSaaLJlJ3aE6wTD+nvots18U3GuQMJpUyClChaZlQrqx3dBnbhF20OnKWZyx8EgyZypQtBDtgQ==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "sort-package-json": "2.15.1",
 | 
				
			||||||
 | 
					                "synckit": "0.9.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "prettier": ">= 1.16.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					                "prettier": {
 | 
				
			||||||
 | 
					                    "optional": true
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/semver": {
 | 
				
			||||||
 | 
					            "version": "7.7.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "ISC",
 | 
				
			||||||
 | 
					            "bin": {
 | 
				
			||||||
 | 
					                "semver": "bin/semver.js"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=10"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/sort-object-keys": {
 | 
				
			||||||
 | 
					            "version": "1.1.3",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/sort-package-json": {
 | 
				
			||||||
 | 
					            "version": "2.15.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.15.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "detect-indent": "^7.0.1",
 | 
				
			||||||
 | 
					                "detect-newline": "^4.0.0",
 | 
				
			||||||
 | 
					                "get-stdin": "^9.0.0",
 | 
				
			||||||
 | 
					                "git-hooks-list": "^3.0.0",
 | 
				
			||||||
 | 
					                "is-plain-obj": "^4.1.0",
 | 
				
			||||||
 | 
					                "semver": "^7.6.0",
 | 
				
			||||||
 | 
					                "sort-object-keys": "^1.1.3",
 | 
				
			||||||
 | 
					                "tinyglobby": "^0.2.9"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "bin": {
 | 
				
			||||||
 | 
					                "sort-package-json": "cli.js"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/synckit": {
 | 
				
			||||||
 | 
					            "version": "0.9.2",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "@pkgr/core": "^0.1.0",
 | 
				
			||||||
 | 
					                "tslib": "^2.6.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": "^14.18.0 || >=16.0.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": {
 | 
				
			||||||
 | 
					                "url": "https://opencollective.com/unts"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/tinyglobby": {
 | 
				
			||||||
 | 
					            "version": "0.2.13",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "MIT",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "fdir": "^6.4.4",
 | 
				
			||||||
 | 
					                "picomatch": "^4.0.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=12.0.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": {
 | 
				
			||||||
 | 
					                "url": "https://github.com/sponsors/SuperchupuDev"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/tslib": {
 | 
				
			||||||
 | 
					            "version": "2.8.1",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "0BSD"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/typescript": {
 | 
				
			||||||
 | 
					            "version": "5.8.3",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
 | 
				
			||||||
 | 
					            "dev": true,
 | 
				
			||||||
 | 
					            "license": "Apache-2.0",
 | 
				
			||||||
 | 
					            "bin": {
 | 
				
			||||||
 | 
					                "tsc": "bin/tsc",
 | 
				
			||||||
 | 
					                "tsserver": "bin/tsserver"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=14.17"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										14
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								package.json
									
									
									
									
									
								
							@ -1,5 +1,15 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "name": "@goauthentik/authentik",
 | 
					    "name": "@goauthentik/authentik",
 | 
				
			||||||
    "version": "2025.2.4",
 | 
					    "version": "2025.4.0",
 | 
				
			||||||
    "private": true
 | 
					    "private": true,
 | 
				
			||||||
 | 
					    "type": "module",
 | 
				
			||||||
 | 
					    "devDependencies": {
 | 
				
			||||||
 | 
					        "@trivago/prettier-plugin-sort-imports": "^5.2.2",
 | 
				
			||||||
 | 
					        "prettier": "^3.3.3",
 | 
				
			||||||
 | 
					        "prettier-plugin-organize-imports": "^4.1.0",
 | 
				
			||||||
 | 
					        "prettier-plugin-packagejson": "^2.5.10",
 | 
				
			||||||
 | 
					        "typescript": "^5.6.2"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "workspaces": [],
 | 
				
			||||||
 | 
					    "prettier": "./packages/prettier-config/index.js"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -18,9 +18,7 @@
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.badge--support-community {
 | 
					.badge--support-community {
 | 
				
			||||||
    --ifm-badge-background-color: var(
 | 
					    --ifm-badge-background-color: var(--ifm-color-secondary-contrast-foreground);
 | 
				
			||||||
        --ifm-color-secondary-contrast-foreground
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    --ifm-badge-border-color: var(--ifm-color-secondary-dark);
 | 
					    --ifm-badge-border-color: var(--ifm-color-secondary-dark);
 | 
				
			||||||
    --ifm-badge-color: var(--ifm-color-secondary-contrast-background);
 | 
					    --ifm-badge-color: var(--ifm-color-secondary-contrast-background);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,12 @@
 | 
				
			|||||||
:root {
 | 
					:root {
 | 
				
			||||||
    --ifm-font-family-base:
 | 
					    --ifm-font-family-base:
 | 
				
			||||||
        RedHatVF, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell,
 | 
					        RedHatVF, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans,
 | 
				
			||||||
        Noto Sans, sans-serif, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial,
 | 
					        sans-serif, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif,
 | 
				
			||||||
        sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
 | 
					        "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    --ifm-font-family-monospace:
 | 
					    --ifm-font-family-monospace:
 | 
				
			||||||
        RedHatMonoVF, SFMono-Regular, Menlo, Monaco, Consolas,
 | 
					        RedHatMonoVF, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
 | 
				
			||||||
        "Liberation Mono", "Courier New", monospace;
 | 
					        monospace;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    --ifm-heading-font-family: RedHatDisplayVF, var(--ifm-font-family-base);
 | 
					    --ifm-heading-font-family: RedHatDisplayVF, var(--ifm-font-family-base);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -7,11 +7,7 @@
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.homepage_hero__subtitle p {
 | 
					.homepage_hero__subtitle p {
 | 
				
			||||||
    font-size: clamp(
 | 
					    font-size: clamp(1.125rem, 0.9946rem + 0.6522vi, 1.5rem); /* Adjust font as page scales */
 | 
				
			||||||
        1.125rem,
 | 
					 | 
				
			||||||
        0.9946rem + 0.6522vi,
 | 
					 | 
				
			||||||
        1.5rem
 | 
					 | 
				
			||||||
    ); /* Adjust font as page scales */
 | 
					 | 
				
			||||||
    max-width: 28ch; /* Apply a maximum to keep everything in the box */
 | 
					    max-width: 28ch; /* Apply a maximum to keep everything in the box */
 | 
				
			||||||
    text-wrap: balance; /* Prevent widows, orphans, and runts. Doesn't work in Safari */
 | 
					    text-wrap: balance; /* Prevent widows, orphans, and runts. Doesn't work in Safari */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
:root {
 | 
					:root {
 | 
				
			||||||
    --ifm-menu-link-padding-vertical: 1em;
 | 
					    --ifm-menu-link-padding-vertical: 0.5em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.menu__list-item {
 | 
					.menu__list-item {
 | 
				
			||||||
 | 
				
			|||||||
@ -75,17 +75,14 @@
 | 
				
			|||||||
        --ifm-navbar-item-padding-horizontal: 1rem;
 | 
					        --ifm-navbar-item-padding-horizontal: 1rem;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .docs-wrapper .navbar {
 | 
					    .navbar {
 | 
				
			||||||
        margin: 0;
 | 
					        margin: 0;
 | 
				
			||||||
        padding-inline-start: 0;
 | 
					        padding-inline-start: 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .navbar__brand {
 | 
					    .navbar__brand {
 | 
				
			||||||
        justify-content: center;
 | 
					        justify-content: center;
 | 
				
			||||||
    }
 | 
					        width: var(--doc-sidebar-width, 300px);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    .docs-wrapper .navbar__brand {
 | 
					 | 
				
			||||||
        width: var(--doc-sidebar-width);
 | 
					 | 
				
			||||||
        margin: 0;
 | 
					        margin: 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -122,12 +119,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        @media (min-width: 999px) {
 | 
					        @media (min-width: 999px) {
 | 
				
			||||||
            border-inline-start: 1px solid var(--ifm-hover-overlay);
 | 
					            border-inline-start: 1px solid var(--ifm-hover-overlay);
 | 
				
			||||||
            margin-inline-start: calc(
 | 
					            margin-inline-start: calc(var(--ifm-navbar-item-padding-horizontal) / 2);
 | 
				
			||||||
                var(--ifm-navbar-item-padding-horizontal) / 2
 | 
					            padding-inline-start: calc(var(--ifm-navbar-item-padding-horizontal) / 2);
 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
            padding-inline-start: calc(
 | 
					 | 
				
			||||||
                var(--ifm-navbar-item-padding-horizontal) / 2
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -151,19 +144,14 @@
 | 
				
			|||||||
        hsl(236.84deg 34.55% 10.78%)
 | 
					        hsl(236.84deg 34.55% 10.78%)
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    --docsearch-key-shadow:
 | 
					    --docsearch-key-shadow:
 | 
				
			||||||
        inset 0 -2px 0 0 hsl(233.33deg 36% 24.51%),
 | 
					        inset 0 -2px 0 0 hsl(233.33deg 36% 24.51%), inset 0 0 1px 1px hsl(232.11deg 34.86% 57.25%),
 | 
				
			||||||
        inset 0 0 1px 1px hsl(232.11deg 34.86% 57.25%),
 | 
					 | 
				
			||||||
        0 2px 2px 0 rgba(3, 4, 9, 0.3);
 | 
					        0 2px 2px 0 rgba(3, 4, 9, 0.3);
 | 
				
			||||||
    --docsearch-key-pressed-shadow:
 | 
					    --docsearch-key-pressed-shadow:
 | 
				
			||||||
        inset 0 -2px 0 0 #282d55,
 | 
					        inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px hsl(231.82deg 21.36% 40.39%),
 | 
				
			||||||
        inset 0 0 1px 1px hsl(231.82deg 21.36% 40.39%),
 | 
					 | 
				
			||||||
        0 1px 1px 0 hsl(230deg 50% 2.35% / 30.2%);
 | 
					        0 1px 1px 0 hsl(230deg 50% 2.35% / 30.2%);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    padding: var(--ifm-navbar-item-padding-vertical)
 | 
					    padding: var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal) !important;
 | 
				
			||||||
        var(--ifm-navbar-item-padding-horizontal) !important;
 | 
					    padding-inline-end: calc(var(--ifm-navbar-item-padding-horizontal) * 1.25) !important;
 | 
				
			||||||
    padding-inline-end: calc(
 | 
					 | 
				
			||||||
        var(--ifm-navbar-item-padding-horizontal) * 1.25
 | 
					 | 
				
			||||||
    ) !important;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .DocSearch-Button-Placeholder {
 | 
					    .DocSearch-Button-Placeholder {
 | 
				
			||||||
        font-family: var(--ifm-heading-font-family);
 | 
					        font-family: var(--ifm-heading-font-family);
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,3 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    --ifm-color-content: hsl(216 35% 3%);
 | 
					    --ifm-color-content: hsl(216 35% 3%);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
body {
 | 
					 | 
				
			||||||
    overscroll-behavior-x: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -4,8 +4,8 @@
 | 
				
			|||||||
 * @import { Config as DocusaurusConfig } from "@docusaurus/types"
 | 
					 * @import { Config as DocusaurusConfig } from "@docusaurus/types"
 | 
				
			||||||
 * @import { UserThemeConfig } from "./theme.js"
 | 
					 * @import { UserThemeConfig } from "./theme.js"
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					 | 
				
			||||||
import { deepmerge } from "deepmerge-ts";
 | 
					import { deepmerge } from "deepmerge-ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { createThemeConfig } from "./theme.js";
 | 
					import { createThemeConfig } from "./theme.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//#region Types
 | 
					//#region Types
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,6 @@
 | 
				
			|||||||
 * @import { UserThemeConfig as UserThemeConfigCommon } from "@docusaurus/theme-common";
 | 
					 * @import { UserThemeConfig as UserThemeConfigCommon } from "@docusaurus/theme-common";
 | 
				
			||||||
 * @import { UserThemeConfig as UserThemeConfigAlgolia } from "@docusaurus/theme-search-algolia";
 | 
					 * @import { UserThemeConfig as UserThemeConfigAlgolia } from "@docusaurus/theme-search-algolia";
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					 | 
				
			||||||
import { deepmerge } from "deepmerge-ts";
 | 
					import { deepmerge } from "deepmerge-ts";
 | 
				
			||||||
import { themes as prismThemes } from "prism-react-renderer";
 | 
					import { themes as prismThemes } from "prism-react-renderer";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								packages/docusaurus-config/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								packages/docusaurus-config/package-lock.json
									
									
									
										generated
									
									
									
								
							@ -1,12 +1,12 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "name": "@goauthentik/docusaurus-config",
 | 
					    "name": "@goauthentik/docusaurus-config",
 | 
				
			||||||
    "version": "1.0.2",
 | 
					    "version": "1.0.6",
 | 
				
			||||||
    "lockfileVersion": 3,
 | 
					    "lockfileVersion": 3,
 | 
				
			||||||
    "requires": true,
 | 
					    "requires": true,
 | 
				
			||||||
    "packages": {
 | 
					    "packages": {
 | 
				
			||||||
        "": {
 | 
					        "": {
 | 
				
			||||||
            "name": "@goauthentik/docusaurus-config",
 | 
					            "name": "@goauthentik/docusaurus-config",
 | 
				
			||||||
            "version": "1.0.2",
 | 
					            "version": "1.0.6",
 | 
				
			||||||
            "license": "MIT",
 | 
					            "license": "MIT",
 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "deepmerge-ts": "^7.1.5",
 | 
					                "deepmerge-ts": "^7.1.5",
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "name": "@goauthentik/docusaurus-config",
 | 
					    "name": "@goauthentik/docusaurus-config",
 | 
				
			||||||
    "version": "1.0.4",
 | 
					    "version": "1.0.6",
 | 
				
			||||||
    "description": "authentik's Docusaurus config",
 | 
					    "description": "authentik's Docusaurus config",
 | 
				
			||||||
    "license": "MIT",
 | 
					    "license": "MIT",
 | 
				
			||||||
    "scripts": {
 | 
					    "scripts": {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
    "name": "@goauthentik/monorepo",
 | 
					 | 
				
			||||||
    "version": "1.0.0",
 | 
					 | 
				
			||||||
    "description": "Utilities for the authentik monorepo.",
 | 
					 | 
				
			||||||
    "private": true,
 | 
					 | 
				
			||||||
    "license": "MIT",
 | 
					 | 
				
			||||||
    "type": "module",
 | 
					 | 
				
			||||||
    "exports": {
 | 
					 | 
				
			||||||
        "./package.json": "./package.json",
 | 
					 | 
				
			||||||
        ".": {
 | 
					 | 
				
			||||||
            "import": "./index.js",
 | 
					 | 
				
			||||||
            "types": "./out/index.d.ts"
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "types": "./out/index.d.ts",
 | 
					 | 
				
			||||||
    "engines": {
 | 
					 | 
				
			||||||
        "node": ">=20.11"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,30 +0,0 @@
 | 
				
			|||||||
import { createRequire } from "node:module";
 | 
					 | 
				
			||||||
import { dirname, join, resolve } from "node:path";
 | 
					 | 
				
			||||||
import { fileURLToPath } from "node:url";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const __dirname = dirname(fileURLToPath(import.meta.url));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @typedef {'~authentik'} MonoRepoRoot
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * The root of the authentik monorepo.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export const MonoRepoRoot = /** @type {MonoRepoRoot} */ (resolve(__dirname, "..", ".."));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const require = createRequire(import.meta.url);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Resolve a package name to its location in the monorepo to the single node_modules directory.
 | 
					 | 
				
			||||||
 * @param {string} packageName
 | 
					 | 
				
			||||||
 * @returns {string} The resolved path to the package.
 | 
					 | 
				
			||||||
 * @throws {Error} If the package cannot be resolved.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export function resolvePackage(packageName) {
 | 
					 | 
				
			||||||
    const packageJSONPath = require.resolve(join(packageName, "package.json"), {
 | 
					 | 
				
			||||||
        paths: [MonoRepoRoot],
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return dirname(packageJSONPath);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
[project]
 | 
					[project]
 | 
				
			||||||
name = "authentik"
 | 
					name = "authentik"
 | 
				
			||||||
version = "2025.2.4"
 | 
					version = "2025.4.0"
 | 
				
			||||||
description = ""
 | 
					description = ""
 | 
				
			||||||
authors = [{ name = "authentik Team", email = "hello@goauthentik.io" }]
 | 
					authors = [{ name = "authentik Team", email = "hello@goauthentik.io" }]
 | 
				
			||||||
requires-python = "==3.12.*"
 | 
					requires-python = "==3.13.*"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
    "argon2-cffi",
 | 
					    "argon2-cffi",
 | 
				
			||||||
    "celery",
 | 
					    "celery",
 | 
				
			||||||
@ -52,7 +52,7 @@ dependencies = [
 | 
				
			|||||||
    "pydantic-scim",
 | 
					    "pydantic-scim",
 | 
				
			||||||
    "pyjwt",
 | 
					    "pyjwt",
 | 
				
			||||||
    "pyrad",
 | 
					    "pyrad",
 | 
				
			||||||
    "python-kadmin-rs ==0.6.0",
 | 
					    "python-kadmin-rs",
 | 
				
			||||||
    "pyyaml",
 | 
					    "pyyaml",
 | 
				
			||||||
    "requests-oauthlib",
 | 
					    "requests-oauthlib",
 | 
				
			||||||
    "scim2-filter-parser",
 | 
					    "scim2-filter-parser",
 | 
				
			||||||
@ -70,7 +70,7 @@ dependencies = [
 | 
				
			|||||||
    "watchdog",
 | 
					    "watchdog",
 | 
				
			||||||
    "webauthn",
 | 
					    "webauthn",
 | 
				
			||||||
    "wsproto",
 | 
					    "wsproto",
 | 
				
			||||||
    "xmlsec <= 1.3.14",
 | 
					    "xmlsec",
 | 
				
			||||||
    "zxcvbn",
 | 
					    "zxcvbn",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -101,6 +101,18 @@ dev = [
 | 
				
			|||||||
    "selenium",
 | 
					    "selenium",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[tool.uv]
 | 
				
			||||||
 | 
					no-binary-package = [
 | 
				
			||||||
 | 
					    # This differs from the no-binary packages in the Dockerfile. This is due to the fact
 | 
				
			||||||
 | 
					    # that these packages are built from source for different reasons than cryptography and kadmin.
 | 
				
			||||||
 | 
					    # These packages are built from source to link against the libxml2 on the system which is
 | 
				
			||||||
 | 
					    # required for functionality and to stay up-to-date on both libraries.
 | 
				
			||||||
 | 
					    # The other packages specified in the dockerfile are compiled from source to link against the
 | 
				
			||||||
 | 
					    # correct FIPS OpenSSL libraries
 | 
				
			||||||
 | 
					    "lxml",
 | 
				
			||||||
 | 
					    "xmlsec",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[tool.uv.sources]
 | 
					[tool.uv.sources]
 | 
				
			||||||
django-tenants = { git = "https://github.com/rissson/django-tenants.git", branch = "authentik-fixes" }
 | 
					django-tenants = { git = "https://github.com/rissson/django-tenants.git", branch = "authentik-fixes" }
 | 
				
			||||||
opencontainers = { git = "https://github.com/BeryJu/oci-python", rev = "c791b19056769cd67957322806809ab70f5bead8" }
 | 
					opencontainers = { git = "https://github.com/BeryJu/oci-python", rev = "c791b19056769cd67957322806809ab70f5bead8" }
 | 
				
			||||||
@ -143,12 +155,12 @@ ignore-words = ".github/codespell-words.txt"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[tool.black]
 | 
					[tool.black]
 | 
				
			||||||
line-length = 100
 | 
					line-length = 100
 | 
				
			||||||
target-version = ['py312']
 | 
					target-version = ['py313']
 | 
				
			||||||
exclude = 'node_modules'
 | 
					exclude = 'node_modules'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[tool.ruff]
 | 
					[tool.ruff]
 | 
				
			||||||
line-length = 100
 | 
					line-length = 100
 | 
				
			||||||
target-version = "py312"
 | 
					target-version = "py313"
 | 
				
			||||||
exclude = ["**/migrations/**", "**/node_modules/**"]
 | 
					exclude = ["**/migrations/**", "**/node_modules/**"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[tool.ruff.lint]
 | 
					[tool.ruff.lint]
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
openapi: 3.0.3
 | 
					openapi: 3.0.3
 | 
				
			||||||
info:
 | 
					info:
 | 
				
			||||||
  title: authentik
 | 
					  title: authentik
 | 
				
			||||||
  version: 2025.2.4
 | 
					  version: 2025.4.0
 | 
				
			||||||
  description: Making authentication simple.
 | 
					  description: Making authentication simple.
 | 
				
			||||||
  contact:
 | 
					  contact:
 | 
				
			||||||
    email: hello@goauthentik.io
 | 
					    email: hello@goauthentik.io
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,12 @@
 | 
				
			|||||||
services:
 | 
					services:
 | 
				
			||||||
  chrome:
 | 
					  chrome:
 | 
				
			||||||
    image: docker.io/selenium/standalone-chrome:122.0
 | 
					    image: docker.io/selenium/standalone-chrome:136.0
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - /dev/shm:/dev/shm
 | 
					      - /dev/shm:/dev/shm
 | 
				
			||||||
    network_mode: host
 | 
					    network_mode: host
 | 
				
			||||||
    restart: always
 | 
					    restart: always
 | 
				
			||||||
  mailpit:
 | 
					  mailpit:
 | 
				
			||||||
    image: docker.io/axllent/mailpit:v1.6.5
 | 
					    image: docker.io/axllent/mailpit:v1.24.2
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - 1025:1025
 | 
					      - 1025:1025
 | 
				
			||||||
      - 8025:8025
 | 
					      - 8025:8025
 | 
				
			||||||
 | 
				
			|||||||
@ -26,6 +26,7 @@ from selenium import webdriver
 | 
				
			|||||||
from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException
 | 
					from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException
 | 
				
			||||||
from selenium.webdriver.common.by import By
 | 
					from selenium.webdriver.common.by import By
 | 
				
			||||||
from selenium.webdriver.common.keys import Keys
 | 
					from selenium.webdriver.common.keys import Keys
 | 
				
			||||||
 | 
					from selenium.webdriver.remote.command import Command
 | 
				
			||||||
from selenium.webdriver.remote.webdriver import WebDriver
 | 
					from selenium.webdriver.remote.webdriver import WebDriver
 | 
				
			||||||
from selenium.webdriver.remote.webelement import WebElement
 | 
					from selenium.webdriver.remote.webelement import WebElement
 | 
				
			||||||
from selenium.webdriver.support.wait import WebDriverWait
 | 
					from selenium.webdriver.support.wait import WebDriverWait
 | 
				
			||||||
@ -197,7 +198,12 @@ class SeleniumTestCase(DockerTestCase, StaticLiveServerTestCase):
 | 
				
			|||||||
        super().tearDown()
 | 
					        super().tearDown()
 | 
				
			||||||
        if IS_CI:
 | 
					        if IS_CI:
 | 
				
			||||||
            print("::group::Browser logs")
 | 
					            print("::group::Browser logs")
 | 
				
			||||||
        for line in self.driver.get_log("browser"):
 | 
					        # Very verbose way to get browser logs
 | 
				
			||||||
 | 
					        # https://github.com/SeleniumHQ/selenium/pull/15641
 | 
				
			||||||
 | 
					        # for some reason this removes the `get_log` API from Remote Webdriver
 | 
				
			||||||
 | 
					        # and only keeps it on the local Chrome web driver, even when using
 | 
				
			||||||
 | 
					        # a remote chrome driver...? (nvm the fact this was released as a minor version)
 | 
				
			||||||
 | 
					        for line in self.driver.execute(Command.GET_LOG, {"type": "browser"})["value"]:
 | 
				
			||||||
            print(line["message"])
 | 
					            print(line["message"])
 | 
				
			||||||
        if IS_CI:
 | 
					        if IS_CI:
 | 
				
			||||||
            print("::endgroup::")
 | 
					            print("::endgroup::")
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										28
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					// TypeScript Project Configuration
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    "extends": "./packages/tsconfig/tsconfig.json",
 | 
				
			||||||
 | 
					    "compilerOptions": {
 | 
				
			||||||
 | 
					        "baseUrl": "."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "watchOptions": {
 | 
				
			||||||
 | 
					        "excludeDirectories": [
 | 
				
			||||||
 | 
					            "**/.git", // Git
 | 
				
			||||||
 | 
					            "**/.yarn", // Yarn
 | 
				
			||||||
 | 
					            "**/.vscode", // VS Code
 | 
				
			||||||
 | 
					            "**/.vscode-test-web", // VS Code Web Test
 | 
				
			||||||
 | 
					            "**/dist", // Distributed build files
 | 
				
			||||||
 | 
					            "**/out", // Output build files
 | 
				
			||||||
 | 
					            "**/.drafts", // Drafts
 | 
				
			||||||
 | 
					            "**/.github", // GitHub
 | 
				
			||||||
 | 
					            "**/node_modules" // Node modules
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // The root project has no sources of its own. By setting `files` to an empty
 | 
				
			||||||
 | 
					    // list, TS won't automatically include all sources below root (the default).
 | 
				
			||||||
 | 
					    "files": [],
 | 
				
			||||||
 | 
					    "references": [
 | 
				
			||||||
 | 
					        // Note that references are in the order we want them to be built.
 | 
				
			||||||
 | 
					        // TODO: Left blank until TypeScript workspaces are complete.
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -2,15 +2,11 @@
 | 
				
			|||||||
node_modules
 | 
					node_modules
 | 
				
			||||||
# don't lint build output (make sure it's set to your correct build folder name)
 | 
					# don't lint build output (make sure it's set to your correct build folder name)
 | 
				
			||||||
dist
 | 
					dist
 | 
				
			||||||
 | 
					out
 | 
				
			||||||
# don't lint nyc coverage output
 | 
					# don't lint nyc coverage output
 | 
				
			||||||
coverage
 | 
					coverage
 | 
				
			||||||
# Import order matters
 | 
					# Import order matters
 | 
				
			||||||
poly.ts
 | 
					 | 
				
			||||||
src/locale-codes.ts
 | 
					src/locale-codes.ts
 | 
				
			||||||
src/locales/
 | 
					src/locales/
 | 
				
			||||||
storybook-static/
 | 
					storybook-static/
 | 
				
			||||||
# Prettier breaks the tsconfig file
 | 
					 | 
				
			||||||
tsconfig.json
 | 
					 | 
				
			||||||
.storybook/css-import-maps*
 | 
					.storybook/css-import-maps*
 | 
				
			||||||
package.json
 | 
					 | 
				
			||||||
packages/**/package.json
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12651
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12651
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										115
									
								
								web/package.json
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								web/package.json
									
									
									
									
									
								
							@ -1,6 +1,44 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "name": "@goauthentik/web",
 | 
					    "name": "@goauthentik/web",
 | 
				
			||||||
    "version": "0.0.0",
 | 
					    "version": "0.0.0",
 | 
				
			||||||
 | 
					    "license": "MIT",
 | 
				
			||||||
 | 
					    "private": true,
 | 
				
			||||||
 | 
					    "scripts": {
 | 
				
			||||||
 | 
					        "build": "wireit",
 | 
				
			||||||
 | 
					        "build-locales": "wireit",
 | 
				
			||||||
 | 
					        "build-locales:build": "wireit",
 | 
				
			||||||
 | 
					        "build-proxy": "wireit",
 | 
				
			||||||
 | 
					        "build:sfe": "wireit",
 | 
				
			||||||
 | 
					        "esbuild:watch": "node scripts/build-web.mjs --watch",
 | 
				
			||||||
 | 
					        "extract-locales": "wireit",
 | 
				
			||||||
 | 
					        "format": "wireit",
 | 
				
			||||||
 | 
					        "lint": "wireit",
 | 
				
			||||||
 | 
					        "lint:imports": "wireit",
 | 
				
			||||||
 | 
					        "lint:lockfile": "wireit",
 | 
				
			||||||
 | 
					        "lint:nightmare": "wireit",
 | 
				
			||||||
 | 
					        "lint:precommit": "wireit",
 | 
				
			||||||
 | 
					        "lint:types": "wireit",
 | 
				
			||||||
 | 
					        "lit-analyse": "wireit",
 | 
				
			||||||
 | 
					        "postinstall": "bash scripts/patch-spotlight.sh",
 | 
				
			||||||
 | 
					        "precommit": "wireit",
 | 
				
			||||||
 | 
					        "prettier": "wireit",
 | 
				
			||||||
 | 
					        "prettier-check": "wireit",
 | 
				
			||||||
 | 
					        "pseudolocalize": "wireit",
 | 
				
			||||||
 | 
					        "storybook": "storybook dev -p 6006",
 | 
				
			||||||
 | 
					        "storybook:build": "wireit",
 | 
				
			||||||
 | 
					        "test": "wireit",
 | 
				
			||||||
 | 
					        "test:e2e": "wireit",
 | 
				
			||||||
 | 
					        "test:e2e:watch": "wireit",
 | 
				
			||||||
 | 
					        "test:watch": "wireit",
 | 
				
			||||||
 | 
					        "tsc": "wireit",
 | 
				
			||||||
 | 
					        "watch": "run-s build-locales esbuild:watch"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "type": "module",
 | 
				
			||||||
 | 
					    "exports": {
 | 
				
			||||||
 | 
					        "./package.json": "./package.json",
 | 
				
			||||||
 | 
					        "./paths": "./paths.js",
 | 
				
			||||||
 | 
					        "./scripts/*": "./scripts/*.mjs"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "dependencies": {
 | 
					    "dependencies": {
 | 
				
			||||||
        "@codemirror/lang-css": "^6.3.1",
 | 
					        "@codemirror/lang-css": "^6.3.1",
 | 
				
			||||||
        "@codemirror/lang-html": "^6.4.9",
 | 
					        "@codemirror/lang-html": "^6.4.9",
 | 
				
			||||||
@ -12,8 +50,7 @@
 | 
				
			|||||||
        "@floating-ui/dom": "^1.6.11",
 | 
					        "@floating-ui/dom": "^1.6.11",
 | 
				
			||||||
        "@formatjs/intl-listformat": "^7.5.7",
 | 
					        "@formatjs/intl-listformat": "^7.5.7",
 | 
				
			||||||
        "@fortawesome/fontawesome-free": "^6.6.0",
 | 
					        "@fortawesome/fontawesome-free": "^6.6.0",
 | 
				
			||||||
        "@goauthentik/api": "^2025.2.4-1745325566",
 | 
					        "@goauthentik/api": "^2025.4.0-1746018955",
 | 
				
			||||||
        "@lit-labs/ssr": "^3.2.2",
 | 
					 | 
				
			||||||
        "@lit/context": "^1.1.2",
 | 
					        "@lit/context": "^1.1.2",
 | 
				
			||||||
        "@lit/localize": "^0.12.2",
 | 
					        "@lit/localize": "^0.12.2",
 | 
				
			||||||
        "@lit/reactive-element": "^2.0.4",
 | 
					        "@lit/reactive-element": "^2.0.4",
 | 
				
			||||||
@ -54,6 +91,7 @@
 | 
				
			|||||||
        "remark-gfm": "^4.0.1",
 | 
					        "remark-gfm": "^4.0.1",
 | 
				
			||||||
        "remark-mdx-frontmatter": "^5.0.0",
 | 
					        "remark-mdx-frontmatter": "^5.0.0",
 | 
				
			||||||
        "style-mod": "^4.1.2",
 | 
					        "style-mod": "^4.1.2",
 | 
				
			||||||
 | 
					        "trusted-types": "^2.0.0",
 | 
				
			||||||
        "ts-pattern": "^5.4.0",
 | 
					        "ts-pattern": "^5.4.0",
 | 
				
			||||||
        "unist-util-visit": "^5.0.0",
 | 
					        "unist-util-visit": "^5.0.0",
 | 
				
			||||||
        "webcomponent-qr-code": "^1.2.0",
 | 
					        "webcomponent-qr-code": "^1.2.0",
 | 
				
			||||||
@ -62,6 +100,7 @@
 | 
				
			|||||||
    "devDependencies": {
 | 
					    "devDependencies": {
 | 
				
			||||||
        "@eslint/js": "^9.11.1",
 | 
					        "@eslint/js": "^9.11.1",
 | 
				
			||||||
        "@goauthentik/esbuild-plugin-live-reload": "^1.0.4",
 | 
					        "@goauthentik/esbuild-plugin-live-reload": "^1.0.4",
 | 
				
			||||||
 | 
					        "@goauthentik/monorepo": "^1.0.0",
 | 
				
			||||||
        "@goauthentik/prettier-config": "^1.0.4",
 | 
					        "@goauthentik/prettier-config": "^1.0.4",
 | 
				
			||||||
        "@goauthentik/tsconfig": "^1.0.4",
 | 
					        "@goauthentik/tsconfig": "^1.0.4",
 | 
				
			||||||
        "@hcaptcha/types": "^1.0.4",
 | 
					        "@hcaptcha/types": "^1.0.4",
 | 
				
			||||||
@ -93,13 +132,13 @@
 | 
				
			|||||||
        "@wdio/spec-reporter": "^9.1.2",
 | 
					        "@wdio/spec-reporter": "^9.1.2",
 | 
				
			||||||
        "chromedriver": "^131.0.1",
 | 
					        "chromedriver": "^131.0.1",
 | 
				
			||||||
        "esbuild": "^0.25.0",
 | 
					        "esbuild": "^0.25.0",
 | 
				
			||||||
 | 
					        "esbuild-plugin-copy": "^2.1.1",
 | 
				
			||||||
        "esbuild-plugin-polyfill-node": "^0.3.0",
 | 
					        "esbuild-plugin-polyfill-node": "^0.3.0",
 | 
				
			||||||
        "esbuild-plugins-node-modules-polyfill": "^1.7.0",
 | 
					        "esbuild-plugins-node-modules-polyfill": "^1.7.0",
 | 
				
			||||||
        "eslint": "^9.11.1",
 | 
					        "eslint": "^9.11.1",
 | 
				
			||||||
        "eslint-plugin-lit": "^1.15.0",
 | 
					        "eslint-plugin-lit": "^1.15.0",
 | 
				
			||||||
        "eslint-plugin-wc": "^2.1.1",
 | 
					        "eslint-plugin-wc": "^2.1.1",
 | 
				
			||||||
        "github-slugger": "^2.0.0",
 | 
					        "github-slugger": "^2.0.0",
 | 
				
			||||||
        "glob": "^11.0.0",
 | 
					 | 
				
			||||||
        "globals": "^15.10.0",
 | 
					        "globals": "^15.10.0",
 | 
				
			||||||
        "knip": "^5.30.6",
 | 
					        "knip": "^5.30.6",
 | 
				
			||||||
        "lit-analyzer": "^2.0.3",
 | 
					        "lit-analyzer": "^2.0.3",
 | 
				
			||||||
@ -110,7 +149,6 @@
 | 
				
			|||||||
        "rollup-plugin-postcss-lit": "^2.1.0",
 | 
					        "rollup-plugin-postcss-lit": "^2.1.0",
 | 
				
			||||||
        "storybook": "^8.3.4",
 | 
					        "storybook": "^8.3.4",
 | 
				
			||||||
        "storybook-addon-mock": "^5.0.0",
 | 
					        "storybook-addon-mock": "^5.0.0",
 | 
				
			||||||
        "syncpack": "^13.0.0",
 | 
					 | 
				
			||||||
        "turnstile-types": "^1.2.3",
 | 
					        "turnstile-types": "^1.2.3",
 | 
				
			||||||
        "typescript": "^5.6.2",
 | 
					        "typescript": "^5.6.2",
 | 
				
			||||||
        "typescript-eslint": "^8.8.0",
 | 
					        "typescript-eslint": "^8.8.0",
 | 
				
			||||||
@ -118,10 +156,6 @@
 | 
				
			|||||||
        "vite-tsconfig-paths": "^5.0.1",
 | 
					        "vite-tsconfig-paths": "^5.0.1",
 | 
				
			||||||
        "wireit": "^0.14.9"
 | 
					        "wireit": "^0.14.9"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "engines": {
 | 
					 | 
				
			||||||
        "node": ">=20"
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "license": "MIT",
 | 
					 | 
				
			||||||
    "optionalDependencies": {
 | 
					    "optionalDependencies": {
 | 
				
			||||||
        "@esbuild/darwin-arm64": "^0.24.0",
 | 
					        "@esbuild/darwin-arm64": "^0.24.0",
 | 
				
			||||||
        "@esbuild/linux-amd64": "^0.18.11",
 | 
					        "@esbuild/linux-amd64": "^0.18.11",
 | 
				
			||||||
@ -130,48 +164,6 @@
 | 
				
			|||||||
        "@rollup/rollup-linux-arm64-gnu": "4.23.0",
 | 
					        "@rollup/rollup-linux-arm64-gnu": "4.23.0",
 | 
				
			||||||
        "@rollup/rollup-linux-x64-gnu": "4.23.0"
 | 
					        "@rollup/rollup-linux-x64-gnu": "4.23.0"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "overrides": {
 | 
					 | 
				
			||||||
        "rapidoc": {
 | 
					 | 
				
			||||||
            "@apitools/openapi-parser@": "0.0.37"
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        "chromedriver": {
 | 
					 | 
				
			||||||
            "axios": "^1.8.4"
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "prettier": "@goauthentik/prettier-config",
 | 
					 | 
				
			||||||
    "private": true,
 | 
					 | 
				
			||||||
    "scripts": {
 | 
					 | 
				
			||||||
        "build": "wireit",
 | 
					 | 
				
			||||||
        "build-locales": "wireit",
 | 
					 | 
				
			||||||
        "build-locales:build": "wireit",
 | 
					 | 
				
			||||||
        "build-proxy": "wireit",
 | 
					 | 
				
			||||||
        "build:sfe": "wireit",
 | 
					 | 
				
			||||||
        "esbuild:watch": "node scripts/build-web.mjs --watch",
 | 
					 | 
				
			||||||
        "extract-locales": "wireit",
 | 
					 | 
				
			||||||
        "format": "wireit",
 | 
					 | 
				
			||||||
        "lint": "wireit",
 | 
					 | 
				
			||||||
        "lint:imports": "wireit",
 | 
					 | 
				
			||||||
        "lint:lockfile": "wireit",
 | 
					 | 
				
			||||||
        "lint:nightmare": "wireit",
 | 
					 | 
				
			||||||
        "lint:package": "wireit",
 | 
					 | 
				
			||||||
        "lint:precommit": "wireit",
 | 
					 | 
				
			||||||
        "lint:types": "wireit",
 | 
					 | 
				
			||||||
        "lit-analyse": "wireit",
 | 
					 | 
				
			||||||
        "postinstall": "bash scripts/patch-spotlight.sh",
 | 
					 | 
				
			||||||
        "precommit": "wireit",
 | 
					 | 
				
			||||||
        "prettier": "wireit",
 | 
					 | 
				
			||||||
        "prettier-check": "wireit",
 | 
					 | 
				
			||||||
        "pseudolocalize": "wireit",
 | 
					 | 
				
			||||||
        "storybook": "storybook dev -p 6006",
 | 
					 | 
				
			||||||
        "storybook:build": "wireit",
 | 
					 | 
				
			||||||
        "test": "wireit",
 | 
					 | 
				
			||||||
        "test:e2e": "wireit",
 | 
					 | 
				
			||||||
        "test:e2e:watch": "wireit",
 | 
					 | 
				
			||||||
        "test:watch": "wireit",
 | 
					 | 
				
			||||||
        "tsc": "wireit",
 | 
					 | 
				
			||||||
        "watch": "run-s build-locales esbuild:watch"
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "type": "module",
 | 
					 | 
				
			||||||
    "wireit": {
 | 
					    "wireit": {
 | 
				
			||||||
        "build": {
 | 
					        "build": {
 | 
				
			||||||
            "#comment": [
 | 
					            "#comment": [
 | 
				
			||||||
@ -248,10 +240,7 @@
 | 
				
			|||||||
            "command": "lit-localize extract"
 | 
					            "command": "lit-localize extract"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "format": {
 | 
					        "format": {
 | 
				
			||||||
            "command": "prettier --write .",
 | 
					            "command": "prettier --write ."
 | 
				
			||||||
            "dependencies": [
 | 
					 | 
				
			||||||
                "lint:package"
 | 
					 | 
				
			||||||
            ]
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "format:packages": {
 | 
					        "format:packages": {
 | 
				
			||||||
            "dependencies": [
 | 
					            "dependencies": [
 | 
				
			||||||
@ -290,9 +279,6 @@
 | 
				
			|||||||
                "./packages/sfe:lint:lockfile"
 | 
					                "./packages/sfe:lint:lockfile"
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "lint:package": {
 | 
					 | 
				
			||||||
            "command": "syncpack format -i '    '"
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        "lint:nightmare": {
 | 
					        "lint:nightmare": {
 | 
				
			||||||
            "command": "${NODE_RUNNER} ./scripts/eslint.mjs --nightmare",
 | 
					            "command": "${NODE_RUNNER} ./scripts/eslint.mjs --nightmare",
 | 
				
			||||||
            "env": {
 | 
					            "env": {
 | 
				
			||||||
@ -323,7 +309,6 @@
 | 
				
			|||||||
                "lint:types",
 | 
					                "lint:types",
 | 
				
			||||||
                "lint:components",
 | 
					                "lint:components",
 | 
				
			||||||
                "lint:spelling",
 | 
					                "lint:spelling",
 | 
				
			||||||
                "lint:package",
 | 
					 | 
				
			||||||
                "lint:lockfile",
 | 
					                "lint:lockfile",
 | 
				
			||||||
                "lint:lockfiles",
 | 
					                "lint:lockfiles",
 | 
				
			||||||
                "lint:precommit",
 | 
					                "lint:precommit",
 | 
				
			||||||
@ -388,8 +373,20 @@
 | 
				
			|||||||
            ]
 | 
					            ]
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "engines": {
 | 
				
			||||||
 | 
					        "node": ">=20"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "workspaces": [
 | 
					    "workspaces": [
 | 
				
			||||||
        ".",
 | 
					        ".",
 | 
				
			||||||
        "./packages/*"
 | 
					        "./packages/*"
 | 
				
			||||||
    ]
 | 
					    ],
 | 
				
			||||||
 | 
					    "prettier": "@goauthentik/prettier-config",
 | 
				
			||||||
 | 
					    "overrides": {
 | 
				
			||||||
 | 
					        "rapidoc": {
 | 
				
			||||||
 | 
					            "@apitools/openapi-parser@": "0.0.37"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "chromedriver": {
 | 
				
			||||||
 | 
					            "axios": "^1.8.4"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,22 +1,11 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "name": "@goauthentik/esbuild-plugin-live-reload",
 | 
					    "name": "@goauthentik/esbuild-plugin-live-reload",
 | 
				
			||||||
    "description": "ESBuild plugin to watch for file changes and trigger client-side reloads.",
 | 
					 | 
				
			||||||
    "version": "1.0.4",
 | 
					    "version": "1.0.4",
 | 
				
			||||||
    "dependencies": {
 | 
					    "description": "ESBuild plugin to watch for file changes and trigger client-side reloads.",
 | 
				
			||||||
        "find-free-ports": "^3.1.1"
 | 
					    "license": "MIT",
 | 
				
			||||||
    },
 | 
					    "private": true,
 | 
				
			||||||
    "devDependencies": {
 | 
					    "main": "index.js",
 | 
				
			||||||
        "@goauthentik/prettier-config": "^1.0.4",
 | 
					    "type": "module",
 | 
				
			||||||
        "@goauthentik/tsconfig": "^1.0.4",
 | 
					 | 
				
			||||||
        "@trivago/prettier-plugin-sort-imports": "^5.2.2",
 | 
					 | 
				
			||||||
        "@types/node": "^22.14.1",
 | 
					 | 
				
			||||||
        "esbuild": "^0.25.0",
 | 
					 | 
				
			||||||
        "prettier": "^3.3.3",
 | 
					 | 
				
			||||||
        "typescript": "^5.6.2"
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "engines": {
 | 
					 | 
				
			||||||
        "node": ">=20.11"
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "exports": {
 | 
					    "exports": {
 | 
				
			||||||
        "./package.json": "./package.json",
 | 
					        "./package.json": "./package.json",
 | 
				
			||||||
        ".": {
 | 
					        ".": {
 | 
				
			||||||
@ -32,22 +21,33 @@
 | 
				
			|||||||
            "import": "./plugin/index.js"
 | 
					            "import": "./plugin/index.js"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "dependencies": {
 | 
				
			||||||
 | 
					        "find-free-ports": "^3.1.1"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "devDependencies": {
 | 
				
			||||||
 | 
					        "@goauthentik/prettier-config": "^1.0.4",
 | 
				
			||||||
 | 
					        "@goauthentik/tsconfig": "^1.0.4",
 | 
				
			||||||
 | 
					        "@trivago/prettier-plugin-sort-imports": "^5.2.2",
 | 
				
			||||||
 | 
					        "@types/node": "^22.14.1",
 | 
				
			||||||
 | 
					        "esbuild": "^0.25.0",
 | 
				
			||||||
 | 
					        "prettier": "^3.3.3",
 | 
				
			||||||
 | 
					        "typescript": "^5.6.2"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "peerDependencies": {
 | 
				
			||||||
 | 
					        "esbuild": "^0.25.0"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "engines": {
 | 
				
			||||||
 | 
					        "node": ">=20.11"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "types": "./out/index.d.ts",
 | 
				
			||||||
    "files": [
 | 
					    "files": [
 | 
				
			||||||
        "./index.js",
 | 
					        "./index.js",
 | 
				
			||||||
        "client/**/*",
 | 
					        "client/**/*",
 | 
				
			||||||
        "plugin/**/*",
 | 
					        "plugin/**/*",
 | 
				
			||||||
        "out/**/*"
 | 
					        "out/**/*"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "license": "MIT",
 | 
					 | 
				
			||||||
    "main": "index.js",
 | 
					 | 
				
			||||||
    "peerDependencies": {
 | 
					 | 
				
			||||||
        "esbuild": "^0.25.0"
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "prettier": "@goauthentik/prettier-config",
 | 
					    "prettier": "@goauthentik/prettier-config",
 | 
				
			||||||
    "private": true,
 | 
					 | 
				
			||||||
    "publishConfig": {
 | 
					    "publishConfig": {
 | 
				
			||||||
        "access": "public"
 | 
					        "access": "public"
 | 
				
			||||||
    },
 | 
					    }
 | 
				
			||||||
    "type": "module",
 | 
					 | 
				
			||||||
    "types": "./out/index.d.ts"
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,4 +2,3 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This package contains utility scripts common to all TypeScript and JavaScript packages in the
 | 
					This package contains utility scripts common to all TypeScript and JavaScript packages in the
 | 
				
			||||||
`@goauthentik` monorepo.
 | 
					`@goauthentik` monorepo.
 | 
				
			||||||
 | 
					 | 
				
			||||||
							
								
								
									
										42
									
								
								web/packages/monorepo/build.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								web/packages/monorepo/build.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @file Utility functions for building and copying files.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A source environment variable, which can be a string, number, boolean, null, or undefined.
 | 
				
			||||||
 | 
					 * @typedef {string | number | boolean | null | undefined} EnvironmentVariable
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A type helper for serializing environment variables.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @template {EnvironmentVariable} T
 | 
				
			||||||
 | 
					 * @typedef {T extends string ? `"${T}"` : T} JSONify
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Given an object of environment variables, returns a new object with the same keys and values, but
 | 
				
			||||||
 | 
					 * with the values serialized as strings.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @template {Record<string, EnvironmentVariable>} EnvRecord
 | 
				
			||||||
 | 
					 * @template {string} [Prefix='process.env.']
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param {EnvRecord} input
 | 
				
			||||||
 | 
					 * @param {Prefix} [prefix='process.env.']
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @returns {{[K in keyof EnvRecord as `${Prefix}${K}`]: JSONify<EnvRecord[K]>}}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function serializeEnvironmentVars(input, prefix = /** @type {Prefix} */ ("process.env.")) {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @type {Record<string, string>}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    const env = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const [key, value] of Object.entries(input)) {
 | 
				
			||||||
 | 
					        const namespaceKey = prefix + key;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        env[namespaceKey] = JSON.stringify(value || "");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return /** @type {any} */ (env);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,8 +1,9 @@
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * @file Constants for JavaScript and TypeScript files.
 | 
					 * @file Constants for JavaScript and TypeScript files.
 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// <reference types="../../types/global.js" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * The current Node.js environment, defaulting to "development" when not set.
 | 
					 * The current Node.js environment, defaulting to "development" when not set.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@ -12,6 +13,4 @@
 | 
				
			|||||||
 * ensure that module tree-shaking works correctly.
 | 
					 * ensure that module tree-shaking works correctly.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const NodeEnvironment = /** @type {'development' | 'production'} */ (
 | 
					export const NodeEnvironment = process.env.NODE_ENV || "development";
 | 
				
			||||||
    process.env.NODE_ENV || "development"
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
@ -1,4 +1,7 @@
 | 
				
			|||||||
 | 
					/// <reference types="./types/global.js" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export * from "./paths.js";
 | 
					export * from "./paths.js";
 | 
				
			||||||
export * from "./constants.js";
 | 
					export * from "./constants.js";
 | 
				
			||||||
 | 
					export * from "./build.js";
 | 
				
			||||||
export * from "./version.js";
 | 
					export * from "./version.js";
 | 
				
			||||||
export * from "./scripting.js";
 | 
					export * from "./scripting.js";
 | 
				
			||||||
							
								
								
									
										28
									
								
								web/packages/monorepo/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								web/packages/monorepo/package.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "name": "@goauthentik/monorepo",
 | 
				
			||||||
 | 
					    "version": "1.0.0",
 | 
				
			||||||
 | 
					    "description": "Utilities for the authentik monorepo.",
 | 
				
			||||||
 | 
					    "license": "MIT",
 | 
				
			||||||
 | 
					    "private": true,
 | 
				
			||||||
 | 
					    "main": "index.js",
 | 
				
			||||||
 | 
					    "type": "module",
 | 
				
			||||||
 | 
					    "exports": {
 | 
				
			||||||
 | 
					        "./package.json": "./package.json",
 | 
				
			||||||
 | 
					        ".": {
 | 
				
			||||||
 | 
					            "types": "./out/index.d.ts",
 | 
				
			||||||
 | 
					            "import": "./index.js"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "devDependencies": {
 | 
				
			||||||
 | 
					        "@goauthentik/prettier-config": "^1.0.4",
 | 
				
			||||||
 | 
					        "@goauthentik/tsconfig": "^1.0.4",
 | 
				
			||||||
 | 
					        "@types/node": "^22.14.1",
 | 
				
			||||||
 | 
					        "prettier": "^3.3.3",
 | 
				
			||||||
 | 
					        "typescript": "^5.6.2"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "engines": {
 | 
				
			||||||
 | 
					        "node": ">=20.11"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "types": "./out/index.d.ts",
 | 
				
			||||||
 | 
					    "prettier": "@goauthentik/prettier-config"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										45
									
								
								web/packages/monorepo/paths.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								web/packages/monorepo/paths.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					import { createRequire } from "node:module";
 | 
				
			||||||
 | 
					import { dirname, join, resolve } from "node:path";
 | 
				
			||||||
 | 
					import { fileURLToPath } from "node:url";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const relativeDirname = dirname(fileURLToPath(import.meta.url));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @typedef {'~authentik'} MonoRepoRoot
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The root of the authentik monorepo.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					// TODO: Revise when this package is moved to the monorepo's `packages/monorepo` directory.
 | 
				
			||||||
 | 
					export const MonoRepoRoot = /** @type {MonoRepoRoot} */ (
 | 
				
			||||||
 | 
					    resolve(relativeDirname, "..", "..", "..")
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const require = createRequire(import.meta.url);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Resolve a package name to its location in the monorepo to the single node_modules directory.
 | 
				
			||||||
 | 
					 * @param {string} packageName
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @returns {string} The resolved path to the package.
 | 
				
			||||||
 | 
					 * @throws {Error} If the package cannot be resolved.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function resolvePackage(packageName) {
 | 
				
			||||||
 | 
					    const relativePackageJSONPath = join(packageName, "package.json");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @type {string} */
 | 
				
			||||||
 | 
					    let absolutePackageJSONPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        absolutePackageJSONPath = require.resolve(relativePackageJSONPath);
 | 
				
			||||||
 | 
					    } catch (cause) {
 | 
				
			||||||
 | 
					        const error = new Error(`Failed to resolve package "${packageName}"`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        error.cause = cause;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        throw error;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return dirname(absolutePackageJSONPath);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								web/packages/monorepo/types/global.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								web/packages/monorepo/types/global.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					declare module "process" {
 | 
				
			||||||
 | 
					    global {
 | 
				
			||||||
 | 
					        namespace NodeJS {
 | 
				
			||||||
 | 
					            interface ProcessEnv {
 | 
				
			||||||
 | 
					                /**
 | 
				
			||||||
 | 
					                 * An environment variable used to determine
 | 
				
			||||||
 | 
					                 * whether Node.js is running in production mode.
 | 
				
			||||||
 | 
					                 *
 | 
				
			||||||
 | 
					                 * @see {@link https://nodejs.org/en/learn/getting-started/nodejs-the-difference-between-development-and-production | The difference between development and production}
 | 
				
			||||||
 | 
					                 */
 | 
				
			||||||
 | 
					                NODE_ENV?: "production" | "development";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { execSync } from "node:child_process";
 | 
					import { execSync } from "node:child_process";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import PackageJSON from "../../package.json" with { type: "json" };
 | 
					import PackageJSON from "../../../package.json" with { type: "json" };
 | 
				
			||||||
import { MonoRepoRoot } from "./paths.js";
 | 
					import { MonoRepoRoot } from "./paths.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
							
								
								
									
										78
									
								
								web/paths.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								web/paths.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,78 @@
 | 
				
			|||||||
 | 
					import { dirname, resolve } from "node:path";
 | 
				
			||||||
 | 
					import { fileURLToPath } from "node:url";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const relativeDirname = dirname(fileURLToPath(import.meta.url));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#region Base paths
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @typedef {'@goauthentik/web'} WebPackageIdentifier
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The root of the web package.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export const PackageRoot = /** @type {WebPackageIdentifier} */ (resolve(relativeDirname));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The name of the distribution directory.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export const DistDirectoryName = "dist";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Path to the web package's distribution directory.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This is where the built files are located after running the build process.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export const DistDirectory = /** @type {`${WebPackageIdentifier}/${DistDirectoryName}`} */ (
 | 
				
			||||||
 | 
					    resolve(relativeDirname, DistDirectoryName)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#region Entry points
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @typedef {{ in: string, out: string }} EntryPointTarget
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * ESBuild entrypoint target.
 | 
				
			||||||
 | 
					 * Matches the type defined in the ESBuild context.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Entry points available for building.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @satisfies {Record<string, EntryPointTarget>}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export const EntryPoint = /** @type {const} */ ({
 | 
				
			||||||
 | 
					    Admin: {
 | 
				
			||||||
 | 
					        in: resolve(PackageRoot, "src", "admin", "AdminInterface", "index.entrypoint.ts"),
 | 
				
			||||||
 | 
					        out: resolve(DistDirectory, "admin", "AdminInterface"),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    User: {
 | 
				
			||||||
 | 
					        in: resolve(PackageRoot, "src", "user", "index.entrypoint.ts"),
 | 
				
			||||||
 | 
					        out: resolve(DistDirectory, "user", "UserInterface"),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    Flow: {
 | 
				
			||||||
 | 
					        in: resolve(PackageRoot, "src", "flow", "index.entrypoint.ts"),
 | 
				
			||||||
 | 
					        out: resolve(DistDirectory, "flow", "FlowInterface"),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    Standalone: {
 | 
				
			||||||
 | 
					        in: resolve(PackageRoot, "src", "standalone", "api-browser/index.entrypoint.ts"),
 | 
				
			||||||
 | 
					        out: resolve(DistDirectory, "standalone", "api-browser", "index"),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    StandaloneLoading: {
 | 
				
			||||||
 | 
					        in: resolve(PackageRoot, "src", "standalone", "loading/index.entrypoint.ts"),
 | 
				
			||||||
 | 
					        out: resolve(DistDirectory, "standalone", "loading", "index"),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    RAC: {
 | 
				
			||||||
 | 
					        in: resolve(PackageRoot, "src", "rac", "index.entrypoint.ts"),
 | 
				
			||||||
 | 
					        out: resolve(DistDirectory, "rac", "index"),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    Polyfill: {
 | 
				
			||||||
 | 
					        in: resolve(PackageRoot, "src", "polyfill", "index.entrypoint.ts"),
 | 
				
			||||||
 | 
					        out: resolve(DistDirectory, "poly"),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#endregion
 | 
				
			||||||
@ -4,138 +4,86 @@
 | 
				
			|||||||
 * @import { BuildOptions } from "esbuild";
 | 
					 * @import { BuildOptions } from "esbuild";
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
import { liveReloadPlugin } from "@goauthentik/esbuild-plugin-live-reload/plugin";
 | 
					import { liveReloadPlugin } from "@goauthentik/esbuild-plugin-live-reload/plugin";
 | 
				
			||||||
import { execFileSync } from "child_process";
 | 
					import {
 | 
				
			||||||
 | 
					    MonoRepoRoot,
 | 
				
			||||||
 | 
					    NodeEnvironment,
 | 
				
			||||||
 | 
					    readBuildIdentifier,
 | 
				
			||||||
 | 
					    resolvePackage,
 | 
				
			||||||
 | 
					    serializeEnvironmentVars,
 | 
				
			||||||
 | 
					} from "@goauthentik/monorepo";
 | 
				
			||||||
 | 
					import { DistDirectory, DistDirectoryName, EntryPoint, PackageRoot } from "@goauthentik/web/paths";
 | 
				
			||||||
import { deepmerge } from "deepmerge-ts";
 | 
					import { deepmerge } from "deepmerge-ts";
 | 
				
			||||||
import esbuild from "esbuild";
 | 
					import esbuild from "esbuild";
 | 
				
			||||||
 | 
					import copy from "esbuild-plugin-copy";
 | 
				
			||||||
import { polyfillNode } from "esbuild-plugin-polyfill-node";
 | 
					import { polyfillNode } from "esbuild-plugin-polyfill-node";
 | 
				
			||||||
import { copyFileSync, mkdirSync, readFileSync, statSync } from "fs";
 | 
					import * as fs from "node:fs/promises";
 | 
				
			||||||
import { globSync } from "glob";
 | 
					import * as path from "node:path";
 | 
				
			||||||
import * as path from "path";
 | 
					 | 
				
			||||||
import { cwd } from "process";
 | 
					 | 
				
			||||||
import process from "process";
 | 
					 | 
				
			||||||
import { fileURLToPath } from "url";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { mdxPlugin } from "./esbuild/build-mdx-plugin.mjs";
 | 
					import { mdxPlugin } from "./esbuild/build-mdx-plugin.mjs";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const __dirname = fileURLToPath(new URL(".", import.meta.url));
 | 
					const logPrefix = "[Build]";
 | 
				
			||||||
let authentikProjectRoot = path.join(__dirname, "..", "..");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
try {
 | 
					const definitions = serializeEnvironmentVars({
 | 
				
			||||||
    // Use the package.json file in the root folder, as it has the current version information.
 | 
					    NODE_ENV: NodeEnvironment,
 | 
				
			||||||
    authentikProjectRoot = execFileSync("git", ["rev-parse", "--show-toplevel"], {
 | 
					    CWD: process.cwd(),
 | 
				
			||||||
        encoding: "utf8",
 | 
					    AK_API_BASE_PATH: process.env.AK_API_BASE_PATH,
 | 
				
			||||||
    }).replace("\n", "");
 | 
					});
 | 
				
			||||||
} catch (_error) {
 | 
					 | 
				
			||||||
    // We probably don't have a .git folder, which could happen in container builds.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const packageJSONPath = path.join(authentikProjectRoot, "./package.json");
 | 
					const patternflyPath = resolvePackage("@patternfly/patternfly");
 | 
				
			||||||
const rootPackage = JSON.parse(readFileSync(packageJSONPath, "utf8"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const NODE_ENV = process.env.NODE_ENV || "development";
 | 
					 | 
				
			||||||
const AK_API_BASE_PATH = process.env.AK_API_BASE_PATH || "";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const environmentVars = new Map([
 | 
					 | 
				
			||||||
    ["NODE_ENV", NODE_ENV],
 | 
					 | 
				
			||||||
    ["CWD", cwd()],
 | 
					 | 
				
			||||||
    ["AK_API_BASE_PATH", AK_API_BASE_PATH],
 | 
					 | 
				
			||||||
]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const definitions = Object.fromEntries(
 | 
					 | 
				
			||||||
    Array.from(environmentVars).map(([key, value]) => {
 | 
					 | 
				
			||||||
        return [`process.env.${key}`, JSON.stringify(value)];
 | 
					 | 
				
			||||||
    }),
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * All is magic is just to make sure the assets are copied into the right places. This is a very
 | 
					 * @type {Readonly<BuildOptions>}
 | 
				
			||||||
 * stripped down version of what the rollup-copy-plugin does, without any of the features we don't
 | 
					 | 
				
			||||||
 * use, and using globSync instead of globby since we already had globSync lying around thanks to
 | 
					 | 
				
			||||||
 * Typescript. If there's a third argument in an array entry, it's used to replace the internal path
 | 
					 | 
				
			||||||
 * before concatenating it all together as the destination target.
 | 
					 | 
				
			||||||
 * @type {Array<[string, string, string?]>}
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
const assetsFileMappings = [
 | 
					 | 
				
			||||||
    ["node_modules/@patternfly/patternfly/patternfly.min.css", "."],
 | 
					 | 
				
			||||||
    ["node_modules/@patternfly/patternfly/assets/**", ".", "node_modules/@patternfly/patternfly/"],
 | 
					 | 
				
			||||||
    ["src/common/styles/**", "."],
 | 
					 | 
				
			||||||
    ["src/assets/images/**", "./assets/images"],
 | 
					 | 
				
			||||||
    ["./icons/*", "./assets/icons"],
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @param {string} filePath
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
const isFile = (filePath) => statSync(filePath).isFile();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @param {string} src Source file
 | 
					 | 
				
			||||||
 * @param {string} dest Destination folder
 | 
					 | 
				
			||||||
 * @param {string} [strip] Path to strip from the source file
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
function nameCopyTarget(src, dest, strip) {
 | 
					 | 
				
			||||||
    const target = path.join(dest, strip ? src.replace(strip, "") : path.parse(src).base);
 | 
					 | 
				
			||||||
    return [src, target];
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
for (const [source, rawdest, strip] of assetsFileMappings) {
 | 
					 | 
				
			||||||
    const matchedPaths = globSync(source);
 | 
					 | 
				
			||||||
    const dest = path.join("dist", rawdest);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const copyTargets = matchedPaths.map((path) => nameCopyTarget(path, dest, strip));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (const [src, dest] of copyTargets) {
 | 
					 | 
				
			||||||
        if (isFile(src)) {
 | 
					 | 
				
			||||||
            mkdirSync(path.dirname(dest), { recursive: true });
 | 
					 | 
				
			||||||
            copyFileSync(src, dest);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @typedef {[source: string, destination: string]} EntryPoint
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * This starts the definitions used for esbuild: Our targets, our arguments, the function for
 | 
					 | 
				
			||||||
 * running a build, and three options for building: watching, building, and building the proxy.
 | 
					 | 
				
			||||||
 * Ordered by largest to smallest interface to build even faster
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @type {EntryPoint[]}
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
const entryPoints = [
 | 
					 | 
				
			||||||
    ["admin/AdminInterface/AdminInterface.ts", "admin"],
 | 
					 | 
				
			||||||
    ["user/UserInterface.ts", "user"],
 | 
					 | 
				
			||||||
    ["flow/FlowInterface.ts", "flow"],
 | 
					 | 
				
			||||||
    ["standalone/api-browser/index.ts", "standalone/api-browser"],
 | 
					 | 
				
			||||||
    ["rac/index.ts", "rac"],
 | 
					 | 
				
			||||||
    ["standalone/loading/index.ts", "standalone/loading"],
 | 
					 | 
				
			||||||
    ["polyfill/poly.ts", "."],
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @type {import("esbuild").BuildOptions}
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
const BASE_ESBUILD_OPTIONS = {
 | 
					const BASE_ESBUILD_OPTIONS = {
 | 
				
			||||||
 | 
					    entryNames: `[dir]/[name]-${readBuildIdentifier()}`,
 | 
				
			||||||
 | 
					    chunkNames: "[dir]/chunks/[name]-[hash]",
 | 
				
			||||||
 | 
					    assetNames: "assets/[dir]/[name]-[hash]",
 | 
				
			||||||
 | 
					    publicPath: path.join("/static", DistDirectoryName),
 | 
				
			||||||
 | 
					    outdir: DistDirectory,
 | 
				
			||||||
    bundle: true,
 | 
					    bundle: true,
 | 
				
			||||||
    write: true,
 | 
					    write: true,
 | 
				
			||||||
    sourcemap: true,
 | 
					    sourcemap: true,
 | 
				
			||||||
    minify: NODE_ENV === "production",
 | 
					    minify: NodeEnvironment === "production",
 | 
				
			||||||
 | 
					    legalComments: "external",
 | 
				
			||||||
    splitting: true,
 | 
					    splitting: true,
 | 
				
			||||||
    treeShaking: true,
 | 
					    treeShaking: true,
 | 
				
			||||||
    external: ["*.woff", "*.woff2"],
 | 
					    external: ["*.woff", "*.woff2"],
 | 
				
			||||||
    tsconfig: path.resolve(__dirname, "..", "tsconfig.build.json"),
 | 
					    tsconfig: path.resolve(PackageRoot, "tsconfig.build.json"),
 | 
				
			||||||
    loader: {
 | 
					    loader: {
 | 
				
			||||||
        ".css": "text",
 | 
					        ".css": "text",
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    plugins: [
 | 
					    plugins: [
 | 
				
			||||||
 | 
					        copy({
 | 
				
			||||||
 | 
					            assets: [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    from: path.join(patternflyPath, "patternfly.min.css"),
 | 
				
			||||||
 | 
					                    to: ".",
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    from: path.join(patternflyPath, "assets", "**"),
 | 
				
			||||||
 | 
					                    to: "./assets",
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    from: path.resolve(PackageRoot, "src", "common", "styles", "**"),
 | 
				
			||||||
 | 
					                    to: ".",
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    from: path.resolve(PackageRoot, "src", "assets", "images", "**"),
 | 
				
			||||||
 | 
					                    to: "./assets/images",
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    from: path.resolve(PackageRoot, "icons", "*"),
 | 
				
			||||||
 | 
					                    to: "./assets/icons",
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        }),
 | 
				
			||||||
        polyfillNode({
 | 
					        polyfillNode({
 | 
				
			||||||
            polyfills: {
 | 
					            polyfills: {
 | 
				
			||||||
                path: true,
 | 
					                path: true,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        }),
 | 
					        }),
 | 
				
			||||||
        mdxPlugin({
 | 
					        mdxPlugin({
 | 
				
			||||||
            root: authentikProjectRoot,
 | 
					            root: MonoRepoRoot,
 | 
				
			||||||
        }),
 | 
					        }),
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    define: definitions,
 | 
					    define: definitions,
 | 
				
			||||||
@ -151,69 +99,43 @@ const BASE_ESBUILD_OPTIONS = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					async function cleanDistDirectory() {
 | 
				
			||||||
 * Creates a version ID for the build.
 | 
					    const timerLabel = `${logPrefix} ♻️ Cleaning previous builds...`;
 | 
				
			||||||
 * @returns {string}
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
function composeVersionID() {
 | 
					 | 
				
			||||||
    const { version } = rootPackage;
 | 
					 | 
				
			||||||
    const buildHash = process.env.GIT_BUILD_HASH;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (buildHash) {
 | 
					    console.time(timerLabel);
 | 
				
			||||||
        return `${version}+${buildHash}`;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return version;
 | 
					    await fs.rm(DistDirectory, {
 | 
				
			||||||
 | 
					        recursive: true,
 | 
				
			||||||
 | 
					        force: true,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await fs.mkdir(DistDirectory, {
 | 
				
			||||||
 | 
					        recursive: true,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    console.timeEnd(timerLabel);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Build a single entry point.
 | 
					 * Creates an ESBuild options, extending the base options with the given overrides.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @param {EntryPoint} buildTarget
 | 
					 * @param {BuildOptions} overrides
 | 
				
			||||||
 * @param {Partial<esbuild.BuildOptions>} [overrides]
 | 
					 * @returns {BuildOptions}
 | 
				
			||||||
 * @throws {Error} on build failure
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function createEntryPointOptions([source, dest], overrides = {}) {
 | 
					export function createESBuildOptions(overrides) {
 | 
				
			||||||
    const outdir = path.join(__dirname, "..", "dist", dest);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @type {esbuild.BuildOptions}
 | 
					     * @type {BuildOptions}
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					    const mergedOptions = deepmerge(BASE_ESBUILD_OPTIONS, overrides);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const entryPointConfig = {
 | 
					    return mergedOptions;
 | 
				
			||||||
        entryPoints: [`./src/${source}`],
 | 
					 | 
				
			||||||
        entryNames: `[dir]/[name]-${composeVersionID()}`,
 | 
					 | 
				
			||||||
        publicPath: path.join("/static", "dist", dest),
 | 
					 | 
				
			||||||
        outdir,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @type {esbuild.BuildOptions}
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    const mergedConfig = deepmerge(BASE_ESBUILD_OPTIONS, entryPointConfig, overrides);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return mergedConfig;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Build all entry points in parallel.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @param {EntryPoint[]} entryPoints
 | 
					 | 
				
			||||||
 * @returns {Promise<esbuild.BuildResult[]>}
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
async function buildParallel(entryPoints) {
 | 
					 | 
				
			||||||
    return Promise.all(
 | 
					 | 
				
			||||||
        entryPoints.map((entryPoint) => {
 | 
					 | 
				
			||||||
            return esbuild.build(createEntryPointOptions(entryPoint));
 | 
					 | 
				
			||||||
        }),
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function doHelp() {
 | 
					function doHelp() {
 | 
				
			||||||
    console.log(`Build the authentik UI
 | 
					    console.log(`Build the authentik UI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        options:
 | 
					        options:
 | 
				
			||||||
            -w, --watch: Build all ${entryPoints.length} interfaces
 | 
					            -w, --watch: Build all interfaces
 | 
				
			||||||
            -p, --proxy: Build only the polyfills and the loading application
 | 
					            -p, --proxy: Build only the polyfills and the loading application
 | 
				
			||||||
            -h, --help: This help message
 | 
					            -h, --help: This help message
 | 
				
			||||||
`);
 | 
					`);
 | 
				
			||||||
@ -222,27 +144,29 @@ function doHelp() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function doWatch() {
 | 
					async function doWatch() {
 | 
				
			||||||
    console.log("Watching all entry points...");
 | 
					    console.group(`${logPrefix} 🤖 Watching entry points`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const buildContexts = await Promise.all(
 | 
					    const entryPoints = Object.entries(EntryPoint).map(([entrypointID, target]) => {
 | 
				
			||||||
        entryPoints.map((entryPoint) => {
 | 
					        console.log(entrypointID);
 | 
				
			||||||
            return esbuild.context(
 | 
					 | 
				
			||||||
                createEntryPointOptions(entryPoint, {
 | 
					 | 
				
			||||||
                    define: definitions,
 | 
					 | 
				
			||||||
                    plugins: [
 | 
					 | 
				
			||||||
                        liveReloadPlugin({
 | 
					 | 
				
			||||||
                            logPrefix: `Build Observer (${entryPoint[1]})`,
 | 
					 | 
				
			||||||
                            relativeRoot: path.join(__dirname, ".."),
 | 
					 | 
				
			||||||
                        }),
 | 
					 | 
				
			||||||
                    ],
 | 
					 | 
				
			||||||
                }),
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }),
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await Promise.all(buildContexts.map((context) => context.rebuild()));
 | 
					        return target;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await Promise.allSettled(buildContexts.map((context) => context.watch()));
 | 
					    console.groupEnd();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const buildOptions = createESBuildOptions({
 | 
				
			||||||
 | 
					        entryPoints,
 | 
				
			||||||
 | 
					        plugins: [
 | 
				
			||||||
 | 
					            liveReloadPlugin({
 | 
				
			||||||
 | 
					                relativeRoot: PackageRoot,
 | 
				
			||||||
 | 
					            }),
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const buildContext = await esbuild.context(buildOptions);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await buildContext.rebuild();
 | 
				
			||||||
 | 
					    await buildContext.watch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return /** @type {Promise<void>} */ (
 | 
					    return /** @type {Promise<void>} */ (
 | 
				
			||||||
        new Promise((resolve) => {
 | 
					        new Promise((resolve) => {
 | 
				
			||||||
@ -254,15 +178,34 @@ async function doWatch() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function doBuild() {
 | 
					async function doBuild() {
 | 
				
			||||||
    console.log("Building all entry points");
 | 
					    console.group(`${logPrefix} 🚀 Building entry points:`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return buildParallel(entryPoints);
 | 
					    const entryPoints = Object.entries(EntryPoint).map(([entrypointID, target]) => {
 | 
				
			||||||
 | 
					        console.log(entrypointID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return target;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    console.groupEnd();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const buildOptions = createESBuildOptions({
 | 
				
			||||||
 | 
					        entryPoints,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await esbuild.build(buildOptions);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    console.log("Build complete");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function doProxy() {
 | 
					async function doProxy() {
 | 
				
			||||||
    return buildParallel(
 | 
					    const entryPoints = [EntryPoint.StandaloneLoading];
 | 
				
			||||||
        entryPoints.filter(([_, dest]) => ["standalone/loading", "."].includes(dest)),
 | 
					
 | 
				
			||||||
    );
 | 
					    const buildOptions = createESBuildOptions({
 | 
				
			||||||
 | 
					        entryPoints,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await esbuild.build(buildOptions);
 | 
				
			||||||
 | 
					    console.log("Proxy build complete");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function delegateCommand() {
 | 
					async function delegateCommand() {
 | 
				
			||||||
@ -284,12 +227,16 @@ async function delegateCommand() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
await delegateCommand()
 | 
					await cleanDistDirectory()
 | 
				
			||||||
    .then(() => {
 | 
					    // ---
 | 
				
			||||||
        console.log("Build complete");
 | 
					    .then(() =>
 | 
				
			||||||
        process.exit(0);
 | 
					        delegateCommand()
 | 
				
			||||||
    })
 | 
					            .then(() => {
 | 
				
			||||||
    .catch((error) => {
 | 
					                console.log("Build complete");
 | 
				
			||||||
        console.error(error);
 | 
					                process.exit(0);
 | 
				
			||||||
        process.exit(1);
 | 
					            })
 | 
				
			||||||
    });
 | 
					            .catch((error) => {
 | 
				
			||||||
 | 
					                console.error(error);
 | 
				
			||||||
 | 
					                process.exit(1);
 | 
				
			||||||
 | 
					            }),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,11 @@
 | 
				
			|||||||
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
 | 
					import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
 | 
				
			||||||
import { VERSION } from "@goauthentik/common/constants";
 | 
					import { VERSION } from "@goauthentik/common/constants";
 | 
				
			||||||
import { globalAK } from "@goauthentik/common/global";
 | 
					import { globalAK } from "@goauthentik/common/global";
 | 
				
			||||||
 | 
					import { DefaultBrand } from "@goauthentik/common/ui/config";
 | 
				
			||||||
import "@goauthentik/elements/EmptyState";
 | 
					import "@goauthentik/elements/EmptyState";
 | 
				
			||||||
import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
					import { WithBrandConfig } from "@goauthentik/elements/Interface/brandProvider";
 | 
				
			||||||
import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider";
 | 
					import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider";
 | 
				
			||||||
import { ModalButton } from "@goauthentik/elements/buttons/ModalButton";
 | 
					import { ModalButton } from "@goauthentik/elements/buttons/ModalButton";
 | 
				
			||||||
import { DefaultBrand } from "@goauthentik/elements/sidebar/SidebarBrand";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { msg } from "@lit/localize";
 | 
					import { msg } from "@lit/localize";
 | 
				
			||||||
import { TemplateResult, css, html } from "lit";
 | 
					import { TemplateResult, css, html } from "lit";
 | 
				
			||||||
 | 
				
			|||||||
@ -1,186 +1,97 @@
 | 
				
			|||||||
import { EVENT_SIDEBAR_TOGGLE } from "@goauthentik/common/constants";
 | 
					 | 
				
			||||||
import { me } from "@goauthentik/common/users";
 | 
					 | 
				
			||||||
import { AKElement } from "@goauthentik/elements/Base";
 | 
					 | 
				
			||||||
import {
 | 
					 | 
				
			||||||
    CapabilitiesEnum,
 | 
					 | 
				
			||||||
    WithCapabilitiesConfig,
 | 
					 | 
				
			||||||
} from "@goauthentik/elements/Interface/capabilitiesProvider";
 | 
					 | 
				
			||||||
import { WithVersion } from "@goauthentik/elements/Interface/versionProvider";
 | 
					 | 
				
			||||||
import { ID_REGEX, SLUG_REGEX, UUID_REGEX } from "@goauthentik/elements/router/Route";
 | 
					import { ID_REGEX, SLUG_REGEX, UUID_REGEX } from "@goauthentik/elements/router/Route";
 | 
				
			||||||
import { getRootStyle } from "@goauthentik/elements/utils/getRootStyle";
 | 
					 | 
				
			||||||
import { spread } from "@open-wc/lit-helpers";
 | 
					import { spread } from "@open-wc/lit-helpers";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { msg } from "@lit/localize";
 | 
					import { msg } from "@lit/localize";
 | 
				
			||||||
import { TemplateResult, html, nothing } from "lit";
 | 
					import { TemplateResult, html, nothing } from "lit";
 | 
				
			||||||
import { customElement, property, state } from "lit/decorators.js";
 | 
					import { repeat } from "lit/directives/repeat.js";
 | 
				
			||||||
import { map } from "lit/directives/map.js";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { UiThemeEnum } from "@goauthentik/api";
 | 
					// The second attribute type is of string[] to help with the 'activeWhen' control, which was
 | 
				
			||||||
import type { SessionUser, UserSelf } from "@goauthentik/api";
 | 
					// commonplace and singular enough to merit its own handler.
 | 
				
			||||||
 | 
					type SidebarEntry = [
 | 
				
			||||||
 | 
					    path: string | null,
 | 
				
			||||||
 | 
					    label: string,
 | 
				
			||||||
 | 
					    attributes?: Record<string, any> | string[] | null, // eslint-disable-line
 | 
				
			||||||
 | 
					    children?: SidebarEntry[],
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-admin-sidebar")
 | 
					/**
 | 
				
			||||||
export class AkAdminSidebar extends WithCapabilitiesConfig(WithVersion(AKElement)) {
 | 
					 * Recursively renders a sidebar entry.
 | 
				
			||||||
    @property({ type: Boolean, reflect: true })
 | 
					 */
 | 
				
			||||||
    open = true;
 | 
					export function renderSidebarItem([
 | 
				
			||||||
 | 
					    path,
 | 
				
			||||||
 | 
					    label,
 | 
				
			||||||
 | 
					    attributes,
 | 
				
			||||||
 | 
					    children,
 | 
				
			||||||
 | 
					]: SidebarEntry): TemplateResult {
 | 
				
			||||||
 | 
					    const properties = Array.isArray(attributes)
 | 
				
			||||||
 | 
					        ? { ".activeWhen": attributes }
 | 
				
			||||||
 | 
					        : (attributes ?? {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @state()
 | 
					    if (path) {
 | 
				
			||||||
    impersonation: UserSelf["username"] | null = null;
 | 
					        properties.path = path;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    constructor() {
 | 
					 | 
				
			||||||
        super();
 | 
					 | 
				
			||||||
        me().then((user: SessionUser) => {
 | 
					 | 
				
			||||||
            this.impersonation = user.original ? user.user.username : null;
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        this.toggleOpen = this.toggleOpen.bind(this);
 | 
					 | 
				
			||||||
        this.checkWidth = this.checkWidth.bind(this);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // This has to be a bound method so the event listener can be removed on disconnection as
 | 
					    return html`<ak-sidebar-item ${spread(properties)}>
 | 
				
			||||||
    // needed.
 | 
					        ${label ? html`<span slot="label">${label}</span>` : nothing}
 | 
				
			||||||
    toggleOpen() {
 | 
					        ${children ? renderSidebarItems(children) : nothing}
 | 
				
			||||||
        this.open = !this.open;
 | 
					    </ak-sidebar-item>`;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    checkWidth() {
 | 
					 | 
				
			||||||
        // This works just fine, but it assumes that the `--ak-sidebar--minimum-auto-width` is in
 | 
					 | 
				
			||||||
        // REMs. If that changes, this code will have to be adjusted as well.
 | 
					 | 
				
			||||||
        const minWidth =
 | 
					 | 
				
			||||||
            parseFloat(getRootStyle("--ak-sidebar--minimum-auto-width")) *
 | 
					 | 
				
			||||||
            parseFloat(getRootStyle("font-size"));
 | 
					 | 
				
			||||||
        this.open = window.innerWidth >= minWidth;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    connectedCallback() {
 | 
					 | 
				
			||||||
        super.connectedCallback();
 | 
					 | 
				
			||||||
        window.addEventListener(EVENT_SIDEBAR_TOGGLE, this.toggleOpen);
 | 
					 | 
				
			||||||
        window.addEventListener("resize", this.checkWidth);
 | 
					 | 
				
			||||||
        // After connecting to the DOM, we can now perform this check to see if the sidebar should
 | 
					 | 
				
			||||||
        // be open by default.
 | 
					 | 
				
			||||||
        this.checkWidth();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // The symmetry (☟, ☝) here is critical in that you want to start adding these handlers after
 | 
					 | 
				
			||||||
    // connection, and removing them before disconnection.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    disconnectedCallback() {
 | 
					 | 
				
			||||||
        window.removeEventListener(EVENT_SIDEBAR_TOGGLE, this.toggleOpen);
 | 
					 | 
				
			||||||
        window.removeEventListener("resize", this.checkWidth);
 | 
					 | 
				
			||||||
        super.disconnectedCallback();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    render() {
 | 
					 | 
				
			||||||
        return html`
 | 
					 | 
				
			||||||
            <ak-sidebar
 | 
					 | 
				
			||||||
                class="pf-c-page__sidebar ${this.open ? "pf-m-expanded" : "pf-m-collapsed"} ${this
 | 
					 | 
				
			||||||
                    .activeTheme === UiThemeEnum.Light
 | 
					 | 
				
			||||||
                    ? "pf-m-light"
 | 
					 | 
				
			||||||
                    : ""}"
 | 
					 | 
				
			||||||
            >
 | 
					 | 
				
			||||||
                ${this.renderSidebarItems()}
 | 
					 | 
				
			||||||
            </ak-sidebar>
 | 
					 | 
				
			||||||
        `;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    updated() {
 | 
					 | 
				
			||||||
        // This is permissible as`:host.classList` is not one of the properties Lit uses as a
 | 
					 | 
				
			||||||
        // scheduling trigger. This sort of shenanigans can trigger an loop, in that it will trigger
 | 
					 | 
				
			||||||
        // a browser reflow, which may trigger some other styling the application is monitoring,
 | 
					 | 
				
			||||||
        // triggering a re-render which triggers a browser reflow, ad infinitum. But we've been
 | 
					 | 
				
			||||||
        // living with that since jQuery, and it's both well-known and fortunately rare.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // eslint-disable-next-line wc/no-self-class
 | 
					 | 
				
			||||||
        this.classList.remove("pf-m-expanded", "pf-m-collapsed");
 | 
					 | 
				
			||||||
        // eslint-disable-next-line wc/no-self-class
 | 
					 | 
				
			||||||
        this.classList.add(this.open ? "pf-m-expanded" : "pf-m-collapsed");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    renderSidebarItems(): TemplateResult {
 | 
					 | 
				
			||||||
        // The second attribute type is of string[] to help with the 'activeWhen' control, which was
 | 
					 | 
				
			||||||
        // commonplace and singular enough to merit its own handler.
 | 
					 | 
				
			||||||
        type SidebarEntry = [
 | 
					 | 
				
			||||||
            path: string | null,
 | 
					 | 
				
			||||||
            label: string,
 | 
					 | 
				
			||||||
            attributes?: Record<string, any> | string[] | null, // eslint-disable-line
 | 
					 | 
				
			||||||
            children?: SidebarEntry[],
 | 
					 | 
				
			||||||
        ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // prettier-ignore
 | 
					 | 
				
			||||||
        const sidebarContent: SidebarEntry[] = [
 | 
					 | 
				
			||||||
            [null, msg("Dashboards"), { "?expanded": true }, [
 | 
					 | 
				
			||||||
                ["/administration/overview", msg("Overview")],
 | 
					 | 
				
			||||||
                ["/administration/dashboard/users", msg("User Statistics")],
 | 
					 | 
				
			||||||
                ["/administration/system-tasks", msg("System Tasks")]]],
 | 
					 | 
				
			||||||
            [null, msg("Applications"), null, [
 | 
					 | 
				
			||||||
                ["/core/applications", msg("Applications"), [`^/core/applications/(?<slug>${SLUG_REGEX})$`]],
 | 
					 | 
				
			||||||
                ["/core/providers", msg("Providers"), [`^/core/providers/(?<id>${ID_REGEX})$`]],
 | 
					 | 
				
			||||||
                ["/outpost/outposts", msg("Outposts")]]],
 | 
					 | 
				
			||||||
            [null, msg("Events"), null, [
 | 
					 | 
				
			||||||
                ["/events/log", msg("Logs"), [`^/events/log/(?<id>${UUID_REGEX})$`]],
 | 
					 | 
				
			||||||
                ["/events/rules", msg("Notification Rules")],
 | 
					 | 
				
			||||||
                ["/events/transports", msg("Notification Transports")]]],
 | 
					 | 
				
			||||||
            [null, msg("Customization"), null, [
 | 
					 | 
				
			||||||
                ["/policy/policies", msg("Policies")],
 | 
					 | 
				
			||||||
                ["/core/property-mappings", msg("Property Mappings")],
 | 
					 | 
				
			||||||
                ["/blueprints/instances", msg("Blueprints")],
 | 
					 | 
				
			||||||
                ["/policy/reputation", msg("Reputation scores")]]],
 | 
					 | 
				
			||||||
            [null, msg("Flows and Stages"), null, [
 | 
					 | 
				
			||||||
                ["/flow/flows", msg("Flows"), [`^/flow/flows/(?<slug>${SLUG_REGEX})$`]],
 | 
					 | 
				
			||||||
                ["/flow/stages", msg("Stages")],
 | 
					 | 
				
			||||||
                ["/flow/stages/prompts", msg("Prompts")]]],
 | 
					 | 
				
			||||||
            [null, msg("Directory"), null, [
 | 
					 | 
				
			||||||
                ["/identity/users", msg("Users"), [`^/identity/users/(?<id>${ID_REGEX})$`]],
 | 
					 | 
				
			||||||
                ["/identity/groups", msg("Groups"), [`^/identity/groups/(?<id>${UUID_REGEX})$`]],
 | 
					 | 
				
			||||||
                ["/identity/roles", msg("Roles"), [`^/identity/roles/(?<id>${UUID_REGEX})$`]],
 | 
					 | 
				
			||||||
                ["/identity/initial-permissions", msg("Initial Permissions"), [`^/identity/initial-permissions/(?<id>${ID_REGEX})$`]],
 | 
					 | 
				
			||||||
                ["/core/sources", msg("Federation and Social login"), [`^/core/sources/(?<slug>${SLUG_REGEX})$`]],
 | 
					 | 
				
			||||||
                ["/core/tokens", msg("Tokens and App passwords")],
 | 
					 | 
				
			||||||
                ["/flow/stages/invitations", msg("Invitations")]]],
 | 
					 | 
				
			||||||
            [null, msg("System"), null, [
 | 
					 | 
				
			||||||
                ["/core/brands", msg("Brands")],
 | 
					 | 
				
			||||||
                ["/crypto/certificates", msg("Certificates")],
 | 
					 | 
				
			||||||
                ["/outpost/integrations", msg("Outpost Integrations")],
 | 
					 | 
				
			||||||
                ["/admin/settings", msg("Settings")]]],
 | 
					 | 
				
			||||||
        ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Typescript requires the type here to correctly type the recursive path
 | 
					 | 
				
			||||||
        type SidebarRenderer = (_: SidebarEntry) => TemplateResult;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const renderOneSidebarItem: SidebarRenderer = ([path, label, attributes, children]) => {
 | 
					 | 
				
			||||||
            const properties = Array.isArray(attributes)
 | 
					 | 
				
			||||||
                ? { ".activeWhen": attributes }
 | 
					 | 
				
			||||||
                : (attributes ?? {});
 | 
					 | 
				
			||||||
            if (path) {
 | 
					 | 
				
			||||||
                properties.path = path;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return html`<ak-sidebar-item ${spread(properties)}>
 | 
					 | 
				
			||||||
                ${label ? html`<span slot="label">${label}</span>` : nothing}
 | 
					 | 
				
			||||||
                ${map(children, renderOneSidebarItem)}
 | 
					 | 
				
			||||||
            </ak-sidebar-item>`;
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // prettier-ignore
 | 
					 | 
				
			||||||
        return html`
 | 
					 | 
				
			||||||
            ${map(sidebarContent, renderOneSidebarItem)}
 | 
					 | 
				
			||||||
            ${this.renderEnterpriseMenu()}
 | 
					 | 
				
			||||||
        `;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    renderEnterpriseMenu() {
 | 
					 | 
				
			||||||
        return this.can(CapabilitiesEnum.IsEnterprise)
 | 
					 | 
				
			||||||
            ? html`
 | 
					 | 
				
			||||||
                  <ak-sidebar-item>
 | 
					 | 
				
			||||||
                      <span slot="label">${msg("Enterprise")}</span>
 | 
					 | 
				
			||||||
                      <ak-sidebar-item path="/enterprise/licenses">
 | 
					 | 
				
			||||||
                          <span slot="label">${msg("Licenses")}</span>
 | 
					 | 
				
			||||||
                      </ak-sidebar-item>
 | 
					 | 
				
			||||||
                  </ak-sidebar-item>
 | 
					 | 
				
			||||||
              `
 | 
					 | 
				
			||||||
            : nothing;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare global {
 | 
					/**
 | 
				
			||||||
    interface HTMLElementTagNameMap {
 | 
					 * Recursively renders a collection of sidebar entries.
 | 
				
			||||||
        "ak-admin-sidebar": AkAdminSidebar;
 | 
					 */
 | 
				
			||||||
    }
 | 
					export function renderSidebarItems(entries: readonly SidebarEntry[]) {
 | 
				
			||||||
 | 
					    return repeat(entries, ([path, label]) => path || label, renderSidebarItem);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// prettier-ignore
 | 
				
			||||||
 | 
					export const AdminSidebarEntries: readonly SidebarEntry[] = [
 | 
				
			||||||
 | 
					    [null, msg("Dashboards"), { "?expanded": true }, [
 | 
				
			||||||
 | 
					        ["/administration/overview", msg("Overview")],
 | 
				
			||||||
 | 
					        ["/administration/dashboard/users", msg("User Statistics")],
 | 
				
			||||||
 | 
					        ["/administration/system-tasks", msg("System Tasks")]]
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    [null, msg("Applications"), null, [
 | 
				
			||||||
 | 
					        ["/core/applications", msg("Applications"), [`^/core/applications/(?<slug>${SLUG_REGEX})$`]],
 | 
				
			||||||
 | 
					        ["/core/providers", msg("Providers"), [`^/core/providers/(?<id>${ID_REGEX})$`]],
 | 
				
			||||||
 | 
					        ["/outpost/outposts", msg("Outposts")]]
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    [null, msg("Events"), null, [
 | 
				
			||||||
 | 
					        ["/events/log", msg("Logs"), [`^/events/log/(?<id>${UUID_REGEX})$`]],
 | 
				
			||||||
 | 
					        ["/events/rules", msg("Notification Rules")],
 | 
				
			||||||
 | 
					        ["/events/transports", msg("Notification Transports")]]
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    [null, msg("Customization"), null, [
 | 
				
			||||||
 | 
					        ["/policy/policies", msg("Policies")],
 | 
				
			||||||
 | 
					        ["/core/property-mappings", msg("Property Mappings")],
 | 
				
			||||||
 | 
					        ["/blueprints/instances", msg("Blueprints")],
 | 
				
			||||||
 | 
					        ["/policy/reputation", msg("Reputation scores")]]
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    [null, msg("Flows and Stages"), null, [
 | 
				
			||||||
 | 
					        ["/flow/flows", msg("Flows"), [`^/flow/flows/(?<slug>${SLUG_REGEX})$`]],
 | 
				
			||||||
 | 
					        ["/flow/stages", msg("Stages")],
 | 
				
			||||||
 | 
					        ["/flow/stages/prompts", msg("Prompts")]]
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    [null, msg("Directory"), null, [
 | 
				
			||||||
 | 
					        ["/identity/users", msg("Users"), [`^/identity/users/(?<id>${ID_REGEX})$`]],
 | 
				
			||||||
 | 
					        ["/identity/groups", msg("Groups"), [`^/identity/groups/(?<id>${UUID_REGEX})$`]],
 | 
				
			||||||
 | 
					        ["/identity/roles", msg("Roles"), [`^/identity/roles/(?<id>${UUID_REGEX})$`]],
 | 
				
			||||||
 | 
					        ["/identity/initial-permissions", msg("Initial Permissions"), [`^/identity/initial-permissions/(?<id>${ID_REGEX})$`]],
 | 
				
			||||||
 | 
					        ["/core/sources", msg("Federation and Social login"), [`^/core/sources/(?<slug>${SLUG_REGEX})$`]],
 | 
				
			||||||
 | 
					        ["/core/tokens", msg("Tokens and App passwords")],
 | 
				
			||||||
 | 
					        ["/flow/stages/invitations", msg("Invitations")]]
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    [null, msg("System"), null, [
 | 
				
			||||||
 | 
					        ["/core/brands", msg("Brands")],
 | 
				
			||||||
 | 
					        ["/crypto/certificates", msg("Certificates")],
 | 
				
			||||||
 | 
					        ["/outpost/integrations", msg("Outpost Integrations")],
 | 
				
			||||||
 | 
					        ["/admin/settings", msg("Settings")]]
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// prettier-ignore
 | 
				
			||||||
 | 
					export const AdminSidebarEnterpriseEntries: readonly SidebarEntry[] = [
 | 
				
			||||||
 | 
					    [null, msg("Enterprise"), null, [
 | 
				
			||||||
 | 
					        ["/enterprise/licenses", msg("Licenses"), null]
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					]]
 | 
				
			||||||
 | 
				
			|||||||
@ -4,13 +4,17 @@ import { ROUTES } from "@goauthentik/admin/Routes";
 | 
				
			|||||||
import {
 | 
					import {
 | 
				
			||||||
    EVENT_API_DRAWER_TOGGLE,
 | 
					    EVENT_API_DRAWER_TOGGLE,
 | 
				
			||||||
    EVENT_NOTIFICATION_DRAWER_TOGGLE,
 | 
					    EVENT_NOTIFICATION_DRAWER_TOGGLE,
 | 
				
			||||||
 | 
					    EVENT_SIDEBAR_TOGGLE,
 | 
				
			||||||
} from "@goauthentik/common/constants";
 | 
					} from "@goauthentik/common/constants";
 | 
				
			||||||
import { configureSentry } from "@goauthentik/common/sentry";
 | 
					import { configureSentry } from "@goauthentik/common/sentry";
 | 
				
			||||||
import { me } from "@goauthentik/common/users";
 | 
					import { me } from "@goauthentik/common/users";
 | 
				
			||||||
import { WebsocketClient } from "@goauthentik/common/ws";
 | 
					import { WebsocketClient } from "@goauthentik/common/ws";
 | 
				
			||||||
import { AuthenticatedInterface } from "@goauthentik/elements/Interface";
 | 
					import { AuthenticatedInterface } from "@goauthentik/elements/Interface";
 | 
				
			||||||
 | 
					import { WithLicenseSummary } from "@goauthentik/elements/Interface/licenseSummaryProvider.js";
 | 
				
			||||||
import "@goauthentik/elements/ak-locale-context";
 | 
					import "@goauthentik/elements/ak-locale-context";
 | 
				
			||||||
import "@goauthentik/elements/banner/EnterpriseStatusBanner";
 | 
					import "@goauthentik/elements/banner/EnterpriseStatusBanner";
 | 
				
			||||||
 | 
					import "@goauthentik/elements/banner/EnterpriseStatusBanner";
 | 
				
			||||||
 | 
					import "@goauthentik/elements/banner/VersionBanner";
 | 
				
			||||||
import "@goauthentik/elements/banner/VersionBanner";
 | 
					import "@goauthentik/elements/banner/VersionBanner";
 | 
				
			||||||
import "@goauthentik/elements/messages/MessageContainer";
 | 
					import "@goauthentik/elements/messages/MessageContainer";
 | 
				
			||||||
import "@goauthentik/elements/messages/MessageContainer";
 | 
					import "@goauthentik/elements/messages/MessageContainer";
 | 
				
			||||||
@ -21,25 +25,32 @@ import "@goauthentik/elements/router/RouterOutlet";
 | 
				
			|||||||
import "@goauthentik/elements/sidebar/Sidebar";
 | 
					import "@goauthentik/elements/sidebar/Sidebar";
 | 
				
			||||||
import "@goauthentik/elements/sidebar/SidebarItem";
 | 
					import "@goauthentik/elements/sidebar/SidebarItem";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { CSSResult, TemplateResult, css, html } from "lit";
 | 
					import { CSSResult, TemplateResult, css, html, nothing } from "lit";
 | 
				
			||||||
import { customElement, property, query, state } from "lit/decorators.js";
 | 
					import { customElement, property, query, state } from "lit/decorators.js";
 | 
				
			||||||
import { classMap } from "lit/directives/class-map.js";
 | 
					import { classMap } from "lit/directives/class-map.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import PFButton from "@patternfly/patternfly/components/Button/button.css";
 | 
					import PFButton from "@patternfly/patternfly/components/Button/button.css";
 | 
				
			||||||
import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css";
 | 
					import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css";
 | 
				
			||||||
 | 
					import PFNav from "@patternfly/patternfly/components/Nav/nav.css";
 | 
				
			||||||
import PFPage from "@patternfly/patternfly/components/Page/page.css";
 | 
					import PFPage from "@patternfly/patternfly/components/Page/page.css";
 | 
				
			||||||
import PFBase from "@patternfly/patternfly/patternfly-base.css";
 | 
					import PFBase from "@patternfly/patternfly/patternfly-base.css";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { SessionUser, UiThemeEnum } from "@goauthentik/api";
 | 
					import { LicenseSummaryStatusEnum, SessionUser, UiThemeEnum } from "@goauthentik/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "./AdminSidebar";
 | 
					import {
 | 
				
			||||||
 | 
					    AdminSidebarEnterpriseEntries,
 | 
				
			||||||
 | 
					    AdminSidebarEntries,
 | 
				
			||||||
 | 
					    renderSidebarItems,
 | 
				
			||||||
 | 
					} from "./AdminSidebar.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (process.env.NODE_ENV === "development") {
 | 
					if (process.env.NODE_ENV === "development") {
 | 
				
			||||||
    await import("@goauthentik/esbuild-plugin-live-reload/client");
 | 
					    await import("@goauthentik/esbuild-plugin-live-reload/client");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@customElement("ak-interface-admin")
 | 
					@customElement("ak-interface-admin")
 | 
				
			||||||
export class AdminInterface extends AuthenticatedInterface {
 | 
					export class AdminInterface extends WithLicenseSummary(AuthenticatedInterface) {
 | 
				
			||||||
 | 
					    //#region Properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property({ type: Boolean })
 | 
					    @property({ type: Boolean })
 | 
				
			||||||
    notificationDrawerOpen = getURLParam("notificationDrawerOpen", false);
 | 
					    notificationDrawerOpen = getURLParam("notificationDrawerOpen", false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -54,12 +65,29 @@ export class AdminInterface extends AuthenticatedInterface {
 | 
				
			|||||||
    @query("ak-about-modal")
 | 
					    @query("ak-about-modal")
 | 
				
			||||||
    aboutModal?: AboutModal;
 | 
					    aboutModal?: AboutModal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property({ type: Boolean, reflect: true })
 | 
				
			||||||
 | 
					    public sidebarOpen: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #toggleSidebar = () => {
 | 
				
			||||||
 | 
					        this.sidebarOpen = !this.sidebarOpen;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #sidebarMatcher: MediaQueryList;
 | 
				
			||||||
 | 
					    #sidebarListener = (event: MediaQueryListEvent) => {
 | 
				
			||||||
 | 
					        this.sidebarOpen = event.matches;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //#region Styles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static get styles(): CSSResult[] {
 | 
					    static get styles(): CSSResult[] {
 | 
				
			||||||
        return [
 | 
					        return [
 | 
				
			||||||
            PFBase,
 | 
					            PFBase,
 | 
				
			||||||
            PFPage,
 | 
					            PFPage,
 | 
				
			||||||
            PFButton,
 | 
					            PFButton,
 | 
				
			||||||
            PFDrawer,
 | 
					            PFDrawer,
 | 
				
			||||||
 | 
					            PFNav,
 | 
				
			||||||
            css`
 | 
					            css`
 | 
				
			||||||
                .pf-c-page__main,
 | 
					                .pf-c-page__main,
 | 
				
			||||||
                .pf-c-drawer__content,
 | 
					                .pf-c-drawer__content,
 | 
				
			||||||
@ -67,23 +95,30 @@ export class AdminInterface extends AuthenticatedInterface {
 | 
				
			|||||||
                    z-index: auto !important;
 | 
					                    z-index: auto !important;
 | 
				
			||||||
                    background-color: transparent;
 | 
					                    background-color: transparent;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                .display-none {
 | 
					                .display-none {
 | 
				
			||||||
                    display: none;
 | 
					                    display: none;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                .pf-c-page {
 | 
					                .pf-c-page {
 | 
				
			||||||
                    background-color: var(--pf-c-page--BackgroundColor) !important;
 | 
					                    background-color: var(--pf-c-page--BackgroundColor) !important;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                /* Global page background colour */
 | 
					
 | 
				
			||||||
                :host([theme="dark"]) .pf-c-page {
 | 
					                :host([theme="dark"]) {
 | 
				
			||||||
                    --pf-c-page--BackgroundColor: var(--ak-dark-background);
 | 
					                    /* Global page background colour */
 | 
				
			||||||
 | 
					                    .pf-c-page {
 | 
				
			||||||
 | 
					                        --pf-c-page--BackgroundColor: var(--ak-dark-background);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                ak-enterprise-status,
 | 
					
 | 
				
			||||||
                ak-version-banner {
 | 
					                ak-page-navbar {
 | 
				
			||||||
                    grid-area: header;
 | 
					                    grid-area: header;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                ak-admin-sidebar {
 | 
					
 | 
				
			||||||
 | 
					                .ak-sidebar {
 | 
				
			||||||
                    grid-area: nav;
 | 
					                    grid-area: nav;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                .pf-c-drawer__panel {
 | 
					                .pf-c-drawer__panel {
 | 
				
			||||||
                    z-index: var(--pf-global--ZIndex--xl);
 | 
					                    z-index: var(--pf-global--ZIndex--xl);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -91,10 +126,23 @@ export class AdminInterface extends AuthenticatedInterface {
 | 
				
			|||||||
        ];
 | 
					        ];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //#region Lifecycle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor() {
 | 
					    constructor() {
 | 
				
			||||||
        super();
 | 
					        super();
 | 
				
			||||||
        this.ws = new WebsocketClient();
 | 
					        this.ws = new WebsocketClient();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.#sidebarMatcher = window.matchMedia("(min-width: 1200px)");
 | 
				
			||||||
 | 
					        this.sidebarOpen = this.#sidebarMatcher.matches;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public connectedCallback() {
 | 
				
			||||||
 | 
					        super.connectedCallback();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        window.addEventListener(EVENT_SIDEBAR_TOGGLE, this.#toggleSidebar);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        window.addEventListener(EVENT_NOTIFICATION_DRAWER_TOGGLE, () => {
 | 
					        window.addEventListener(EVENT_NOTIFICATION_DRAWER_TOGGLE, () => {
 | 
				
			||||||
            this.notificationDrawerOpen = !this.notificationDrawerOpen;
 | 
					            this.notificationDrawerOpen = !this.notificationDrawerOpen;
 | 
				
			||||||
            updateURLParams({
 | 
					            updateURLParams({
 | 
				
			||||||
@ -108,6 +156,14 @@ export class AdminInterface extends AuthenticatedInterface {
 | 
				
			|||||||
                apiDrawerOpen: this.apiDrawerOpen,
 | 
					                apiDrawerOpen: this.apiDrawerOpen,
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.#sidebarMatcher.addEventListener("change", this.#sidebarListener);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public disconnectedCallback(): void {
 | 
				
			||||||
 | 
					        super.disconnectedCallback();
 | 
				
			||||||
 | 
					        window.removeEventListener(EVENT_SIDEBAR_TOGGLE, this.#toggleSidebar);
 | 
				
			||||||
 | 
					        this.#sidebarMatcher.removeEventListener("change", this.#sidebarListener);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async firstUpdated(): Promise<void> {
 | 
					    async firstUpdated(): Promise<void> {
 | 
				
			||||||
@ -118,6 +174,7 @@ export class AdminInterface extends AuthenticatedInterface {
 | 
				
			|||||||
            this.user.user.isSuperuser ||
 | 
					            this.user.user.isSuperuser ||
 | 
				
			||||||
            // TODO: somehow add `access_admin_interface` to the API schema
 | 
					            // TODO: somehow add `access_admin_interface` to the API schema
 | 
				
			||||||
            this.user.user.systemPermissions.includes("access_admin_interface");
 | 
					            this.user.user.systemPermissions.includes("access_admin_interface");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!canAccessAdmin && this.user.user.pk > 0) {
 | 
					        if (!canAccessAdmin && this.user.user.pk > 0) {
 | 
				
			||||||
            window.location.assign("/if/user/");
 | 
					            window.location.assign("/if/user/");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -125,10 +182,14 @@ export class AdminInterface extends AuthenticatedInterface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    render(): TemplateResult {
 | 
					    render(): TemplateResult {
 | 
				
			||||||
        const sidebarClasses = {
 | 
					        const sidebarClasses = {
 | 
				
			||||||
 | 
					            "pf-c-page__sidebar": true,
 | 
				
			||||||
            "pf-m-light": this.activeTheme === UiThemeEnum.Light,
 | 
					            "pf-m-light": this.activeTheme === UiThemeEnum.Light,
 | 
				
			||||||
 | 
					            "pf-m-expanded": this.sidebarOpen,
 | 
				
			||||||
 | 
					            "pf-m-collapsed": !this.sidebarOpen,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const drawerOpen = this.notificationDrawerOpen || this.apiDrawerOpen;
 | 
					        const drawerOpen = this.notificationDrawerOpen || this.apiDrawerOpen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const drawerClasses = {
 | 
					        const drawerClasses = {
 | 
				
			||||||
            "pf-m-expanded": drawerOpen,
 | 
					            "pf-m-expanded": drawerOpen,
 | 
				
			||||||
            "pf-m-collapsed": !drawerOpen,
 | 
					            "pf-m-collapsed": !drawerOpen,
 | 
				
			||||||
@ -136,11 +197,18 @@ export class AdminInterface extends AuthenticatedInterface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return html` <ak-locale-context>
 | 
					        return html` <ak-locale-context>
 | 
				
			||||||
            <div class="pf-c-page">
 | 
					            <div class="pf-c-page">
 | 
				
			||||||
                <ak-enterprise-status interface="admin"></ak-enterprise-status>
 | 
					                <ak-page-navbar>
 | 
				
			||||||
                <ak-version-banner></ak-version-banner>
 | 
					                    <ak-version-banner></ak-version-banner>
 | 
				
			||||||
                <ak-admin-sidebar
 | 
					                    <ak-enterprise-status interface="admin"></ak-enterprise-status>
 | 
				
			||||||
                    class="pf-c-page__sidebar ${classMap(sidebarClasses)}"
 | 
					                </ak-page-navbar>
 | 
				
			||||||
                ></ak-admin-sidebar>
 | 
					
 | 
				
			||||||
 | 
					                <ak-sidebar class="${classMap(sidebarClasses)}">
 | 
				
			||||||
 | 
					                    ${renderSidebarItems(AdminSidebarEntries)}
 | 
				
			||||||
 | 
					                    ${this.licenseSummary?.status !== LicenseSummaryStatusEnum.Unlicensed
 | 
				
			||||||
 | 
					                        ? renderSidebarItems(AdminSidebarEnterpriseEntries)
 | 
				
			||||||
 | 
					                        : nothing}
 | 
				
			||||||
 | 
					                </ak-sidebar>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                <div class="pf-c-page__drawer">
 | 
					                <div class="pf-c-page__drawer">
 | 
				
			||||||
                    <div class="pf-c-drawer ${classMap(drawerClasses)}">
 | 
					                    <div class="pf-c-drawer ${classMap(drawerClasses)}">
 | 
				
			||||||
                        <div class="pf-c-drawer__main">
 | 
					                        <div class="pf-c-drawer__main">
 | 
				
			||||||
@ -1,5 +0,0 @@
 | 
				
			|||||||
import { AdminInterface } from "./AdminInterface";
 | 
					 | 
				
			||||||
import "./AdminInterface";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export { AdminInterface };
 | 
					 | 
				
			||||||
export default AdminInterface;
 | 
					 | 
				
			||||||
@ -94,10 +94,13 @@ export class AdminOverviewPage extends AdminOverviewBase {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render(): TemplateResult {
 | 
					    render(): TemplateResult {
 | 
				
			||||||
        const name = this.user?.user.name ?? this.user?.user.username;
 | 
					        const username = this.user?.user.name || this.user?.user.username;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return html`<ak-page-header description=${msg("General system status")} ?hasIcon=${false}>
 | 
					        return html` <ak-page-header
 | 
				
			||||||
                <span slot="header"> ${msg(str`Welcome, ${name || ""}.`)} </span>
 | 
					                header=${msg(str`Welcome, ${username || ""}.`)}
 | 
				
			||||||
 | 
					                description=${msg("General system status")}
 | 
				
			||||||
 | 
					                ?hasIcon=${false}
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
            </ak-page-header>
 | 
					            </ak-page-header>
 | 
				
			||||||
            <section class="pf-c-page__main-section">
 | 
					            <section class="pf-c-page__main-section">
 | 
				
			||||||
                <div class="pf-l-grid pf-m-gutter">
 | 
					                <div class="pf-l-grid pf-m-gutter">
 | 
				
			||||||
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user