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 |  | ||||||
|  | |||||||
							
								
								
									
										12647
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12647
									
								
								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, { |         return target; | ||||||
|                     define: definitions, |     }); | ||||||
|  |  | ||||||
|  |     console.groupEnd(); | ||||||
|  |  | ||||||
|  |     const buildOptions = createESBuildOptions({ | ||||||
|  |         entryPoints, | ||||||
|         plugins: [ |         plugins: [ | ||||||
|             liveReloadPlugin({ |             liveReloadPlugin({ | ||||||
|                             logPrefix: `Build Observer (${entryPoint[1]})`, |                 relativeRoot: PackageRoot, | ||||||
|                             relativeRoot: path.join(__dirname, ".."), |  | ||||||
|             }), |             }), | ||||||
|         ], |         ], | ||||||
|                 }), |     }); | ||||||
|             ); |  | ||||||
|         }), |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
|     await Promise.all(buildContexts.map((context) => context.rebuild())); |     const buildContext = await esbuild.context(buildOptions); | ||||||
|  |  | ||||||
|     await Promise.allSettled(buildContexts.map((context) => context.watch())); |     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,7 +227,10 @@ async function delegateCommand() { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| await delegateCommand() | await cleanDistDirectory() | ||||||
|  |     // --- | ||||||
|  |     .then(() => | ||||||
|  |         delegateCommand() | ||||||
|             .then(() => { |             .then(() => { | ||||||
|                 console.log("Build complete"); |                 console.log("Build complete"); | ||||||
|                 process.exit(0); |                 process.exit(0); | ||||||
| @ -292,4 +238,5 @@ await delegateCommand() | |||||||
|             .catch((error) => { |             .catch((error) => { | ||||||
|                 console.error(error); |                 console.error(error); | ||||||
|                 process.exit(1); |                 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,100 +1,10 @@ | |||||||
| 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"; |  | ||||||
| import type { SessionUser, UserSelf } from "@goauthentik/api"; |  | ||||||
|  |  | ||||||
| @customElement("ak-admin-sidebar") |  | ||||||
| export class AkAdminSidebar extends WithCapabilitiesConfig(WithVersion(AKElement)) { |  | ||||||
|     @property({ type: Boolean, reflect: true }) |  | ||||||
|     open = true; |  | ||||||
|  |  | ||||||
|     @state() |  | ||||||
|     impersonation: UserSelf["username"] | null = null; |  | ||||||
|  |  | ||||||
|     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 |  | ||||||
|     // needed. |  | ||||||
|     toggleOpen() { |  | ||||||
|         this.open = !this.open; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     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 | // The second attribute type is of string[] to help with the 'activeWhen' control, which was | ||||||
| // commonplace and singular enough to merit its own handler. | // commonplace and singular enough to merit its own handler. | ||||||
| type SidebarEntry = [ | type SidebarEntry = [ | ||||||
| @ -104,29 +14,64 @@ export class AkAdminSidebar extends WithCapabilitiesConfig(WithVersion(AKElement | |||||||
|     children?: SidebarEntry[], |     children?: SidebarEntry[], | ||||||
| ]; | ]; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Recursively renders a sidebar entry. | ||||||
|  |  */ | ||||||
|  | export function renderSidebarItem([ | ||||||
|  |     path, | ||||||
|  |     label, | ||||||
|  |     attributes, | ||||||
|  |     children, | ||||||
|  | ]: SidebarEntry): TemplateResult { | ||||||
|  |     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} | ||||||
|  |         ${children ? renderSidebarItems(children) : nothing} | ||||||
|  |     </ak-sidebar-item>`; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Recursively renders a collection of sidebar entries. | ||||||
|  |  */ | ||||||
|  | export function renderSidebarItems(entries: readonly SidebarEntry[]) { | ||||||
|  |     return repeat(entries, ([path, label]) => path || label, renderSidebarItem); | ||||||
|  | } | ||||||
|  |  | ||||||
| // prettier-ignore | // prettier-ignore | ||||||
|         const sidebarContent: SidebarEntry[] = [ | export const AdminSidebarEntries: readonly SidebarEntry[] = [ | ||||||
|     [null, msg("Dashboards"), { "?expanded": true }, [ |     [null, msg("Dashboards"), { "?expanded": true }, [ | ||||||
|         ["/administration/overview", msg("Overview")], |         ["/administration/overview", msg("Overview")], | ||||||
|         ["/administration/dashboard/users", msg("User Statistics")], |         ["/administration/dashboard/users", msg("User Statistics")], | ||||||
|                 ["/administration/system-tasks", msg("System Tasks")]]], |         ["/administration/system-tasks", msg("System Tasks")]] | ||||||
|  |     ], | ||||||
|     [null, msg("Applications"), null, [ |     [null, msg("Applications"), null, [ | ||||||
|         ["/core/applications", msg("Applications"), [`^/core/applications/(?<slug>${SLUG_REGEX})$`]], |         ["/core/applications", msg("Applications"), [`^/core/applications/(?<slug>${SLUG_REGEX})$`]], | ||||||
|         ["/core/providers", msg("Providers"), [`^/core/providers/(?<id>${ID_REGEX})$`]], |         ["/core/providers", msg("Providers"), [`^/core/providers/(?<id>${ID_REGEX})$`]], | ||||||
|                 ["/outpost/outposts", msg("Outposts")]]], |         ["/outpost/outposts", msg("Outposts")]] | ||||||
|  |     ], | ||||||
|     [null, msg("Events"), null, [ |     [null, msg("Events"), null, [ | ||||||
|         ["/events/log", msg("Logs"), [`^/events/log/(?<id>${UUID_REGEX})$`]], |         ["/events/log", msg("Logs"), [`^/events/log/(?<id>${UUID_REGEX})$`]], | ||||||
|         ["/events/rules", msg("Notification Rules")], |         ["/events/rules", msg("Notification Rules")], | ||||||
|                 ["/events/transports", msg("Notification Transports")]]], |         ["/events/transports", msg("Notification Transports")]] | ||||||
|  |     ], | ||||||
|     [null, msg("Customization"), null, [ |     [null, msg("Customization"), null, [ | ||||||
|         ["/policy/policies", msg("Policies")], |         ["/policy/policies", msg("Policies")], | ||||||
|         ["/core/property-mappings", msg("Property Mappings")], |         ["/core/property-mappings", msg("Property Mappings")], | ||||||
|         ["/blueprints/instances", msg("Blueprints")], |         ["/blueprints/instances", msg("Blueprints")], | ||||||
|                 ["/policy/reputation", msg("Reputation scores")]]], |         ["/policy/reputation", msg("Reputation scores")]] | ||||||
|  |     ], | ||||||
|     [null, msg("Flows and Stages"), null, [ |     [null, msg("Flows and Stages"), null, [ | ||||||
|         ["/flow/flows", msg("Flows"), [`^/flow/flows/(?<slug>${SLUG_REGEX})$`]], |         ["/flow/flows", msg("Flows"), [`^/flow/flows/(?<slug>${SLUG_REGEX})$`]], | ||||||
|         ["/flow/stages", msg("Stages")], |         ["/flow/stages", msg("Stages")], | ||||||
|                 ["/flow/stages/prompts", msg("Prompts")]]], |         ["/flow/stages/prompts", msg("Prompts")]] | ||||||
|  |     ], | ||||||
|     [null, msg("Directory"), null, [ |     [null, msg("Directory"), null, [ | ||||||
|         ["/identity/users", msg("Users"), [`^/identity/users/(?<id>${ID_REGEX})$`]], |         ["/identity/users", msg("Users"), [`^/identity/users/(?<id>${ID_REGEX})$`]], | ||||||
|         ["/identity/groups", msg("Groups"), [`^/identity/groups/(?<id>${UUID_REGEX})$`]], |         ["/identity/groups", msg("Groups"), [`^/identity/groups/(?<id>${UUID_REGEX})$`]], | ||||||
| @ -134,53 +79,19 @@ export class AkAdminSidebar extends WithCapabilitiesConfig(WithVersion(AKElement | |||||||
|         ["/identity/initial-permissions", msg("Initial Permissions"), [`^/identity/initial-permissions/(?<id>${ID_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/sources", msg("Federation and Social login"), [`^/core/sources/(?<slug>${SLUG_REGEX})$`]], | ||||||
|         ["/core/tokens", msg("Tokens and App passwords")], |         ["/core/tokens", msg("Tokens and App passwords")], | ||||||
|                 ["/flow/stages/invitations", msg("Invitations")]]], |         ["/flow/stages/invitations", msg("Invitations")]] | ||||||
|  |     ], | ||||||
|     [null, msg("System"), null, [ |     [null, msg("System"), null, [ | ||||||
|         ["/core/brands", msg("Brands")], |         ["/core/brands", msg("Brands")], | ||||||
|         ["/crypto/certificates", msg("Certificates")], |         ["/crypto/certificates", msg("Certificates")], | ||||||
|         ["/outpost/integrations", msg("Outpost Integrations")], |         ["/outpost/integrations", msg("Outpost Integrations")], | ||||||
|                 ["/admin/settings", msg("Settings")]]], |         ["/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 | // prettier-ignore | ||||||
|         return html` | export const AdminSidebarEnterpriseEntries: readonly SidebarEntry[] = [ | ||||||
|             ${map(sidebarContent, renderOneSidebarItem)} |     [null, msg("Enterprise"), null, [ | ||||||
|             ${this.renderEnterpriseMenu()} |         ["/enterprise/licenses", msg("Licenses"), null] | ||||||
|         `; |     ], | ||||||
|     } | ]] | ||||||
|  |  | ||||||
|     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 { |  | ||||||
|         "ak-admin-sidebar": AkAdminSidebar; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -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; | ||||||
|                 } |                 } | ||||||
|  | 
 | ||||||
|  |                 :host([theme="dark"]) { | ||||||
|                     /* Global page background colour */ |                     /* Global page background colour */ | ||||||
|                 :host([theme="dark"]) .pf-c-page { |                     .pf-c-page { | ||||||
|                         --pf-c-page--BackgroundColor: var(--ak-dark-background); |                         --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
	