diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 6d7176b3c..f78e67f49 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 2023.10.3 +current_version = 2023.10.4 tag = True commit = True parse = (?P\d+)\.(?P\d+)\.(?P\d+) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index a52a79bf7..6e5bd99e6 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -2,7 +2,7 @@ name: "Setup authentik testing environment" description: "Setup authentik testing environment" inputs: - postgresql_tag: + postgresql_version: description: "Optional postgresql image tag" default: "12" @@ -33,9 +33,8 @@ runs: - name: Setup dependencies shell: bash run: | - export PSQL_TAG=${{ inputs.postgresql_tag }} + export PSQL_TAG=${{ inputs.postgresql_version }} docker-compose -f .github/actions/setup/docker-compose.yml up -d - poetry env use python3.11 poetry install cd web && npm ci - name: Generate config diff --git a/.github/workflows/ci-main.yml b/.github/workflows/ci-main.yml index 2eebe378f..26baa3556 100644 --- a/.github/workflows/ci-main.yml +++ b/.github/workflows/ci-main.yml @@ -48,25 +48,38 @@ jobs: - name: run migrations run: poetry run python -m lifecycle.migrate test-migrations-from-stable: + name: test-migrations-from-stable - PostgreSQL ${{ matrix.psql }} runs-on: ubuntu-latest - continue-on-error: true + strategy: + fail-fast: false + matrix: + psql: + - 12-alpine + - 15-alpine + - 16-alpine steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup authentik env uses: ./.github/actions/setup + with: + postgresql_version: ${{ matrix.psql }} - name: checkout stable run: | + # Delete all poetry envs + rm -rf /home/runner/.cache/pypoetry # Copy current, latest config to local cp authentik/lib/default.yml local.env.yml cp -R .github .. cp -R scripts .. - git checkout $(git describe --tags $(git rev-list --tags --max-count=1)) + git checkout version/$(python -c "from authentik import __version__; print(__version__)") rm -rf .github/ scripts/ mv ../.github ../scripts . - name: Setup authentik env (ensure stable deps are installed) uses: ./.github/actions/setup + with: + postgresql_version: ${{ matrix.psql }} - name: run migrations to stable run: poetry run python -m lifecycle.migrate - name: checkout current code @@ -76,9 +89,13 @@ jobs: git reset --hard HEAD git clean -d -fx . git checkout $GITHUB_SHA + # Delete previous poetry env + rm -rf $(poetry env info --path) poetry install - name: Setup authentik env (ensure latest deps are installed) uses: ./.github/actions/setup + with: + postgresql_version: ${{ matrix.psql }} - name: migrate to latest run: poetry run python -m lifecycle.migrate test-unittest: @@ -97,7 +114,7 @@ jobs: - name: Setup authentik env uses: ./.github/actions/setup with: - postgresql_tag: ${{ matrix.psql }} + postgresql_version: ${{ matrix.psql }} - name: run unittest run: | poetry run make test @@ -117,7 +134,7 @@ jobs: uses: helm/kind-action@v1.8.0 - name: run integration run: | - poetry run coverage run manage.py test --randomly-seed=2100196988 tests/integration + poetry run coverage run manage.py test tests/integration poetry run coverage xml - if: ${{ always() }} uses: codecov/codecov-action@v3 diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 625e45489..dd280d682 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -14,6 +14,7 @@ "ms-python.pylint", "ms-python.python", "ms-python.vscode-pylance", + "ms-python.black-formatter", "redhat.vscode-yaml", "Tobermory.es6-string-html", "unifiedjs.vscode-mdx", diff --git a/.vscode/settings.json b/.vscode/settings.json index e674c02b5..218800d1e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -19,10 +19,8 @@ "slo", "scim", ], - "python.linting.pylintEnabled": true, "todo-tree.tree.showCountsInTree": true, "todo-tree.tree.showBadges": true, - "python.formatting.provider": "black", "yaml.customTags": [ "!Find sequence", "!KeyOf scalar", diff --git a/Dockerfile b/Dockerfile index 3d0e27c6c..6db21c26f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -81,7 +81,7 @@ RUN --mount=type=secret,id=GEOIPUPDATE_ACCOUNT_ID \ /bin/sh -c "/usr/bin/entry.sh || echo 'Failed to get GeoIP database, disabling'; exit 0" # Stage 5: Python dependencies -FROM docker.io/python:3.11.5-bookworm AS python-deps +FROM docker.io/python:3.12.0-slim-bookworm AS python-deps WORKDIR /ak-root/poetry @@ -104,7 +104,7 @@ RUN --mount=type=bind,target=./pyproject.toml,src=./pyproject.toml \ poetry install --only=main --no-ansi --no-interaction # Stage 6: Run -FROM docker.io/python:3.11.5-slim-bookworm AS final-image +FROM docker.io/python:3.12.0-slim-bookworm AS final-image ARG GIT_BUILD_HASH ARG VERSION diff --git a/authentik/__init__.py b/authentik/__init__.py index 09916d0e2..fc368ceeb 100644 --- a/authentik/__init__.py +++ b/authentik/__init__.py @@ -2,7 +2,7 @@ from os import environ from typing import Optional -__version__ = "2023.10.3" +__version__ = "2023.10.4" ENV_GIT_HASH_KEY = "GIT_BUILD_HASH" diff --git a/authentik/core/models.py b/authentik/core/models.py index 59a590d81..75706c20e 100644 --- a/authentik/core/models.py +++ b/authentik/core/models.py @@ -517,7 +517,7 @@ class Source(ManagedModel, SerializerModel, PolicyBindingModel): objects = InheritanceManager() @property - def get_icon(self) -> Optional[str]: + def icon_url(self) -> Optional[str]: """Get the URL to the Icon. If the name is /static or starts with http it is returned as-is""" if not self.icon: diff --git a/authentik/events/models.py b/authentik/events/models.py index 56cb75f7d..35d2c1cbc 100644 --- a/authentik/events/models.py +++ b/authentik/events/models.py @@ -217,6 +217,7 @@ class Event(SerializerModel, ExpiringModel): "path": request.path, "method": request.method, "args": cleanse_dict(QueryDict(request.META.get("QUERY_STRING", ""))), + "user_agent": request.META.get("HTTP_USER_AGENT", ""), } # Special case for events created during flow execution # since they keep the http query within a wrapped query diff --git a/authentik/events/tests/test_event.py b/authentik/events/tests/test_event.py index b23daa0ca..2ca49ab32 100644 --- a/authentik/events/tests/test_event.py +++ b/authentik/events/tests/test_event.py @@ -53,7 +53,15 @@ class TestEvents(TestCase): """Test plain from_http""" event = Event.new("unittest").from_http(self.factory.get("/")) self.assertEqual( - event.context, {"http_request": {"args": {}, "method": "GET", "path": "/"}} + event.context, + { + "http_request": { + "args": {}, + "method": "GET", + "path": "/", + "user_agent": "", + } + }, ) def test_from_http_clean_querystring(self): @@ -67,6 +75,7 @@ class TestEvents(TestCase): "args": {"token": SafeExceptionReporterFilter.cleansed_substitute}, "method": "GET", "path": "/", + "user_agent": "", } }, ) @@ -83,6 +92,7 @@ class TestEvents(TestCase): "args": {"token": SafeExceptionReporterFilter.cleansed_substitute}, "method": "GET", "path": "/", + "user_agent": "", } }, ) diff --git a/authentik/events/utils.py b/authentik/events/utils.py index d910e4a2d..a7c3bdf3e 100644 --- a/authentik/events/utils.py +++ b/authentik/events/utils.py @@ -5,12 +5,13 @@ from dataclasses import asdict, is_dataclass from datetime import date, datetime, time, timedelta from enum import Enum from pathlib import Path -from types import GeneratorType +from types import GeneratorType, NoneType from typing import Any, Optional from uuid import UUID from django.contrib.auth.models import AnonymousUser from django.core.handlers.wsgi import WSGIRequest +from django.core.serializers.json import DjangoJSONEncoder from django.db import models from django.db.models.base import Model from django.http.request import HttpRequest @@ -159,7 +160,14 @@ def sanitize_item(value: Any) -> Any: "name": value.__name__, "module": value.__module__, } - return value + # List taken from the stdlib's JSON encoder (_make_iterencode, encoder.py:415) + if isinstance(value, (bool, int, float, NoneType, list, tuple, dict)): + return value + try: + return DjangoJSONEncoder().default(value) + except TypeError: + return str(value) + return str(value) def sanitize_dict(source: dict[Any, Any]) -> dict[Any, Any]: diff --git a/authentik/sources/oauth/models.py b/authentik/sources/oauth/models.py index 6b871fe55..7acbb9223 100644 --- a/authentik/sources/oauth/models.py +++ b/authentik/sources/oauth/models.py @@ -74,7 +74,7 @@ class OAuthSource(Source): def ui_login_button(self, request: HttpRequest) -> UILoginButton: provider_type = self.source_type provider = provider_type() - icon = self.get_icon + icon = self.icon_url if not icon: icon = provider.icon_url() return UILoginButton( @@ -85,7 +85,7 @@ class OAuthSource(Source): def ui_user_settings(self) -> Optional[UserSettingSerializer]: provider_type = self.source_type - icon = self.get_icon + icon = self.icon_url if not icon: icon = provider_type().icon_url() return UserSettingSerializer( @@ -232,7 +232,7 @@ class UserOAuthSourceConnection(UserSourceConnection): access_token = models.TextField(blank=True, null=True, default=None) @property - def serializer(self) -> Serializer: + def serializer(self) -> type[Serializer]: from authentik.sources.oauth.api.source_connection import ( UserOAuthSourceConnectionSerializer, ) diff --git a/authentik/sources/plex/models.py b/authentik/sources/plex/models.py index 06d46dc67..e20c809a3 100644 --- a/authentik/sources/plex/models.py +++ b/authentik/sources/plex/models.py @@ -62,7 +62,7 @@ class PlexSource(Source): return PlexSourceSerializer def ui_login_button(self, request: HttpRequest) -> UILoginButton: - icon = self.get_icon + icon = self.icon_url if not icon: icon = static("authentik/sources/plex.svg") return UILoginButton( @@ -79,7 +79,7 @@ class PlexSource(Source): ) def ui_user_settings(self) -> Optional[UserSettingSerializer]: - icon = self.get_icon + icon = self.icon_url if not icon: icon = static("authentik/sources/plex.svg") return UserSettingSerializer( diff --git a/authentik/sources/saml/models.py b/authentik/sources/saml/models.py index 5f01b034e..6c24abf8d 100644 --- a/authentik/sources/saml/models.py +++ b/authentik/sources/saml/models.py @@ -200,11 +200,11 @@ class SAMLSource(Source): } ), name=self.name, - icon_url=self.get_icon, + icon_url=self.icon_url, ) def ui_user_settings(self) -> Optional[UserSettingSerializer]: - icon = self.get_icon + icon = self.icon_url if not icon: icon = static(f"authentik/sources/{self.slug}.svg") return UserSettingSerializer( diff --git a/authentik/stages/authenticator_sms/stage.py b/authentik/stages/authenticator_sms/stage.py index dfbf48c68..e2c661089 100644 --- a/authentik/stages/authenticator_sms/stage.py +++ b/authentik/stages/authenticator_sms/stage.py @@ -69,7 +69,6 @@ class AuthenticatorSMSStageView(ChallengeStageView): stage: AuthenticatorSMSStage = self.executor.current_stage hashed_number = hash_phone_number(phone_number) query = Q(phone_number=hashed_number) | Q(phone_number=phone_number) - print(SMSDevice.objects.filter(query, stage=stage.pk)) if SMSDevice.objects.filter(query, stage=stage.pk).exists(): raise ValidationError(_("Invalid phone number")) # No code yet, but we have a phone number, so send a verification message diff --git a/authentik/stages/authenticator_sms/tests.py b/authentik/stages/authenticator_sms/tests.py index 9601cf886..1ab16aa56 100644 --- a/authentik/stages/authenticator_sms/tests.py +++ b/authentik/stages/authenticator_sms/tests.py @@ -199,11 +199,9 @@ class AuthenticatorSMSStageTests(FlowTestCase): sms_send_mock, ), ): - print(self.client.session[SESSION_KEY_PLAN]) response = self.client.get( reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}), ) - print(response.content.decode()) self.assertStageResponse( response, self.flow, diff --git a/authentik/stages/authenticator_validate/tests/test_duo.py b/authentik/stages/authenticator_validate/tests/test_duo.py index 320c00603..bdd1c5984 100644 --- a/authentik/stages/authenticator_validate/tests/test_duo.py +++ b/authentik/stages/authenticator_validate/tests/test_duo.py @@ -184,6 +184,7 @@ class AuthenticatorValidateStageDuoTests(FlowTestCase): "args": {}, "method": "GET", "path": f"/api/v3/flows/executor/{flow.slug}/", + "user_agent": "", }, }, ) diff --git a/authentik/stages/email/stage.py b/authentik/stages/email/stage.py index 0b92173d5..a9570190a 100644 --- a/authentik/stages/email/stage.py +++ b/authentik/stages/email/stage.py @@ -59,7 +59,6 @@ class EmailStageView(ChallengeStageView): query_params = QueryDict(self.request.GET.get(QS_QUERY), mutable=True) query_params.pop(QS_KEY_TOKEN, None) query_params.update(kwargs) - print(query_params) full_url = base_url if len(query_params) > 0: full_url = f"{full_url}?{query_params.urlencode()}" diff --git a/docker-compose.yml b/docker-compose.yml index cb961c487..68e7530e7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,7 +32,7 @@ services: volumes: - redis:/data server: - image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.10.3} + image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.10.4} restart: unless-stopped command: server environment: @@ -53,7 +53,7 @@ services: - postgresql - redis worker: - image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.10.3} + image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.10.4} restart: unless-stopped command: worker environment: diff --git a/go.mod b/go.mod index e6dc5e2e9..866913ce9 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.8.4 - goauthentik.io/api/v3 v3.2023103.4 + goauthentik.io/api/v3 v3.2023104.1 golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab golang.org/x/oauth2 v0.14.0 golang.org/x/sync v0.5.0 diff --git a/go.sum b/go.sum index b0d84e974..28425c27c 100644 --- a/go.sum +++ b/go.sum @@ -358,8 +358,8 @@ go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyK go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -goauthentik.io/api/v3 v3.2023103.4 h1:dysNzRSbZC2NYeIyk3x5o3kUSsz+Y2VhtfcnzRe8Wkk= -goauthentik.io/api/v3 v3.2023103.4/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw= +goauthentik.io/api/v3 v3.2023104.1 h1:cvAsgoKP/fmO4fzifx0OyICknauFeyN88C4Z1LdWXDs= +goauthentik.io/api/v3 v3.2023104.1/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= diff --git a/internal/constants/constants.go b/internal/constants/constants.go index a452599b7..fb12db690 100644 --- a/internal/constants/constants.go +++ b/internal/constants/constants.go @@ -29,4 +29,4 @@ func UserAgent() string { return fmt.Sprintf("authentik@%s", FullVersion()) } -const VERSION = "2023.10.3" +const VERSION = "2023.10.4" diff --git a/poetry.lock b/poetry.lock index fb836b1eb..4f489af94 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "aiohttp" version = "3.9.0" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -100,7 +99,6 @@ speedups = ["Brotli", "aiodns", "brotlicffi"] name = "aiohttp-retry" version = "2.8.3" description = "Simple retry client for aiohttp" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -115,7 +113,6 @@ aiohttp = "*" name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -130,7 +127,6 @@ frozenlist = ">=1.1.0" name = "amqp" version = "5.2.0" description = "Low-level AMQP client for Python (fork of amqplib)." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -145,7 +141,6 @@ vine = ">=5.0.0,<6.0.0" name = "annotated-types" version = "0.6.0" description = "Reusable constraint types to use with typing.Annotated" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -155,14 +150,13 @@ files = [ [[package]] name = "anyio" -version = "4.0.0" +version = "4.1.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, - {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, + {file = "anyio-4.1.0-py3-none-any.whl", hash = "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f"}, + {file = "anyio-4.1.0.tar.gz", hash = "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da"}, ] [package.dependencies] @@ -170,15 +164,14 @@ idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.22)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "argon2-cffi" version = "23.1.0" description = "Argon2 for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -199,7 +192,6 @@ typing = ["mypy"] name = "argon2-cffi-bindings" version = "21.2.0" description = "Low-level CFFI bindings for Argon2" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -237,7 +229,6 @@ tests = ["pytest"] name = "asgiref" version = "3.7.2" description = "ASGI specs, helper code, and adapters" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -252,7 +243,6 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] name = "asn1crypto" version = "1.5.1" description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" -category = "main" optional = false python-versions = "*" files = [ @@ -264,7 +254,6 @@ files = [ name = "astroid" version = "3.0.1" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -272,23 +261,10 @@ files = [ {file = "astroid-3.0.1.tar.gz", hash = "sha256:86b0bb7d7da0be1a7c4aedb7974e391b32d4ed89e33de6ed6902b4b15c97577e"}, ] -[[package]] -name = "async-timeout" -version = "4.0.3" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, -] - [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -307,7 +283,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "autobahn" version = "23.6.2" description = "WebSocket client & server library, WAMP real-time framework" -category = "main" optional = false python-versions = ">=3.9" files = [ @@ -336,7 +311,6 @@ xbr = ["base58 (>=2.1.0)", "bitarray (>=2.7.5)", "cbor2 (>=5.2.0)", "click (>=8. name = "automat" version = "22.10.0" description = "Self-service finite-state machines for the programmer on the go." -category = "main" optional = false python-versions = "*" files = [ @@ -355,7 +329,6 @@ visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] name = "autopep8" version = "2.0.4" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -370,7 +343,6 @@ pycodestyle = ">=2.10.0" name = "bandit" version = "1.7.5" description = "Security oriented static analyser for python code." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -394,7 +366,6 @@ yaml = ["PyYAML"] name = "bcrypt" version = "4.0.1" description = "Modern password hashing for your software and your servers" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -429,7 +400,6 @@ typecheck = ["mypy"] name = "billiard" version = "4.2.0" description = "Python multiprocessing fork with improvements and bugfixes" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -441,7 +411,6 @@ files = [ name = "black" version = "23.11.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -482,7 +451,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "bump2version" version = "1.0.1" description = "Version-bump your software with a single command!" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -494,7 +462,6 @@ files = [ name = "cachetools" version = "5.3.2" description = "Extensible memoizing collections and decorators" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -506,7 +473,6 @@ files = [ name = "cbor2" version = "5.5.1" description = "CBOR (de)serializer with extensive tag support" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -556,14 +522,13 @@ test = ["coverage (>=7)", "hypothesis", "pytest"] [[package]] name = "celery" -version = "5.3.5" +version = "5.3.6" description = "Distributed Task Queue." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "celery-5.3.5-py3-none-any.whl", hash = "sha256:30b75ac60fb081c2d9f8881382c148ed7c9052031a75a1e8743ff4b4b071f184"}, - {file = "celery-5.3.5.tar.gz", hash = "sha256:6b65d8dd5db499dd6190c45aa6398e171b99592f2af62c312f7391587feb5458"}, + {file = "celery-5.3.6-py3-none-any.whl", hash = "sha256:9da4ea0118d232ce97dff5ed4974587fb1c0ff5c10042eb15278487cdd27d1af"}, + {file = "celery-5.3.6.tar.gz", hash = "sha256:870cc71d737c0200c397290d730344cc991d13a057534353d124c9380267aab9"}, ] [package.dependencies] @@ -572,7 +537,7 @@ click = ">=8.1.2,<9.0" click-didyoumean = ">=0.3.0" click-plugins = ">=1.1.1" click-repl = ">=0.2.0" -kombu = ">=5.3.3,<6.0" +kombu = ">=5.3.4,<6.0" python-dateutil = ">=2.8.2" tzdata = ">=2022.7" vine = ">=5.1.0,<6.0" @@ -589,7 +554,7 @@ couchbase = ["couchbase (>=3.0.0)"] couchdb = ["pycouchdb (==1.14.2)"] django = ["Django (>=2.2.28)"] dynamodb = ["boto3 (>=1.26.143)"] -elasticsearch = ["elastic-transport (<=8.10.0)", "elasticsearch (<=8.10.1)"] +elasticsearch = ["elastic-transport (<=8.10.0)", "elasticsearch (<=8.11.0)"] eventlet = ["eventlet (>=0.32.0)"] gevent = ["gevent (>=1.5.0)"] librabbitmq = ["librabbitmq (>=2.0.0)"] @@ -614,7 +579,6 @@ zstd = ["zstandard (==0.22.0)"] name = "certifi" version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -626,7 +590,6 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -691,7 +654,6 @@ pycparser = "*" name = "channels" version = "4.0.0" description = "Brings async, event-driven capabilities to Django 3.2 and up." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -712,7 +674,6 @@ tests = ["async-timeout", "coverage (>=4.5,<5.0)", "pytest", "pytest-asyncio", " name = "channels-redis" version = "4.1.0" description = "Redis-backed ASGI channel layer implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -734,7 +695,6 @@ tests = ["async-timeout", "cryptography (>=1.3.0)", "pytest", "pytest-asyncio", name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -834,7 +794,6 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -849,7 +808,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "click-didyoumean" version = "0.3.0" description = "Enables git-like *did-you-mean* feature in click" -category = "main" optional = false python-versions = ">=3.6.2,<4.0.0" files = [ @@ -864,7 +822,6 @@ click = ">=7" name = "click-plugins" version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." -category = "main" optional = false python-versions = "*" files = [ @@ -882,7 +839,6 @@ dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] name = "click-repl" version = "0.3.0" description = "REPL plugin for Click" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -901,7 +857,6 @@ testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] name = "codespell" version = "2.2.6" description = "Codespell" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -919,7 +874,6 @@ types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -931,7 +885,6 @@ files = [ name = "constantly" version = "23.10.4" description = "Symbolic constants in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -943,7 +896,6 @@ files = [ name = "coverage" version = "7.3.2" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1008,7 +960,6 @@ toml = ["tomli"] name = "cryptography" version = "41.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1054,7 +1005,6 @@ test-randomorder = ["pytest-randomly"] name = "dacite" version = "1.8.1" description = "Simple creation of data classes from dictionaries." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1068,7 +1018,6 @@ dev = ["black", "coveralls", "mypy", "pre-commit", "pylint", "pytest (>=5)", "py name = "daphne" version = "4.0.0" description = "Django ASGI (HTTP/WebSocket) server" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1088,7 +1037,6 @@ tests = ["django", "hypothesis", "pytest", "pytest-asyncio"] name = "debugpy" version = "1.8.0" description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1116,7 +1064,6 @@ files = [ name = "deepmerge" version = "1.1.0" description = "a toolset to deeply merge python dictionaries." -category = "main" optional = false python-versions = "*" files = [ @@ -1128,7 +1075,6 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1140,7 +1086,6 @@ files = [ name = "dill" version = "0.3.7" description = "serialize all of Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1155,7 +1100,6 @@ graph = ["objgraph (>=1.7.2)"] name = "django" version = "4.2.7" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1176,7 +1120,6 @@ bcrypt = ["bcrypt"] name = "django-filter" version = "23.4" description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1191,7 +1134,6 @@ Django = ">=3.2" name = "django-guardian" version = "2.4.0" description = "Implementation of per object permissions for Django." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1206,7 +1148,6 @@ Django = ">=2.2" name = "django-model-utils" version = "4.3.1" description = "Django model mixins and utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1221,7 +1162,6 @@ Django = ">=3.2" name = "django-prometheus" version = "2.3.1" description = "Django middlewares to monitor your application with Prometheus.io." -category = "main" optional = false python-versions = "*" files = [ @@ -1236,7 +1176,6 @@ prometheus-client = ">=0.7" name = "django-redis" version = "5.4.0" description = "Full featured redis cache backend for Django." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1255,7 +1194,6 @@ hiredis = ["redis[hiredis] (>=3,!=4.0.0,!=4.0.1)"] name = "django-silk" version = "5.0.4" description = "Silky smooth profiling for the Django Framework" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1272,8 +1210,7 @@ sqlparse = "*" [[package]] name = "django-tenants" version = "3.5.0" -description = "" -category = "main" +description = "Tenant support for Django using PostgreSQL schemas." optional = false python-versions = "*" files = [] @@ -1292,7 +1229,6 @@ resolved_reference = "31040e911d00a96e9379860d48f458c2b222afc1" name = "djangorestframework" version = "3.14.0" description = "Web APIs for Django, made easy." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1308,7 +1244,6 @@ pytz = "*" name = "djangorestframework-guardian" version = "0.3.0" description = "django-guardian support for Django REST Framework" -category = "main" optional = false python-versions = "*" files = [ @@ -1325,7 +1260,6 @@ djangorestframework = "*" name = "dnspython" version = "2.4.2" description = "DNS toolkit" -category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -1345,7 +1279,6 @@ wmi = ["wmi (>=1.5.1,<2.0.0)"] name = "docker" version = "6.1.3" description = "A Python library for the Docker Engine API." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1367,7 +1300,6 @@ ssh = ["paramiko (>=2.4.3)"] name = "drf-jsonschema-serializer" version = "2.0.0" description = "JSON Schema support for Django REST Framework" -category = "dev" optional = false python-versions = "*" files = [ @@ -1391,7 +1323,6 @@ tests = ["black", "django-stubs[compatible-mypy]", "djangorestframework-stubs[co name = "drf-spectacular" version = "0.26.5" description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1415,7 +1346,6 @@ sidecar = ["drf-spectacular-sidecar"] name = "dumb-init" version = "1.2.5.post1" description = "Simple wrapper script which proxies signals to a child" -category = "main" optional = false python-versions = "*" files = [ @@ -1430,7 +1360,6 @@ files = [ name = "duo-client" version = "5.2.0" description = "Reference client for Duo Security APIs" -category = "main" optional = false python-versions = "*" files = [ @@ -1446,7 +1375,6 @@ six = "*" name = "email-validator" version = "2.1.0.post1" description = "A robust email address syntax and deliverability validation library." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1462,7 +1390,6 @@ idna = ">=2.0.0" name = "facebook-sdk" version = "3.1.0" description = "This client library is designed to support the Facebook Graph API and the official Facebook JavaScript SDK, which is the canonical way to implement Facebook authentication." -category = "main" optional = false python-versions = "*" files = [ @@ -1477,7 +1404,6 @@ requests = "*" name = "flower" version = "2.0.1" description = "Celery Flower" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1496,7 +1422,6 @@ tornado = ">=5.0.0,<7.0.0" name = "freezegun" version = "1.2.2" description = "Let your Python tests travel through time" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1511,7 +1436,6 @@ python-dateutil = ">=2.7" name = "frozenlist" version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1582,7 +1506,6 @@ files = [ name = "geoip2" version = "4.7.0" description = "MaxMind GeoIP2 API" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1599,7 +1522,6 @@ requests = ">=2.24.0,<3.0.0" name = "gitdb" version = "4.0.11" description = "Git Object Database" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1614,7 +1536,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.40" description = "GitPython is a Python library used to interact with Git repositories" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1632,7 +1553,6 @@ test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre name = "google-auth" version = "2.23.4" description = "Google Authentication Library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1656,7 +1576,6 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] name = "gprof2dot" version = "2022.7.29" description = "Generate a dot graph from the output of several profilers." -category = "dev" optional = false python-versions = ">=2.7" files = [ @@ -1668,7 +1587,6 @@ files = [ name = "gunicorn" version = "21.2.0" description = "WSGI HTTP Server for UNIX" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1689,7 +1607,6 @@ tornado = ["tornado (>=0.2)"] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1701,7 +1618,6 @@ files = [ name = "httptools" version = "0.6.1" description = "A collection of framework independent HTTP protocol utils." -category = "main" optional = false python-versions = ">=3.8.0" files = [ @@ -1748,14 +1664,13 @@ test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "humanize" -version = "4.8.0" +version = "4.9.0" description = "Python humanize utilities" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "humanize-4.8.0-py3-none-any.whl", hash = "sha256:8bc9e2bb9315e61ec06bf690151ae35aeb65651ab091266941edf97c90836404"}, - {file = "humanize-4.8.0.tar.gz", hash = "sha256:9783373bf1eec713a770ecaa7c2d7a7902c98398009dfa3d8a2df91eec9311e8"}, + {file = "humanize-4.9.0-py3-none-any.whl", hash = "sha256:ce284a76d5b1377fd8836733b983bfb0b76f1aa1c090de2566fcf008d7f6ab16"}, + {file = "humanize-4.9.0.tar.gz", hash = "sha256:582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa"}, ] [package.extras] @@ -1765,7 +1680,6 @@ tests = ["freezegun", "pytest", "pytest-cov"] name = "hyperlink" version = "21.0.0" description = "A featureful, immutable, and correct URL for Python." -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1780,7 +1694,6 @@ idna = ">=2.5" name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1792,7 +1705,6 @@ files = [ name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1812,7 +1724,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "incremental" version = "22.10.0" description = "\"A small library that versions your Python projects.\"" -category = "main" optional = false python-versions = "*" files = [ @@ -1828,7 +1739,6 @@ scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] name = "inflection" version = "0.5.1" description = "A port of Ruby on Rails inflector to Python" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1840,7 +1750,6 @@ files = [ name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1852,7 +1761,6 @@ files = [ name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -1870,7 +1778,6 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1888,7 +1795,6 @@ i18n = ["Babel (>=2.7)"] name = "jsonpatch" version = "1.33" description = "Apply JSON-Patches (RFC 6902)" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ @@ -1903,7 +1809,6 @@ jsonpointer = ">=1.9" name = "jsonpointer" version = "2.4" description = "Identify specific nodes in a JSON document (RFC 6901)" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ @@ -1915,7 +1820,6 @@ files = [ name = "jsonschema" version = "4.20.0" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1937,7 +1841,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.11.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1952,7 +1855,6 @@ referencing = ">=0.31.0" name = "kombu" version = "5.3.4" description = "Messaging library for Python." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1983,14 +1885,13 @@ zookeeper = ["kazoo (>=2.8.0)"] [[package]] name = "kubernetes" -version = "28.1.0" +version = "27.2.0" description = "Kubernetes python client" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "kubernetes-28.1.0-py2.py3-none-any.whl", hash = "sha256:10f56f8160dcb73647f15fafda268e7f60cf7dbc9f8e46d52fcd46d3beb0c18d"}, - {file = "kubernetes-28.1.0.tar.gz", hash = "sha256:1468069a573430fb1cb5ad22876868f57977930f80a6749405da31cd6086a7e9"}, + {file = "kubernetes-27.2.0-py2.py3-none-any.whl", hash = "sha256:0f9376329c85cf07615ed6886bf9bf21eb1cbfc05e14ec7b0f74ed8153cd2815"}, + {file = "kubernetes-27.2.0.tar.gz", hash = "sha256:d479931c6f37561dbfdf28fc5f46384b1cb8b28f9db344ed4a232ce91990825a"}, ] [package.dependencies] @@ -2002,8 +1903,8 @@ pyyaml = ">=5.4.1" requests = "*" requests-oauthlib = "*" six = ">=1.9.0" -urllib3 = ">=1.24.2,<2.0" -websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.0 || >=0.43.0" +urllib3 = ">=1.24.2" +websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" [package.extras] adal = ["adal (>=1.0.2)"] @@ -2012,7 +1913,6 @@ adal = ["adal (>=1.0.2)"] name = "ldap3" version = "2.9.1" description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" -category = "main" optional = false python-versions = "*" files = [ @@ -2027,7 +1927,6 @@ pyasn1 = ">=0.4.6" name = "lxml" version = "4.9.3" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ @@ -2135,7 +2034,6 @@ source = ["Cython (>=0.29.35)"] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2160,7 +2058,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2230,7 +2127,6 @@ files = [ name = "maxminddb" version = "2.5.1" description = "Reader for the MaxMind DB format" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2291,7 +2187,6 @@ setuptools = ">=68.2.2" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2303,7 +2198,6 @@ files = [ name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2315,7 +2209,6 @@ files = [ name = "msgpack" version = "1.0.7" description = "MessagePack serializer" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2381,7 +2274,6 @@ files = [ name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2465,7 +2357,6 @@ files = [ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2477,7 +2368,6 @@ files = [ name = "netaddr" version = "0.9.0" description = "A network address manipulation library for Python" -category = "dev" optional = false python-versions = "*" files = [ @@ -2489,7 +2379,6 @@ files = [ name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2506,7 +2395,6 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] name = "opencontainers" version = "0.0.14" description = "Python module for oci specifications" -category = "main" optional = false python-versions = "*" files = [ @@ -2517,7 +2405,6 @@ files = [ name = "outcome" version = "1.3.0.post0" description = "Capture the outcome of Python function calls." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2532,7 +2419,6 @@ attrs = ">=19.2.0" name = "packaging" version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2544,7 +2430,6 @@ files = [ name = "paramiko" version = "3.3.1" description = "SSH2 protocol library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2566,7 +2451,6 @@ invoke = ["invoke (>=2.0)"] name = "pathspec" version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2578,7 +2462,6 @@ files = [ name = "pbr" version = "6.0.0" description = "Python Build Reasonableness" -category = "dev" optional = false python-versions = ">=2.6" files = [ @@ -2590,7 +2473,6 @@ files = [ name = "pdoc" version = "14.1.0" description = "API Documentation for Python Projects" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2610,7 +2492,6 @@ dev = ["black", "hypothesis", "mypy", "pygments (>=2.14.0)", "pytest", "pytest-c name = "platformdirs" version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2626,7 +2507,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2642,7 +2522,6 @@ testing = ["pytest", "pytest-benchmark"] name = "prometheus-client" version = "0.19.0" description = "Python client for the Prometheus monitoring system." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2657,7 +2536,6 @@ twisted = ["twisted"] name = "prompt-toolkit" version = "3.0.41" description = "Library for building powerful interactive command lines in Python" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -2672,7 +2550,6 @@ wcwidth = "*" name = "psycopg" version = "3.1.13" description = "PostgreSQL database adapter for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2697,7 +2574,6 @@ test = ["anyio (>=3.6.2,<4.0)", "mypy (>=1.4.1)", "pproxy (>=2.7)", "pytest (>=6 name = "psycopg-c" version = "3.1.13" description = "PostgreSQL database adapter for Python -- C optimisation distribution" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2708,7 +2584,6 @@ files = [ name = "pyasn1" version = "0.5.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -2720,7 +2595,6 @@ files = [ name = "pyasn1-modules" version = "0.3.0" description = "A collection of ASN.1-based protocols modules" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -2735,7 +2609,6 @@ pyasn1 = ">=0.4.6,<0.6.0" name = "pycodestyle" version = "2.11.1" description = "Python style guide checker" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2747,7 +2620,6 @@ files = [ name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2759,7 +2631,6 @@ files = [ name = "pycryptodome" version = "3.19.0" description = "Cryptographic library for Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2799,20 +2670,19 @@ files = [ [[package]] name = "pydantic" -version = "2.5.1" +version = "2.5.2" description = "Data validation using Python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-2.5.1-py3-none-any.whl", hash = "sha256:dc5244a8939e0d9a68f1f1b5f550b2e1c879912033b1becbedb315accc75441b"}, - {file = "pydantic-2.5.1.tar.gz", hash = "sha256:0b8be5413c06aadfbe56f6dc1d45c9ed25fd43264414c571135c97dd77c2bedb"}, + {file = "pydantic-2.5.2-py3-none-any.whl", hash = "sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0"}, + {file = "pydantic-2.5.2.tar.gz", hash = "sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd"}, ] [package.dependencies] annotated-types = ">=0.4.0" email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} -pydantic-core = "2.14.3" +pydantic-core = "2.14.5" typing-extensions = ">=4.6.1" [package.extras] @@ -2820,117 +2690,116 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.14.3" +version = "2.14.5" description = "" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic_core-2.14.3-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:ba44fad1d114539d6a1509966b20b74d2dec9a5b0ee12dd7fd0a1bb7b8785e5f"}, - {file = "pydantic_core-2.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4a70d23eedd88a6484aa79a732a90e36701048a1509078d1b59578ef0ea2cdf5"}, - {file = "pydantic_core-2.14.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cc24728a1a9cef497697e53b3d085fb4d3bc0ef1ef4d9b424d9cf808f52c146"}, - {file = "pydantic_core-2.14.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab4a2381005769a4af2ffddae74d769e8a4aae42e970596208ec6d615c6fb080"}, - {file = "pydantic_core-2.14.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a12bf088d6fa20e094f9a477bf84bd823651d8b8384f59bcd50eaa92e6a52"}, - {file = "pydantic_core-2.14.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:38aed5a1bbc3025859f56d6a32f6e53ca173283cb95348e03480f333b1091e7d"}, - {file = "pydantic_core-2.14.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1767bd3f6370458e60c1d3d7b1d9c2751cc1ad743434e8ec84625a610c8b9195"}, - {file = "pydantic_core-2.14.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7cb0c397f29688a5bd2c0dbd44451bc44ebb9b22babc90f97db5ec3e5bb69977"}, - {file = "pydantic_core-2.14.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ff737f24b34ed26de62d481ef522f233d3c5927279f6b7229de9b0deb3f76b5"}, - {file = "pydantic_core-2.14.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1a39fecb5f0b19faee9a8a8176c805ed78ce45d760259a4ff3d21a7daa4dfc1"}, - {file = "pydantic_core-2.14.3-cp310-none-win32.whl", hash = "sha256:ccbf355b7276593c68fa824030e68cb29f630c50e20cb11ebb0ee450ae6b3d08"}, - {file = "pydantic_core-2.14.3-cp310-none-win_amd64.whl", hash = "sha256:536e1f58419e1ec35f6d1310c88496f0d60e4f182cacb773d38076f66a60b149"}, - {file = "pydantic_core-2.14.3-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:f1f46700402312bdc31912f6fc17f5ecaaaa3bafe5487c48f07c800052736289"}, - {file = "pydantic_core-2.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:88ec906eb2d92420f5b074f59cf9e50b3bb44f3cb70e6512099fdd4d88c2f87c"}, - {file = "pydantic_core-2.14.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:056ea7cc3c92a7d2a14b5bc9c9fa14efa794d9f05b9794206d089d06d3433dc7"}, - {file = "pydantic_core-2.14.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:076edc972b68a66870cec41a4efdd72a6b655c4098a232314b02d2bfa3bfa157"}, - {file = "pydantic_core-2.14.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e71f666c3bf019f2490a47dddb44c3ccea2e69ac882f7495c68dc14d4065eac2"}, - {file = "pydantic_core-2.14.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f518eac285c9632be337323eef9824a856f2680f943a9b68ac41d5f5bad7df7c"}, - {file = "pydantic_core-2.14.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dbab442a8d9ca918b4ed99db8d89d11b1f067a7dadb642476ad0889560dac79"}, - {file = "pydantic_core-2.14.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0653fb9fc2fa6787f2fa08631314ab7fc8070307bd344bf9471d1b7207c24623"}, - {file = "pydantic_core-2.14.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c54af5069da58ea643ad34ff32fd6bc4eebb8ae0fef9821cd8919063e0aeeaab"}, - {file = "pydantic_core-2.14.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc956f78651778ec1ab105196e90e0e5f5275884793ab67c60938c75bcca3989"}, - {file = "pydantic_core-2.14.3-cp311-none-win32.whl", hash = "sha256:5b73441a1159f1fb37353aaefb9e801ab35a07dd93cb8177504b25a317f4215a"}, - {file = "pydantic_core-2.14.3-cp311-none-win_amd64.whl", hash = "sha256:7349f99f1ef8b940b309179733f2cad2e6037a29560f1b03fdc6aa6be0a8d03c"}, - {file = "pydantic_core-2.14.3-cp311-none-win_arm64.whl", hash = "sha256:ec79dbe23702795944d2ae4c6925e35a075b88acd0d20acde7c77a817ebbce94"}, - {file = "pydantic_core-2.14.3-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:8f5624f0f67f2b9ecaa812e1dfd2e35b256487566585160c6c19268bf2ffeccc"}, - {file = "pydantic_core-2.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c2d118d1b6c9e2d577e215567eedbe11804c3aafa76d39ec1f8bc74e918fd07"}, - {file = "pydantic_core-2.14.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe863491664c6720d65ae438d4efaa5eca766565a53adb53bf14bc3246c72fe0"}, - {file = "pydantic_core-2.14.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:136bc7247e97a921a020abbd6ef3169af97569869cd6eff41b6a15a73c44ea9b"}, - {file = "pydantic_core-2.14.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aeafc7f5bbddc46213707266cadc94439bfa87ecf699444de8be044d6d6eb26f"}, - {file = "pydantic_core-2.14.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e16aaf788f1de5a85c8f8fcc9c1ca1dd7dd52b8ad30a7889ca31c7c7606615b8"}, - {file = "pydantic_core-2.14.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc652c354d3362e2932a79d5ac4bbd7170757a41a62c4fe0f057d29f10bebb"}, - {file = "pydantic_core-2.14.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f1b92e72babfd56585c75caf44f0b15258c58e6be23bc33f90885cebffde3400"}, - {file = "pydantic_core-2.14.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:75f3f534f33651b73f4d3a16d0254de096f43737d51e981478d580f4b006b427"}, - {file = "pydantic_core-2.14.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c9ffd823c46e05ef3eb28b821aa7bc501efa95ba8880b4a1380068e32c5bed47"}, - {file = "pydantic_core-2.14.3-cp312-none-win32.whl", hash = "sha256:12e05a76b223577a4696c76d7a6b36a0ccc491ffb3c6a8cf92d8001d93ddfd63"}, - {file = "pydantic_core-2.14.3-cp312-none-win_amd64.whl", hash = "sha256:1582f01eaf0537a696c846bea92082082b6bfc1103a88e777e983ea9fbdc2a0f"}, - {file = "pydantic_core-2.14.3-cp312-none-win_arm64.whl", hash = "sha256:96fb679c7ca12a512d36d01c174a4fbfd912b5535cc722eb2c010c7b44eceb8e"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:71ed769b58d44e0bc2701aa59eb199b6665c16e8a5b8b4a84db01f71580ec448"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:5402ee0f61e7798ea93a01b0489520f2abfd9b57b76b82c93714c4318c66ca06"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaab9dc009e22726c62fe3b850b797e7f0e7ba76d245284d1064081f512c7226"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92486a04d54987054f8b4405a9af9d482e5100d6fe6374fc3303015983fc8bda"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf08b43d1d5d1678f295f0431a4a7e1707d4652576e1d0f8914b5e0213bfeee5"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8ca13480ce16daad0504be6ce893b0ee8ec34cd43b993b754198a89e2787f7e"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44afa3c18d45053fe8d8228950ee4c8eaf3b5a7f3b64963fdeac19b8342c987f"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56814b41486e2d712a8bc02a7b1f17b87fa30999d2323bbd13cf0e52296813a1"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c3dc2920cc96f9aa40c6dc54256e436cc95c0a15562eb7bd579e1811593c377e"}, - {file = "pydantic_core-2.14.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e483b8b913fcd3b48badec54185c150cb7ab0e6487914b84dc7cde2365e0c892"}, - {file = "pydantic_core-2.14.3-cp37-none-win32.whl", hash = "sha256:364dba61494e48f01ef50ae430e392f67ee1ee27e048daeda0e9d21c3ab2d609"}, - {file = "pydantic_core-2.14.3-cp37-none-win_amd64.whl", hash = "sha256:a402ae1066be594701ac45661278dc4a466fb684258d1a2c434de54971b006ca"}, - {file = "pydantic_core-2.14.3-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:10904368261e4509c091cbcc067e5a88b070ed9a10f7ad78f3029c175487490f"}, - {file = "pydantic_core-2.14.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:260692420028319e201b8649b13ac0988974eeafaaef95d0dfbf7120c38dc000"}, - {file = "pydantic_core-2.14.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1bf1a7b05a65d3b37a9adea98e195e0081be6b17ca03a86f92aeb8b110f468"}, - {file = "pydantic_core-2.14.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d7abd17a838a52140e3aeca271054e321226f52df7e0a9f0da8f91ea123afe98"}, - {file = "pydantic_core-2.14.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5c51460ede609fbb4fa883a8fe16e749964ddb459966d0518991ec02eb8dfb9"}, - {file = "pydantic_core-2.14.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d06c78074646111fb01836585f1198367b17d57c9f427e07aaa9ff499003e58d"}, - {file = "pydantic_core-2.14.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af452e69446fadf247f18ac5d153b1f7e61ef708f23ce85d8c52833748c58075"}, - {file = "pydantic_core-2.14.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3ad4968711fb379a67c8c755beb4dae8b721a83737737b7bcee27c05400b047"}, - {file = "pydantic_core-2.14.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c5ea0153482e5b4d601c25465771c7267c99fddf5d3f3bdc238ef930e6d051cf"}, - {file = "pydantic_core-2.14.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:96eb10ef8920990e703da348bb25fedb8b8653b5966e4e078e5be382b430f9e0"}, - {file = "pydantic_core-2.14.3-cp38-none-win32.whl", hash = "sha256:ea1498ce4491236d1cffa0eee9ad0968b6ecb0c1cd711699c5677fc689905f00"}, - {file = "pydantic_core-2.14.3-cp38-none-win_amd64.whl", hash = "sha256:2bc736725f9bd18a60eec0ed6ef9b06b9785454c8d0105f2be16e4d6274e63d0"}, - {file = "pydantic_core-2.14.3-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:1ea992659c03c3ea811d55fc0a997bec9dde863a617cc7b25cfde69ef32e55af"}, - {file = "pydantic_core-2.14.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2b53e1f851a2b406bbb5ac58e16c4a5496038eddd856cc900278fa0da97f3fc"}, - {file = "pydantic_core-2.14.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c7f8e8a7cf8e81ca7d44bea4f181783630959d41b4b51d2f74bc50f348a090f"}, - {file = "pydantic_core-2.14.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8d3b9c91eeb372a64ec6686c1402afd40cc20f61a0866850f7d989b6bf39a41a"}, - {file = "pydantic_core-2.14.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ef3e2e407e4cad2df3c89488a761ed1f1c33f3b826a2ea9a411b0a7d1cccf1b"}, - {file = "pydantic_core-2.14.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f86f20a9d5bee1a6ede0f2757b917bac6908cde0f5ad9fcb3606db1e2968bcf5"}, - {file = "pydantic_core-2.14.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61beaa79d392d44dc19d6f11ccd824d3cccb865c4372157c40b92533f8d76dd0"}, - {file = "pydantic_core-2.14.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d41df8e10b094640a6b234851b624b76a41552f637b9fb34dc720b9fe4ef3be4"}, - {file = "pydantic_core-2.14.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c08ac60c3caa31f825b5dbac47e4875bd4954d8f559650ad9e0b225eaf8ed0c"}, - {file = "pydantic_core-2.14.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d8b3932f1a369364606417ded5412c4ffb15bedbcf797c31317e55bd5d920e"}, - {file = "pydantic_core-2.14.3-cp39-none-win32.whl", hash = "sha256:caa94726791e316f0f63049ee00dff3b34a629b0d099f3b594770f7d0d8f1f56"}, - {file = "pydantic_core-2.14.3-cp39-none-win_amd64.whl", hash = "sha256:2494d20e4c22beac30150b4be3b8339bf2a02ab5580fa6553ca274bc08681a65"}, - {file = "pydantic_core-2.14.3-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:fe272a72c7ed29f84c42fedd2d06c2f9858dc0c00dae3b34ba15d6d8ae0fbaaf"}, - {file = "pydantic_core-2.14.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7e63a56eb7fdee1587d62f753ccd6d5fa24fbeea57a40d9d8beaef679a24bdd6"}, - {file = "pydantic_core-2.14.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7692f539a26265cece1e27e366df5b976a6db6b1f825a9e0466395b314ee48b"}, - {file = "pydantic_core-2.14.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af46f0b7a1342b49f208fed31f5a83b8495bb14b652f621e0a6787d2f10f24ee"}, - {file = "pydantic_core-2.14.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e2f9d76c00e805d47f19c7a96a14e4135238a7551a18bfd89bb757993fd0933"}, - {file = "pydantic_core-2.14.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:de52ddfa6e10e892d00f747bf7135d7007302ad82e243cf16d89dd77b03b649d"}, - {file = "pydantic_core-2.14.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:38113856c7fad8c19be7ddd57df0c3e77b1b2336459cb03ee3903ce9d5e236ce"}, - {file = "pydantic_core-2.14.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:354db020b1f8f11207b35360b92d95725621eb92656725c849a61e4b550f4acc"}, - {file = "pydantic_core-2.14.3-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:76fc18653a5c95e5301a52d1b5afb27c9adc77175bf00f73e94f501caf0e05ad"}, - {file = "pydantic_core-2.14.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2646f8270f932d79ba61102a15ea19a50ae0d43b314e22b3f8f4b5fabbfa6e38"}, - {file = "pydantic_core-2.14.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37dad73a2f82975ed563d6a277fd9b50e5d9c79910c4aec787e2d63547202315"}, - {file = "pydantic_core-2.14.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:113752a55a8eaece2e4ac96bc8817f134c2c23477e477d085ba89e3aa0f4dc44"}, - {file = "pydantic_core-2.14.3-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:8488e973547e8fb1b4193fd9faf5236cf1b7cd5e9e6dc7ff6b4d9afdc4c720cb"}, - {file = "pydantic_core-2.14.3-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3d1dde10bd9962b1434053239b1d5490fc31a2b02d8950a5f731bc584c7a5a0f"}, - {file = "pydantic_core-2.14.3-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:2c83892c7bf92b91d30faca53bb8ea21f9d7e39f0ae4008ef2c2f91116d0464a"}, - {file = "pydantic_core-2.14.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:849cff945284c577c5f621d2df76ca7b60f803cc8663ff01b778ad0af0e39bb9"}, - {file = "pydantic_core-2.14.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa89919fbd8a553cd7d03bf23d5bc5deee622e1b5db572121287f0e64979476"}, - {file = "pydantic_core-2.14.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf15145b1f8056d12c67255cd3ce5d317cd4450d5ee747760d8d088d85d12a2d"}, - {file = "pydantic_core-2.14.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4cc6bb11f4e8e5ed91d78b9880774fbc0856cb226151b0a93b549c2b26a00c19"}, - {file = "pydantic_core-2.14.3-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:832d16f248ca0cc96929139734ec32d21c67669dcf8a9f3f733c85054429c012"}, - {file = "pydantic_core-2.14.3-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b02b5e1f54c3396c48b665050464803c23c685716eb5d82a1d81bf81b5230da4"}, - {file = "pydantic_core-2.14.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1f2d4516c32255782153e858f9a900ca6deadfb217fd3fb21bb2b60b4e04d04d"}, - {file = "pydantic_core-2.14.3-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0a3e51c2be472b7867eb0c5d025b91400c2b73a0823b89d4303a9097e2ec6655"}, - {file = "pydantic_core-2.14.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:df33902464410a1f1a0411a235f0a34e7e129f12cb6340daca0f9d1390f5fe10"}, - {file = "pydantic_core-2.14.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27828f0227b54804aac6fb077b6bb48e640b5435fdd7fbf0c274093a7b78b69c"}, - {file = "pydantic_core-2.14.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2979dc80246e18e348de51246d4c9b410186ffa3c50e77924bec436b1e36cb"}, - {file = "pydantic_core-2.14.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b28996872b48baf829ee75fa06998b607c66a4847ac838e6fd7473a6b2ab68e7"}, - {file = "pydantic_core-2.14.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ca55c9671bb637ce13d18ef352fd32ae7aba21b4402f300a63f1fb1fd18e0364"}, - {file = "pydantic_core-2.14.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:aecd5ed096b0e5d93fb0367fd8f417cef38ea30b786f2501f6c34eabd9062c38"}, - {file = "pydantic_core-2.14.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:44aaf1a07ad0824e407dafc637a852e9a44d94664293bbe7d8ee549c356c8882"}, - {file = "pydantic_core-2.14.3.tar.gz", hash = "sha256:3ad083df8fe342d4d8d00cc1d3c1a23f0dc84fce416eb301e69f1ddbbe124d3f"}, + {file = "pydantic_core-2.14.5-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd"}, + {file = "pydantic_core-2.14.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113"}, + {file = "pydantic_core-2.14.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66"}, + {file = "pydantic_core-2.14.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997"}, + {file = "pydantic_core-2.14.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093"}, + {file = "pydantic_core-2.14.5-cp310-none-win32.whl", hash = "sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720"}, + {file = "pydantic_core-2.14.5-cp310-none-win_amd64.whl", hash = "sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b"}, + {file = "pydantic_core-2.14.5-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459"}, + {file = "pydantic_core-2.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6"}, + {file = "pydantic_core-2.14.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4"}, + {file = "pydantic_core-2.14.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada"}, + {file = "pydantic_core-2.14.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda"}, + {file = "pydantic_core-2.14.5-cp311-none-win32.whl", hash = "sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651"}, + {file = "pydantic_core-2.14.5-cp311-none-win_amd64.whl", hash = "sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077"}, + {file = "pydantic_core-2.14.5-cp311-none-win_arm64.whl", hash = "sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf"}, + {file = "pydantic_core-2.14.5-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093"}, + {file = "pydantic_core-2.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc"}, + {file = "pydantic_core-2.14.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e"}, + {file = "pydantic_core-2.14.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69"}, + {file = "pydantic_core-2.14.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d"}, + {file = "pydantic_core-2.14.5-cp312-none-win32.whl", hash = "sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260"}, + {file = "pydantic_core-2.14.5-cp312-none-win_amd64.whl", hash = "sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36"}, + {file = "pydantic_core-2.14.5-cp312-none-win_arm64.whl", hash = "sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4"}, + {file = "pydantic_core-2.14.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325"}, + {file = "pydantic_core-2.14.5-cp37-none-win32.whl", hash = "sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405"}, + {file = "pydantic_core-2.14.5-cp37-none-win_amd64.whl", hash = "sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588"}, + {file = "pydantic_core-2.14.5-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf"}, + {file = "pydantic_core-2.14.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331"}, + {file = "pydantic_core-2.14.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b"}, + {file = "pydantic_core-2.14.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec"}, + {file = "pydantic_core-2.14.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124"}, + {file = "pydantic_core-2.14.5-cp38-none-win32.whl", hash = "sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867"}, + {file = "pydantic_core-2.14.5-cp38-none-win_amd64.whl", hash = "sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d"}, + {file = "pydantic_core-2.14.5-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7"}, + {file = "pydantic_core-2.14.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db"}, + {file = "pydantic_core-2.14.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955"}, + {file = "pydantic_core-2.14.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5"}, + {file = "pydantic_core-2.14.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209"}, + {file = "pydantic_core-2.14.5-cp39-none-win32.whl", hash = "sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6"}, + {file = "pydantic_core-2.14.5-cp39-none-win_amd64.whl", hash = "sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7"}, + {file = "pydantic_core-2.14.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634"}, + {file = "pydantic_core-2.14.5-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8"}, + {file = "pydantic_core-2.14.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe"}, + {file = "pydantic_core-2.14.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3"}, + {file = "pydantic_core-2.14.5.tar.gz", hash = "sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71"}, ] [package.dependencies] @@ -2940,7 +2809,6 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" name = "pydantic-scim" version = "0.0.8" description = "Pydantic types for SCIM" -category = "main" optional = false python-versions = ">=3.8.0" files = [ @@ -2956,14 +2824,13 @@ pydantic = [ [[package]] name = "pygments" -version = "2.17.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pygments-2.17.1-py3-none-any.whl", hash = "sha256:1b37f1b1e1bff2af52ecaf28cc601e2ef7077000b227a0675da25aef85784bc4"}, - {file = "pygments-2.17.1.tar.gz", hash = "sha256:e45a0e74bf9c530f564ca81b8952343be986a29f6afe7f5ad95c5f06b7bdf5e8"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] @@ -2974,7 +2841,6 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2992,7 +2858,6 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pylint" version = "3.0.2" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -3003,7 +2868,7 @@ files = [ [package.dependencies] astroid = ">=3.0.1,<=3.1.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = {version = ">=0.3.6", markers = "python_version >= \"3.11\""} +dill = {version = ">=0.3.7", markers = "python_version >= \"3.12\""} isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" @@ -3017,7 +2882,6 @@ testutils = ["gitpython (>3)"] name = "pylint-django" version = "2.5.5" description = "A Pylint plugin to help Pylint understand the Django web framework" -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -3036,7 +2900,6 @@ with-django = ["Django (>=2.2)"] name = "pylint-plugin-utils" version = "0.8.2" description = "Utilities and helpers for writing Pylint plugins" -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -3051,7 +2914,6 @@ pylint = ">=1.7" name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3078,7 +2940,6 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] name = "pyopenssl" version = "23.3.0" description = "Python wrapper module around the OpenSSL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3097,7 +2958,6 @@ test = ["flaky", "pretend", "pytest (>=3.0.1)"] name = "pyrad" version = "2.4" description = "RADIUS tools" -category = "dev" optional = false python-versions = "*" files = [ @@ -3113,7 +2973,6 @@ six = "*" name = "pysocks" version = "1.7.1" description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3126,7 +2985,6 @@ files = [ name = "pytest" version = "7.4.3" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3147,7 +3005,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-django" version = "4.7.0" description = "A Django plugin for pytest." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3166,7 +3023,6 @@ testing = ["Django", "django-configurations (>=2.0)"] name = "pytest-github-actions-annotate-failures" version = "0.2.0" description = "pytest plugin to annotate failed tests with a workflow command for GitHub Actions" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3181,7 +3037,6 @@ pytest = ">=4.0.0" name = "pytest-randomly" version = "3.15.0" description = "Pytest plugin to randomly order tests and control random.seed." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3196,7 +3051,6 @@ pytest = "*" name = "pytest-timeout" version = "2.2.0" description = "pytest plugin to abort hanging tests" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3211,7 +3065,6 @@ pytest = ">=5.0.0" name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -3226,7 +3079,6 @@ six = ">=1.5" name = "python-dotenv" version = "1.0.0" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3241,7 +3093,6 @@ cli = ["click (>=5.0)"] name = "pytz" version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -3253,7 +3104,6 @@ files = [ name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" files = [ @@ -3277,7 +3127,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3337,7 +3186,6 @@ files = [ name = "redis" version = "5.0.1" description = "Python client for Redis database and key-value store" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3345,9 +3193,6 @@ files = [ {file = "redis-5.0.1.tar.gz", hash = "sha256:0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f"}, ] -[package.dependencies] -async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} - [package.extras] hiredis = ["hiredis (>=1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] @@ -3356,7 +3201,6 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" name = "referencing" version = "0.31.0" description = "JSON Referencing + Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3372,7 +3216,6 @@ rpds-py = ">=0.7.0" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3394,7 +3237,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-mock" version = "1.11.0" description = "Mock out responses from the requests package" -category = "dev" optional = false python-versions = "*" files = [ @@ -3414,7 +3256,6 @@ test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "tes name = "requests-oauthlib" version = "1.3.1" description = "OAuthlib authentication support for Requests." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3433,7 +3274,6 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] name = "rich" version = "13.7.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -3452,7 +3292,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rpds-py" version = "0.13.1" description = "Python bindings to Rust's persistent data structures (rpds)" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3561,7 +3400,6 @@ files = [ name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" -category = "main" optional = false python-versions = ">=3.6,<4" files = [ @@ -3576,7 +3414,6 @@ pyasn1 = ">=0.1.3" name = "ruff" version = "0.1.6" description = "An extremely fast Python linter and code formatter, written in Rust." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3603,7 +3440,6 @@ files = [ name = "selenium" version = "4.15.2" description = "" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3619,14 +3455,13 @@ urllib3 = {version = ">=1.26,<3", extras = ["socks"]} [[package]] name = "sentry-sdk" -version = "1.36.0" +version = "1.37.0" description = "Python client for Sentry (https://sentry.io)" -category = "main" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.36.0.tar.gz", hash = "sha256:f32dd16547f2f45e1c71a96fd4a48925e629541f7ddfe3d5d25ef7d5e94eb3c8"}, - {file = "sentry_sdk-1.36.0-py2.py3-none-any.whl", hash = "sha256:25d574f94fdf72199e331c2401fdac60d01b5be8f32822174c51c3ff0fc2f8cb"}, + {file = "sentry-sdk-1.37.0.tar.gz", hash = "sha256:ab4dc65a42db24c075e450c92b1e451ae266618fca857fcfe3dc16d37e1945eb"}, + {file = "sentry_sdk-1.37.0-py2.py3-none-any.whl", hash = "sha256:d3fc420d972e692376fe3fcd8560b5cea75aafac7a04f54ea6c01200aff59177"}, ] [package.dependencies] @@ -3667,7 +3502,6 @@ tornado = ["tornado (>=5)"] name = "service-identity" version = "23.1.0" description = "Service identity verification for pyOpenSSL & cryptography." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3690,14 +3524,13 @@ tests = ["coverage[toml] (>=5.0.2)", "pytest"] [[package]] name = "setuptools" -version = "69.0.1" +version = "69.0.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.1-py3-none-any.whl", hash = "sha256:6875bbd06382d857b1b90cd07cee6a2df701a164f241095706b5192bc56c5c62"}, - {file = "setuptools-69.0.1.tar.gz", hash = "sha256:f25195d54deb649832182d6455bffba7ac3d8fe71d35185e738d2198a4310044"}, + {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, + {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, ] [package.extras] @@ -3709,7 +3542,6 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -3721,7 +3553,6 @@ files = [ name = "smmap" version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3733,7 +3564,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3745,7 +3575,6 @@ files = [ name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "dev" optional = false python-versions = "*" files = [ @@ -3757,7 +3586,6 @@ files = [ name = "sqlparse" version = "0.4.4" description = "A non-validating SQL parser." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -3774,7 +3602,6 @@ test = ["pytest", "pytest-cov"] name = "stevedore" version = "5.1.0" description = "Manage dynamic plugins for Python applications" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3789,7 +3616,6 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" name = "structlog" version = "23.2.0" description = "Structured Logging for Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3807,7 +3633,6 @@ typing = ["mypy (>=1.4)", "rich", "twisted"] name = "swagger-spec-validator" version = "3.0.3" description = "Validation of Swagger specifications" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3824,7 +3649,6 @@ typing-extensions = "*" name = "tenant-schemas-celery" version = "2.2.0" description = "Celery integration for django-tenant-schemas and django-tenants" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3838,7 +3662,6 @@ celery = "*" name = "tomlkit" version = "0.12.3" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3850,7 +3673,6 @@ files = [ name = "tornado" version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" optional = false python-versions = ">= 3.8" files = [ @@ -3871,7 +3693,6 @@ files = [ name = "trio" version = "0.23.1" description = "A friendly Python library for async concurrency and I/O" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3891,7 +3712,6 @@ sortedcontainers = "*" name = "trio-websocket" version = "0.11.1" description = "WebSocket library for Trio" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3907,7 +3727,6 @@ wsproto = ">=0.14" name = "twilio" version = "8.10.2" description = "Twilio API client and TwiML generator" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -3925,7 +3744,6 @@ requests = ">=2.0.0" name = "twisted" version = "23.10.0" description = "An asynchronous networking framework written in Python" -category = "main" optional = false python-versions = ">=3.8.0" files = [ @@ -3965,7 +3783,6 @@ windows-platform = ["pywin32 (!=226)", "pywin32 (!=226)", "twisted[all-non-platf name = "twisted-iocpsupport" version = "1.0.4" description = "An extension for use in the twisted I/O Completion Ports reactor." -category = "main" optional = false python-versions = "*" files = [ @@ -3994,7 +3811,6 @@ files = [ name = "txaio" version = "23.1.1" description = "Compatibility API between asyncio/Twisted/Trollius" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4011,7 +3827,6 @@ twisted = ["twisted (>=20.3.0)", "zope.interface (>=5.2.0)"] name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4023,7 +3838,6 @@ files = [ name = "tzdata" version = "2023.3" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -4035,7 +3849,6 @@ files = [ name = "ua-parser" version = "0.18.0" description = "Python port of Browserscope's user agent parser" -category = "main" optional = false python-versions = "*" files = [ @@ -4047,7 +3860,6 @@ files = [ name = "uritemplate" version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4057,46 +3869,27 @@ files = [ [[package]] name = "urllib3" -version = "1.26.18" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.dependencies] -certifi = {version = "*", optional = true, markers = "extra == \"secure\""} -cryptography = {version = ">=1.3.4", optional = true, markers = "extra == \"secure\""} -idna = {version = ">=2.0.0", optional = true, markers = "extra == \"secure\""} -pyOpenSSL = {version = ">=0.14", optional = true, markers = "extra == \"secure\""} -PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} -urllib3-secure-extra = {version = "*", optional = true, markers = "extra == \"secure\""} +pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "urllib3-secure-extra" -version = "0.1.0" -description = "Marker library to detect whether urllib3 was installed with the deprecated [secure] extra" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "urllib3-secure-extra-0.1.0.tar.gz", hash = "sha256:ee9409cbfeb4b8609047be4c32fb4317870c602767e53fd8a41005ebe6a41dff"}, - {file = "urllib3_secure_extra-0.1.0-py2.py3-none-any.whl", hash = "sha256:f7adcb108b4d12a4b26b99eb60e265d087f435052a76aefa396b6ee85e9a6ef9"}, -] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" version = "0.24.0.post1" description = "The lightning-fast ASGI server." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4111,7 +3904,7 @@ h11 = ">=0.8" httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} -uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} @@ -4122,7 +3915,6 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", name = "uvloop" version = "0.19.0" description = "Fast implementation of asyncio event loop on top of libuv" -category = "main" optional = false python-versions = ">=3.8.0" files = [ @@ -4167,7 +3959,6 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" name = "vine" version = "5.1.0" description = "Python promises." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4179,7 +3970,6 @@ files = [ name = "watchdog" version = "3.0.0" description = "Filesystem events monitoring" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4219,7 +4009,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "watchfiles" version = "0.21.0" description = "Simple, modern and high performance file watching and code reload in python." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4305,21 +4094,19 @@ anyio = ">=3.0.0" [[package]] name = "wcwidth" -version = "0.2.11" +version = "0.2.12" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.11-py2.py3-none-any.whl", hash = "sha256:c4b153acf29f1f0d7fb1b00d097cce82b73de7a2016321c8d7ca71bd76dd848b"}, - {file = "wcwidth-0.2.11.tar.gz", hash = "sha256:25eb3ecbec328cdb945f56f2a7cfe784bdf7a73a8197398c7a7c65e7fe93e9ae"}, + {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, + {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, ] [[package]] name = "webauthn" version = "1.11.1" description = "Pythonic WebAuthn" -category = "main" optional = false python-versions = "*" files = [ @@ -4338,7 +4125,6 @@ pyOpenSSL = ">=23.2.0" name = "websocket-client" version = "1.6.4" description = "WebSocket client for Python with low level API options" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4355,7 +4141,6 @@ test = ["websockets"] name = "websockets" version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4437,7 +4222,6 @@ files = [ name = "wsproto" version = "1.2.0" description = "WebSockets state-machine based protocol implementation" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -4452,7 +4236,6 @@ h11 = ">=0.9.0,<1" name = "xmlsec" version = "1.3.13" description = "Python bindings for the XML Security Library" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -4478,7 +4261,6 @@ lxml = ">=3.8" name = "yarl" version = "1.9.3" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4582,7 +4364,6 @@ multidict = ">=4.0" name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4598,7 +4379,6 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p name = "zope-interface" version = "6.1" description = "Interfaces for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4652,7 +4432,6 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] name = "zxcvbn" version = "4.4.28" description = "" -category = "main" optional = false python-versions = "*" files = [ @@ -4661,5 +4440,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "~3.11" -content-hash = "46e484f52ef3b3b9e64091f3997090bd2a6d9cf489ddf721ff2eb153c2b4f285" +python-versions = "~3.12" +content-hash = "cd3ba23870e29c7b2d912cccf8414de94b8d1c167976874b1e87e36cd1791a10" diff --git a/pyproject.toml b/pyproject.toml index 2af9fd351..75c976b27 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ reportOptionalSubscript = false # so we have to disable those for now reportGeneralTypeIssues = false verboseOutput = false -pythonVersion = "3.11" +pythonVersion = "3.12" pythonPlatform = "All" [tool.black] @@ -97,7 +97,7 @@ const-rgx = "[a-zA-Z0-9_]{1,40}$" ignored-modules = ["binascii", "socket", "zlib"] generated-members = ["xmlsec.constants.*", "xmlsec.tree.*", "xmlsec.template.*"] -ignore = "migrations" +ignore = ["migrations", "tests"] max-attributes = 12 max-branches = 20 @@ -113,7 +113,7 @@ filterwarnings = [ [tool.poetry] name = "authentik" -version = "2023.10.3" +version = "2023.10.4" description = "" authors = ["authentik Team "] @@ -157,7 +157,7 @@ pycryptodome = "*" pydantic = "*" pydantic-scim = "*" pyjwt = "*" -python = "~3.11" +python = "~3.12" pyyaml = "*" requests-oauthlib = "*" sentry-sdk = "*" diff --git a/schema.yml b/schema.yml index 66b769f77..b9c9e8cf1 100644 --- a/schema.yml +++ b/schema.yml @@ -1,7 +1,7 @@ openapi: 3.0.3 info: title: authentik - version: 2023.10.3 + version: 2023.10.4 description: Making authentication simple. contact: email: hello@goauthentik.io diff --git a/tests/e2e/test_provider_oauth2_github.py b/tests/e2e/test_provider_oauth2_github.py index 49f640093..7df12137b 100644 --- a/tests/e2e/test_provider_oauth2_github.py +++ b/tests/e2e/test_provider_oauth2_github.py @@ -36,8 +36,8 @@ class TestProviderOAuth2Github(SeleniumTestCase): "auto_remove": True, "healthcheck": Healthcheck( test=["CMD", "wget", "--spider", "http://localhost:3000"], - interval=5 * 100 * 1000000, - start_period=1 * 100 * 1000000, + interval=5 * 1_000 * 1_000_000, + start_period=1 * 1_000 * 1_000_000, ), "environment": { "GF_AUTH_GITHUB_ENABLED": "true", diff --git a/tests/e2e/test_provider_oauth2_grafana.py b/tests/e2e/test_provider_oauth2_grafana.py index d096a3483..fdb75e1b9 100644 --- a/tests/e2e/test_provider_oauth2_grafana.py +++ b/tests/e2e/test_provider_oauth2_grafana.py @@ -42,8 +42,8 @@ class TestProviderOAuth2OAuth(SeleniumTestCase): "auto_remove": True, "healthcheck": Healthcheck( test=["CMD", "wget", "--spider", "http://localhost:3000"], - interval=5 * 100 * 1000000, - start_period=1 * 100 * 1000000, + interval=5 * 1_000 * 1_000_000, + start_period=1 * 1_000 * 1_000_000, ), "environment": { "GF_AUTH_GENERIC_OAUTH_ENABLED": "true", diff --git a/tests/e2e/test_source_oauth.py b/tests/e2e/test_source_oauth.py index 40f7e1ce7..c7f0fd881 100644 --- a/tests/e2e/test_source_oauth.py +++ b/tests/e2e/test_source_oauth.py @@ -113,8 +113,8 @@ class TestSourceOAuth2(SeleniumTestCase): "command": "dex serve /config.yml", "healthcheck": Healthcheck( test=["CMD", "wget", "--spider", "http://localhost:5556/dex/healthz"], - interval=5 * 100 * 1000000, - start_period=1 * 100 * 1000000, + interval=5 * 1_000 * 1_000_000, + start_period=1 * 1_000 * 1_000_000, ), "volumes": {str(Path(CONFIG_PATH).absolute()): {"bind": "/config.yml", "mode": "ro"}}, } diff --git a/tests/e2e/test_source_saml.py b/tests/e2e/test_source_saml.py index 2d5a7efa9..0921335b7 100644 --- a/tests/e2e/test_source_saml.py +++ b/tests/e2e/test_source_saml.py @@ -83,8 +83,8 @@ class TestSourceSAML(SeleniumTestCase): "auto_remove": True, "healthcheck": Healthcheck( test=["CMD", "curl", "http://localhost:8080"], - interval=5 * 100 * 1000000, - start_period=1 * 100 * 1000000, + interval=5 * 1_000 * 1_000_000, + start_period=1 * 1_000 * 1_000_000, ), "environment": { "SIMPLESAMLPHP_SP_ENTITY_ID": "entity-id", diff --git a/tests/integration/test_outpost_docker.py b/tests/integration/test_outpost_docker.py index 19b00b333..99daf1915 100644 --- a/tests/integration/test_outpost_docker.py +++ b/tests/integration/test_outpost_docker.py @@ -35,8 +35,8 @@ class OutpostDockerTests(DockerTestCase, ChannelsLiveServerTestCase): privileged=True, healthcheck=Healthcheck( test=["CMD", "docker", "info"], - interval=5 * 100 * 1000000, - start_period=5 * 100 * 1000000, + interval=5 * 1_000 * 1_000_000, + start_period=5 * 1_000 * 1_000_000, ), environment={"DOCKER_TLS_CERTDIR": "/ssl"}, volumes={ diff --git a/tests/integration/test_proxy_docker.py b/tests/integration/test_proxy_docker.py index 7b4e11ba8..7ba027cdd 100644 --- a/tests/integration/test_proxy_docker.py +++ b/tests/integration/test_proxy_docker.py @@ -35,8 +35,8 @@ class TestProxyDocker(DockerTestCase, ChannelsLiveServerTestCase): privileged=True, healthcheck=Healthcheck( test=["CMD", "docker", "info"], - interval=5 * 100 * 1000000, - start_period=5 * 100 * 1000000, + interval=5 * 1_000 * 1_000_000, + start_period=5 * 1_000 * 1_000_000, ), environment={"DOCKER_TLS_CERTDIR": "/ssl"}, volumes={ diff --git a/tests/wdio/package-lock.json b/tests/wdio/package-lock.json index bcb1e33c4..c55e1f66d 100644 --- a/tests/wdio/package-lock.json +++ b/tests/wdio/package-lock.json @@ -9,10 +9,10 @@ "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@typescript-eslint/eslint-plugin": "^6.12.0", "@typescript-eslint/parser": "^6.12.0", - "@wdio/cli": "^8.23.3", - "@wdio/local-runner": "^8.23.3", - "@wdio/mocha-framework": "^8.23.1", - "@wdio/spec-reporter": "^8.23.1", + "@wdio/cli": "^8.24.1", + "@wdio/local-runner": "^8.24.1", + "@wdio/mocha-framework": "^8.24.0", + "@wdio/spec-reporter": "^8.24.0", "eslint": "^8.54.0", "eslint-config-google": "^0.14.0", "eslint-plugin-sonarjs": "^0.23.0", @@ -1141,18 +1141,18 @@ "dev": true }, "node_modules/@wdio/cli": { - "version": "8.23.3", - "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.23.3.tgz", - "integrity": "sha512-iD4s8994u/nR1hZBcVY6yWBKqcyfVbwOtbjEcPoti4KcH5hs2u0ec0CpAh841NDx24fimDuPSh1znOsbrzvELw==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.24.1.tgz", + "integrity": "sha512-3NB5LwPN5f1C8LPumlOHFfoCFfE7OmM0h7vN0/gzjcIlCXMrJ9igePyDQ6Af7u/jqfPk3SloBsG9DnxZBCcAxQ==", "dev": true, "dependencies": { "@types/node": "^20.1.1", - "@wdio/config": "8.23.1", - "@wdio/globals": "8.23.3", + "@wdio/config": "8.24.0", + "@wdio/globals": "8.24.1", "@wdio/logger": "8.16.17", "@wdio/protocols": "8.23.0", - "@wdio/types": "8.23.1", - "@wdio/utils": "8.23.1", + "@wdio/types": "8.24.0", + "@wdio/utils": "8.24.0", "async-exit-hook": "^2.0.1", "chalk": "^5.2.0", "chokidar": "^3.5.3", @@ -1168,7 +1168,7 @@ "lodash.union": "^4.6.0", "read-pkg-up": "^10.0.0", "recursive-readdir": "^2.2.3", - "webdriverio": "8.23.3", + "webdriverio": "8.24.1", "yargs": "^17.7.2" }, "bin": { @@ -1191,14 +1191,14 @@ } }, "node_modules/@wdio/config": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.23.1.tgz", - "integrity": "sha512-MljMBvMr+QYoy4/FytFHWorFE3CrBdEWuroOaGzC/0gkVOcHRO4nOy2rKahdcPXJAuxFwJNqqHhBPj+4tWiz9w==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.24.0.tgz", + "integrity": "sha512-n92MPtRCLH763ssS6f/r7uWhnFkIg072nqZK+YnXTlTVIED9SdlMXlyjp9e/1sRmXUc7LbVPwvEVa35lsO0S8w==", "dev": true, "dependencies": { "@wdio/logger": "8.16.17", - "@wdio/types": "8.23.1", - "@wdio/utils": "8.23.1", + "@wdio/types": "8.24.0", + "@wdio/utils": "8.24.0", "decamelize": "^6.0.0", "deepmerge-ts": "^5.0.0", "glob": "^10.2.2", @@ -1209,29 +1209,29 @@ } }, "node_modules/@wdio/globals": { - "version": "8.23.3", - "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.23.3.tgz", - "integrity": "sha512-pmsR82CvbQu2zonwsIblsvNv+wOL0hCm4eJmCzLEMQ9WBB36kO28im8B/itsh/XKzqvQ1aidhCUdSSHFwFwZsQ==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.24.1.tgz", + "integrity": "sha512-r5JmeAZd9BiVwUesj8vTRPHybyEMAN/gkscVaawCXEWAm/+7pzLARv6e8PMrAayO4MkeviGBDYCm6d4+nYFOUQ==", "dev": true, "engines": { "node": "^16.13 || >=18" }, "optionalDependencies": { - "expect-webdriverio": "^4.5.1", - "webdriverio": "8.23.3" + "expect-webdriverio": "^4.6.1", + "webdriverio": "8.24.1" } }, "node_modules/@wdio/local-runner": { - "version": "8.23.3", - "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.23.3.tgz", - "integrity": "sha512-ELiD+zWR7PxvV+kIjnlIh2pUZ2dWSld7c6XeKff/e+YLnhc3AG7+/b3ml+JhLrtQqFt6X43V9IV9lfbNRiHWoQ==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.24.1.tgz", + "integrity": "sha512-/KdUVZn7aY5l1SBWd+xiTKhuO/eSAoFgNDLOArbL98ED2TYDzCZ3QCTlebbMckHA4J4ZZW/Rvox75a9Ne6yRzw==", "dev": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/logger": "8.16.17", "@wdio/repl": "8.23.1", - "@wdio/runner": "8.23.3", - "@wdio/types": "8.23.1", + "@wdio/runner": "8.24.1", + "@wdio/types": "8.24.0", "async-exit-hook": "^2.0.1", "split2": "^4.1.0", "stream-buffers": "^3.0.2" @@ -1268,16 +1268,16 @@ } }, "node_modules/@wdio/mocha-framework": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.23.1.tgz", - "integrity": "sha512-6PbALck8MuLnKhW5JGjCQrtfBivlX1fKqdin6clppVEI6LTqOxj5w8wmLhBbDV5oy68MzaSgc6hP141caWptuQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.24.0.tgz", + "integrity": "sha512-UqmvE5Z+KsD+u4mGuV5Y4GUDwrfmX1qIzD07idaLwidU/rHRy+Csn5mzyN38VIrIAuyMYdMGRyxEEieeu6a/4w==", "dev": true, "dependencies": { "@types/mocha": "^10.0.0", "@types/node": "^20.1.0", "@wdio/logger": "8.16.17", - "@wdio/types": "8.23.1", - "@wdio/utils": "8.23.1", + "@wdio/types": "8.24.0", + "@wdio/utils": "8.24.0", "mocha": "^10.0.0" }, "engines": { @@ -1303,14 +1303,14 @@ } }, "node_modules/@wdio/reporter": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.23.1.tgz", - "integrity": "sha512-MQKImrjRZdiJC1n0mw+OjgroX7SZdFApJTPijAT3mJ0KLeIf5PA+jnW3TZueMcWvG1NB7ZTAzL8BTWInOoZtgA==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.24.0.tgz", + "integrity": "sha512-yQhUwV5W1oDnVzr1pPBaOOCDwAE0Iyri9sAzIHb4pF1ezdUNTVe8ZfoWZSD4i7oC3riK8MlH8hXfGNCfrFrWlg==", "dev": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/logger": "8.16.17", - "@wdio/types": "8.23.1", + "@wdio/types": "8.24.0", "diff": "^5.0.0", "object-inspect": "^1.12.0" }, @@ -1319,35 +1319,35 @@ } }, "node_modules/@wdio/runner": { - "version": "8.23.3", - "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.23.3.tgz", - "integrity": "sha512-vbSNfEvgMcDdWgBoRSo2GRiV8ccsh5QJYP8b5FfRoHBAvC4OZV6ZVx9Xzh7QsEfSaXXA9G/vaUGX0PPrS0gmgQ==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.24.1.tgz", + "integrity": "sha512-IfbLFUM+/cZoEJCLPjesekQ9FjuH/+OnJPzDIcxEv4RLShZX8mQKmiUw/HNMlQlcOkeAzfTObzaT+f8Tt2ZYlQ==", "dev": true, "dependencies": { "@types/node": "^20.1.0", - "@wdio/config": "8.23.1", - "@wdio/globals": "8.23.3", + "@wdio/config": "8.24.0", + "@wdio/globals": "8.24.1", "@wdio/logger": "8.16.17", - "@wdio/types": "8.23.1", - "@wdio/utils": "8.23.1", + "@wdio/types": "8.24.0", + "@wdio/utils": "8.24.0", "deepmerge-ts": "^5.0.0", - "expect-webdriverio": "^4.5.1", + "expect-webdriverio": "^4.6.1", "gaze": "^1.1.2", - "webdriver": "8.23.1", - "webdriverio": "8.23.3" + "webdriver": "8.24.0", + "webdriverio": "8.24.1" }, "engines": { "node": "^16.13 || >=18" } }, "node_modules/@wdio/spec-reporter": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.23.1.tgz", - "integrity": "sha512-Igc/vsa58xbklwz8vJ1He3tyuxeEP9TQvlT23HizG1QziBvvU1b6V5qnM9BPiDvTg+n3SByJI0Ce0jyn4J2wYQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.24.0.tgz", + "integrity": "sha512-L65ua0+lGkmiiElHWE1zD3EnzZzyJli5tLmwYcahh4LwJ3hEOL7ut/GOZ8LTMih87T1q+KttQiJVmgnOEjMH5w==", "dev": true, "dependencies": { - "@wdio/reporter": "8.23.1", - "@wdio/types": "8.23.1", + "@wdio/reporter": "8.24.0", + "@wdio/types": "8.24.0", "chalk": "^5.1.2", "easy-table": "^1.2.0", "pretty-ms": "^7.0.0" @@ -1369,9 +1369,9 @@ } }, "node_modules/@wdio/types": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.23.1.tgz", - "integrity": "sha512-ym3tWSUGvmKwQ9vNPQfcKvJwGNK/Fh3e5WloNj3zoaUTKgD0aJeFQ0+Dz6KGlNowA0j5VkcqTTXo+UZ3l4Cx9A==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.24.0.tgz", + "integrity": "sha512-FXbJnQCS1b39RKqBlW9HTNEP4vukxjFc+GiwvPS+XPtY+3Vn7eOyBv3X3CiH1K7C+tzelqlio/HgP68pV5cXsQ==", "dev": true, "dependencies": { "@types/node": "^20.1.0" @@ -1381,14 +1381,14 @@ } }, "node_modules/@wdio/utils": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.23.1.tgz", - "integrity": "sha512-VA47MOpt+7svHj3W9r+DUl3t73tJbjF7+ZXL0Lk7QLe79xevd+mPk+YmuTEepn+0MljJWAuqRCEKFG/HK77RNw==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.24.0.tgz", + "integrity": "sha512-m0qsWx2U5ZBTS0vzg1gTBp9mTrcLQlDrOBVR28LJ93a/e0bj+4aQ4c5U2y9gUzV+lKH0wUJSZTLnhebQwapURQ==", "dev": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.16.17", - "@wdio/types": "8.23.1", + "@wdio/types": "8.24.0", "decamelize": "^6.0.0", "deepmerge-ts": "^5.1.0", "edgedriver": "^5.3.5", @@ -3278,9 +3278,9 @@ } }, "node_modules/expect-webdriverio": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.5.1.tgz", - "integrity": "sha512-fwcMpPV/+e0bS+F7+bC1UoQsZYjJTcbA1XhU4VVB2pEZDhNmeuaPrCanA0tLVP8nDya75oegXK7LgPzP3zZR9w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.6.1.tgz", + "integrity": "sha512-w6ee91kN3BoxNGVKQheAqFpRGMehdDg7kDiErEk/oM7tbd/WUT4R4v9KYOUtjiaUFHWWCRW2FtcOOjcd0+1pvQ==", "dev": true, "dependencies": { "expect": "^29.7.0", @@ -3291,8 +3291,9 @@ "node": ">=16 || >=18 || >=20" }, "optionalDependencies": { - "@wdio/globals": "^8.22.1", - "webdriverio": "^8.22.1" + "@wdio/globals": "^8.23.1", + "@wdio/logger": "^8.16.17", + "webdriverio": "^8.23.1" } }, "node_modules/external-editor": { @@ -8615,18 +8616,18 @@ } }, "node_modules/webdriver": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.23.1.tgz", - "integrity": "sha512-0PLN6cqP5cSorZBU2OBk2XKhxKpWWKzvClHBiGCqZIuofZ3kPTq7uYFapej0c4xFmKXHEiLIN7Qkt4H3gWTs8g==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.24.0.tgz", + "integrity": "sha512-zI1zw4lbP2cg1NPikIaUBHQU3+xdvEEBi0Jrydhtp3VVeIEqJWwUFxG/P9LwJpiQ0PYMb/5cxoQrSRhrEXyXHQ==", "dev": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", - "@wdio/config": "8.23.1", + "@wdio/config": "8.24.0", "@wdio/logger": "8.16.17", "@wdio/protocols": "8.23.0", - "@wdio/types": "8.23.1", - "@wdio/utils": "8.23.1", + "@wdio/types": "8.24.0", + "@wdio/utils": "8.24.0", "deepmerge-ts": "^5.1.0", "got": "^ 12.6.1", "ky": "^0.33.0", @@ -8674,18 +8675,18 @@ } }, "node_modules/webdriverio": { - "version": "8.23.3", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.23.3.tgz", - "integrity": "sha512-kH+GAQrC6GfrF0LDX5odqn3CVvVrdIeTAYsQtji9tmb2YTJMIx57GNL1NIXhV4MFtalcEc9UjhZCwekLMemEOg==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.24.1.tgz", + "integrity": "sha512-NMu5Y0EFjx7GK4K8uDDi14q8IdHdSQiqzJoyGjuzGy8mj5c04Ta1hoLG5KPag5LzIQNOtJmqwbTFL5PLqragOg==", "dev": true, "dependencies": { "@types/node": "^20.1.0", - "@wdio/config": "8.23.1", + "@wdio/config": "8.24.0", "@wdio/logger": "8.16.17", "@wdio/protocols": "8.23.0", "@wdio/repl": "8.23.1", - "@wdio/types": "8.23.1", - "@wdio/utils": "8.23.1", + "@wdio/types": "8.24.0", + "@wdio/utils": "8.24.0", "archiver": "^6.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", @@ -8702,7 +8703,7 @@ "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^11.0.1", - "webdriver": "8.23.1" + "webdriver": "8.24.0" }, "engines": { "node": "^16.13 || >=18" diff --git a/tests/wdio/package.json b/tests/wdio/package.json index 0a93cd6cb..0b048885d 100644 --- a/tests/wdio/package.json +++ b/tests/wdio/package.json @@ -6,10 +6,10 @@ "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@typescript-eslint/eslint-plugin": "^6.12.0", "@typescript-eslint/parser": "^6.12.0", - "@wdio/cli": "^8.23.3", - "@wdio/local-runner": "^8.23.3", - "@wdio/mocha-framework": "^8.23.1", - "@wdio/spec-reporter": "^8.23.1", + "@wdio/cli": "^8.24.1", + "@wdio/local-runner": "^8.24.1", + "@wdio/mocha-framework": "^8.24.0", + "@wdio/spec-reporter": "^8.24.0", "eslint": "^8.54.0", "eslint-config-google": "^0.14.0", "eslint-plugin-sonarjs": "^0.23.0", diff --git a/web/package-lock.json b/web/package-lock.json index e90dc247f..66a8659ae 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -15,18 +15,17 @@ "@codemirror/lang-xml": "^6.0.2", "@codemirror/legacy-modes": "^6.3.3", "@codemirror/theme-one-dark": "^6.1.2", - "@esbuild/linux-arm64": "^0.19.7", "@formatjs/intl-listformat": "^7.5.3", "@fortawesome/fontawesome-free": "^6.4.2", - "@goauthentik/api": "^2023.10.3-1700268969", + "@goauthentik/api": "^2023.10.4-1700591367", "@lit-labs/context": "^0.4.0", "@lit-labs/task": "^3.1.0", "@lit/localize": "^0.11.4", "@open-wc/lit-helpers": "^0.6.0", "@patternfly/elements": "^2.4.0", "@patternfly/patternfly": "^4.224.2", - "@sentry/browser": "^7.81.0", - "@sentry/tracing": "^7.81.0", + "@sentry/browser": "^7.81.1", + "@sentry/tracing": "^7.81.1", "@webcomponents/webcomponentsjs": "^2.8.0", "base64-js": "^1.5.1", "chart.js": "^4.4.0", @@ -69,7 +68,7 @@ "@storybook/web-components-vite": "^7.5.3", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/chart.js": "^2.9.41", - "@types/codemirror": "5.60.14", + "@types/codemirror": "5.60.15", "@types/grecaptcha": "^3.0.7", "@typescript-eslint/eslint-plugin": "^6.12.0", "@typescript-eslint/parser": "^6.12.0", @@ -86,10 +85,10 @@ "npm-run-all": "^4.1.5", "prettier": "^3.1.0", "pseudolocale": "^2.0.0", - "pyright": "^1.1.336", + "pyright": "^1.1.337", "react": "^18.2.0", "react-dom": "^18.2.0", - "rollup": "^4.5.0", + "rollup": "^4.5.1", "rollup-plugin-copy": "^3.5.0", "rollup-plugin-cssimport": "^1.0.3", "rollup-plugin-postcss-lit": "^2.1.0", @@ -2924,9 +2923,9 @@ } }, "node_modules/@goauthentik/api": { - "version": "2023.10.3-1700268969", - "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2023.10.3-1700268969.tgz", - "integrity": "sha512-EwkNfFL8sgPzDRHQ+IlkYyFxlN9U79x3OaRgVR1GuEyKF2XXNm+ftdpqSmTSYeIrObEdOgvKItqKBGw5EYZXsg==" + "version": "2023.10.4-1700591367", + "resolved": "https://registry.npmjs.org/@goauthentik/api/-/api-2023.10.4-1700591367.tgz", + "integrity": "sha512-ljC/SHH6ZgGC2qjvuA3gley8sRz9wVzr5FgRGKeqd1mi6G6TfnFYeA7tuuqgQc6WGN2MVMG17FnBraTI77Rl/A==" }, "node_modules/@hcaptcha/types": { "version": "1.0.3", @@ -4593,9 +4592,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.0.tgz", - "integrity": "sha512-OINaBGY+Wc++U0rdr7BLuFClxcoWaVW3vQYqmQq6B3bqQ/2olkaoz+K8+af/Mmka/C2yN5j+L9scBkv4BtKsDA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.1.tgz", + "integrity": "sha512-YaN43wTyEBaMqLDYeze+gQ4ZrW5RbTEGtT5o1GVDkhpdNcsLTnLRcLccvwy3E9wiDKWg9RIhuoy3JQKDRBfaZA==", "cpu": [ "arm" ], @@ -4606,9 +4605,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.5.0.tgz", - "integrity": "sha512-UdMf1pOQc4ZmUA/NTmKhgJTBimbSKnhPS2zJqucqFyBRFPnPDtwA8MzrGNTjDeQbIAWfpJVAlxejw+/lQyBK/w==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.5.1.tgz", + "integrity": "sha512-n1bX+LCGlQVuPlCofO0zOKe1b2XkFozAVRoczT+yxWZPGnkEAKTTYVOGZz8N4sKuBnKMxDbfhUsB1uwYdup/sw==", "cpu": [ "arm64" ], @@ -4619,9 +4618,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.5.0.tgz", - "integrity": "sha512-L0/CA5p/idVKI+c9PcAPGorH6CwXn6+J0Ys7Gg1axCbTPgI8MeMlhA6fLM9fK+ssFhqogMHFC8HDvZuetOii7w==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.5.1.tgz", + "integrity": "sha512-QqJBumdvfBqBBmyGHlKxje+iowZwrHna7pokj/Go3dV1PJekSKfmjKrjKQ/e6ESTGhkfPNLq3VXdYLAc+UtAQw==", "cpu": [ "arm64" ], @@ -4632,9 +4631,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.5.0.tgz", - "integrity": "sha512-QZCbVqU26mNlLn8zi/XDDquNmvcr4ON5FYAHQQsyhrHx8q+sQi/6xduoznYXwk/KmKIXG5dLfR0CvY+NAWpFYQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.5.1.tgz", + "integrity": "sha512-RrkDNkR/P5AEQSPkxQPmd2ri8WTjSl0RYmuFOiEABkEY/FSg0a4riihWQGKDJ4LnV9gigWZlTMx2DtFGzUrYQw==", "cpu": [ "x64" ], @@ -4645,9 +4644,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.5.0.tgz", - "integrity": "sha512-VpSQ+xm93AeV33QbYslgf44wc5eJGYfYitlQzAi3OObu9iwrGXEnmu5S3ilkqE3Pr/FkgOiJKV/2p0ewf4Hrtg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.5.1.tgz", + "integrity": "sha512-ZFPxvUZmE+fkB/8D9y/SWl/XaDzNSaxd1TJUSE27XAKlRpQ2VNce/86bGd9mEUgL3qrvjJ9XTGwoX0BrJkYK/A==", "cpu": [ "arm" ], @@ -4658,9 +4657,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.5.0.tgz", - "integrity": "sha512-OrEyIfpxSsMal44JpEVx9AEcGpdBQG1ZuWISAanaQTSMeStBW+oHWwOkoqR54bw3x8heP8gBOyoJiGg+fLY8qQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.5.1.tgz", + "integrity": "sha512-FEuAjzVIld5WVhu+M2OewLmjmbXWd3q7Zcx+Rwy4QObQCqfblriDMMS7p7+pwgjZoo9BLkP3wa9uglQXzsB9ww==", "cpu": [ "arm64" ], @@ -4671,9 +4670,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.5.0.tgz", - "integrity": "sha512-1H7wBbQuE6igQdxMSTjtFfD+DGAudcYWhp106z/9zBA8OQhsJRnemO4XGavdzHpGhRtRxbgmUGdO3YQgrWf2RA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.5.1.tgz", + "integrity": "sha512-f5Gs8WQixqGRtI0Iq/cMqvFYmgFzMinuJO24KRfnv7Ohi/HQclwrBCYkzQu1XfLEEt3DZyvveq9HWo4bLJf1Lw==", "cpu": [ "arm64" ], @@ -4684,9 +4683,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.5.0.tgz", - "integrity": "sha512-FVyFI13tXw5aE65sZdBpNjPVIi4Q5mARnL/39UIkxvSgRAIqCo5sCpCELk0JtXHGee2owZz5aNLbWNfBHzr71Q==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.5.1.tgz", + "integrity": "sha512-CWPkPGrFfN2vj3mw+S7A/4ZaU3rTV7AkXUr08W9lNP+UzOvKLVf34tWCqrKrfwQ0NTk5GFqUr2XGpeR2p6R4gw==", "cpu": [ "x64" ], @@ -4697,9 +4696,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.5.0.tgz", - "integrity": "sha512-eBPYl2sLpH/o8qbSz6vPwWlDyThnQjJfcDOGFbNjmjb44XKC1F5dQfakOsADRVrXCNzM6ZsSIPDG5dc6HHLNFg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.5.1.tgz", + "integrity": "sha512-ZRETMFA0uVukUC9u31Ed1nx++29073goCxZtmZARwk5aF/ltuENaeTtRVsSQzFlzdd4J6L3qUm+EW8cbGt0CKQ==", "cpu": [ "x64" ], @@ -4710,9 +4709,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.5.0.tgz", - "integrity": "sha512-xaOHIfLOZypoQ5U2I6rEaugS4IYtTgP030xzvrBf5js7p9WI9wik07iHmsKaej8Z83ZDxN5GyypfoyKV5O5TJA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.5.1.tgz", + "integrity": "sha512-ihqfNJNb2XtoZMSCPeoo0cYMgU04ksyFIoOw5S0JUVbOhafLot+KD82vpKXOurE2+9o/awrqIxku9MRR9hozHQ==", "cpu": [ "arm64" ], @@ -4723,9 +4722,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.5.0.tgz", - "integrity": "sha512-Al6quztQUrHwcOoU2TuFblUQ5L+/AmPBXFR6dUvyo4nRj2yQRK0WIUaGMF/uwKulvRcXkpHe3k9A8Vf93VDktA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.5.1.tgz", + "integrity": "sha512-zK9MRpC8946lQ9ypFn4gLpdwr5a01aQ/odiIJeL9EbgZDMgbZjjT/XzTqJvDfTmnE1kHdbG20sAeNlpc91/wbg==", "cpu": [ "ia32" ], @@ -4736,9 +4735,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.5.0.tgz", - "integrity": "sha512-8kdW+brNhI/NzJ4fxDufuJUjepzINqJKLGHuxyAtpPG9bMbn8P5mtaCcbOm0EzLJ+atg+kF9dwg8jpclkVqx5w==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.5.1.tgz", + "integrity": "sha512-5I3Nz4Sb9TYOtkRwlH0ow+BhMH2vnh38tZ4J4mggE48M/YyJyp/0sPSxhw1UeS1+oBgQ8q7maFtSeKpeRJu41Q==", "cpu": [ "x64" ], @@ -4749,84 +4748,84 @@ ] }, "node_modules/@sentry-internal/tracing": { - "version": "7.81.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.81.0.tgz", - "integrity": "sha512-mc3tdOEvAE6kaCvT3BpMwCgfTT2yfXjWpC7g+3N8U/yuQEmQSCDZA/ut7EkzU0DyhG3t8HzT0c+CAG3HtilEAQ==", + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.81.1.tgz", + "integrity": "sha512-E5xm27xrLXL10knH2EWDQsQYh5nb4SxxZzJ3sJwDGG9XGKzBdlp20UUhKqx00wixooVX9uCj3e4Jg8SvNB1hKg==", "dependencies": { - "@sentry/core": "7.81.0", - "@sentry/types": "7.81.0", - "@sentry/utils": "7.81.0" + "@sentry/core": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/browser": { - "version": "7.81.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.81.0.tgz", - "integrity": "sha512-/6xsdSeZspq7+LARg6Gt0KMUQRf6nZcuA20X9Y28uJqyZFYoXBnxG3+JJcxycxleEJRci20gjBwOtM157anUJA==", + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.81.1.tgz", + "integrity": "sha512-DNtS7bZEnFPKVoGazKs5wHoWC0FwsOFOOMNeDvEfouUqKKbjO7+RDHbr7H6Bo83zX4qmZWRBf8V+3n3YPIiJFw==", "dependencies": { - "@sentry-internal/tracing": "7.81.0", - "@sentry/core": "7.81.0", - "@sentry/replay": "7.81.0", - "@sentry/types": "7.81.0", - "@sentry/utils": "7.81.0" + "@sentry-internal/tracing": "7.81.1", + "@sentry/core": "7.81.1", + "@sentry/replay": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/core": { - "version": "7.81.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.81.0.tgz", - "integrity": "sha512-FCAKlqo9Z6fku69bkahw1AN+eBfAgRgOL1RpBLZgyG7YBW12vtSkHb5SDvZZTkm541Fo3hhepUTLtX0qmpA4yw==", + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.81.1.tgz", + "integrity": "sha512-tU37yAmckOGCw/moWKSwekSCWWJP15O6luIq+u7wal22hE88F3Vc5Avo8SeF3upnPR+4ejaOFH+BJTr6bgrs6Q==", "dependencies": { - "@sentry/types": "7.81.0", - "@sentry/utils": "7.81.0" + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/replay": { - "version": "7.81.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.81.0.tgz", - "integrity": "sha512-kJRWjEzby1015Ds5TTNNVe9EkzfwPfPcM06ycba+DIXPJ2LiaSXvH3OU0s2HEJ9Vo/+jcpFMlODXFF/wrYIn9w==", + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.81.1.tgz", + "integrity": "sha512-4ueT0C4bYjngN/9p0fEYH10dTMLovHyk9HxJ6zSTgePvGVexhg+cSEHXisoBDwHeRZVnbIvsVM0NA7rmEDXJJw==", "dependencies": { - "@sentry-internal/tracing": "7.81.0", - "@sentry/core": "7.81.0", - "@sentry/types": "7.81.0", - "@sentry/utils": "7.81.0" + "@sentry-internal/tracing": "7.81.1", + "@sentry/core": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" }, "engines": { "node": ">=12" } }, "node_modules/@sentry/tracing": { - "version": "7.81.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.81.0.tgz", - "integrity": "sha512-3QRusk7AZzbNWuPalqSCQCPAEJ9L167txYUkL5x3Y+YK4gZt3/bNovoVNDaQ06XmIYL9ENXVw1hbdk0DIgirpw==", + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.81.1.tgz", + "integrity": "sha512-of9WMu0XgEBl9onTEk8SMaxj4BUadaUvHH96T1OpRMjdyuCM/3u2mjCkh3ekINr3Fu/uT2kJ/kO3goUxfcdXIQ==", "dependencies": { - "@sentry-internal/tracing": "7.81.0" + "@sentry-internal/tracing": "7.81.1" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/types": { - "version": "7.81.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.81.0.tgz", - "integrity": "sha512-rbYNYSSrrnwNndC7S+eVT84GRLEyCZNh9oXUQqzgSD6ngXCZ0xFJW6si75uv/XQBWIw4rkj9xfRcy8DU0Tj4fg==", + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.81.1.tgz", + "integrity": "sha512-dvJvGyctiaPMIQqa46k56Re5IODWMDxiHJ1UjBs/WYDLrmWFPGrEbyJ8w8CYLhYA+7qqrCyIZmHbWSTRIxstHw==", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.81.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.81.0.tgz", - "integrity": "sha512-yC9IvfeVbG4dygi4b+iUUMHp9xeHJfCn6XLbqjJVfq3xjAzBGHgfrpw6fYPNyTljXKb6CTiSXSqaNaQJE4CkPA==", + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.81.1.tgz", + "integrity": "sha512-gq+MDXIirHKxNZ+c9/lVvCXd6y2zaZANujwlFggRH2u9SRiPaIXVilLpvMm4uJqmqBMEcY81ArujExtHvkbCqg==", "dependencies": { - "@sentry/types": "7.81.0" + "@sentry/types": "7.81.1" }, "engines": { "node": ">=8" @@ -10130,9 +10129,9 @@ } }, "node_modules/@types/codemirror": { - "version": "5.60.14", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.14.tgz", - "integrity": "sha512-Gs+9yVSe7ceqhY7SJ6YUpU20aVnj/E2wjYHPWyntSD2ayr204xgPtVWyEp+8ARZjteEYVLJ/rVnHtdSCPbfYFQ==", + "version": "5.60.15", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", + "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", "dev": true, "dependencies": { "@types/tern": "*" @@ -18469,9 +18468,9 @@ } }, "node_modules/pyright": { - "version": "1.1.336", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.336.tgz", - "integrity": "sha512-PE/ArjnfS5dKon05zAX2eMzSQmu4ftCITzLqKgFKuwLIRnKJ+l4QGwkCKtYvWoXKm1fWr+TjqYpdRejrYkolyg==", + "version": "1.1.337", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.337.tgz", + "integrity": "sha512-iZcID/OX5rjiToKCb3DShygOC21Zx8GvSwei+ApyTfK2C2xdRWyV+yJCrUUF75/qVkTZy8ZCDwQc4aYDqD8Scg==", "dev": true, "bin": { "pyright": "index.js", @@ -19171,9 +19170,9 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.5.0.tgz", - "integrity": "sha512-41xsWhzxqjMDASCxH5ibw1mXk+3c4TNI2UjKbLxe6iEzrSQnqOzmmK8/3mufCPbzHNJ2e04Fc1ddI35hHy+8zg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.5.1.tgz", + "integrity": "sha512-0EQribZoPKpb5z1NW/QYm3XSR//Xr8BeEXU49Lc/mQmpmVVG5jPUVrpc2iptup/0WMrY9mzas0fxH+TjYvG2CA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -19183,18 +19182,18 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.5.0", - "@rollup/rollup-android-arm64": "4.5.0", - "@rollup/rollup-darwin-arm64": "4.5.0", - "@rollup/rollup-darwin-x64": "4.5.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.5.0", - "@rollup/rollup-linux-arm64-gnu": "4.5.0", - "@rollup/rollup-linux-arm64-musl": "4.5.0", - "@rollup/rollup-linux-x64-gnu": "4.5.0", - "@rollup/rollup-linux-x64-musl": "4.5.0", - "@rollup/rollup-win32-arm64-msvc": "4.5.0", - "@rollup/rollup-win32-ia32-msvc": "4.5.0", - "@rollup/rollup-win32-x64-msvc": "4.5.0", + "@rollup/rollup-android-arm-eabi": "4.5.1", + "@rollup/rollup-android-arm64": "4.5.1", + "@rollup/rollup-darwin-arm64": "4.5.1", + "@rollup/rollup-darwin-x64": "4.5.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.5.1", + "@rollup/rollup-linux-arm64-gnu": "4.5.1", + "@rollup/rollup-linux-arm64-musl": "4.5.1", + "@rollup/rollup-linux-x64-gnu": "4.5.1", + "@rollup/rollup-linux-x64-musl": "4.5.1", + "@rollup/rollup-win32-arm64-msvc": "4.5.1", + "@rollup/rollup-win32-ia32-msvc": "4.5.1", + "@rollup/rollup-win32-x64-msvc": "4.5.1", "fsevents": "~2.3.2" } }, diff --git a/web/package.json b/web/package.json index ccfb5e03a..c5a67b304 100644 --- a/web/package.json +++ b/web/package.json @@ -38,15 +38,15 @@ "@codemirror/theme-one-dark": "^6.1.2", "@formatjs/intl-listformat": "^7.5.3", "@fortawesome/fontawesome-free": "^6.4.2", - "@goauthentik/api": "^2023.10.3-1700268969", + "@goauthentik/api": "^2023.10.4-1700591367", "@lit-labs/context": "^0.4.0", "@lit-labs/task": "^3.1.0", "@lit/localize": "^0.11.4", "@open-wc/lit-helpers": "^0.6.0", "@patternfly/elements": "^2.4.0", "@patternfly/patternfly": "^4.224.2", - "@sentry/browser": "^7.81.0", - "@sentry/tracing": "^7.81.0", + "@sentry/browser": "^7.81.1", + "@sentry/tracing": "^7.81.1", "@webcomponents/webcomponentsjs": "^2.8.0", "base64-js": "^1.5.1", "chart.js": "^4.4.0", @@ -89,7 +89,7 @@ "@storybook/web-components-vite": "^7.5.3", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/chart.js": "^2.9.41", - "@types/codemirror": "5.60.14", + "@types/codemirror": "5.60.15", "@types/grecaptcha": "^3.0.7", "@typescript-eslint/eslint-plugin": "^6.12.0", "@typescript-eslint/parser": "^6.12.0", @@ -106,10 +106,10 @@ "npm-run-all": "^4.1.5", "prettier": "^3.1.0", "pseudolocale": "^2.0.0", - "pyright": "^1.1.336", + "pyright": "^1.1.337", "react": "^18.2.0", "react-dom": "^18.2.0", - "rollup": "^4.5.0", + "rollup": "^4.5.1", "rollup-plugin-copy": "^3.5.0", "rollup-plugin-cssimport": "^1.0.3", "rollup-plugin-postcss-lit": "^2.1.0", diff --git a/web/src/admin/groups/GroupViewPage.ts b/web/src/admin/groups/GroupViewPage.ts index a2f704363..8faaca198 100644 --- a/web/src/admin/groups/GroupViewPage.ts +++ b/web/src/admin/groups/GroupViewPage.ts @@ -118,7 +118,7 @@ export class GroupViewPage extends AKElement {
diff --git a/web/src/common/constants.ts b/web/src/common/constants.ts index e5c7c3c65..459fc91a5 100644 --- a/web/src/common/constants.ts +++ b/web/src/common/constants.ts @@ -3,7 +3,7 @@ export const SUCCESS_CLASS = "pf-m-success"; export const ERROR_CLASS = "pf-m-danger"; export const PROGRESS_CLASS = "pf-m-in-progress"; export const CURRENT_CLASS = "pf-m-current"; -export const VERSION = "2023.10.3"; +export const VERSION = "2023.10.4"; export const TITLE_DEFAULT = "authentik"; export const ROUTE_SEPARATOR = ";"; diff --git a/web/xliff/fr.xlf b/web/xliff/fr.xlf index eb5cbb2f1..37dfc4bce 100644 --- a/web/xliff/fr.xlf +++ b/web/xliff/fr.xlf @@ -7953,30 +7953,39 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti 0: Too guessable: risky password. (guesses &lt; 10^3) + 0: Trop prévisible: mot de passe risqué. (essais &lt; 10^3) 1: Very guessable: protection from throttled online attacks. (guesses &lt; 10^6) + 1: Très prévisible: protection contre les attaques en ligne limitées. (essais &lt; 10^6) 2: Somewhat guessable: protection from unthrottled online attacks. (guesses &lt; 10^8) + 2: Quelque peu prévisible: protection contre les attaques en ligne non limitées. (essais &lt; 10^8) 3: Safely unguessable: moderate protection from offline slow-hash scenario. (guesses &lt; 10^10) + 3: Sûrement imprévisible: protection modérée contre les attaques de hash-lent hors ligne. (essais &lt; 10^10) 4: Very unguessable: strong protection from offline slow-hash scenario. (guesses &gt;= 10^10) + 4: Très imprévisible: forte protection control les attaques de hash-lent hors ligne. (essais &gt;= 10^10) Successfully created user and added to group + Utilisateur créé et ajouté au groupe avec succès This user will be added to the group "". + Cet utilisateur sera ajouté au groupe &quot;&quot;. Pretend user exists + Faire comme si l'utilisateur existe When enabled, the stage will always accept the given user identifier and continue. + Lorsqu'activé, l'étape acceptera toujours l'identifiant utilisateur donné et continuera. diff --git a/web/xliff/zh_TW.xlf b/web/xliff/zh_TW.xlf index bc39005a9..eccaef9f7 100644 --- a/web/xliff/zh_TW.xlf +++ b/web/xliff/zh_TW.xlf @@ -1,6036 +1,7930 @@ - - - + + English - 英语 + 英語 + French - 法语 + 法語 + Turkish - 土耳其语 + 土耳其語 + Spanish - 西班牙的 + 西班牙語 + Polish - 波兰语 + 波蘭語 + Taiwanese Mandarin - Taiwanese Mandarin + 繁體中文(台灣) + Chinese (simplified) - 简体中文 + 簡體中文 + Chinese (traditional) - 繁体中文 + 繁體中文 + German - 德语 + 德語 + Loading... - 载入中…… + 載入中…… + Application - 应用程序 + 應用程式 + Logins 登入 + Show less - 显示更少 + 顯示更少 + Show more - 显示更多 + 顯示更多 + UID UID + Name 姓名 + App App + Model Name - 型号名称 + 型號名稱 + Message - 信息 + 訊息 + Subject Subject + From 来自 + To - To + + Context 上下文 + User - 用户 + 使用者 + Affected model: - 受影响的模型: + 受影響的模型: + Authorized application: - 授权应用程序: + 已授權的應用程式: + Using flow - 使用 Flow + 使用流程 + Email info: - 电子邮件信息: + 電子郵件訊息: + Secret: - Secret: + 機密密碼: + Open issue on GitHub... - 在 GitHub 上打开问题... + 前往 GitHub 回報問題…… + Exception 例外 + Expression - 表情 + 表示式 + Binding - 绑定 + 附加 + Request - 请求 + 要求 + Object - 对象 + 物件 + Result - 结果 + 結果 + Passing - 通过 + 通過 + Messages - 信息 + 訊息 + Using source - 使用源 + 使用來源 + Attempted to log in as - 已尝试以 - 身份登入 + 已嘗試以 的身份登入 + No additional data available. - 没有其他可用数据。 + 没有其他可用資料。 + Click to change value - 单击以更改值 + 點擊以更改數值 + Select an object. - 选择一个对象。 + 選擇一個物件。 + Loading options... + 載入選項中…… + Connection error, reconnecting... - 连接错误,正在重新连接... + 連線錯誤,正在重新連線…… + Login 登入 + Failed login - 登入失败 + 登入失敗 + Logout - 退出 + 登出 + User was written to - 用户被写入 + 使用者已經被寫入到 + Suspicious request - 可疑请求 + 可疑的要求 + Password set - 密码已设置 + 密碼設定完成 + Secret was viewed - 已查看 Secret + 機密密碼已被查看 + Secret was rotated - 秘密被轮换了 + 機密密碼已被輪替 + Invitation used - 已使用邀请 + 已使用邀請函 + Application authorized - 应用程序已授权 + 已成功授權應用程式 + Source linked - 源链接 + 已連接來源 + Impersonation started - 模拟已开始 + 已開始模擬 + Impersonation ended - 模拟已结束 + 已結束模擬 + Flow execution - 流程执行 + 流程的執行事件 + Policy execution - 策略执行 + 政策的執行事件 + Policy exception - 策略例外 + 政策的例外事件 + Property Mapping exception - 属性映射异常 + 屬性對應例外事件 + System task execution - 系统任务执行 + 系統工作執行事件 + System task exception - 系统任务异常 + 系統工作例外事件 + General system exception - 一般系统异常 + 一般系統例外事件 + Configuration error - 配置错误 + 設定錯誤 + Model created - 模型已创建 + 已建立模型 + Model updated - 模型已更新 + 已更新模型 + Model deleted - 模型已删除 + 已刪除模型 + Email sent - 电子邮件已发送 + 已發送電子郵件 + Update available - 更新可用 + 有可用更新 + Unknown severity + 嚴重程度未知 + Alert - 注意 + 警報 + Notice 注意 + Warning 警告 + no tabs defined - 未定义选项卡 + 未定義的標籤頁 + - of - - - - of - + 個項目中的 - 項目 + Go to previous page - 转到上一页 + 回到上一頁 + Go to next page - 转到下一页 + 前往下一頁 + Search... - 搜索... + 搜尋中…… + Loading - 正在加载 + 載入中 + No objects found. - 未找到任何对象。 + 找不到任何物件。 + Failed to fetch objects. + 無法擷取物件。 + Refresh - 刷新 + 重新整理 + Select all rows - 选择所有行 + 選擇所有列 + Action - 操作 + 動作 + Creation Date - 创建日期 + 建立日期 + Client IP - 客户端 IP + 用戶端 IP + Tenant - 租户 + 租戶 + Recent events + 最近的事件 + On behalf of - 代表 - + 代表 + - - + No Events found. 未找到任何事件。 + No matching events could be found. - 找不到匹配的事件。 + 找不到符合的事件。 + Embedded outpost is not configured correctly. - 嵌入式 outpost 配置不正确。 + 嵌入式 outpost 設定不正確。 + Check outposts. - 检查 outposts. + 檢查 outposts. + HTTPS is not detected correctly - 未正确检测到 HTTPS + 未正確的偵測到 HTTPS + Server and client are further than 5 seconds apart. - 服务器和客户端之间的距离超过5秒。 + 伺服器和用戶端的時間差距超過5秒。 + OK OK + Everything is ok. 一切正常。 + System status - 系统状态 + 系統狀態 + Based on + 基於 + is available! - - 可用! + 新版本 可用! + Up-to-date! - 最新! + 最新版本! + Version 版本 + Workers Workers + No workers connected. Background tasks will not run. - 没有 workers 连接。后台任务将无法运行。 + 沒有已連線的 workers,無法執行背景工作。 + hour(s) ago + 小時以前 + day(s) ago + 天以前 + Authorizations - 授权 + 授權 + Failed Logins - 登入失败 + 登入失敗 + Successful Logins - 成功登入 + 登入成功 + : : + Cancel 取消 + LDAP Source - LDAP 源 + LDAP 來源 + SCIM Provider + SCIM 供應商 + Healthy + 健康 + Healthy outposts 健康的 Outposts + Admin - 管理员 + 系統管理員 + Not found - 未找到 + 找不到 + The URL "" was not found. - 找不到网址 “ - ”。 + 找不到網址 ""。 + Return home - 返回主页 + 回到首頁 + General system status - 常规系统状态 + 一般系統狀態 + Welcome, . - 欢迎, - + 歡迎, + Quick actions - 快速行动 + 快速動作 + Create a new application - 创建新应用程序 + 建立新的應用程式 + Check the logs - 检查日志 + 檢查日誌 + Explore integrations - 探索集成 + 探索整合方案 + Manage users + 管理使用者 + Outpost status - Outpost 状态 + Outpost 狀態 + Sync status - 同步状态 + 同步狀態 + Logins and authorizations over the last week (per 8 hours) + 一周的登入和授權狀態(每 8 小時) + Apps with most usage - 使用率最高的应用 + 使用頻率最高的應用程式 + days ago - - 天前 + 天前 + Objects created - 已创建对象 + 已建立物件 + Users created per day in the last month - 上个月每天创建的用户 + 上個月每天的建立使用者數量 + Logins per day in the last month - 上个月每天的登入次数 + 上個月每天的登入次數 + Failed Logins per day in the last month - 上个月每天的失败登入次数 + 上個月每天的登入失敗次數 + Clear search + 清除搜尋結果 + System Tasks - 系统任务 + 系統工作 + Long-running operations which authentik executes in the background. - authentik 在后台执行的长时间运行的操作。 + authentik 在背景執行的長時間工作。 + Identifier - 标识符 + 識別碼 + Description 描述 + Last run - 上次运行 + 最後執行 + Status - 状态 + 狀態 + Actions - 操作 + 動作 + Successful 成功 + Error - 错误 + 錯誤 + Unknown 未知 + Duration + 持續時間 + seconds + + Authentication - 身份验证 + 身分認證 + Authorization - 授权 + 授權 + Enrollment - 注册 + 註冊 + Invalidation 失效 + Recovery - 恢复 + 救援 + Stage Configuration - 阶段配置 + 階段設定 + Unenrollment - 取消注册 + 取消註冊 + Unknown designation + 未知命名 + Stacked + 堆疊 + Content left + 內容置左 + Content right + 內容置右 + Sidebar left + 側邊攔置左 + Sidebar right + 側邊攔置右 + Unknown layout + 未知的版面設計 + Successfully updated provider. - 已成功更新提供程序。 + 成功更新供應商。 + Successfully created provider. - 已成功创建提供商。 + 成功建立供應商。 + Bind flow - Bind 流程 + 附加流程 + Flow used for users to authenticate. + 用於使用者認證的流程 + Search group - 搜索组 + 搜尋群組 + Users in the selected group can do search queries. If no group is selected, no LDAP Searches are allowed. - 所选组中的用户可以执行搜索查询。如果未选择任何组,则不允许 LDAP 搜索。 + 選中的群組中的使用者可以搜尋查詢,如果未選擇任何群組,則無法執行 LDAP 搜尋。 + Bind mode + 附加模式 + Cached binding + 儲存在快取的附加 + Flow is executed and session is cached in memory. Flow is executed when session expires + 當流程執行後,會談訊息將儲存在記憶體中。一旦會談過期,該流程將重新執行 + Direct binding + 直接附加 + Always execute the configured bind flow to authenticate the user + 總是執行設定的附加流程來驗證使用者 + Configure how the outpost authenticates requests. + 設定 Outpost 如何驗證要求。 + Search mode - 搜索模式 + 搜尋模式 + Cached querying + 快取中的查詢 + The outpost holds all users and groups in-memory and will refresh every 5 Minutes + Outpost 將所有使用者和群組保存在記憶體中,並每5分鐘重新整理。 + Direct querying + 直接查詢 + Always returns the latest data, but slower than cached querying + 總是回傳最新的資料,但這會比快取查詢慢上許多 + Configure how the outpost queries the core authentik server's users. - 配置前哨如何查询核心 authentik 服务器的用户。 + 設定 Outpost 如何查詢 authentik core 伺服器上的使用者。 + Protocol settings - 协议设置 + 通訊協定設定 + Base DN Base DN + LDAP DN under which bind requests and search requests can be made. - 可以发出绑定请求和搜索请求的 LDAP DN。 + 可以進行附加和搜尋要求的 LDAP DN。 + Certificate - 证书 + 憑證 + UID start number - UID 起始编号 + UID 起始編號 + The start for uidNumbers, this number is added to the user.Pk to make sure that the numbers aren't too low for POSIX users. Default is 2000 to ensure that we don't collide with local users uidNumber - 对于UIDNumbers来说,这个数字被添加到User.pk中,以确保对于POSIX用户来说,这个数字不会太低。默认值为 2000,以确保我们不会与本地用户 uidNumber 发生冲突 + 對於 uidNumbers 的起始值,這個數字會加到 user.Pk 上,以確保對於 POSIX 使用者來說,這個數字不會太低。預設值是 2000,以確保我們不會和本機使用者的 uidNumber 產生衝突 + GID start number - GID 起始编号 + GID 起始編號 + The start for gidNumbers, this number is added to a number generated from the group.Pk to make sure that the numbers aren't too low for POSIX groups. Default is 4000 to ensure that we don't collide with local groups or users primary groups gidNumber - 对于 GIDNumbers 来说,这个数字被添加到从 group.pk 生成的数字中,以确保对于 POSIX 组来说,这个数字不会太低。默认值为 4000,以确保我们不会与本地组或用户主组 GIDNumber 发生冲突 + 對於 gidNumbers 的起始值,這個數字會加到從 group.Pk 生成的數字上,以確保對於 POSIX 群組來說,這個數字不會太低。預設值是 4000,以確保我們不會和本地群組或使用者的主要群組的 gidNumber 產生衝突 + (Format: hours=-1;minutes=-2;seconds=-3). (格式: hours=-1;minutes=-2;seconds=-3). + (Format: hours=1;minutes=2;seconds=3). (格式: hours=1;minutes=2;seconds=3). + The following keywords are supported: + 支援以下的關鍵字: + Authentication flow - 身份验证流程 + 身分認證流程 + Flow used when a user access this provider and is not authenticated. + 使用者存取此供應商但未獲授權時的流程 + Authorization flow - 授权流程 + 授權流程 + Flow used when authorizing this provider. - 授权此请求发起端时使用的Flow。 + 授權此供應商時的流程。 + Client type - 客户机类型 + 用戶端類型 + Confidential - 机密 + 機密 + Confidential clients are capable of maintaining the confidentiality of their credentials such as client secrets + 機密用戶端能夠維護其憑證的機密性,如:用戶端金鑰。 + Public - 公开 + 公開 + Public clients are incapable of maintaining the confidentiality and should use methods like PKCE. + 公開用戶端能夠使用如 PKCE 等方式維護其機密性。 + Client ID - 客户端 ID + 用戶端 ID + Client Secret - 客户端密钥 + 用戶端金鑰 + Redirect URIs/Origins (RegEx) + 重新導向到 URI 或 原始來源 (正規表示式) + Valid redirect URLs after a successful authorization flow. Also specify any origins here for Implicit flows. - 授权流成功后有效的重定向 URL。还可以在此处为隐式流指定任何来源。 + 成功授權流程後的有效重新導向的網址。對於隱式流程,也在此處指定任何來源。 + If no explicit redirect URIs are specified, the first successfully used redirect URI will be saved. - 如果未指定显式重定向 URI,则将保存第一个成功使用的重定向 URI。 + 如果未指定明確的重新導向 URI,將儲存第一個成功重新導向的 URI。 + To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. + 欲允許任何重新導向的 URI,輸入 ".*" ,但請注意這個可會有安全性風險。 + Signing Key - 签名密钥 + 簽署金鑰 + Key used to sign the tokens. - 用于对令牌进行签名的密钥。 + 用於對權杖進行簽署的金鑰。 + Advanced protocol settings - 高级协议设置 + 進階通訊協定設定 + Access code validity - 访问代码有效性 + 存取認證碼的有效性 + Configure how long access codes are valid for. - 配置访问代码的有效期限。 + 設定存取認證碼的有效期限。 + Access Token validity + 存取權杖的有效性 + Configure how long access tokens are valid for. - 配置访问令牌的有效时间。 + 設定存取權杖的有效期限。 + Refresh Token validity + 重新整理權杖的有效性 + Configure how long refresh tokens are valid for. + 設定重新整理權杖的有效期限。 + Scopes - 范围 + 範疇 + Select which scopes can be used by the client. The client still has to specify the scope to access the data. - 选择客户端可以使用哪些作用域。客户端仍然需要指定访问数据的范围。 + 選擇用戶端可以使用的範疇,用戶端仍然需要指定範疇才能存取資料。 + Hold control/command to select multiple items. - 按住 ctrl/command 键可选择多个项目。 + 按住 ctrl/command 鍵選擇多個項目。 + Subject mode Subject 模式 + Based on the User's hashed ID + 基於使用者雜湊 ID + Based on the User's ID + 基於使用者 ID + Based on the User's UUID + 基於使用者 UUID + Based on the User's username + 基於使用者名稱 + Based on the User's Email + 基於使用者的電子郵件 + This is recommended over the UPN mode. + 這比 UPN 模式更推薦。 + Based on the User's UPN + 基於使用者的 UPN + Requires the user to have a 'upn' attribute set, and falls back to hashed user ID. Use this mode only if you have different UPN and Mail domains. + 需要使用者設定了「upn」特徵項,備選將使用使用者雜湊 ID。只有您有不同的 UPN 和郵件網域時才使用本模式。 + Configure what data should be used as unique User Identifier. For most cases, the default should be fine. - 配置应将哪些数据用作唯一用户标识符。在大多数情况下,默认值应该没问题。 + 設定應該使用哪些資料作為唯一的使用者識別碼。在大多數情況下使用預設值即可。 + Include claims in id_token - 在 id_token 中包含声明 + 在 id_token 中包含身分聲明 + Include User claims from scopes in the id_token, for applications that don't access the userinfo endpoint. - 对于不访问userinfo端点的应用程序,将来自作用域的用户声明包含在id_token中。 + 對於那些不存取 userinfo 端點的應用程式,在 id_token 中將包含來自範疇的使用者身分聲明。 + Issuer mode - Issuer mode + 發行者模式 + Each provider has a different issuer, based on the application slug + 基於應用程式的縮寫,每個供應商都有一個不同的發行者 + Same identifier is used for all providers - 所有提供商都使用相同的标识符 + 所有供應商都使用相同的識別碼 + Configure how the issuer field of the ID Token should be filled. - 配置如何填写 ID 令牌的颁发者字段。 + 設定該如何填寫 ID 權杖的發行者欄位。 + Machine-to-Machine authentication settings + 機器對機器的認證設定 + Trusted OIDC Sources + 受信任的 OIDC 來源 + JWTs signed by certificates configured in the selected sources can be used to authenticate to this provider. + 透過所選來源中的憑證來簽署的 JWT ,可用於對此供應商進行身份認證。 + HTTP-Basic Username Key - HTTP-Basic 用户名密钥 + HTTP 基本認證的使用者金鑰 + User/Group Attribute used for the user part of the HTTP-Basic Header. If not set, the user's Email address is used. - 用于 HTTP-Basic 标头用户部分的用户/组属性。如果未设置,则使用用户的电子邮件地址。 + 用於 HTTP 基本認證標頭中,使用者區塊中的使用者/群組特徵項。如果未設定則套用使用者的電子郵件地址。 + HTTP-Basic Password Key - HTTP-Basic 密码密钥 + HTTP 基本認證的密碼金鑰 + User/Group Attribute used for the password part of the HTTP-Basic Header. - 用于 HTTP-Basic 标头的密码部分的用户/组属性。 + 用於 HTTP 基本認證標頭中,密碼區塊中的使用者/群組特徵項。 + Proxy 代理 + Forward auth (single application) - 转发身份验证(单个应用程序) + 轉發身分認證(單一應用程式) + Forward auth (domain level) - 转发身份验证(域级别) + 轉發身分認證(網域級別) + This provider will behave like a transparent reverse-proxy, except requests must be authenticated. If your upstream application uses HTTPS, make sure to connect to the outpost using HTTPS as well. - 除了请求必须经过身份验证外,此提供程序的行为类似于透明的反向代理。如果您的上游应用程序使用 HTTPS,请确保也使用 HTTPS 连接到 Outpost。 + 此供應商將充當透明的反向代理,唯一的區別是請求必須通過身份認證。如果您的上游應用程式使用 HTTPS,請確保也使用 HTTPS 連接到 Outpost。 + External host - 外部主机 + 外部主機 + The external URL you'll access the application at. Include any non-standard port. - 您将通过其访问应用程序的外部 URL。包括任何非标准端口。 + 您欲存取應用程式的外部網址,包含任何非標準的連接埠。 + Internal host - 内部主机 + 內部主機 + Upstream host that the requests are forwarded to. - 请求被转发到的上游主机。 + 要求轉發到上游主機。 + Internal host SSL Validation - 内部主机 SSL 验证 + 內部主機的 SSL 驗證 + Validate SSL Certificates of upstream servers. - 验证上游服务器的 SSL 证书。 + 驗證上游主機的 SSL 憑證。 + Use this provider with nginx's auth_request or traefik's forwardAuth. Only a single provider is required per root domain. You can't do per-application authorization, but you don't have to create a provider for each application. - 将此提供程序与 nginx 的 auth_request 或 traefik 的 ForwardAuth 一起使用。每个根域只需要一个提供程序。您无法执行每个应用程序的授权,但不必为每个应用程序创建提供程序。 + 將此供應商與 nginx 的 auth_request 或 traefik 的 forwardAuth 一起使用。每個主網域只需要一個提供者。您無法執行每個應用程式的授權,但您不必為每個應用程式建立提供者。 + An example setup can look like this: - 设置示例如下所示: + 設定的範例如下: + authentik running on auth.example.com - auth.example.com 上运行的 authentik + authentik 運行於 auth.example.com + app1 running on app1.example.com - app1 在 app1.example.com 上运行 + app1 運行於 app1.example.com + In this case, you'd set the Authentication URL to auth.example.com and Cookie domain to example.com. - 在这种情况下,您需要将身份验证网址设置为 auth.example.com,将 Cookie 域设置为 example.com。 + 在這種情況下,您需要將身分認證網址設定為 auth.example.com 並將 Cookie 的網域設定為 example.com。 + Authentication URL - 身份验证 URL + 身分認證網址 + The external URL you'll authenticate at. The authentik core server should be reachable under this URL. - 您将在其中进行身份验证的外部 URL。在此 URL 下应该可以访问身份验证核心服务器。 + 您身分認證的外部網址,該網址應該要能夠連線到 authentik Core 伺服器。 + Cookie domain - Cookie 域名 + Cookie 網域 + Set this to the domain you wish the authentication to be valid for. Must be a parent domain of the URL above. If you're running applications as app1.domain.tld, app2.domain.tld, set this to 'domain.tld'. - 将此设置为您希望身份验证有效的域。必须是上述 URL 的父域名。如果你以 app1.domain.tld、app2.domain.tld 的身份运行应用程序,请将其设置为 “domain.tld”。 + 將此設定為用於使身分認證為有效的網域。必須是上述網址的上級網域。如果您的應用程式運行於 app1.domain.tld、app2.domain.tld 等等,則將其設定為「domain.tld」。 + Unknown proxy mode + 未知的代理模式 + Token validity - 令牌有效性 + 權杖的有效性 + Configure how long tokens are valid for. - 配置令牌的有效期限。 + 設定權杖的有效期限。 + Additional scopes + 額外的範疇 + Additional scope mappings, which are passed to the proxy. - 传递给代理的其他作用域映射。 + 額外範疇的對應,用於傳遞給代理服務。 + Unauthenticated URLs - 未经身份验证的 URL + 未經身分認證的網址 + Unauthenticated Paths - 未经身份验证的路径 + 未經身分認證的路徑 + Regular expressions for which authentication is not required. Each new line is interpreted as a new expression. - 不需要身份验证的正则表达式。每个新行都被解释为一个新表达式。 + 不需要身分認證的正規表示式,每一行區隔為新的表示式。 + When using proxy or forward auth (single application) mode, the requested URL Path is checked against the regular expressions. When using forward auth (domain mode), the full requested URL including scheme and host is matched against the regular expressions. - 使用代理或转发身份验证(单个应用程序)模式时,将根据正则表达式检查请求的 URL 路径。使用前向身份验证(域模式)时,请求的完整 URL(包括 scheme 和 host)将与正则表达式进行匹配。 + 當使用代理或轉發認證(單一應用程式)模式時,會根據正規表示式檢查要求的網址路徑。在使用轉發認證(網域模式)時,包含方案和主機在內的完整要求網址將與正規表示式進行配對。 + Authentication settings + 身分認證設定 + Intercept header authentication + 擷取標頭的身分認證 + When enabled, authentik will intercept the Authorization header to authenticate the request. + 啟用時,authentik 將會擷取授權標頭來認證要求。 + Send HTTP-Basic Authentication + 傳送 HTTP 基本身分認證 + Send a custom HTTP-Basic Authentication header based on values from authentik. + 傳送一個基於 authentik 數值客製化的 HTTP 基本身分認證標頭。 + ACS URL - ACS URL + ACS 網址 + Issuer - Issuer + 發行者 + Also known as EntityID. + 也稱為 EntityID。 + Service Provider Binding - 服务提供商绑定 + 服務供應商附加 + Redirect - 重定向 + 重新導向 + Post Post + Determines how authentik sends the response back to the Service Provider. - 确定 authentik 如何将响应发送回服务提供商。 + 決定 authentik 如何將回應送回給服務供應商。 + Audience Audience + Signing Certificate - 签名证书 + 簽署憑證 + Certificate used to sign outgoing Responses going to the Service Provider. - 用于签署发送给服务提供商的外发响应的证书。 + 用於簽署外送回應給服務供應商的憑證。 + Verification Certificate - 验证证书 + 驗證憑證 + When selected, incoming assertion's Signatures will be validated against this certificate. To allow unsigned Requests, leave on default. - 选中后,传入声明的签名将根据此证书进行验证。要允许未签名的请求,请保留默认值。 + 選擇時,傳入斷言的簽章將依據這個憑證進行認證。若要允許未簽署的要求,請表留預設值。 + Property mappings - 属性映射 + 屬性對應 + NameID Property Mapping - nameID 属性映射 + nameID 屬性對應 + Configure how the NameID value will be created. When left empty, the NameIDPolicy of the incoming request will be respected. - 配置如何创建 NameID 值。如果留空,将遵守传入请求的 NameIdPolicy。 + 設定如何建立 NameID 數值。如果為空則將遵守傳入要求的 NameIdPolicy。 + Assertion valid not before - 断言之前无效 + 斷言的有效期限不早於 + Configure the maximum allowed time drift for an assertion. - 为断言配置允许的最大时间漂移。 + 設定斷言的允許最大時間偏移量。 + Assertion valid not on or after - 断言不在当天或之后有效 + 斷言在這個的時間及之後無效: + Assertion not valid on or after current time + this value. + 斷言的有效期限為當前時間加上此值 + Session valid not on or after - 会话不在当天或之后有效 + 會談在這個時間及之後無效: + Session not valid on or after current time + this value. + 會談的有效期限是當前時間加上此值 + Digest algorithm - 摘要算法 + 摘要演算法 + Signature algorithm - 签名算法 + 簽章演算法 + Successfully imported provider. - 已成功导入提供程序。 + 成功匯入供應商。 + Metadata - 元数据 + 中繼資料 + Apply changes + 套用變更 + Close - 关闭 + 關閉 + Finish 完成 + Back 返回 + No form found - 找不到表格 + 找不到表單 + Form didn't return a promise for submitting - 表单未返回提交承诺 + 表單提交時沒有回傳一個 promise 物件 + Select type - 选择类型 + 選擇類型 + Try the new application wizard + 試試看新的應用程式精靈 + The new application wizard greatly simplifies the steps required to create applications and providers. + 新的應用程式精靈大量簡化了建立應用程式和供應商的所需步驟。 + Try it now + 立即嘗試 + Create - 创建 + 建立 + New provider - 新建提供程序 + 新增供應商 + Create a new provider. - 创建一个新提供程序 + 建立一個新的供應商。 + Create - 创建 - + 建立 + Shared secret + 共享密鑰 + Client Networks + 用戶端網路 + List of CIDRs (comma-seperated) that clients can connect from. A more specific CIDR will match before a looser one. Clients connecting from a non-specified CIDR will be dropped. + 用戶端可以連線的 CIDR 列表(以逗號分隔)。 + 更具體的 CIDR 會在較寬鬆的 CIDR 之前優先套用。 + 來自未指定 CIDR 的用戶端連線將被拒絕。 URL + 網址 + SCIM base url, usually ends in /v2. + SCIM 的基礎網址,通常以 /v2 結尾。 + Token - 令牌 + 權杖 + Token to authenticate with. Currently only bearer authentication is supported. + 用於身份認證的權杖,目前只支援 bearer 認證。 + User filtering + 使用者篩選 + Exclude service accounts + 排除服務帳號 + Group - + 群組 + Only sync users within the selected group. + 只同步選中群組的使用者。 + Attribute mapping + 特徵項對應 + User Property Mappings - 用户属性映射 + 使用者屬性對應 + Property mappings used to user mapping. + 用於使用者對應的屬性對應 + Group Property Mappings - 组属性映射 + 群組屬性對應 + Property mappings used to group creation. - 用于组创建的属性映射。 + 用於建立群組的屬性對應 + Not used by any other object. - 不被任何其他对象使用。 + 未被其他物件使用。 + object will be DELETED - 对象将被删除 + 物件將被刪除 + connection will be deleted - 连接将被删除 + 連線將被刪除 + reference will be reset to default value - 引用将被重置为默认值 + 引用將被重設為預設值 + reference will be set to an empty value - 引用将被设置为空值 + 引用將被設為空值 + () - - ( - ) + () + ID ID + Successfully deleted + 成功刪除 Failed to delete : - 无法删除 - : - + 無法刪除 : + Delete - 删除 - + 刪除 + Are you sure you want to delete ? + 您確定要刪除 嗎? Delete - 删除 + 刪除 + Providers - 提供商 + 供應商 + Provide support for protocols like SAML and OAuth to assigned applications. - 为分配的应用程序提供对 SAML 和 OAuth 等协议的支持。 + 為分配的應用程式提供如 SAML 和 OAuth 等協定的支援。 + Type - 类型 + 類型 + Provider(s) - 提供商 + 供應商 + Assigned to application - 分配给应用程序 + 分配給應用程式: + Assigned to application (backchannel) + 分配給應用程式(背景通道): + Warning: Provider not assigned to any application. - 警告:提供程序未分配给任何应用程序。 + 警告:供應商未分配給任何應用程式。 + Update 更新 + Update - 更新 - + 更新 + Select providers to add to application + 選擇要加入到應用程式的供應商 + Add - 添加 + 加入 + Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". - 输入完整的网址、相对路径,或者使用 'fa://fa-test' 来使用 Font Awesome 图标 “fa-test”。 + 輸入完整網址、相對路徑,或者使用 'fa://fa-test' 來使用 Font Awesome 圖示 「fa-test」。 + Path template for users created. Use placeholders like `%(slug)s` to insert the source slug. + 使用者建立的路徑範本,使用預置內容例如「%(slug)s」來插入來源縮寫。 + Successfully updated application. - 已成功更新应用程序。 + 成功更新應用程式。 + Successfully created application. - 已成功创建应用程序。 + 成功建立應用程式。 + Application's display Name. - 应用的显示名称。 + 應用程式的顯示名稱。 + Slug Slug + Optionally enter a group name. Applications with identical groups are shown grouped together. - 输入可选的分组名称。分组相同的应用程序会显示在一起。 + 可選:輸入群組名稱。具有相同群組的應用程式會排列在同一分組。 + Provider - 提供商 + 供應商 + Select a provider that this application should use. + 選擇一個應用程式應該使用的供應商。 + Select backchannel providers which augment the functionality of the main provider. + 選擇背景通道供應商,以增強主要提供者的功能。 + Policy engine mode - 策略引擎模式 + 政策引擎模式 + Any policy must match to grant access + 必須符合任一政策才能取得存取權 + All policies must match to grant access + 必須符合全部政策才能取得存取權 + UI settings - 用户界面设置 + 使用者介面設定 + Launch URL - 启动 URL + 啟動的網址 + If left empty, authentik will try to extract the launch URL based on the selected provider. - 如果留空,authentik 将尝试根据选定的提供商提取启动网址。 + 如果為空,authentik 將會嘗試從選擇的供應商取得啟動網址。 + Open in new tab + 另開新分頁 + If checked, the launch URL will open in a new browser tab or window from the user's application library. + 如果勾選此項,將從使用者的應用程式庫中,在瀏覽器新的分頁或視窗中打開啟動的網址。 + Icon - 图标 + 圖示 + Currently set to: - 当前设置为: + 目前設定為: + Clear icon - 清除图标 + 清除圖示 + Publisher - 发行人 + 發行人 + Create Application - 创建应用程序 + 建立應用程式 + Overview 概述 + Changelog - 更新日志 + 更新日誌 + Warning: Provider is not used by any Outpost. - 警告:提供者未被任何 Outpos 使用。 + 警告:供應商未被任何 Outpost 使用。 + Assigned to application - 分配给应用程序 + 分配給應用程式 + Update LDAP Provider - 更新 LDAP 提供程序 + 更新 LDAP 供應商 + Edit - 编辑 + 編輯 + How to connect - 如何连接 + 如何連線 + Connect to the LDAP Server on port 389: - 通过端口 389 连接到 LDAP 服务器: + 使用連接埠 389 連線到 LDAP 伺服器: + Check the IP of the Kubernetes service, or - 检查 Kubernetes 服务的 IP,或者 + 檢查 Kubernetes 服務的 IP,或者 + The Host IP of the docker host - docker 主机的主机 IP + docker 服務的主機 IP + Bind DN Bind DN + Bind Password - Bind 密码 + Bind 密碼 + Search base - 搜索基础 + 搜尋基礎 + Preview + 預覽 + Warning: Provider is not used by an Application. - 警告:应用程序不使用提供程序。 + 警告:供應商未被任何應用程式使用。 + Redirect URIs - 重定向 URI + 重新導向 URI + Update OAuth2 Provider - 更新 OAuth2 提供程序 + 更新 OAuth2 供應商 + OpenID Configuration URL - OpenID 配置网址 + OpenID 設定網址 + OpenID Configuration Issuer - OpenID 配置发行者 + OpenID 設定發行者 + Authorize URL - 授权 URL + 授權網址 + Token URL - 令牌网址 + 權杖網址 + Userinfo URL - 用户信息网址 + 使用者資訊網址 + Logout URL - 退出 URL + 登出網址 + JWKS URL + JWKS 網址 + Example JWT payload (for currently authenticated user) + 範例 JWT 酬載(給目前已認證的使用者) + Forward auth (domain-level) - 转发身份验证(域级) + 轉發身分認證(網域級別) + Nginx (Ingress) Nginx (Ingress) + Nginx (Proxy Manager) - Nginx(代理管理器) + Nginx Prxoxy Manager + Nginx (standalone) - Nginx (standalone) + Nginx (獨立應用程式) + Traefik (Ingress) Traefik (Ingress) + Traefik (Compose) Traefik (Compose) + Traefik (Standalone) - Traefik (Standalone) + Traefik (獨立應用程式) + Caddy (Standalone) + Caddy (獨立應用程式) + Internal Host - 内部主机 + 內部主機 + External Host - 外部主机 + 外部主機 + Basic-Auth - 基本身份验证 + 基本身分認證 + Yes - Yes + + Mode 模式 + Update Proxy Provider - 更新代理提供程序 + 更新代理供應商 + Protocol Settings - 协议设置 + 通訊協定設定 + Allowed Redirect URIs - 允许的重定向 URI + 允許的重新導向 URI + Setup - 设置 + 設定 + No additional setup is required. - 无需进行其他设置。 + 無須額外設定。 + Update Radius Provider + 更新 Radius 供應商 + Download 下載 + Copy download URL - 复制下载 URL + 複製下載連結網址 + Download signing certificate - 下载签名证书 + 下載簽章憑證 + Related objects - 相关对象 + 有關聯的物件 + Update SAML Provider - 更新 SAML 提供程序 + 更新 SAML 供應商 + SAML Configuration + SAML 設定 + EntityID/Issuer + SEntityID/發行者 + SSO URL (Post) + SSO 網址(Post方法) + SSO URL (Redirect) + SSO 網址(重新導向) + SSO URL (IdP-initiated Login) + SSO 網址(識別提供者Idp發起的登入) + SLO URL (Post) + SLO 網址(Post方法) + SLO URL (Redirect) + SLO 網址(重新導向) + SAML Metadata - SAML 元数据 + SAML 中繼資料 + Example SAML attributes + SAML 的特徵項範例 + NameID attribute + NameID 特徵項 + Warning: Provider is not assigned to an application as backchannel provider. + 警告:供應商未作為背景通道分配給任何應用程式。 + Update SCIM Provider + 更新 SCIM 供應商 + Sync not run yet. + 尚未執行同步。 + Run sync again - 再次运行同步 + 再次執行同步 + Modern applications, APIs and Single-page applications. + 新一代的應用程式,API 和單頁式應用程式 + LDAP LDAP + Provide an LDAP interface for applications and users to authenticate against. + 提供一個 LDAP 介面,供應用程式和用戶進行身份認證。 + New application + 新增應用程式 + Applications - 应用程序 + 應用程式 + Provider Type - 提供商类型 + 供應商類型 + Application(s) - 应用程序 + 應用程式 + Application Icon - 应用程序图标 + 應用程式圖示 + Update Application - 更新应用程序 + 更新應用程式 + Successfully sent test-request. - 已成功发送测试请求。 + 成功發送測試要求。 + Log messages - 日志消息 + 日誌訊息 + No log messages. - 没有日志消息。 + 無日誌訊息。 + Active - 激活 + 啟用 + Last login - 上次登录 + 最近登入 + Select users to add - 选择要添加的用户 + 選擇要加入的使用者 + Successfully updated group. - 已成功更新组。 + 成功更新群組。 + Successfully created group. - 已成功创建组。 + 成功建立群組。 + Is superuser - 是超级用户 + 成為超級使用者 + Users added to this group will be superusers. - 添加到该组的用户均为超级用户。 + 加入到該群組的成員將會成為超級使用者。 + Parent - 家长 + 上級群組 + Attributes - 属性 + 特徵項 + Set custom attributes using YAML or JSON. - 使用 YAML 或 JSON 设置自定义属性。 + 使用 YAML 或 JSON 設定客製化特徵項。 + Successfully updated binding. - 已成功更新绑定。 + 成功更新附加。 + Successfully created binding. - 成功创建绑定。 + 成功建立附加。 + Policy - 策略 + 政策 + Group mappings can only be checked if a user is already logged in when trying to access this source. - 组绑定仅会在已登录用户访问此源时检查。 + 僅當已登入的使用者在存取此來源時,才能檢查群組對應。 + User mappings can only be checked if a user is already logged in when trying to access this source. - 用户绑定仅会在已登录用户访问此源时检查。 + 僅當已登入的使用者在存取此來源時,才能檢查使用者對應。 + Enabled - 已启用 + 啟用中 + Negate result - 否定结果 + 反向结果 + Negates the outcome of the binding. Messages are unaffected. - 否定绑定的结果。消息不受影响。 + 反轉附加的結果。訊息不受影響。 + Order - 订购 + 執行順序 + Timeout - 超时 + 逾時過期 + Successfully updated policy. - 已成功更新策略。 + 成功更新政策。 + Successfully created policy. - 已成功创建策略。 + 成功建立政策。 + A policy used for testing. Always returns the same result as specified below after waiting a random duration. - 用于测试的策略。等待随机持续时间后,始终返回与下面指定的结果相同的结果。 + 用於測試的政策。等待隨機的時間後回傳相同的結果。 + Execution logging - 执行日志记录 + 執行的日誌紀錄 + When this option is enabled, all executions of this policy will be logged. By default, only execution errors are logged. - 启用此选项后,将记录此策略的所有执行。默认情况下,只记录执行错误。 + 啟用此選項時,將會記錄這個政策所有的日誌。預設只會記錄錯誤日誌。 + Policy-specific settings - 特定于策略的设置 + 政策詳細設定 + Pass policy? - 通行证政策? + 政策通過? + Wait (min) - 等待 (最短) + 等待時間 (最短) + The policy takes a random time to execute. This controls the minimum time it will take. - 策略需要一段随机时间才能执行。这将控制所需的最短时间。 + 政策需要一段隨機時間才能執行。這個設定控制最短等待時間。 + Wait (max) - 等待 (最多) + 等待時間 (最長) + Matches an event against a set of criteria. If any of the configured values match, the policy passes. - 根据一组条件匹配事件。如果任何配置的值匹配,则策略将通过。 + 根據一系列標準配對事件。如果符合任何設定的數值,則政策通過。 + Match created events with this action type. When left empty, all action types will be matched. - 将创建的事件与此操作类型匹配。留空时,所有操作类型都将匹配。 + 將此動作類型與建立的事件配對。如果為空則將符合所有動作類型。 + Matches Event's Client IP (strict matching, for network matching use an Expression Policy. - 匹配事件的客户端 IP(严格匹配),对于网络匹配,请使用表达式策略。 + 配對事件的用戶端 IP(嚴格篩選,如要配對網路請使用表示式政策)。 + Match events created by selected application. When left empty, all applications are matched. - 匹配选定应用程序创建的事件。如果留空,则匹配所有应用程序。 + 將選擇的應用程式與建立的事件配對。如果為空則將符合所有應用程式。 + Checks if the request's user's password has been changed in the last x days, and denys based on settings. - 检查过去 x 天内请求的用户密码是否已更改,并根据设置拒绝。 + 檢查要求中的使用者密碼在過去幾個天內是否已更改,並根據設定決定是否拒絕。 + Maximum age (in days) - 最长使用期限(以天为单位) + 最長有效期限(以天為單位) + Only fail the policy, don't invalidate user's password + 僅不通過政策,不取消使用者密碼的有效性 + Executes the python snippet to determine whether to allow or deny a request. - 执行 python 代码段以确定是允许还是拒绝请求。 + 執行 Python 程式片段以決定是否允許或拒絕要求。 + Expression using Python. - 使用 Python 的表达式。 + 使用 Python 的表示式。 + See documentation for a list of all variables. - 有关所有变量的列表,请参阅文档。 + 有關所有變數列表請參考官方文件。 + Static rules + 靜態規則 + Minimum length - 最小长度 + 最短密碼長度 + Minimum amount of Uppercase Characters - 大写字符的最小数量 + 最少大寫字母數量 + Minimum amount of Lowercase Characters - 小写字符的最小数量 + 最少小寫字母數量 + Minimum amount of Digits - 最低位数 + 最少數字數量 + Minimum amount of Symbols Characters - 符号字符的最小数量 + 最少特殊符號數量 + Error message - 错误消息 + 錯誤訊息 + Symbol charset - 符号字符集 + 特殊符號字元編碼 + Characters which are considered as symbols. - 被视为符号的字符。 + 將被視為特殊符號的字元。 + HaveIBeenPwned settings + HaveIBeenPwned 設定 + Allowed count - 允许计数 + 可允許的次數 + Allow up to N occurrences in the HIBP database. - HIBP 数据库中最多允许 N 次出现。 + 允許出現在 HIBP 資料庫的次數。 + zxcvbn settings + zxcvbn 設定 + Score threshold + 分數閾值 + If the password's score is less than or equal this value, the policy will fail. + 如果密碼的分數不大於此數值,則未通過政策。 + Checks the value from the policy request against several rules, mostly used to ensure password strength. - 根据多条规则检查策略请求中的值,这些规则主要用于确保密码强度。 + 依據多條規則來檢查政策要求中的值,主要用於確保密碼強度。 + Password field - “密码” 字段 + 密碼欄位的鍵值 + Field key to check, field keys defined in Prompt stages are available. - 要检查的字段键,提示阶段中定义的字段键可用。 + 要檢查的鍵值,欄位鍵值可在提示階段中選取。 + Check static rules + 檢查靜態規則 + Check haveibeenpwned.com + 檢查 haveibeenpwned.com + For more info see: + 若要更多資訊請前往: + Check zxcvbn + 檢查 zxcvbn + Password strength estimator created by Dropbox, see: + 由 Dropbox 建立的密碼強度指示計,請前往: + Allows/denys requests based on the users and/or the IPs reputation. - 根据用户和/或 IP 信誉允许/拒绝请求。 + 根據使用者或 IP 名譽來允許或禁止要求。 + Invalid login attempts will decrease the score for the client's IP, and the username they are attempting to login as, by one. + 無效的登入嘗試將使該用戶端 IP 和該使用者名稱的分數每次減少1分。 The policy passes when the reputation score is below the threshold, and doesn't pass when either or both of the selected options are equal or above the threshold. + 當名譽分數低於閾值時能通過政策。反之,當選項中的任何一個以上等於或高於閾值時,不通過政策。 Check IP - 检查 IP + 檢查 IP + Check Username - 检查用户名 + 檢查使用者名稱 + Threshold - 阈值 + 閾值 + New policy - 新建策略 + 新增政策 + Create a new policy. - 创建一个新策略。 + 建立一個新的政策。 + Create Binding - 创建绑定 + 建立附加 + Superuser - 超级用户 + 超級使用者 + Members - 成员 + 成員 + Select groups to add user to - 选择要向其添加用户的组 + 選擇要加入使用者的群組 + Warning: Adding the user to the selected group(s) will give them superuser permissions. + 警告:使用者加入到所選的群組將會賦予其超級使用者的權限。 + Successfully updated user. - 已成功更新用户。 + 成功更新使用者。 + Successfully created user. - 已成功创建用户。 + 成功建立使用者。 + Username - 用户名 + 使用者名稱 + User's primary identifier. 150 characters or fewer. + 使用者的主要識別碼。150個字元以內。 + User's display name. - 用户的显示名称。 + 用使用者的顯示名稱。 + Email - 电子邮箱 + 電子郵件 + Is active - 处于激活状态 + 啟用帳戶 + Designates whether this user should be treated as active. Unselect this instead of deleting accounts. - 指定是否应将此用户视为活动用户。取消选择此选项,而不是删除帐户。 + 決定是否將此使用者視為啟用的帳戶。建議取消選擇此項來停用,而不是刪除帳戶。 + Path + 路徑 + Policy / User / Group - 策略/用户/组 + 政策 / 使用者 / 群組 + Policy - 策略 - + 政策 + Group - 组 - + 群組 + User - 用户 - + 使用者 + Edit Policy - 编辑策略 + 編輯政策 + Update Group - 更新组 + 更新群組 + Edit Group - 编辑组 + 編輯群組 + Update User - 更新用户 + 更新使用者 + Edit User - 编辑用户 + 編輯使用者 + Policy binding(s) - 策略绑定 + 政策附加 + Update Binding - 更新绑定 + 更新附加 + Edit Binding - 编辑绑定 + 編輯附加 + No Policies bound. - 没有策略约束。 + 沒有已附加的政策。 + No policies are currently bound to this object. - 当前没有策略绑定到此对象。 + 目前沒有附加到此物件的政策。 + Bind existing policy + 附加到現存的政策 + Warning: Application is not used by any Outpost. - 警告:应用程序未被任何 Outpost 使用。 + 警告:應用程式未被任何 Outpost 使用。 + Related - 相关 + 關聯 + Backchannel Providers + 背景通道供應商 + Check access - 检查访问权限 + 檢查存取權限 + Check - 查看 + 檢查 + Check Application access - 检查应用程序访问权限 + 檢查應用程式存取權限 + Test - 测试 + 測試 + Launch - 启动 + 啟動 + Logins over the last week (per 8 hours) + 一周的登入狀態(每 8 小時) + Policy / Group / User Bindings - 策略/组/用户绑定 + 政策 / 使用者 / 群組 附加 + These policies control which users can access this application. - 这些策略控制哪些用户可以访问此应用程序。 + 這些政策控制了哪些使用者可以存取這個應用程式。 + Successfully updated source. - 已成功更新源。 + 成功更新來源。 + Successfully created source. - 已成功创建源。 + 成功建立來源。 + Sync users - 同步用户 + 同步使用者 + User password writeback - 用户密码写回 + 可改寫使用者密碼 + Login password is synced from LDAP into authentik automatically. Enable this option only to write password changes in authentik back to LDAP. - 登入密码会自动从 LDAP 同步到 authentik。启用此选项可将 authentik 中的密码更改回写至 LDAP。 + 登入密碼會自動從 LDAP 同步到 authentik。啟用此選項可將 authentik 修改的密碼同步回 LDAP。 + Sync groups - 同步组 + 同步群組 + Connection settings - 连接设置 + 連線設定 + Server URI - 服务器 URI + 伺服器 URI + Specify multiple server URIs by separating them with a comma. - 通过用逗号分隔多个服务器 URI 来指定它们。 + 若要新增多個伺服器,透過逗號分隔多個伺服器 URI。 + Enable StartTLS - 启用 StartTLS + 啟用 StartTLS + To use SSL instead, use 'ldaps://' and disable this option. - 要改用 SSL,请使用 'ldaps: //' 并禁用此选项。 + 若要使用 SSL 請停用此選項,並使用「ldaps://」。 + TLS Verification Certificate - TLS 验证证书 + TLS 驗證憑證 + When connecting to an LDAP Server with TLS, certificates are not checked by default. Specify a keypair to validate the remote certificate. - 使用 TLS 连接到 LDAP 服务器时,默认情况下不检查证书。指定密钥对以验证远程证书。 + 使用 TLS 連線到 LDAP 時,預設不檢查憑證,選擇金鑰對來驗證遠端憑證。 + Bind CN Bind CN + LDAP Attribute mapping - LDAP 属性映射 + LDAP 特徵碼對應 + Property mappings used to user creation. - 用于创建用户的属性映射。 + 用於建立使用者的屬性對應。 + Additional settings - 其他设置 + 其他設定 + Parent group for all the groups imported from LDAP. - 从 LDAP 导入的所有组的父组。 + 從 LDAP 匯入群組的上級群組。 + User path + 使用者路徑 + Addition User DN - 额外的用户 DN + 額外的使用者 DN + Additional user DN, prepended to the Base DN. - 额外的User DN,优先于Base DN。 + 額外的使用者 DN,將優先於 Base DN。 + Addition Group DN - 额外的 Group DN + 額外的群組 DN + Additional group DN, prepended to the Base DN. - 额外的Group DN,优先于Base DN。 + 額外的群組 DN,將優先於 Base DN。 + User object filter - 用户对象筛选器 + 使用者物件篩選器 + Consider Objects matching this filter to be Users. - 将与此筛选器匹配的对象视为用户。 + 符合此篩選的物件將視為使用者。 + Group object filter - 分组对象过滤器 + 群組物件篩選器 + Consider Objects matching this filter to be Groups. - 将与此过滤器匹配的对象视为组。 + 符合此篩選的物件將視為群組。 + Group membership field - 组成员资格字段 + 群組成員欄位 + Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' - 包含组成员的字段。请注意,如果使用 “memberUID” 字段,则假定该值包含相对可分辨名称。例如,'memberUID=some-user' 而不是 'memberuid=cn=some-user、ou=groups、... ' + 包含群組成員的欄位。注意,如果使用「memberUid」欄位,則假設其值包含相對可分辨的名稱。例如,「memberUID=some-user」而不是「memberuid=cn=some-user,ou=groups,... 」 + Object uniqueness field - 对象唯一性字段 + 物件的唯一性欄位 + Field which contains a unique Identifier. - 包含唯一标识符的字段。 + 包含唯一識別碼的欄位。 + Link users on unique identifier - 使用唯一标识符链接用户 + 使用唯一識別碼連結使用者 + Link to a user with identical email address. Can have security implications when a source doesn't validate email addresses - 链接到具有相同电子邮件地址的用户。当源不验证电子邮件地址时,可能会产生安全隐患 + 連結到具有相同電子郵件地址的使用者。當來源不驗證電子郵件地址時,可能會有安全風險。 + Use the user's email address, but deny enrollment when the email address already exists + 使用使用者的電子郵件地址,但在電子郵件地址已存在時拒絕註冊。 + Link to a user with identical username. Can have security implications when a username is used with another source + 連接到具有相同使用者名稱的使用者。當使用者名稱與其他來源一同使用時,可能會有安全風險。 + Use the user's username, but deny enrollment when the username already exists + 使用使用者的使用者名稱,但在使用者名稱已存在時拒絕註冊。 + Unknown user matching mode + 未知使用者配對模式 + URL settings - URL 设置 + 網址設定 + Authorization URL - 授权网址 + 授權網址 + URL the user is redirect to to consent the authorization. - 用户被重定向到以同意授权的 URL。 + 使用者被重新導向到此網址以同意授權。 + Access token URL - 访问令牌 URL + 存取權杖網址 + URL used by authentik to retrieve tokens. - authentik 用来检索令牌的 URL。 + authentik 用來擷取權杖的網址。 + Profile URL - 个人资料网址 + 個人資訊網址 + URL used by authentik to get user information. - authentik 用来获取用户信息的 URL。 + authentik 用來擷取個人資訊的網址。 + Request token URL - 请求令牌 URL + 要求權杖網址 + URL used to request the initial token. This URL is only required for OAuth 1. - 用于请求初始令牌的 URL。只有 OAuth 1 才需要此网址。 + 用於要求初始權杖的網址,僅用於 OAuth 1。 + OIDC Well-known URL + OIDC Well-known 網址 + OIDC well-known configuration URL. Can be used to automatically configure the URLs above. + OIDC Well-known 設定的網址。可以用於自動設定以上網址。 + OIDC JWKS URL + OIDC JWKS 網址 + JSON Web Key URL. Keys from the URL will be used to validate JWTs from this source. + JSON 網路金鑰的網址。才該網址擷取的金鑰用於驗證此來源的 JWT。 + OIDC JWKS + OIDC JWKS + Raw JWKS data. + 原始 JWKS 資料。 + User matching mode - 用户匹配模式 + 用戶配對模式 + Delete currently set icon. - 删除当前设置的图标。 + 刪除目前的圖示。 + Consumer key - 消费者密钥 + 客戶金鑰 + Consumer secret - 消费者机密 + 客戶機密密碼 + Additional scopes to be passed to the OAuth Provider, separated by space. To replace existing scopes, prefix with *. + 額外的範疇將傳遞給 OAuth 供應商,用空格分隔。要替換現存範疇,請在前面加上 *。 + Flow settings - 流程设置 + 流程設定 + Flow to use when authenticating existing users. - 认证已存在用户时所使用的流程。 + 認證現存使用者的流程。 + Enrollment flow - 注册流程 + 註冊流程 + Flow to use when enrolling new users. - 新用户注册时所使用的流程。 + 新使用者註冊時的流程。 + Load servers - 加载服务器 + 載入伺服器 + Re-authenticate with plex - 使用 plex 重新进行身份验证 + 使用 plex 重新身分認證 + Allow friends to authenticate via Plex, even if you don't share any servers - 允许好友通过Plex进行身份验证,即使您不共享任何服务器 + 允許好友通過 Plex 進行身分認證,即便您沒有分享任何伺服器 + Allowed servers - 允许的服务器 + 允許的伺服器 + Select which server a user has to be a member of to be allowed to authenticate. - 选择用户必须是哪个服务器的成员才能进行身份验证。 + 選擇使用者必須是其成員才能被允許進行身份認證的伺服器。 + SSO URL - SSO 网址 + SSO 網址 + URL that the initial Login request is sent to. - 初始登录请求发送到的URL。 + 第一次登入要求發送的網址。 + SLO URL - SLO URL + SLO 網址 + Optional URL if the IDP supports Single-Logout. - 如果 IDP 支持单点注销,则为可选 URL。 + 身分識別提供者 Idp 如果支援單一登出時的可選網址。 + Also known as Entity ID. Defaults the Metadata URL. - 也称为实体 ID。 默认为 Metadata URL。 + 也稱為 Entity ID,預設為中繼資料的網址。 + Binding Type - 绑定类型 + 附加類型 + Redirect binding - 重定向绑定 + 重新導向附加 + Post-auto binding + 自動 Post 附加 + Post binding but the request is automatically sent and the user doesn't have to confirm. + Post 附加,但自動傳送要求,使用者無需確認。 + Post binding - Post binding + Post 附加 + Signing keypair - 签名密钥对 + 簽署的金鑰對 + Keypair which is used to sign outgoing requests. Leave empty to disable signing. - 用于签署传出请求的密钥对。留空则禁用签名。 + 用於簽署傳出要求的金鑰對。保持為空停用簽署。 + Allow IDP-initiated logins - 允许 IDP 发起的登入 + 允許識別提供者 Idp 發起的登入 + Allows authentication flows initiated by the IdP. This can be a security risk, as no validation of the request ID is done. - 允许由 IdP 启动的身份验证流。这可能存在安全风险,因为未对请求 ID 进行验证。 + 允許由身份提供者 Idp 發起的認證流程。這可能是一個安全風險,因為不會驗證要求的 ID。 + NameID Policy NameID 政策 + Persistent - 持久 + 持久性 + Email address - 邮箱地址 + 電子郵件地址 + Windows Windows + X509 Subject - X509 Subject + X509 主體 + Transient - 暂时的 + 暫時性 + Delete temporary users after - 之后删除临时用户 + 在此之後刪除臨時使用者: + Time offset when temporary users should be deleted. This only applies if your IDP uses the NameID Format 'transient', and the user doesn't log out manually. + 刪除臨時使用者的時間偏移量。這僅適用於您的身份提供者使用 NameID 格式「transient」,且用戶沒有手動登出的情況。 + Pre-authentication flow - 身份验证前流程 + 身分認證前的流程 + Flow used before authentication. - 身份验证之前使用的流程。 + 在身分認證前使用的流程。 + New source - 新建身份来源 + 新增身分來源 + Create a new source. - 创建一个新身份来源。 + 建立一個新的身分來源。 + Sources of identities, which can either be synced into authentik's database, or can be used by users to authenticate and enroll themselves. - 身份来源,既可以同步到authentik的数据库中,也可以被用户用来进行身份验证和注册。 + 身分來源,既可以同步到 authentik 的資料庫,也能被使用者用來進行身分認證和註冊。 + Source(s) - + 來源 + Disabled - 已禁用 + 已停用 + Built-in - 内置 + 內建 + Update LDAP Source - 更新 LDAP 源 + 更新 LDAP 來源 + Not synced yet. 尚未同步。 + Task finished with warnings - 任务已完成,但出现警告 + 工作完成,但出現警告 + Task finished with errors - 任务已完成,但出现错误 + 工作完成,但出現錯誤 + Last sync: - 上次同步: - + 上次同步: + OAuth Source + OAuth 來源 + Generic OpenID Connect - 通用 OpenID 连接 + 通用 OpenID 連線 + Unknown provider type + 未知的供應商類型 + Details + 詳細資訊 + Callback URL - 回调 URL + 回呼網址 + Access Key - 访问密钥 + 存取金鑰 + Update OAuth Source - 更新 OAuth 源 + 更新 OAuth 來源 + Diagram - 示意图 + 示意圖 + Policy Bindings - 策略绑定 + 政策附加 + These bindings control which users can access this source. You can only use policies here as access is checked before the user is authenticated. + 這些附加控制哪些使用者可以存取此來源。因為在使用者身份認證之前就會檢查存取權限,所以這裡只能使用政策。 Update Plex Source - 更新 Plex 源 + 更新 Plex 來源 + Update SAML Source - 更新 SAML 源 + 更新 SAML 來源 + Successfully updated mapping. - 已成功更新映射。 + 成功更新對應。 + Successfully created mapping. - 已成功创建映射。 + 成功建立對應。 + Object field - 对象字段 + 物件欄位 + Field of the user object this value is written to. - 写入此值的用户对象的字段。 + 此值寫入到使用者物件的欄位。 + SAML Attribute Name - SAML 属性名称 + SAML 特徵項名稱 + Attribute name used for SAML Assertions. Can be a URN OID, a schema reference, or a any other string. If this property mapping is used for NameID Property, this field is discarded. - 用于 SAML 断言的属性名称。可以是 URN OID, 模式引用或任何其他字符串。如果此属性映射用于 NameID 属性,则会丢弃此字段。 + 用於 SAML 斷言的特徵項名稱。可以是 URN OID,綱要參考或任何其他字串。如果此屬性對應用於 NameID 屬性,則此欄位將被忽略。 + Friendly Name - 友好显示名称 + 易記名稱 + Optionally set the 'FriendlyName' value of the Assertion attribute. - (可选)设置 “断言” 属性的'友好名称'值。 + 可選:設定斷言特徵項中的「FriendlyName」值。 + Scope name - 作用域名称 + 範疇名稱 + Scope which the client can specify to access these properties. - 客户端可以指定的访问这些属性的范围。 + 用戶端可以指定存取這些屬性的範疇。 + Description shown to the user when consenting. If left empty, the user won't be informed. - 同意时向用户显示的描述。如果留空,则不会通知用户。 + 當需要使用者同意時顯示的說明。如果留空將不會顯示。 + Example context data + 範例上下文資料 + Active Directory User + Active Directory 使用者 + Active Directory Group + Active Directory 群組 + New property mapping - 新建属性映射 + 新增屬性對應 + Create a new property mapping. - 创建一个新属性映射。 + 建立一個新的屬性對應。 + Property Mappings - 属性映射 + 屬性對應 + Control how authentik exposes and interprets information. - 控制 authentik 如何公开和解释信息。 + 控制 authentik 如何公開和解釋資訊。 + Property Mapping(s) - 属性映射 + 屬性對應 + Test Property Mapping - 测试属性映射 + 測試屬性對應 + Hide managed mappings - 隐藏托管映射 + 隱藏代管對應 + Successfully updated token. - 已成功更新令牌。 + 成功更新權杖。 + Successfully created token. - 已成功创建令牌。 + 成功建立權杖。 + Unique identifier the token is referenced by. - 引用令牌的唯一标识符。 + 權杖參考的唯一識別碼。 + Intent - 意图 + 使用目的 + API Token + API 權杖 + Used to access the API programmatically + 用於程式化存取 API + App password. + 應用程式密碼 + Used to login using a flow executor + 使用流程執行器來進行登入。 + Expiring - 即将到期 + 是否會過期 + If this is selected, the token will expire. Upon expiration, the token will be rotated. - 如果选择此选项,令牌将过期。到期后,令牌将被轮换。 + 當啟用時,權杖將會過期。在過期後權杖將會被輪替。 + Expires on - 过期时间 + 有效期限 + API Access - API 访问权限 + API 存取權限 + App password - 应用密码 + 應用程式密碼 + Verification - 验证 + 驗證 + Unknown intent + 未知使用目的 + Tokens - 令牌 + 權杖 + Tokens are used throughout authentik for Email validation stages, Recovery keys and API access. - 令牌在整个authentik中用于电子邮件验证阶段、恢复密钥和API访问。 + 權杖在整個 authentik 中用於電子郵件認證階段、救援金鑰和存取 API。 + Expires? - 过期? + 是否會過期 + Expiry date 到期日 + Token(s) - 令牌 + 權杖 + Create Token - 创建令牌 + 建立權杖 + Token is managed by authentik. - 令牌由 authentik 管理。 + 由 authentik 管理的權杖。 + Update Token - 更新令牌 + 更新權杖 + Successfully updated tenant. - 已成功更新租户。 + 成功更新租户。 + Successfully created tenant. - 成功创建租户。 + 成功建立租戶。 + Domain - + 網域 + Matching is done based on domain suffix, so if you enter domain.tld, foo.domain.tld will still match. - 匹配是根据域名后缀完成的,因此,如果您输入 domain.tld,foo.domain.tld 仍将匹配。 + 由網域的後輟配對,如果您输入 domain.tld,foo.domain.tld 仍將會符合。 + Default - 默认 + 設為預設 + Use this tenant for each domain that doesn't have a dedicated tenant. - 对于没有专用租户的每个域,请使用此租户。 + 對於每個沒有專有租戶的網域,請使用此租戶。 + Branding settings - 品牌设置 + 品牌設定 + Title - 标题 + 標題 + Branding shown in page title and several other places. - 品牌信息显示在页面标题和其他几个地方。 + 品牌訊息會顯示在頁面標題和其他地方。 + Logo - Logo + 品牌標誌 + Icon shown in sidebar/header and flow executor. - 在侧边栏/标题和流程执行器中显示的图标。 + 在側邊欄、標題和流程執行器中顯示的圖示。 + Favicon - 网站图标 + 網站圖示 + Icon shown in the browser tab. - 浏览器选项卡中显示的图标。 + 瀏覽器頁籤上顯示的圖示。 + Default flows - 默认流程 + 預設流程 + Flow used to authenticate users. If left empty, the first applicable flow sorted by the slug is used. - 用于对用户进行身份验证的流程。如果留空,则使用按辅助信息块排序的第一个适用流程。 + 用於對使用者進行身分認證的流程。如果為空則按縮寫順序使用第一個符合的流程。 + Invalidation flow - 失效流程 + 登出流程 + Flow used to logout. If left empty, the first applicable flow sorted by the slug is used. - 用于注销的流程。如果留空,则使用按辅助信息块排序的第一个适用流程。 + 用於登出的流程。如果為空則按縮寫順序使用第一個符合的流程。 + Recovery flow - 恢复流程 + 救援流程 + Recovery flow. If left empty, the first applicable flow sorted by the slug is used. - 恢复流程。如果留空,则使用按辅助信息块排序的第一个适用流程。 + 用於各類救援的流程。如果為空則按縮寫順序使用第一個符合的流程。 + Unenrollment flow 取消注册流程 + If set, users are able to unenroll themselves using this flow. If no flow is set, option is not shown. - 如果已设置,则用户可以使用此流程自行取消注册。如果未设置流量,则不显示选项。 + 如果設定此欄位,使用者可使用這個流程自行刪除自己的帳號。如果為空則不顯示選項。 + User settings flow - 用户设置流程 + 使用者設定流程 + If set, users are able to configure details of their profile. - 设置后,用户可以配置他们个人资料的详细信息。 + 如果設定此欄位,使用者可以修改他們的個人資訊。 + Device code flow + 裝置認證碼流程 + If set, the OAuth Device Code profile can be used, and the selected flow will be used to enter the code. + 如果設定此欄位,可以使用 OAuth 裝置認證碼設定檔,並使用所選的流程來輸入認證碼。 + Other global settings - 其他全局设置 + 其他全域設定 + Web Certificate - 网络证书 + 網頁伺服器憑證 + Event retention - 事件保留 + 事件紀錄保存時長 + Duration after which events will be deleted from the database. - 事件将从数据库中删除的持续时间。 + 事件紀錄在被從資料庫刪除前的時長。 + When using an external logging solution for archiving, this can be set to "minutes=5". - 使用外部日志记录解决方案进行存档时,可以将其设置为 “minutes=5”。 + 如果使用外部日誌紀錄解決方案時,可以設定為「minutes=5」。 + This setting only affects new Events, as the expiration is saved per-event. - 此设置仅影响新事件,因为过期时间是按事件保存的。 + 此設定僅會影響新的事件紀錄,舊的紀錄到期時間已經設定。 + Format: "weeks=3;days=2;hours=3,seconds=2". - 格式:"weeks=3;days=2;hours=3,seconds=2"。 + 格式:(weeks=3;days=2;hours=3,seconds=2)。 + Set custom attributes using YAML or JSON. Any attributes set here will be inherited by users, if the request is handled by this tenant. + 使用 YAML 或 JSON 設定客製化特徵項。如果是此租戶處理的要求,這裡設定的任何特徵項都將被使用者繼承。 + Tenants - 租户 + 租戶 + Configure visual settings and defaults for different domains. - 配置不同域的可视化设置和默认值。 + 為不同的網域設定視覺化設定和各項預設值。 + Default? - 默认? + 是否為預設 + Tenant(s) - 租户 + 租戶 + Update Tenant - 更新租户 + 更新租戶 + Create Tenant - 创建租户 + 建立租戶 + Policies - 策略 + 政策 + Allow users to use Applications based on properties, enforce Password Criteria and selectively apply Stages. - 允许用户根据属性使用应用程序、强制使用密码标准以及有选择地应用阶段。 + 允許使用者根據屬性使用應用程式、執行密碼的標準,和有選擇性地應用在階段。 + Assigned to object(s). - 已分配给 - 个对象。 + 已分配给 個物件。 + Warning: Policy is not assigned. - 警告:策略未分配。 + 警告:政策未被分配。 + Test Policy - 测试策略 + 測試政策 + Policy / Policies - 政策/策略 + 政策 + Successfully cleared policy cache - 已成功清除策略缓存 + 成功清除政策快取 + Failed to delete policy cache - 未能删除策略缓存 + 未能清除政策快取 + Clear cache - 清除缓存 + 清除快取 + Clear Policy cache - 清除策略缓存 + 清除政策快取 + Are you sure you want to clear the policy cache? This will cause all policies to be re-evaluated on their next usage. + 您確定要清除政策快取嗎?這將會導致所有政策在下次使用時重新評價。 Reputation scores - 声誉得分 + 名譽分數 + Reputation for IP and user identifiers. Scores are decreased for each failed login and increased for each successful login. - IP 和用户标识符的声誉。每次登入失败的分数都会降低,每次成功登入的分数都会增加。 + IP 和使用者識別碼的名譽。每次登入失敗都會降低分數,反之每次成功登入都會增加分數。 + IP IP + Score - 得分 + 分數 + Updated - 已更新 + 最後更新時間 + Reputation - 声誉 + 名譽 + Groups - + 群組 + Group users together and give them permissions based on the membership. - 将用户分组在一起,并根据成员资格为他们授予权限。 + 將使用者分組,並依照成員資格給予權限。 + Superuser privileges? - 超级用户权限? + 是否擁有超級使用者權限 + Group(s) - + 群組 + Create Group - 创建组 + 建立群組 + Create group - 创建组 + 建立群組 + Enabling this toggle will create a group named after the user, with the user as member. - 启用此开关将创建一个以用户命名的组,用户为成员。 + 啟用此選項時,將會建立以使用者名稱為名的群組,而使用者將會成為其成員。 + Use the username and password below to authenticate. The password can be retrieved later on the Tokens page. - 使用下面的用户名和密码进行身份验证。稍后可以在令牌页面上检索密码。 + 使用以下使用者名稱和密碼進行認證,密碼可以從權杖頁面中取得。 + Password - 密码 + 密碼 + Valid for 360 days, after which the password will automatically rotate. You can copy the password from the Token List. - 有效期为360天,之后密码将自动轮换。您可以从令牌列表中复制密码。 + 有效期限為360天,之後密碼將會自動輪替。您可以在權杖列表中複製密碼。 + The following objects use - 以下对象使用 - + 使用以下物件 + connecting object will be deleted - 连接对象将被删除 + 連線的物件將被刪除 + Successfully updated + 成功更新 Failed to update : - 更新失败 - : - + 無法更新 : + Are you sure you want to update ""? - 你确定要更新 - " - " 吗? + 您確定要更新 」嗎? + Successfully updated password. - 已成功更新密码。 + 成功更新密碼。 + Successfully sent email. - 已成功发送电子邮件。 + 成功發送電子郵件。 + Email stage - 电子邮件阶段 + 電子郵件階段 + Successfully added user(s). + 成功加入使用者 + Users to add + 欲加入的使用者 + User(s) - 用户 + 使用者 + Remove Users(s) + 移除使用者 + - - Are you sure you want to remove the selected users from the group ? - + Remove + 移除 + Impersonate - 模仿 + 模擬使用者 + User status - 用户状态 + 使用者狀態 + Change status - 更改状态 + 更改狀態 + Deactivate 停用 + Update password - 更新密码 + 更新密碼 + Set password - 设置密码 + 設定密碼 + Successfully generated recovery link - 成功生成恢复链接 + 成功產生救援連結 + No recovery flow is configured. - 未配置任何恢复流程。 + 未設定救援流程。 + Copy recovery link - 复制恢复链接 + 複製救援連結 + Send link - 发送链接 + 傳送連結 + Send recovery link to user - 向用户发送恢复链接 + 向使用者傳送救援連結 + Email recovery link - 电子邮件恢复链接 + 電子郵件救援連結 + Recovery link cannot be emailed, user has no email address saved. - 无法通过电子邮件发送恢复链接,用户没有保存电子邮件地址。 + 無法使用電子郵件傳送救援連結,因為使用者並沒有設定電子郵件。 + To let a user directly reset a their password, configure a recovery flow on the currently active tenant. - 要让用户直接重置密码,请在当前活动的租户上配置恢复流程。 + 若要讓使用者直接重設密碼,請在目前的活動租戶上設定救援流程。 + Add User + 加入使用者 + Warning: This group is configured with superuser access. Added users will have superuser access. + 警告:這個群組具有超級使用者權限,加入到此群組的使用者將會取得該權限。 + Add existing user + 加入現存使用者 + Create user + 建立使用者 + Create User - 创建用户 + 建立使用者 + Create Service account - 创建服务账户 + 建立服務帳戶 + Hide service-accounts - 隐藏服务账户 + 隱藏服務帳戶 + Group Info - 组信息 + 群組資訊 + Notes + 備註 + Edit the notes attribute of this group to add notes here. + 編輯這個群組的備註特徵項來加入備註。 + Users - 用户 + 使用者 + Root + Root + Warning: You're about to delete the user you're logged in as (). Proceed at your own risk. - 警告:你即将删除登录的用户 ( - )。继续,风险自负。 + 警告:您即將刪除您正在登入的使用者「」。若選擇繼續請自行承擔風險。 + Hide deactivated user + 隱藏停用的使用者 + User folders + 使用者資料夾 + Successfully added user to group(s). + 成功加入使用者到群組。 + Groups to add + 欲加入的群組 + Remove from Group(s) + 從群組中移除 + Are you sure you want to remove user from the following groups? + 您確定要從群組中移除使用者 嗎? + Add Group + 加入群組 + Add to existing group + 加入到現存的群組 + Add new group + 建立群組並加入 + Application authorizations - 应用程序授权 + 應用程式授權 + Revoked? - 已吊销? + 是否已撤銷 + Expires - 过期 + 有效期限 + ID Token - ID 令牌 + ID 權杖 + Refresh Tokens(s) + 重新整理權杖 + Last IP - 最后的 IP + 最後登入的 IP + Session(s) - 会话 + 會談 + Expiry - 到期 + 過期 + (Current session) + (正在使用的會談) + Permissions + 權限 + Consent(s) 同意 + Successfully updated device. - 已成功更新设备。 + 成功更新裝置。 + Static tokens - 静态令牌 + 靜態權杖 + TOTP Device - TOTP 设备 + TOTP 裝置 + Enroll - 注册 + 註冊 + Device(s) - 设备 + 裝置 + Update Device - 更新设备 + 更新裝置 + Confirmed + 裝置驗證 + User Info - 用户信息 + 使用者資訊 + Actions over the last week (per 8 hours) + 一周的動作狀態(每 8 小時) + Edit the notes attribute of this user to add notes here. + 編輯這個使用者的備註特徵項來加入備註。 + Sessions - 会话 + 會談 + User events - 用户事件 + 使用者事件 + Explicit Consent - 明确同意 + 明示同意 + OAuth Refresh Tokens + OAuth 重新整理權杖 + MFA Authenticators + 多重要素認證器 + Successfully updated invitation. - 已成功更新邀请。 + 成功更新邀請函。 + Successfully created invitation. - 已成功创建邀请。 + 成功建立邀請函。 + Flow 流程 + When selected, the invite will only be usable with the flow. By default the invite is accepted on all flows with invitation stages. + 當選擇時,邀請只能與該流程一起使用。預設情況下,邀請在所有包含邀請階段的流程中都被接受。 + Optional data which is loaded into the flow's 'prompt_data' context variable. YAML or JSON. - 加载到流程的 “prompt_data” 上下文变量中的可选数据。YAML 或 JSON。 + 可選:載入到流程的「prompt_data」上下文變數。YAML 或 JSON 格式。 + Single use - 一次性使用 + 單次使用 + When enabled, the invitation will be deleted after usage. - 启用后,邀请将在使用后被删除。 + 當啟用時,邀請函將在使用後被刪除。 + Select an enrollment flow - 选择注册流程 + 選擇註冊流程 + Link to use the invitation. - 使用邀请的链接。 + 使用邀請函的連結。 + Invitations - 邀请 + 邀請函 + Create Invitation Links to enroll Users, and optionally force specific attributes of their account. - 创建邀请链接以注册用户,并可选择强制使用其帐户的特定属性。 + 建立邀請函連結來註冊使用者,可選擇強制設定其帳戶的特定特徵項。 + Created by - 由... 创建 + 建立者 + Invitation(s) - 邀请 + 邀請函 + Invitation not limited to any flow, and can be used with any enrollment flow. + 邀請函並未限制用於任何流程,且可以用於任何註冊流程。 + Update Invitation - 更新邀请 + 更新邀請函 + Create Invitation - 创建邀请 + 建立邀請函 + Warning: No invitation stage is bound to any flow. Invitations will not work as expected. - 警告:没有邀请阶段绑定到任何流程。邀请将无法按预期工作。 + 警告:邀請流程沒有附加到任何流程。邀請將無法依照預期工作。 + Auto-detect (based on your browser) - 自动检测(基于您的浏览器) + 自動偵測(基於您的瀏覽器) + Required. 必需。 + Continue - 继续 + 繼續 + Successfully updated prompt. - 已成功更新提示。 + 成功更新提示。 + Successfully created prompt. - 已成功创建提示。 + 成功建立提示。 + Text: Simple Text input - 文本:简单文本输入 + 文字:簡單文字輸入 + Text Area: Multiline text input + 文字區塊:多行文字輸入。 + Text (read-only): Simple Text input, but cannot be edited. - 文本(只读):简单文本输入,但无法编辑。 + 文字(唯讀):簡單文字輸入,但無法編輯。 + Text Area (read-only): Multiline text input, but cannot be edited. + 文字區塊(唯讀):多行文字輸入。但無法編輯。 + Username: Same as Text input, but checks for and prevents duplicate usernames. - 用户名:与文本输入相同,但检查并防止用户名重复。 + 使用者名稱:與文字輸入相同,但檢查是否與現存有重複。 + Email: Text field with Email type. - 电子邮件:具有电子邮件类型的文本字段。 + 電子郵件:具有電子郵件類型的文字欄位。 + Password: Masked input, multiple inputs of this type on the same prompt need to be identical. + 密碼:遮罩輸入,同一提示上的多個此類輸入需要相同。 + Number - 编号 + 編號 + Checkbox - 复选框 + 核取方塊 + Radio Button Group (fixed choice) + 選項按鈕群組(固定選項) + Dropdown (fixed choice) + 下拉式選單(固定選項) + Date 日期 + Date Time - 日期时间 + 日期時間 + File + 檔案 + Separator: Static Separator Line - 分隔符:静态分隔线 + 分隔符號:靜態分隔線 + Hidden: Hidden field, can be used to insert data into form. - 隐藏:隐藏字段,可用于将数据插入表单。 + 隱藏:隱藏欄位,可用於將資料插入表單。 + Static: Static value, displayed as-is. - 静态:静态值,按原样显示。 + 靜態:靜態數值,按原狀顯示。 + authentik: Locale: Displays a list of locales authentik supports. - authentik:语言:显示 authentik 支持的语言设置。 + authentik:語言:顯示 authentik 支援的語言列表。 + Preview errors + 預覽錯誤 + Data preview + 資料預覽 + Unique name of this field, used for selecting fields in prompt stages. + 這個欄位的獨特名稱,用於在提示階段中選擇。 + Field Key - 字段键 + 欄位鍵值 + Name of the form field, also used to store the value. - 表单域的名称,也用于存储值。 + 表單名稱,也用於儲存數值。 + When used in conjunction with a User Write stage, use attributes.foo to write attributes. - 当与用户写入阶段结合使用时,请使用 attributes.foo 来编写属性。 + 當與使用者寫入階段結合使用時,請使用 attributes.foo 來撰寫特徵項。 + Label - 标签 + 標籤 + Label shown next to/above the prompt. - 标签显示在提示符旁边/上方。 + 標籤顯示在提示的旁邊或上方。 + Required 必需 + Interpret placeholder as expression - 将占位符解释为表达式 + 將預先填入解釋為表示式 + When checked, the placeholder will be evaluated in the same way a property mapping is. If the evaluation fails, the placeholder itself is returned. + 啟用時,預先填入將以與屬性對應相同的方式進行評估。如果評估失敗,則返回預先填入本身。 Placeholder - 占位符 + 預先填入 + Optionally provide a short hint that describes the expected input value. When creating a fixed choice field, enable interpreting as expression and return a list to return multiple choices. + 可選:提供一個簡短提示,描述預期的輸入值。當建立一個固定選擇欄位時, + 啟用解釋為表示式,並回傳一個列表以提供多個選擇。 Interpret initial value as expression + 將初始值解釋為表示式 + When checked, the initial value will be evaluated in the same way a property mapping is. If the evaluation fails, the initial value itself is returned. + 啟用時,初始值將以與屬性對應相同的方式進行評估。如果評估失敗,則返回初始值本身。 Initial value + 初始值 + Optionally pre-fill the input with an initial value. When creating a fixed choice field, enable interpreting as expression and return a list to return multiple default choices. + 可選:預先填入輸入框以一個初始值。 + 當建立一個固定選擇欄位時,啟用解釋為表示式,並回傳一個列表以提供多個預設選擇。 Help text - 帮助文本 + 支援文字 + Any HTML can be used. - 任何HTML都可以使用。 + 可使用任何 HTML。 + Prompts 提示 + Single Prompts that can be used for Prompt Stages. - 可用于提示阶段的单个提示符。 + 可用於提示階段的單一提示。 + Field - 字段 + 欄位 + Stages - 阶段 + 階段 + Prompt(s) 提示 + Update Prompt 更新提示 + Create Prompt - 创建提示 + 建立提示 + Target - 目标 + 目標 + Stage - 阶段 + 階段 + Evaluate when flow is planned + 在計劃流程時進行評估 + Evaluate policies during the Flow planning process. + 在計劃流程執行時評估政策。 + Evaluate when stage is run + 在執行階段時進行評估 + Evaluate policies before the Stage is present to the user. - 在阶段呈现给用户之前评估策略。 + 在階段呈現給使用者前評估政策。 + Invalid response behavior + 無效的回應行為 + Returns the error message and a similar challenge to the executor + 回傳錯誤訊息以及類似的挑戰到執行器 + Restarts the flow from the beginning + 從頭開始重新啟動流程 + Restarts the flow from the beginning, while keeping the flow context + 從頭開始重新啟動流程,但保持流程的上下文 + Configure how the flow executor should handle an invalid response to a challenge given by this bound stage. + 設定流程執行器在遇到附加的階段中,給出挑戰但收到的無效回應時,應該處理的方式。 + Successfully updated stage. - 已成功更新阶段。 + 成功更新階段。 + Successfully created stage. - 已成功创建阶段。 + 成功建立階段。 + Stage used to configure a duo-based authenticator. This stage should be used for configuration flows. - Stage 用于配置基于二重奏的身份验证器。此阶段应该用于配置流程。 + 用於設定基於 Duo 身分認證器的階段。此階段應該使用在設定流程。 + Authenticator type name + 身分認證器類型的名稱 + Display name of this authenticator, used by users when they enroll an authenticator. + 顯示這個身分認證器,用於當使用者要註冊一個身分認證器時。 + API Hostname - API 主机名 + API 主機名稱 + Duo Auth API + Duo 認證 API + Integration key - 集成密钥 + 整合金鑰 + Secret key - 密钥 + 金鑰 + Duo Admin API (optional) + Duo 管理員 API(可選) + When using a Duo MFA, Access or Beyond plan, an Admin API application can be created. This will allow authentik to import devices automatically. + 當使用 Duo MFA、Access 或 Beyond 計劃時,可以建立一個 Admin API 應用程式。這將允許 authentik 自動匯入裝置。 Stage-specific settings - 阶段特定的设置 + 階段特定的設定 + Configuration flow - 配置流程 + 設定的流程 + Flow used by an authenticated user to configure this Stage. If empty, user will not be able to configure this stage. - 经过身份验证的用户用来配置此阶段的流程。如果为空,用户将无法配置此阶段。 + 用於已認證的使用者設定此階段的流程,如果為空則使用者無法設定此階段。 + Twilio Account SID - Twilio 账户 SID + Twilio 帳號 SID + Get this value from https://console.twilio.com - 从 https://console.twilio.com 获取此值 + 從以下網址取得值 https://console.twilio.com + Twilio Auth Token - Twilio 身份验证令牌 + Twilio 身分認證權杖 + Authentication Type - 身份验证类型 + 身分認證類型 + Basic Auth - 基本身份验证 + 基本身分認證 + Bearer Token - 不记名令牌 + 持有人權杖 + External API URL - 外部 API 网址 + 外部 API 網址 + This is the full endpoint to send POST requests to. - 这是向其发送 POST 请求的完整终端节点。 + 這是項其發送 POST 要求的完整終端節點。 + API Auth Username - API 身份验证用户名 + API 認證使用者 + This is the username to be used with basic auth or the token when used with bearer token - 这是用于基本身份验证的用户名,或者与不记名令牌一起使用时的令牌 + 這是與基本身分認證一起使用的使用者名稱,或與持有人權杖一起使用時的權杖。 + API Auth password - API 身份验证密码 + API 認證密碼 + This is the password to be used with basic auth - 这是用于基本身份验证的密码 + 這是與基本身分認證一起使用的密碼 + Mapping + 對應 + Modify the payload sent to the custom provider. + 修改發送至客製化供應商的酬載。 + Stage used to configure an SMS-based TOTP authenticator. - 用于配置基于短信的 TOTP 身份验证器的阶段。 + 用於設定基於簡訊的 TOTP 身分認證器的階段。 + Twilio Twilio + Generic 通用的 + From number - 发件人号码 + 傳送人電話號碼 + Number the SMS will be sent from. - 发送短信的来源号码。 + 傳送簡訊的電話號碼。 + Hash phone number + 雜湊電話號碼 + If enabled, only a hash of the phone number will be saved. This can be done for data-protection reasons. Devices created from a stage with this enabled cannot be used with the authenticator validation stage. + 啟用時,將只會儲存手機號碼的雜湊值。如果有資料保護的需求可以使用此項。啟用此選項的階段建立的裝置,將無法使用身份認證器的認證階段。 + Stage used to configure a static authenticator (i.e. static tokens). This stage should be used for configuration flows. - Stage 用于配置静态身份验证器(即静态令牌)。此阶段应该用于配置流程。 + 用於設定靜態身分認證器的流程(即靜態權杖)。此階段應用於設定流程。 + Token count - Token count + 權杖計數 + Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator). - 用于配置 TOTP 身份验证器(即 Auth/Google 身份验证器)的阶段。 + 用於設定 TOTP 身分認證器的階段(即 Authy/Google 身分認證器)。 + Digits - 数字 + 位數 + 6 digits, widely compatible - 6位数字,广泛兼容 + 6位數字,廣泛相容各類認證器 + 8 digits, not compatible with apps like Google Authenticator - 8位数字,与谷歌身份验证器等应用不兼容 + 8位數字,不相容於類似 Google Authenticator 等認證器 + Stage used to validate any authenticator. This stage should be used during authentication or authorization flows. - Stage 用于验证任何身份验证器。此阶段应在身份验证或授权流程中使用。 + 用於驗證任何身分認證器的階段。此階段應用於身分認證或授權流程。 + Device classes - 设备类别 + 裝置類別 + Static Tokens - 静态令牌 + 靜態權杖 + TOTP Authenticators - TOTP 身份验证器 + TOTP 身分認證器 + WebAuthn Authenticators - WebAuthn 身份验证器 + WebAuthn 身分認證器 + Duo Authenticators - Duo 身份验证器 + Duo 身分認證器 + SMS-based Authenticators - 基于短信的身份验证器 + 透過簡訊進行身分認證 + Device classes which can be used to authenticate. - 可用于进行身份验证的设备类别。 + 可用於身分認證的類別。 + Last validation threshold + 最後驗證的時間閾值 + If any of the devices user of the types selected above have been used within this duration, this stage will be skipped. + 如果上述選擇的任何裝置類型在此時長內被使用過,則將跳過此階段。 + Not configured action - 未配置操作 + 未設定時的動作 + Force the user to configure an authenticator - 强制用户配置身份验证器 + 強制使用者設定一個身分認證器 + Deny the user access - 拒绝用户访问 + 拒絕使用者存取 + WebAuthn User verification + WebAuthn 使用者驗證 + User verification must occur. - 必须进行用户验证。 + 使用者驗證必需發生。 + User verification is preferred if available, but not required. - 如果可用,则首选用户验证,但不是必需的。 + 使用者驗證作為可選項目而非必需。 + User verification should not occur. - 不应进行用户验证。 + 使用者驗證不應發生。 + Configuration stages - 配置阶段 + 設定階段 + Stages used to configure Authenticator when user doesn't have any compatible devices. After this configuration Stage passes, the user is not prompted again. - 当用户没有任何兼容的设备时,用来配置身份验证器的阶段。此阶段通过后,将不再请求此用户。 + 用於當使用者沒有相容的裝置時,設定身分認證器的階段。通過此階段後,使用者將不會再收到提示。 + When multiple stages are selected, the user can choose which one they want to enroll. - 选中多个阶段时,用户可以选择要注册哪个。 + 當選擇多個階段時,使用者可選擇想使用哪一個註冊。 + User verification - 用户验证 + 使用者驗證 + Resident key requirement - 常驻钥匙要求 + 常駐金鑰要求 + Authenticator Attachment - 身份验证器附件 + 身分認證器外接裝置 + No preference is sent - 不发送首选项 + 不傳送建議選項 + A non-removable authenticator, like TouchID or Windows Hello - 不可移除的身份验证器,例如 TouchID 或 Windows Hello + 不可移除的身分認證器,例如 TouchID 或 Windows Hello + A "roaming" authenticator, like a YubiKey - 像 YubiKey 这样的 “漫游” 身份验证器 + 外接式的身分認證器,例如 YubiKey + This stage checks the user's current session against the Google reCaptcha (or compatible) service. + 這個階段使用 Google reCaptcha (或其他相容的)服務檢查使用者目前的會談。 + Public Key - 公钥 + 公鑰 + Public key, acquired from https://www.google.com/recaptcha/intro/v3.html. - 公钥,从 https://www.google.com/recaptcha/intro/v3.html 获取。 + 公鑰,取得自以下網址 https://www.google.com/recaptcha/intro/v3.html。 + Private Key - 私钥 + 私鑰 + Private key, acquired from https://www.google.com/recaptcha/intro/v3.html. - 私钥,从 https://www.google.com/recaptcha/intro/v3.html 获取。 + 私鑰,取得自以下網址 https://www.google.com/recaptcha/intro/v3.html。 + Advanced settings - 高级设置 + 進階設定 + JS URL + JS 網址 + URL to fetch JavaScript from, defaults to recaptcha. Can be replaced with any compatible alternative. + 用於擷取 JavaScript 的網址,預設為 reCAPTCHA。可以替換為任何相容的替代方案。 + API URL + API 網址 + URL used to validate captcha response, defaults to recaptcha. Can be replaced with any compatible alternative. + 用於驗證認證碼回應的網址,預設為 reCAPTCHA。可以替換為任何相容的替代方案。 + Prompt for the user's consent. The consent can either be permanent or expire in a defined amount of time. - 提示用户同意。同意可以是永久性的,也可以在规定的时间内过期。 + 使用者同意的提示。同意可以是永久性的,也可以設定過期時間。 + Always require consent - 始终需要征得同意 + 總是需要取得同意 + Consent given last indefinitely - 无限期地给予同意 + 給予永久性的同意 + Consent expires. - 同意过期。 + 給予有期限的同意 + Consent expires in - 同意到期时间 + 同意有效期限 + Offset after which consent expires. + 同意有效期限的偏移量 + Dummy stage used for testing. Shows a simple continue button and always passes. - 用于测试的虚拟阶段。显示一个简单的 “继续” 按钮,并且始终通过。 + 用於測試的假階段。顯示一個「繼續」的按鈕且永遠通過。 + Throw error? + 是否顯示錯誤資訊 + SMTP Host - SMTP 主机 + SMTP 主機 + SMTP Port - SMTP 端口 + SMTP 連接埠 + SMTP Username - SMTP 用户名 + SMTP 使用者名稱 + SMTP Password - SMTP 密码 + SMTP 密碼 + Use TLS 使用 TLS + Use SSL 使用 SSL + From address - 发件人地址 + 寄件人地址 + Verify the user's email address by sending them a one-time-link. Can also be used for recovery to verify the user's authenticity. - 通过向用户发送一次性链接来验证用户的电子邮件地址。也可用于恢复,以验证用户的真实性。 + 通過發送一次性連結驗證使用者的電子郵件地址。也可用於救援過程中驗證使用者的真實性。 + Activate pending user on success - 成功时启用待处理用户 + 成功時啟用待處理的使用者 + When a user returns from the email successfully, their account will be activated. - 当用户成功从电子邮件中返回时,其帐户将被激活。 + 當使用者成功透過電子郵件返回時,重新啟用他們的帳號。 + Use global settings - 使用全局设置 + 使用全域設定 + When enabled, global Email connection settings will be used and connection settings below will be ignored. - 启用后,将使用全局电子邮件连接设置,而下面的连接设置将被忽略。 + 啟用時,將使用全域電子郵件連線設定,以下的連線設定將被忽略。 + Token expiry - 令牌到期 + 權杖有效期限 + Time in minutes the token sent is valid. - 发送的令牌的有效时间(以分钟为单位)。 + 發送權杖的有效期限(分鐘為單位)。 + Template - “模板” + 範本 + Let the user identify themselves with their username or Email address. - 让用户使用其用户名或电子邮件地址来标识自己。 + 讓使用者利用使用者名稱或電子郵件來標示自己。 + User fields - 用户字段 + 使用者欄位 + UPN UPN + Fields a user can identify themselves with. If no fields are selected, the user will only be able to use sources. - 用户可以用来标识自己的字段。如果未选择任何字段,则用户将只能使用源。 + 使用者可以用來標示自己的欄位。如果沒有選擇任何欄位,使用者將只能使用來源。 + Password stage - 密码阶段 + 密碼階段 + When selected, a password field is shown on the same page instead of a separate page. This prevents username enumeration attacks. - 选中后,密码字段将显示在同一页面上,而不是单独的页面上。这样可以防止用户名枚举攻击。 + 當選擇時,密碼欄位將會顯示在同一頁面上,這樣可以防止使用者名稱列舉攻擊。 + Case insensitive matching - 不区分大小写的匹配 + 使用者名稱配對不分大小寫 + When enabled, user fields are matched regardless of their casing. - 启用后,无论用户字段大小写如何,都将匹配用户字段。 + 啟用時,配對使用者名稱時將無視大小寫。 + Show matched user - 显示匹配的用户 + 顯示符合的使用者 + When a valid username/email has been entered, and this option is enabled, the user's username and avatar will be shown. Otherwise, the text that the user entered will be shown. - 如果输入了有效的用户名/电子邮件,并且启用了此选项,则会显示用户的用户名和头像。否则,将显示用户输入的文本。 + 當啟用了此選項,且輸入了有效的使用者名稱或電子郵件時,將顯示使用者的使用者名稱和個人檔案圖片。否則,將顯示使用者輸入的文字。 + Source settings + 來源設定 + Sources - + 來源 + Select sources should be shown for users to authenticate with. This only affects web-based sources, not LDAP. - 应显示选择的源以供用户进行身份验证。这只会影响基于 Web 的源,而不影响 LDAP。 + 選擇當使用者進行認證時應顯示的來源。此選項將只會影響基於網頁的來源,LDAP 不受影響。 + Show sources' labels - 显示源的标签 + 顯示來源標籤 + By default, only icons are shown for sources. Enable this to show their full names. - 默认情况下,只为源显示图标。启用此选项可显示他们的全名。 + 預設的情況下,只會顯示來源的圖示,啟用這個選項來顯示全名。 + Passwordless flow - 无密码流 + 無密碼認證流程 + Optional passwordless flow, which is linked at the bottom of the page. When configured, users can use this flow to authenticate with a WebAuthn authenticator, without entering any details. - 可选的无密码流程,链接在页面底部。配置后,用户可以使用此流程向 WebAuthn 身份验证器进行身份验证,而无需输入任何详细信息。 + 可選:無密碼認證的流程,連結顯示在頁面底部。設定時,使用者可以無須輸入任何詳細資訊,透過此流程搭配 WebAuthn 身分認證器來進行認證。 + Optional enrollment flow, which is linked at the bottom of the page. - 可选注册流程,链接在页面底部。 + 可選:註冊流程,連結顯示在頁面底部。 + Optional recovery flow, which is linked at the bottom of the page. - 可选的恢复流程,链接在页面底部。 + 可選:救援流程,連結顯示在頁面底部。 + This stage can be included in enrollment flows to accept invitations. - 此阶段可以包含在注册流程中以接受邀请。 + 此階段可以包含在註冊流程中以接受邀請。 + Continue flow without invitation - 在没有邀请的情况下继续流动 + 設定無邀請函的流程 + If this flag is set, this Stage will jump to the next Stage when no Invitation is given. By default this Stage will cancel the Flow when no invitation is given. - 如果设置了此标志,则当没有发出邀请时,此舞台将跳转到下一个阶段。默认情况下,当没有发出邀请时,此阶段将取消流程。 + 如果啟用此旗標,當沒有邀請函時這個階段將會跳到下個階段。預設的情況下,此階段將會取消流程。 + Validate the user's password against the selected backend(s). - 根据选定的后端验证用户的密码。 + 由選擇的後端來驗證使用者密碼。 + Backends - 后端 + 後端 + User database + standard password - 用户数据库+标准密码 + 使用者資料庫 + 標準密碼 + User database + app passwords - 用户数据库+应用程序密码 + 使用者資料庫 + 應用程式密碼 + User database + LDAP password - 用户数据库 + LDAP 密码 + 使用者資料庫 + LDAP 密碼 + Selection of backends to test the password against. - 选择用于测试密码的后端。 + 選擇要用於測試密碼的後端。 + Flow used by an authenticated user to configure their password. If empty, user will not be able to configure change their password. - 经过身份验证的用户用来配置其密码的流程。如果为空,用户将无法配置更改其密码。 + 經過身分認證的使用者用來設定密碼的流程,如果未設定則使用者將無法變更密碼。 + Failed attempts before cancel - 取消前尝试失败 + 取消前可嘗試的次數 + How many attempts a user has before the flow is canceled. To lock the user out, use a reputation policy and a user_write stage. - 在取消流程之前,用户有多少次尝试。要锁定用户,请使用信誉策略和 user_write 阶段。 + 在取消流程前使用者嘗試的次數。要鎖定使用者請使用名譽政策和 user_write 階段。 + Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable. - 向用户显示任意输入字段,例如在注册期间。数据保存在流程上下文中的 “prompt_data” 变量下。 + 向使用者顯示任意輸入欄位,例如在註冊過程中。資料會保存在流程上下文中的「prompt_data」變數中。 + Fields - 字段 + 欄位 + ("", of type ) - (“ - ”, 类型为 - ) + (「」,類型為 ) + Validation Policies - 验证策略 + 驗證政策 + Selected policies are executed when the stage is submitted to validate the data. - 在提交阶段以验证数据时,将执行选定的策略。 + 當階段提交時,將執行所選政策以驗證資料。 + Delete the currently pending user. CAUTION, this stage does not ask for confirmation. Use a consent stage to ensure the user is aware of their actions. + 刪除目前待處理的使用者。注意,這個階段不會要求確認。使用同意階段以確保使用者意識到他們的動作。 Log the currently pending user in. - 将当前待处理的用户登录。 + 將待處理的使用者登入。 + Session duration - 会话持续时间 + 會談的持續時間 + Determines how long a session lasts. Default of 0 seconds means that the sessions lasts until the browser is closed. - 确定会话持续多长时间。默认为 0 秒意味着会话持续到浏览器关闭为止。 + 決定會談將持續多久。預設值「seconds=0」表示會談會持續到關閉瀏覽器為止。 + Different browsers handle session cookies differently, and might not remove them even when the browser is closed. + 不同的瀏覽器處理會談 cookies 方法各異,在關閉瀏覽器後可能不會移除它。 + See here. + 更多資訊 + Stay signed in offset + 登入的持續時間 + If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. + 如果持續時間大於零,使用者介面上將會有「保持登入」選項。這將會依照設定的時間延長會談。 + Terminate other sessions + 終止其他會談 + When enabled, all previous sessions of the user will be terminated. + 當啟用後,所有之前的會談將會被終止。 + Remove the user from the current session. - 从当前会话中移除用户。 + 移除使用者目前的會談。 + Write any data from the flow's context's 'prompt_data' to the currently pending user. If no user is pending, a new user is created, and data is written to them. + 將流程上下文中的「prompt_data」的任何資料寫入當前待處理的使用者。如果沒有待處理的使用者,則建立一個新使用者,並將資料寫入該使用者。 Never create users + 不建立使用者 + When no user is present in the flow context, the stage will fail. + 當流程上下文中不存在使用者時,階段將會失敗。 + Create users when required + 需要時建立使用者 + When no user is present in the the flow context, a new user is created. + 當流程上下文中不存在使用者時,建立使用者。 + Always create new users + 總是建立使用者 + Create a new user even if a user is in the flow context. + 總是建立使用者,即便流程上下文中存在使用者。 + Create users as inactive - 将用户创建为非活动用户 + 建立停用狀態的使用者 + Mark newly created users as inactive. - 将新创建的用户标记为非活动用户。 + 將建立的使用者標記為停用狀態。 + User path template + 使用者路徑範本 + Path new users will be created under. If left blank, the default path will be used. + 使用者將會建立在此路徑下。如果留空則使用預設路徑。 + Newly created users are added to this group, if a group is selected. - 如果选择了组,则会将新创建的用户添加到该组。 + 如果有選擇群組,使用者將會被加入到該群組。 + New stage - 新建阶段 + 新增階段 + Create a new stage. - 创建一个新阶段。 + 建立一個階段。 + Successfully imported device. + 成功匯入裝置。 + The user in authentik this device will be assigned to. + 此裝置將被分配給的 authentik 中的使用者。 + Duo User ID + Duo 使用者 ID + The user ID in Duo, can be found in the URL after clicking on a user. + Duo 的使用者 ID,點選使用者後可以在網址列上找到。 + Automatic import + 自動匯入 + Successfully imported devices. + 成功匯入 個裝置。 + Start automatic import + 開始自動匯入 + Or manually import + 或使用手動匯入 + Stages are single steps of a Flow that a user is guided through. A stage can only be executed from within a flow. - 阶段是引导用户完成的流程的单个步骤。阶段只能在流程内部执行。 + 階段是流程中使用者被引導通過的單一步驟。階段只能在流程內部執行。 + Flows 流程 + Stage(s) - 阶段 + 階段 + Import - 导入 + 匯入 + Import Duo device + 匯入 Duo 裝置 + Successfully updated flow. - 已成功更新流程。 + 成功更新流程。 + Successfully created flow. - 已成功创建流程。 + 成功建立流程。 + Shown as the Title in Flow pages. - 显示为 “Flow” 页面中的标题。 + 作為標題顯示在流程頁面。 + Visible in the URL. - 在 URL 中可见。 + 顯示於網址列中。 + Designation - 指定 + 使用目的 + Decides what this Flow is used for. For example, the Authentication flow is redirect to when an un-authenticated user visits authentik. - 决定此 Flow 的用途。例如,当未经身份验证的用户访问 authentik 时,身份验证流程将重定向到。 + 決定此流程的用途。例如當未經認證的使用者存取 authentik 時,將其重新導向到身分認證流程。 + No requirement + 不需要 + Require authentication + 需要身分認證 + Require no authentication. + 需要無身分認證 + Require superuser. + 需要超級使用者 + Required authentication level for this flow. + 這個流程所需的身分認證等級。 + Behavior settings + 行為設定 + Compatibility mode - 兼容模式 + 相容模式 + Increases compatibility with password managers and mobile devices. + 提升對密碼管理器和行動裝置的相容性。 + Denied action + 拒絕時動作 + Will follow the ?next parameter if set, otherwise show a message + 如果有設定「?next」參數則重新導向,反之則顯示訊息 + Will either follow the ?next parameter or redirect to the default interface + 如果有設定「?next」參數則重新導向,反之則重新導向到預設介面 + Will notify the user the flow isn't applicable + 將會通知使用者流程無法適用 + Decides the response when a policy denies access to this flow for a user. + 決定當這個流程的使用者被政策拒絕存取時的回應。 + Appearance settings + 外觀設定 + Layout + 版面設計 + Background 背景 + Background shown during execution. - 执行过程中显示背景。 + 執行過程中顯示的背景。 + Clear background + 清除背景 + Delete currently set background image. - 删除当前设置的背景图片。 + 刪除目前設定的背景圖片。 + Successfully imported flow. - 已成功导入流程。 + 成功匯入流程。 + .yaml files, which can be found on goauthentik.io and can be exported by authentik. + .yaml 檔案,可以在 goauthentik.io 中找到且可以從 authentik 中匯出。 + Flows describe a chain of Stages to authenticate, enroll or recover a user. Stages are chosen based on policies applied to them. - 流程描述了一系列用于对用户进行身份验证、注册或恢复的阶段。阶段是根据应用于它们的策略来选择的。 + 流程描述了一系列階段,用於認證、註冊或救援使用者。根據應用於它們的政策選擇階段。 + Flow(s) 流程 + Update Flow 更新流程 + Create Flow - 创建流程 + 建立流程 + Import Flow - 导入流程 + 匯入流程 + Successfully cleared flow cache - 已成功清除流程缓存 + 成功清除流程的快取 + Failed to delete flow cache - 无法删除流程缓存 + 無法刪除流程的快取 + Clear Flow cache - 清除流程缓存 + 清除流程的快取 + Are you sure you want to clear the flow cache? This will cause all flows to be re-evaluated on their next usage. + 您確定要清除流程快取嗎?這將導致所有流程在下次使用時重新評估。 Stage binding(s) - 阶段绑定 + 階段附加 + Stage type - 阶段类型 + 階段類型 + Edit Stage - 编辑 Stage + 編輯階段 + Update Stage binding - 更新阶段绑定 + 更新階段附加 + These bindings control if this stage will be applied to the flow. - 这些绑定控制是否将此阶段应用于流程。 + 這些附加控制此階段是否將應用於流程。 + No Stages bound - 没有阶段绑定 + 沒有已附加的階段 + No stages are currently bound to this flow. - 目前没有阶段绑定到此流程。 + 目前沒有階段附加到此流程。 + Create Stage binding - 创建 Stage 绑定 + 建立階段附加 + Bind stage - Bind 阶段 + 附加階段 + Bind existing stage + 附加已存在的階段 + Flow Overview - 流程概述 + 流程概覽 + Related actions + 關聯的動作 + Execute flow - 执行流程 + 執行流程 + Normal - 正常 + 正常執行 + with current user - 以当前用户 + 使用目前使用者執行 + with inspector - 和检查员一起 + 和流程檢閱器一起執行 + Export flow - 出口流程 + 匯出這個流程 + Export - 出口 + 匯出 + Stage Bindings - 阶段绑定 + 階段附加 + These bindings control which users can access this flow. - 这些绑定控制哪些用户可以访问此流程。 + 這些附加控制哪些使用者可以存取此流程。 + Event Log - 事件日志 + 事件日誌 + Event - 事件 - + 事件 + Event info - 事件信息 + 事件資訊 + Created + 已建立 + Successfully updated transport. - 已成功更新传输。 + 成功更新通道。 + Successfully created transport. - 已成功创建传输。 + 成功建立通道。 + Local (notifications will be created within authentik) + 本機(通知將會透過 authentik 建立) + Webhook (generic) - Webhook (generic) + Webhook (通用) + Webhook (Slack/Discord) Webhook(Slack/Discord) + Webhook URL - Webhook URL + Webhook 網址 + Webhook Mapping - Webhook 映射 + Webhook 對應 + Send once - 发送一次 + 僅發送一次 + Only send notification once, for example when sending a webhook into a chat channel. - 仅发送一次通知,例如在向聊天频道发送 Webhook 时。 + 僅發送一次通知,例如在將 webhook 發送到聊天頻道時。 + Notification Transports - 通知传输 + 通知通道 + Define how notifications are sent to users, like Email or Webhook. - 定义如何向用户发送通知,例如电子邮件或 Webhook。 + 定義如何向使用者傳送通知,例如電子郵件或 Webhook。 + Notification transport(s) - 通知传输 + 通知通道 + Update Notification Transport - 更新通知传输 + 更新通知通道 + Create Notification Transport - 创建通知传输 + 建立通知通道 + Successfully updated rule. - 已成功更新规则。 + 成功更新規則。 + Successfully created rule. - 已成功创建规则。 + 成功建立規則。 + Select the group of users which the alerts are sent to. If no group is selected the rule is disabled. + 選擇接收警報的使用者群組。如果沒有選擇群組,則規則將被停用。 + Transports - 传输 + 通道 + Select which transports should be used to notify the user. If none are selected, the notification will only be shown in the authentik UI. - 选择应使用哪些传输来通知用户。如果未选择任何内容,则通知将仅显示在 authentik UI 中。 + 選擇應使用哪些通道來通知使用者。如果沒有選擇任何通道,通知將只會在 authentik 使用者介面中顯示。 + Severity - 严重程度 + 嚴重程度 + Notification Rules - 通知规则 + 通知規則 + Send notifications whenever a specific Event is created and matched by policies. - 每当策略创建并匹配特定事件时,都会发送通知。 + 當特定事件被建立並符合政策時都會發送通知。 + Sent to group - 已发送到组 + 已發送到群組 + Notification rule(s) - 通知规则 + 通知規則 + None (rule disabled) - 无(规则已禁用) + 無(停用規則) + Update Notification Rule - 更新通知规则 + 更新通知規則 + Create Notification Rule - 创建通知规则 + 建立通知規則 + These bindings control upon which events this rule triggers. Bindings to groups/users are checked against the user of the event. + 這些附加控制了此規則觸發的事件。附加到群組或使用者的條件會根據事件的使用者來檢查。 Outpost Deployment Info - Outpost 部署信息 + Outpost 部署資訊 + View deployment documentation - 查看部署文档 + 檢視部署文件 + Click to copy token - 点击复制令牌 + 點選這裡複製權杖 + If your authentik Instance is using a self-signed certificate, set this value. - 如果您的 authentik 实例正在使用自签名证书,请设置此值。 + 如果您的 authentik 執行個體使用自簽憑證,請設定此項。 + If your authentik_host setting does not match the URL you want to login with, add this setting. - 如果您的 authentik_host 设置与您要登录时使用的网址不匹配,请添加此设置。 + 如果您的 authentik_host 設定與您登入的網址不同,請加入此設定。 + Successfully updated outpost. - 已成功更新 Outpost。 + 成功更新 Outpost。 + Successfully created outpost. - 已成功创建 Outpost。 + 成功建立 Outpost。 + Radius + Radius + Integration 整合 + Selecting an integration enables the management of the outpost by authentik. - 选择集成可以使authentik对 Outpost 进行管理。 + 選擇一個整合讓 authentik 對 Outpost 進行管理。 + You can only select providers that match the type of the outpost. - 您只能选择与 Outpost 类型匹配的提供商。 + 您只能選擇與 Outpost 類型相符的供應商。 + Configuration - 配置 + 設定 + See more here: + 更多資訊請參考: + Documentation + 官方文件 + Last seen + 最後上線時間 + , should be - - ,应该是 - + ,應該是 + Hostname + 主機名稱 + Not available - 不可用 + 無法使用 + Last seen: - 最后显示: - + 最後上線時間: + Unknown type + 未知的類型 + Outposts Outposts + Outposts are deployments of authentik components to support different environments and protocols, like reverse proxies. - Outpost 是对 authentik 组件的部署,以支持不同的环境和协议,例如反向代理。 + Outposts 是 authentik 系統中的一部分,負責部署組件以適應各種環境和協議需求,例如作為反向代理。 + Health and Version - 运行状况和版本 + 執行狀態和版本 + Warning: authentik Domain is not configured, authentication will not work. - 警告:未配置 authentik 域,身份验证将不起作用。 + 警告:未設定 authentik 的網域,身分認證將無法使用。 + Logging in via . - 通过 - 登录。 + 透過以下網址登入。 + No integration active - 没有激活的集成 + 沒有啟用的整合 + Update Outpost 更新 Outpost + View Deployment Info - 查看部署信息 + 檢視部署資訊 + Detailed health (one instance per column, data is cached so may be out of date) + 健康狀態詳細資訊(每一列一個執行個體,使用快取資料所以可能是過時資訊) + Outpost(s) Outpost(s) + Create Outpost - 创建 Outpost + 建立 Outpost + Successfully updated integration. - 已成功更新集成。 + 成功更新整合。 + Successfully created integration. - 已成功创建集成。 + 成功建立整合。 + Local - 本地 + 本機端連線 + If enabled, use the local connection. Required Docker socket/Kubernetes Integration. - 如果启用,请使用本地连接。需要的 Docker Socket/Kubernetes 集成。 + 啟用時,請使用本機連線。需要整合 docker / Kubernetes 的 socket。 + Docker URL - Docker URL + Docker 網址 + Can be in the format of 'unix://' when connecting to a local docker daemon, using 'ssh://' to connect via SSH, or 'https://:2376' when connecting to a remote system. - 连接到本地 docker 守护进程时可以采用 'unix: //' 的格式,通过 SSH 连接时使用 'ssh: //',或者在连接到远程系统时使用 'https://:2376' 的格式。 + 當連接到本機 Docker 常駐程式時,將會是「unix: //」的格式,通過 SSH 連線時使用「ssh: //」,或者當連接到遠端系統時,將會是「https://:2376」的格式。 + CA which the endpoint's Certificate is verified against. Can be left empty for no validation. - 验证终端节点证书所依据的 CA。可以留空以表示不进行验证。 + 驗證終端節點的憑證所需的 CA 憑證。如果為空則不驗證憑證。 + TLS Authentication Certificate/SSH Keypair - TLS 身份验证证书/SSH 密钥对 + TLS 身分認證憑證或 SSH 金鑰對 + Certificate/Key used for authentication. Can be left empty for no authentication. - 用于身份验证的证书/密钥。可以留空,留空表示不进行身份验证。 + 用於身分認證的憑證或金鑰。如果為空則不進行身分認證。 + When connecting via SSH, this keypair is used for authentication. - 通过 SSH 连接时,此密钥对用于身份验证。 + 當使用 SSH 連線時,此金鑰對將用於身分認證。 + Kubeconfig Kubeconfig + Verify Kubernetes API SSL Certificate + 驗證 Kubernetes API 的 SSL 憑證 + New outpost integration - 新前哨集成 + 新增 Outpost 整合 + Create a new outpost integration. - 创建一个新前哨集成。 + 建立一個 Outpost 整合。 + State - + 狀態 + Unhealthy 不健康 + Outpost integration(s) - Outpost 集成 + Outpost 整合 + Successfully generated certificate-key pair. - 成功生成证书密钥对。 + 成功產生金鑰對。 + Common Name - 常用名 + 主體名稱 + Subject-alt name - 替代名称 + 主體別名 + Optional, comma-separated SubjectAlt Names. - 可选,逗号分隔的 subjectAlt 名称。 + 可選:使用逗號分隔多個主體別名。 + Validity days - 有效天数 + 有效天數 + Successfully updated certificate-key pair. - 已成功更新证书密钥对。 + 成功更新金鑰對。 + Successfully created certificate-key pair. - 已成功创建证书密钥对。 + 成功建立金鑰對。 + PEM-encoded Certificate data. - PEM 编码的证书数据。 + PEM 編碼的憑證資料。 + Optional Private Key. If this is set, you can use this keypair for encryption. - 可选私钥。如果设置了此设置,则可以使用此密钥对进行加密。 + 可選:私鑰。如果設定此項,您可以使用金鑰對來加密。 + Certificate-Key Pairs - 证书密钥对 + 憑證金鑰對 + Import certificates of external providers or create certificates to sign requests with. - 导入外部提供商的证书或创建用于签署请求的证书。 + 匯入外部供應商的憑證或建立用於簽署請求的憑證。 + Private key available? - 私钥可用吗? + 是否含有私鑰 + Certificate-Key Pair(s) - 证书密钥对 + 憑證金鑰對 + Managed by authentik 由 authentik 管理 + Managed by authentik (Discovered) - 由 authentik 管理(已发现) + 由 authentik 管理(已發現) + Yes () - Yes ( - ) + 是 () + No - No + + Update Certificate-Key Pair - 更新证书密钥对 + 更新憑證金鑰對 + Certificate Fingerprint (SHA1) - 证书指纹 (SHA1) + 憑證指紋 (SHA1) + Certificate Fingerprint (SHA256) - 证书指纹 (SHA256) + 憑證指紋 (SHA256) + Certificate Subject - 证书主题 + 憑證主題名稱 + Download Certificate - 下载证书 + 下載憑證 + Download Private key - 下载私钥 + 下載私鑰 + Create Certificate-Key Pair - 创建证书密钥对 + 建立憑證金鑰對 + Generate - 生成 + 產生憑證 + Generate Certificate-Key Pair - 生成证书密钥对 + 產生憑證金鑰對 + Successfully updated instance. + 成功更新執行個體 + Successfully created instance. + 成功建立執行個體 + Disabled blueprints are never applied. + 停用的藍圖將永遠不會被應用。 + Local path + 本機路徑 + OCI Registry + OCI Registry + Internal + 內部位置 + OCI URL, in the format of oci://registry.domain.tld/path/to/manifest. + OCI 網址,格式為「oci://registry.domain.tld/path/to/manifest」。 + See more about OCI support here: + 關於更多 OCI 支援請參考: + Blueprint + 藍圖 + Configure the blueprint context, used for templating. + 設定藍圖的上下文,用於作為範本。 + Orphaned + 孤立 + Blueprints + 藍圖 + Automate and template configuration within authentik. + 在 authentik 中自動化和範本化設定。 + Last applied + 最後應用時間 + Blueprint(s) + 藍圖 + Update Blueprint + 更新藍圖 + Create Blueprint Instance + 建立藍圖執行個體 + API Requests - API 请求 + API 要求 + Open API Browser - 打开 API 浏览器 + 打開 API 瀏覽器 + Notifications 通知 + unread - - 未读 + 封尚未讀取 + Successfully cleared notifications - 已成功清除通知 + 成功清除通知 + Clear all - 全部清除 + 清除全部 + A newer version of the frontend is available. - 有较新版本的前端可用。 + 有可用的新版本前端網頁。 + You're currently impersonating . Click to stop. - 你目前正在模拟 - 。单击停止。 + 您現在正在模擬 +。點擊停止模擬。 + User interface - 用户界面 + 使用者介面 + Dashboards - 仪表板 + 儀表板 + Events 事件 + Logs - 日志 + 日誌 + Customisation - 定制 + 客製化設定 + Directory - 目录 + 使用者目錄 + System - 系统 + 系統 + Certificates - 证书 + 憑證 + Outpost Integrations - Outpost 集成 + Outpost 整合 + API request failed - API 请求失败 + API 要求失敗 + User's avatar - 用户的头像 + 使用者的個人檔案圖片 + Something went wrong! Please try again later. - 发生错误,请稍后重试。 + 發生錯誤,請稍後再次嘗試。 + Request ID + 要求 ID + You may close this page now. + 您現在可以關閉這個頁面。 + You're about to be redirect to the following URL. - 您将被重定向到以下 URL。 + 您即將被重新導向到以下網址。 + Follow redirect - 跟随重定向 + 跟隨重新導向 + Request has been denied. - 请求被拒绝。 + 要求被拒。 + Not you? - 不是你? + 不是您? + Need an account? - 需要一个账户? + 需要一個帳號嗎? + Sign up. - 注册。 + 註冊。 + Forgot username or password? - 忘记用户名或密码? + 忘記使用者名稱或密碼? + Select one of the sources below to login. - 选择以下源之一进行登入。 + 選擇一下來源進行登入。 + Or + + Use a security key - 使用安全密钥 + 使用安全金鑰登入 + Login to continue to . - 登入以继续 - + 登入以繼續前往 + Please enter your password - 请输入你的密码 + 請輸入您的密碼 + Forgot password? - 忘记密码了吗? + 忘記密碼 + Application requires following permissions: - 应用程序需要以下权限: + 應用程式需要以下權限: + Application already has access to the following permissions: + 應用程式已用擁有已下存取權限: + Application requires following new permissions: + 應用程式需要新增以下權限: + Check your Inbox for a verification email. - 检查您的收件箱是否有验证电子邮件。 + 檢查您的收件夾確認是否收到驗證電子郵件。 + Send Email again. - 再次发送电子邮件。 + 再次傳送電子郵件。 + Successfully copied TOTP Config. - 成功复制 TOTP 配置。 + 成功複製 TOTP 設定。 + Copy - 复制 + 複製 + Code - 代码 + 認證碼 + Please enter your TOTP Code - 请输入您的 TOTP 代码 + 請輸入您的 TOTP 認證碼 + Duo activation QR code + Duo 啟用的二維條碼 + Alternatively, if your current device has Duo installed, click on this link: - 或者,如果您当前的设备已安装 Duo,请单击此链接: + 或者如果您目前裝置已安裝 Duo,請點擊此連結: + Duo activation - Duo 激活 + Duo 啟用 + Check status - 检查状态 + 檢查狀態 + Make sure to keep these tokens in a safe place. - 确保将这些令牌保存在安全的地方。 + 請將這些權杖保存在安全的地方。 + Phone number - 电话号码 + 電話號碼 + Please enter your Phone number. - 请输入您的电话号码。 + 請輸入您的電話號碼。 + Please enter the code you received via SMS + 請輸入您簡訊收到的認證碼。 + A code has been sent to you via SMS. - 验证码已通过短信发送给您。 + 認證碼已透過簡訊傳送。 + Open your two-factor authenticator app to view your authentication code. + 開啟您的雙重身份認證器應用程式,檢視您的認證碼。 + Static token - 静态令牌 + 靜態權杖 + Authentication code + 認證碼 + Please enter your code + 請輸入您的認證碼 + Return to device picker - 返回设备选择器 + 回到選擇裝置頁面 + Sending Duo push notification + 傳送到 Duo 推播通知 + Assertions is empty - 断言为空 + 斷言為空 + Error when creating credential: - 创建凭证时出错: - + 建立憑證時發生錯誤: + Error when validating assertion on server: - 在服务器上验证断言时出错: - + 在伺服器上驗證斷言發生錯誤: + Retry authentication - 重试身份验证 + 重試身分認證 + Duo push-notifications - 二重奏推送通知 + Duo 推播通知 + Receive a push notification on your device. - 在您的设备上接收推送通知。 + 在您的裝置上接收推播通知。 + Authenticator - 身份验证器 + 身分認證器 + Use a security key to prove your identity. - 使用安全密钥证明您的身份。 + 使用您的安全金鑰證明身分。 + Traditional authenticator - 传统身份验证器 + 傳統身分認證器 + Use a code-based authenticator. - 使用基于代码的身份验证器。 + 使用基於認證碼的身分認證器。 + Recovery keys - 恢复密钥 + 救援金鑰 + In case you can't access any other method. - 万一你无法访问任何其他方法。 + 萬一您無法存取其他方法。 + SMS - 短信 + 簡訊 + Tokens sent via SMS. - 通过短信发送的令牌。 + 通過簡訊傳送權杖。 + Select an authentication method. - 选择一种身份验证方法。 + 選擇一種身分認證方法。 + Stay signed in? + 繼續保持登入? + Select Yes to reduce the number of times you're asked to sign in. + 選擇「是」來減少詢問登入的次數。 + Authenticating with Plex... - 正在使用 Plex 进行身份验证... + 使用 Plex 進行身分認證中…… + Waiting for authentication... + 等待身分認證中…… + If no Plex popup opens, click the button below. + 如果 Plex 彈出視窗未開啟,請點選以下按鈕前往。 + Open login + 開啟登入頁面 + Authenticating with Apple... - 正在使用Apple进行身份验证... + 使用 Apple 進行身分認證中…… + Retry - 重试 + 重試 + Enter the code shown on your device. + 輸入顯示在您裝置上的認證碼。 + Please enter your Code - 请输入您的验证码 + 請輸入認證碼 + You've successfully authenticated your device. + 您已成功透過裝置認證。 + Flow inspector - 流程检查器 + 流程檢閱器 + Next stage - 下一阶段 + 下一個階段 + Stage name - 阶段名 + 階段名稱 + Stage kind - 阶段种类 + 階段類型 + Stage object - 阶段对象 + 階段物件 + This flow is completed. - 此流程已完成。 + 此流程已執行完成。 + Plan history - 计划历史记录 + 計劃歷史紀錄 + Current plan context - 当前计划上下文 + 目前計劃的上下文 + Session ID - 会话 ID + 會談 ID + Powered by authentik - 由 authentik 强力驱动 + 由 authentik 技術支援 + Background image - 背景图片 + 背景圖片 + Error creating credential: - 创建凭证时出错: - + 建立憑證時發生錯誤: + Server validation of credential failed: - 服务器验证凭据失败: - + 伺服器驗證憑證失敗: + Register device - 注册设备 + 註冊裝置 + Refer to documentation + 請參考文件 No Applications available. - 没有可用的应用程序。 + 沒有可用的應用程式。 + Either no applications are defined, or you don’t have access to any. + 尚未有已定義的應用程式,或是您沒有存取任何應用程式的權限。 My Applications - 我的应用 + 我的應用程式 + My applications - 我的应用 + 我的應用程式 + Change your password - 更改你的密码 + 變更您的密碼 + Change password - 修改密码 + 變更密碼 + + Save - 保存 + 儲存 + Delete account - 删除账户 + 刪除帳號 + Successfully updated details - 已成功更新详情 + 成功更新個人資訊 + Open settings - 打开设置 + 開啟設定 + No settings flow configured. - 未配置设置流程 + 未設定設定流程 + Update details - 更新详情 + 更新個人資訊 + Successfully disconnected source + 成功解除來源的連線 + Failed to disconnected source: + 無法解除來自以下來源的連線: + Disconnect - 断开连接 + 解除連線 + Connect - 连接 + 連線 + Error: unsupported source settings: - 错误:不支持的源设置: - + 錯誤:不支援的來源設定: + Connect your user account to the services listed below, to allow you to login using the service instead of traditional credentials. - 将您的用户帐户连接到下面列出的服务,以允许您使用该服务而不是传统凭据登录。 + 將您的使用者帳號與下方的服務連線,讓您可以直接使用該服務而不使用傳統認證登入。 + No services available. - 没有可用的服务。 + 沒有可用的服務。 + Create App password - 创建应用程序密码 + 建立應用程式密碼 + User details - 用户详细信息 + 使用者個人資訊 + Consent 同意 + MFA Devices - MFA 设备 + 多重要素認證裝置 + Connected services - 连接服务 + 已連接的服務 + Tokens and App passwords - 令牌和应用程序密码 + 權杖和應用程式密碼 + Unread notifications - 未读通知 + 未讀取通知 + Admin interface - 管理员界面 + 管理員介面 + Stop impersonation - 停止模拟 + 離開模擬模式 + Avatar image - Avatar image + 個人檔案圖片 + Failed + 失敗 + Unsynced / N/A + 未同步或無法使用 + Outdated outposts - 过时的 Outposts + 過時的 Outposts + Unhealthy outposts 不健康的 Outposts + Next 下一步 + Inactive - 不活跃 + 停用 + Regular user - 普通用户 + 一般使用者 + Activate - 启用 + 啟用 + Use Server URI for SNI verification + 使用伺服器 URI 進行 SNI 驗證 Required for servers using TLS 1.3+ + 伺服器需啟用 TLS 1.3版以上 Client certificate keypair to authenticate against the LDAP Server's Certificate. + 用於對 LDAP 伺服器的憑證進行認證的用戶端憑證金鑰對。 The certificate for the above configured Base DN. As a fallback, the provider uses a self-signed certificate. + 針對上述設定的 Base DN 的憑證。作為備援方案,供應商使用自簽憑證。 TLS Server name + TLS 伺服器名稱 DNS name for which the above configured certificate should be used. The certificate cannot be detected based on the base DN, as the SSL/TLS negotiation happens before such data is exchanged. + 應使用上述設定憑證的 DNS 名稱。Base DN 無法檢測憑證,因為 SSL/TLS 協商發生在此類資料交換之前。 TLS Client authentication certificate + TLS 用戶端認證憑證 Model + 模型 Match events created by selected model. When left empty, all models are matched. + 將選擇的模型與建立的事件配對。如果為空則將符合所有模型。 Code-based MFA Support + 基於認證碼多重要素認證支援 When enabled, code-based multi-factor authentication can be used by appending a semicolon and the TOTP code to the password. This should only be enabled if all users that will bind to this provider have a TOTP device configured, as otherwise a password may incorrectly be rejected if it contains a semicolon. + 當啟用此功能時,可以透過在密碼後加上分號及TOTP認證碼(範例:password:totp認證碼)來使用多重要素驗證。您應只有在所有要連線到此服務的使用者都已設定TOTP裝置的情況下,才啟用此功能。如果使用者的密碼中恰好包含分號,可能會因誤判而被拒絕存取。 User type + 使用者類型 Successfully updated license. + 成功更新授權許可證 Successfully created license. + 成功建立授權許可證 Install ID + 安裝 ID License key + 授權金鑰 Licenses + 授權許可證 License(s) + 授權許可證 Enterprise is in preview. + 企業版正處於預覽版本。 Cumulative license expiry + 累計授權到期人數 Update License + 更新授權許可證 Warning: The current user count has exceeded the configured licenses. + 警告:目前的使用者人數已抵達設設定的授權許可上限。 Click here for more info. + 點擊這裡取得更多資訊。 Enterprise + 企業版 Manage enterprise licenses + 管理企業版授權許可證 No licenses found. + 找不到授權許可證。 Send us feedback! + 提供建議給我們! Get a license + 取得授權許可證。 Go to Customer Portal + 前往客戶入口網站 Forecast internal users + 內部使用者預測 Estimated user count one year from now based on current internal users and forecasted internal users. + 基於目前 名內部使用者和預估的 名內部使用者來估計一年後的使用者總數。 Forecast external users + 外部使用者預測 Estimated user count one year from now based on current external users and forecasted external users. + 基於目前 名外部使用者和預估的 名外部使用者來估計一年後的使用者總數。 Install + 安裝 Install License + 安裝授權許可證 Internal users might be users such as company employees, which will get access to the full Enterprise feature set. + 內部使用者可能是像公司員工這樣的使用者,他們將取得全部企業版功能的存取權限。 External users might be external consultants or B2C customers. These users don't get access to enterprise features. + 外部使用者可能是像顧問或是 B2C 客戶這樣的使用者,這些使用者不會取得企業版功能的存取權限。 Service accounts should be used for machine-to-machine authentication or other automations. + 服務帳號應用於機器對機器的身份認證或其他自動化操作。 Less details + 顯示更少資訊 More details + 顯示更多資訊 Remove item + 移除物件 Open API drawer + 開啟 API 下拉選單 Open Notification drawer + 開啟通知下拉選單 Restart task + 重新啟動工作 Add provider + 新增供應商 Open + 開啟 Copy token + 複製權杖 Add users + 新增使用者 Add group + 新增群組 Import devices + 匯入裝置 Execute + 執行 Show details + 顯示詳細資訊 Apply + 套用 Settings + 設定 Sign out + 登出 The number of tokens generated whenever this stage is used. Every token generated per stage execution will be attached to a single static device. + 每當使用此階段時產生的權杖數量。每次階段執行產生的每個權杖都將附加到一個固定裝置上。 Token length + 權杖長度 The length of the individual generated tokens. Can be increased to improve security. + 每個產生的權杖長度。可以增加以提高安全性。 Internal: + 內部使用者: External: + 外部使用者: Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding. + 靜態拒絕的流程。要有效使用此階段,請在相應的附加上停用「在計劃流程時進行評估」。 Create and bind Policy + 建立政策並附加 Federation and Social login + 聯邦式認證和社群登入 Create and bind Stage + 建立階段並附加 Flows and Stages + 流程與階段 New version available + 有可用的新版本 Failure result + 失敗的結果 Pass + 通過 Don't pass + 不要通過 Result used when policy execution fails. + 當政策執行失敗所使用的結果 Required: User verification must occur. + 必需:使用者驗證必需發生。 Preferred: User verification is preferred if available, but not required. + 推薦:使用者驗證作為可選項目而非必需。 Discouraged: User verification should not occur. + 不建議:使用者驗證不應發生。 Required: The authenticator MUST create a dedicated credential. If it cannot, the RP is prepared for an error to occur + 必須:身份認證器必須建立專屬憑證。如果無法建立,依賴方已準備好應對可能發生的錯誤。 Preferred: The authenticator can create and store a dedicated credential, but if it doesn't that's alright too + 推薦:身份認證器可以建立並儲存專屬憑證,但如果沒有建立也沒關係。 Discouraged: The authenticator should not create a dedicated credential + 不建議:身份認證器不應建立專屬憑證。 Lock the user out of this system + 從這個系統中鎖定使用者 Allow the user to log in and use this system + 允許使用者登入並使用這個系統 Temporarily assume the identity of this user + 臨時扮演該使用者的身份 Enter a new password for this user + 為這個使用者輸入新密碼 Create a link for this user to reset their password + 為這個使用者建立連結來重設他們的密碼 WebAuthn requires this page to be accessed via HTTPS. + WebAuthn 需要使用 HTTPS 存取這個頁面。 WebAuthn not supported by browser. + 不支援 WebAuthn 的瀏覽器。 Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a managed outpost, this is done for you). + 將此供應商與 nginx 的 auth_request 或 traefik 的 forwardAuth 一起使用。每個應用程式或網域需要其自己的供應商。此外,在每個網域上,/outpost.goauthentik.io 必須路由到 Outpost(當使用代管的 Outpost 時,這將會自動完成)。 Default relay state + 預設中繼狀態 When using IDP-initiated logins, the relay state will be set to this value. + 當使用 Idp 發起的登入時,中繼狀態將會設定為這個值。 Flow Info + 流程資訊 Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). + 用於設定 WebAuthn 身份認證器的階段(例如 Yubikey、FaceID/Windows Hello)。 <<<<<<< HEAD Internal application name used in URLs. + 用於網址的應用程式內部名稱。 Submit + 提交 UI Settings + 使用者介面設定 Transparent Reverse Proxy + 透明反向代理 For transparent reverse proxies with required authentication + 用於需要身份認證的透明反向代理 Configure SAML provider manually + 手動設定 SAML 供應商 Configure RADIUS provider manually + 手動設定 RADIUS 供應商 Configure SCIM provider manually + 手動設定 SCIM 供應商 Saving Application... + 儲存應用程式中…… Authentik was unable to save this application: + authentik 無法儲存這個應用程式: Your application has been saved + 已經儲存您的應用程式 In the Application: + 在應用程式: In the Provider: + 在供應商: Method's display Name. + 方法的顯示名稱。 Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a managed outpost, this is done for you). + 將此供應商與 nginx 的auth_request或 traefik 的forwardAuth一起使用。 + 每個應用程式或網域需要其自己的供應商。此外,在每個網域上,/outpost.goauthentik.io必須路由到 Outpost(當使用代管的 Outpost 時,這將會自動完成)。 Custom attributes + 客製化特徵項 Don't show this message again. + 不要再顯示這個通知。 Failed to fetch + 擷取失敗 Failed to fetch data. + 擷取資料失敗。 Successfully assigned permission. + 成功分配權限。 Role + 角色 Assign + 分配 Assign permission to role + 分配權限到角色 Assign to new role + 分配給新增角色 Directly assigned + 直接分配 Assign permission to user + 分配權限給使用者 Assign to new user + 分配權限給新增使用者 User Object Permissions + 使用者物件權限 Role Object Permissions + 角色物件權限 Roles + 角色 Select roles to grant this groups' users' permissions from the selected roles. + 選擇角色以授予此群組或使用者從所選角色中的權限。 Update Permissions + 更新權限 Editing is disabled for managed tokens + 代管權杖的編輯功能已停用 Select permissions to grant + 選擇要取得的權限 Permissions to add + 選擇要加入的權限 Select permissions + 選擇權限 Assign permission + 分配權限 Permission(s) + 權限 Permission + 權限 User doesn't have view permission so description cannot be retrieved. + 使用者沒有讀取權限,所以無法取得描述。 Assigned permissions + 已分配的權限 Assigned global permissions + 已分配的全域權限 Assigned object permissions + 已分配的物件權限 Successfully updated role. + 成功更新角色 Successfully created role. + 成功建立角色 Manage roles which grant permissions to objects within authentik. + 在 authentik 中管理角色來賦予物件權限。 Role(s) + 角色 Update Role + 更新角色 Create Role + 建立角色 Role doesn't have view permission so description cannot be retrieved. + 角色沒有讀取權限,所以無法取得描述。 Role + 角色 Role Info + 角色資訊 Pseudolocale (for testing) + 虛擬翻譯語言(用於測試) Create With Wizard + 使用設定精靈建立 One hint, 'New Application Wizard', is currently hidden + 提示:「新增應用程式設定精靈」目前處於隱藏中 External applications that use authentik as an identity provider via protocols like OAuth2 and SAML. All applications are shown here, even ones you cannot access. + 使用 authentik 作為身份供應商的外部應用程式,透過像 OAuth2 和 SAML 這樣的協議。此處顯示所有應用程式,即使是您無法存取的應用程式也包括在內。 Deny message + 拒絕的訊息 Message shown when this stage is run. + 當這個階段執行時會顯示的訊息。 Open Wizard + 開啟設定精靈 Demo Wizard + 設定精靈示範 Run the demo wizard + 執行設定精靈示範 OAuth2/OIDC (Open Authorization/OpenID Connect) + OAuth2/OIDC (Open Authorization/OpenID Connect) LDAP (Lightweight Directory Access Protocol) + LDAP (Lightweight Directory Access Protocol) Forward Auth (Single Application) + 轉發認證(單一應用程式) Forward Auth (Domain Level) + 轉發認證(網域層級) SAML (Security Assertion Markup Language) + SAML (Security Assertion Markup Language) RADIUS (Remote Authentication Dial-In User Service) + RADIUS (Remote Authentication Dial-In User Service) SCIM (System for Cross-domain Identity Management) + SCIM (System for Cross-domain Identity Management) The token has been copied to your clipboard + 權杖已經複製到您的剪貼簿 The token was displayed because authentik does not have permission to write to the clipboard + 因為 authentik 無法複製到您的剪貼簿,權杖資訊顯示在畫面上 A copy of this recovery link has been placed in your clipboard + 救援連結已經複製到您的剪貼簿中 The current tenant must have a recovery flow configured to use a recovery link + 目前的租戶必需設定救援流程,才能使用救援連結 Create recovery link + 建立救援連結 Create Recovery Link + 建立救援連結 External + 外部 Service account + 服務帳號 Service account (internal) + 服務帳號(內部) Check the release notes + 檢視版本資訊 User Statistics + 使用者統計資料 <No name set> + <No name set> For nginx's auth_request or traefik's forwardAuth + 適用於 nginx 的「auth_request」或 traefik 的「forwardAuth」 For nginx's auth_request or traefik's forwardAuth per root domain + 適用於每個主網域的 nginx 的「auth_request」或 traefik 的「forwardAuth」 RBAC is in preview. + RBAC 正處於預覽版本。 User type used for newly created users. + 用於建立使用者的使用者類型。 Users created + 已建立使用者。 Failed logins + 登入失敗 Also known as Client ID. + 也稱為用戶端 ID Also known as Client Secret. + 也稱為用戶端密碼 Global status + 全域狀態 Vendor + 製造商 No sync status. + 無同步的狀態。 Sync currently running. + 正在進行同步。 Connectivity + 連接性 0: Too guessable: risky password. (guesses &lt; 10^3) + 0: 極為容易猜測,高風險密碼。(猜測次數 &lt; 10^3) 1: Very guessable: protection from throttled online attacks. (guesses &lt; 10^6) + 1: 非常容易猜測:可抵抗受限的線上攻擊。(猜測次數 &lt; 10^6) 2: Somewhat guessable: protection from unthrottled online attacks. (guesses &lt; 10^8) + 2: 普通容易猜測:可抵抗不受限的線上攻擊。(猜測次數 &lt; 10^8) 3: Safely unguessable: moderate protection from offline slow-hash scenario. (guesses &lt; 10^10) + 3: 安全難以猜測:在離線的慢速雜湊情境提供中等保護。(猜測次數 &lt; 10^10) 4: Very unguessable: strong protection from offline slow-hash scenario. (guesses &gt;= 10^10) + 4: 非常難以猜測:在離線的慢速雜湊情境提供強力保護。(猜測次數 &gt;= 10^10) Successfully created user and added to group + 成功建立使用者並加入到群組 This user will be added to the group "". + 這個使用者將會被加入到「」群組。 Pretend user exists + 存在模擬的使用者 When enabled, the stage will always accept the given user identifier and continue. + 啟用時,該階段將始終接受給定的使用者識別碼並繼續執行。 + + + Are you sure you want to remove the selected users from the group ? diff --git a/website/blog/2023-11-22-building-an-oss-security-stack/icon.png b/website/blog/2023-11-22-building-an-oss-security-stack/icon.png new file mode 100644 index 000000000..94aa045e8 Binary files /dev/null and b/website/blog/2023-11-22-building-an-oss-security-stack/icon.png differ diff --git a/website/blog/2023-11-22-building-an-oss-security-stack/item.md b/website/blog/2023-11-22-building-an-oss-security-stack/item.md new file mode 100644 index 000000000..c14397acb --- /dev/null +++ b/website/blog/2023-11-22-building-an-oss-security-stack/item.md @@ -0,0 +1,152 @@ +--- +title: Building an OSS security stack with Loki, Wazuh, and CodeQL to save $100k +description: “You don’t have to spend a lot developing a good security posture from the beginning. Here’s how we built Authentik Security’s stack with mostly free and open source tools.” +slug: 2023-11-22-how-we-saved-over-100k +authors: + - name: authentik Security Team + url: https://goauthentik.io + image_url: ./icon.png +tags: + - authentik + - FOSS + - security budget + - security stack + - Red Team + - Blue Team + - SBOM + - hardening + - penetration testing + - monitoring + - SSO + - insider threats + - certifications + - security + - identity provider + - authentication +hide_table_of_contents: false +--- + +> **_authentik is an open source Identity Provider that unifies your identity needs into a single platform, replacing Okta, Active Directory, and auth0. Authentik Security is a [public benefit company](https://github.com/OpenCoreVentures/ocv-public-benefit-company/blob/main/ocv-public-benefit-company-charter.md) building on top of the open source project._** + +--- + +There was an article recently about nearly 20 well-known startups’ first 10 hires—security engineers didn’t feature at all. Our third hire at Authentik Security was a security engineer so we might be biased, but even startups without the resources for a full-time security hire should have someone on your founding team wearing the security hat, so you get started on the right foot. + +As security departments are cost centers (not revenue generators) it’s not unusual for startups to take a tightwad mentality with security. The good news is that you don’t need a big budget to have a good security posture. There are plenty of free and open source tools at your disposal, and a lot of what makes good security is actually organizational practices—many of which don’t cost a thing to implement. + +> We estimate that using mostly non-commercial security tools saves us approximately $100,000 annually, and the end-result is a robust stack of security tools and processes. + +Here’s how we built out our security stack and processes using mostly free and open source software (FOSS). + + + +## Blue Team efforts + +Security efforts can mostly be grouped into two categories: Blue Team and Red Team. Your Blue Team is defensive, meaning guarding against potential attacks. The Red Team is offensive, actively seeking for weaknesses and potential vulnerabilities. Startups with scant resources should focus on Blue activities first. + +### Visibility: Do you know what is happening in your environment? + +The first step is to get eyes into your environment through SIEM (Security Information Event Monitoring). A security person’s worst nightmare is things happening without them knowing about it. You can’t react to an attack that you don’t know is happening! You need a tool that monitors your team’s device logs and flags suspicious activity. + +We’re an all-remote and globally distributed team, which makes monitoring both harder and more important; team members can log in from anywhere, at any time, and we don’t have a central headquarters to house a secure server for backups, for example. We needed something that’s available worldwide and compatible with our endpoint device architectures, cloud infrastructure, and SaaS solutions. + +We settled on [Wazuh](https://wazuh.com/platform/siem/), which has been around for a long time, is open source and well supported. We’ll acknowledge that it is a bit harder to deploy than some other, proprietary solutions. This can often be the case with FOSS, and it’s a tradeoff you have to accept when you’re not paying for something. + +If you don’t want to use something that’s tricky to stand up, you can of course pay for a tool with which you’ll get customer support and all those good things. Your first priority should be picking something that fits your company’s needs. + +We also use Grafana’s [Loki](https://grafana.com/oss/loki/) (which is free for self-hosted environments) for certain types of log aggregation. Logging is still a staple for security awareness, so do your research for the best logging and analysis solution. + +The general idea behind having good visibility is to gather as many data points as possible while minimizing ongoing maintenance overhead. Make no mistake, this step is not only crucial, but never-ending. Companies are always standing up and tearing down infrastructure, on- and off-boarding employees, etc. Without visibility and monitoring of these activities, it’s easy to leave something exposed to opportunistic attackers. + +### Understand your dependencies: SBOMs for the win + +If you’re a small, early-stage startup, you’re more likely to get caught in a large-scale, net-casting campaign than in any sophisticated, targeted attacks. That means it’s critical to have awareness of your dependencies, so you can quickly understand if a critical vulnerability affects any part of your software supply chain. When the [Log4Shell vulnerability](https://theconversation.com/what-is-log4j-a-cybersecurity-expert-explains-the-latest-internet-vulnerability-how-bad-it-is-and-whats-at-stake-173896) surfaced in December 2021, the companies that were aware of their dependencies were able to mitigate quickly and close the attack window. + +This is where a Software Bill of Materials (SBOM) comes in handy. Your SBOM isn’t just a checkbox exercise for auditing and compliance requirements. We use OWASP’s [Dependency Track](https://dependencytrack.org/) (also free and open source) to ingest our SBOM and help identify parts of the codebase that may be at risk from new vulnerabilities. We also use [Semgrep](https://semgrep.dev/) for code scanning with pattern-based recognition. It’s open source and free to run locally. + +It’s also worth mentioning that if your company’s product is open source, or you have an open core model (a proprietary product built on open source), you may qualify for access to free tooling from GitHub for your open source project: we use [Dependabot](https://github.com/dependabot) for automated dependency updates and [CodeQL](https://codeql.github.com/) for code analysis to identify vulnerable code. + +### Hardening + +Now that you’ve got visibility into your environment, your next step is hardening: reducing or eliminating potential threats. We can group these efforts into two categories: _organizational security_ and _product security_. + +#### Organizational security + +Raise your hand if you’ve worked at a small startup and have seen the following: + +- Shared credentials +- Spreadsheets for IT/People teams to create all logins for new employees on the day they join +- Team members introducing new software/tooling at whim + +It can be a free-for-all at small companies, and while the risk is low at that scale, it can be much harder to introduce more rigorous processes later. The team will be resistant because you’ve added friction where there wasn’t before. + +Ideally, you want to introduce secure-by-default practices into your team and company early on: + +- Multi-factor authentication +- Single sign on +- Just-in-time permissions +- Evaluation of new tooling + +In the case of open source software, you can inspect the code to check how data is being handled, how secure the databases are, what exact kind of data is being transferred, saved, etc. Another team best practice is around vetting the tools and dependencies that the team uses; even if you don’t have time or resources to do a full vet of every new piece of software your coworkers want to use, at least check for certifications. + +Here at Authentik Security, we tackle a lot of risk factors with one shot: [authentik](https://goauthentik.io/). By using SSO, we can ensure every new employee has the correct credentials for accessing the appropriate workplace apps, and that every departing employee immediately has access revoked with one click. We can also quarantine suspect users, essentially cutting off access to all systems quickly. Ironically, one of the most common initial access points is ex-employee credentials. + +These all contribute to ‘defense in depth’—adding layers of security and complications to make it as hard or annoying as possible for attackers to get around. These practices typically cost $0 to implement and will set you up for good security posture as you grow. + +#### Product security + +This layer is really anything to do with securing the actual product you’re building (not your company). This typically means getting third-party penetration testing (if you don’t have a dedicated Red Team—more on this below) and remediating vulnerabilities you’ve surfaced through your monitoring and dependency tracking efforts. + +## Red Team efforts + +As we mentioned above, the Red Team is offensive, meaning they attack the company (physically or remotely) to poke holes in your own defenses before the real bad actors can. + +### Internal penetration testing + +Now that we have implemented monitoring, and hardened a few things, it’s time to test how well we did. This is where we take the attacker’s point of view to try to break in and test our own controls over our systems, to expose weaknesses. Just recently we discovered that Authentik had a bunch of domains that we’d left open, unmonitored. It’s a constant, iterative loop of unearthing holes via your internal penetration testing (also called pentesting or white box testing) and finding ways to plug them. + +There are a lot of tools to choose from here (everyone likes breaking into things!). You’re never done choosing your stack—the threat landscape evolves constantly and so does the tooling to keep up with it. You’ll want to pay attention to new developments by keeping an eye on discussions on Twitter, Reddit, Hacker News, etc. When a new way to attack something develops (and it always will), someone will go create the special automation tooling to address that threat. (Then your attackers are going to go grab that tool and see if they can hack their way in. It’s a constant wheel.) + +At Authentik we use the [Kali Linux](https://www.kali.org/) distribution, which has a host of hacking tools on it, for penetration testing. It’s well known within the security world and is open source and free to use. + +Testing can be a tough one for small startups, because you likely won’t have a dedicated Red Team and commercial pentesting doesn’t come cheap. If you can save on your tooling though, that can help to free up resources for contracting out this type of work. The main goal you’re after is trying to identify the low-hanging fruit that inexperienced actors may exploit. + +### A note on insider threats + +[Okta has been in the news](https://goauthentik.io/blog/2023-10-23-another-okta-breach) (again!) after its second major breach in two years. A team member [unknowingly uploaded a file containing sensitive information to Okta’s support management system](https://www.crn.com/news/security/okta-faces-potential-for-reputational-risk-after-second-major-breach-in-two-years-analysts), highlighting the risk of insider threats. + +Your employees are a risk factor—whether through malice, ignorance, or carelessness. It’s not unheard of for someone to accidentally save a password publicly to the company’s cloud. It can be an honest mistake, but it’s very-low hanging fruit for a bad actor just watching your cloud assets. + +With the rise of Ransomware as a Service, there’s also always the possibility that a disgruntled employee can act as an initial access broker: either accidentally or purposefully giving their credentials or their access to someone else. It’s obviously not possible to prevent all possible compromises, so it’s important that your tooling is set up to alert you to unusual activity and your processes are in place so you can react quickly. + +## Do you really need certifications? + +Apart from using security certifications like ISO/IEC 27001 and SOC 2 to evaluate vendors that make the software you are using, certifications can vouch for your organizational security, which might be important to your customers, depending on what your product does and who your customers are. + +For us at Authentik Security, [our source code](https://github.com/goauthentik/authentik) is available for inspection, but that doesn’t tell people anything about how we handle emails, payment information, and so on. That’s where a third-party certification comes in: an auditor verifies your security practices, which in turn signals to your customers that you can be trusted. + +Certifications can be expensive though, and as a cash-strapped startup, you may not want or be able to invest in a certification. However there’s nothing stopping you from ingraining some of those good security practices in your company’s culture anyway. That way, you’re already building a strong security posture and when the time comes, you’re not rushing to implement processes that feel unnatural to the team. + +Again, it comes back to getting off on the right foot so that you’re not spending 10-20x the amount of money later in people time and resources to course correct later. + +## Security doesn’t have to be a big-company luxury + +People imagine that large corporations have security all figured out, but a large security department doesn’t guarantee that they have any idea what other teams are doing. As a small company, you do have one thing going for you: it’s much easier to have eyes on everything that’s happening. You’re more tightly knit and you can encompass more with fewer resources. + +If you talk to a lot of security people, their happy place is when no one is doing anything. Then your job’s pretty easy. Unfortunately, if you want your company to succeed, you need your developers to develop, your salespeople to talk to prospects, your CEO to meet with whomever they need to meet with. These are standard operations that all put the company at risk, but it’s your job to mitigate that risk the best you can. + +Our security engineer likes to say they work alongside teams, not blocking them. If security says it’s their job to make sure there are no vulnerabilities, and it’s the development team’s job to make new features, how do you get these two sides to work together? + +Realistically, everything has vulnerabilities. You’re never going to have a completely safe, locked-down environment. So, you partner with other teams and find a compromise. Establish a minimum threshold people have to meet to keep going. If you’re too inflexible, those teams won’t want to work with you and they won’t tell you when they’re making new virtual machines or writing new code. + +## Repercussions + +You don’t need to be a security company for these things to matter. This advice applies no matter what type of product you’re building. + +[Some 422 million individuals were impacted by data compromises in 2022](https://www.statista.com/statistics/273550/data-breaches-recorded-in-the-united-states-by-number-of-breaches-and-records-exposed/). As consumers we have almost become numb to news of new breaches. A company gets breached, they offer some sort of credit protection, cyber insurance might go up a bit, but life goes on. + +If you’re still not motivated to invest in your security posture (or trying to win over teammates who prioritize feature shipping over everything), consider the [case of SolarWinds](https://www.sec.gov/news/press-release/2023-227). The company appears to have exaggerated their internal security posture, leading to an indictment from the SEC. + +So not only is security important, it could actually keep you out of jail. + +_What’s in your security stack? Let us know in the comments, or send us an email at hello@goauthentik.io!_ diff --git a/website/developer-docs/index.md b/website/developer-docs/index.md index e28c48a0b..9b312b8a0 100644 --- a/website/developer-docs/index.md +++ b/website/developer-docs/index.md @@ -160,7 +160,7 @@ While the prerequisites above must be satisfied prior to having your pull reques All Python code is linted with [black](https://black.readthedocs.io/en/stable/), [PyLint](https://www.pylint.org/) and [isort](https://pycqa.github.io/isort/). -authentik runs on Python 3.11 at the time of writing this. +authentik runs on Python 3.12 at the time of writing this. - Use native type-annotations wherever possible. - Add meaningful docstrings when possible. diff --git a/website/developer-docs/setup/full-dev-environment.md b/website/developer-docs/setup/full-dev-environment.md index eb4888e8b..10784a53d 100644 --- a/website/developer-docs/setup/full-dev-environment.md +++ b/website/developer-docs/setup/full-dev-environment.md @@ -4,7 +4,7 @@ title: Full development environment ## Requirements -- Python 3.11 +- Python 3.12 - Poetry, which is used to manage dependencies - Go 1.20 - Node.js 20 diff --git a/website/integrations/services/nextcloud/index.md b/website/integrations/services/nextcloud/index.md index d052f8ca7..ab8d92f0d 100644 --- a/website/integrations/services/nextcloud/index.md +++ b/website/integrations/services/nextcloud/index.md @@ -18,7 +18,192 @@ This setup only works, when Nextcloud is running with HTTPS enabled. See [here]( In case something goes wrong with the configuration, you can use the URL `http://nextcloud.company/login?direct=1` to log in using the built-in authentication. ::: -## Preparation +## Authentication + +There are 2 ways to setup single sign on (SSO) for Nextcloud: + +- [via OIDC Connect (OAuth)](#openid-connect-auth) +- [via SAML](#saml-auth) + +### OpenID Connect auth + +#### Preparation + +The following placeholders will be used: + +- `nextcloud.company` is the FQDN of the Nextcloud install. +- `authentik.company` is the FQDN of the authentik install. +- `authentik.local` is the internal FQDN of the authentik install (only relevant when running authentik and Nextcloud behind a reverse proxy) + +Lets start by thinking what user attributes need to be available in Nextcloud: + +- name +- email +- unique user ID +- storage quota (optional) +- groups (optional) + +authentik already provides some default _scopes_ with _claims_ inside them, such as: + +- `email` scope: Has claims `email` and `email_verified` +- `profile` scope: Has claims `name`, `given_name`, `preferred_username`, `nickname`, `groups` +- `openid` scope: This is a default scope required by the OpenID spec. It contains no claims + +##### Custom profile scope + +If you do not need storage quota or group information in Nextcloud [skip to the next step](#provider-and-application). + +However, if you want to be able to control how much storage users in Nextcloud can use, as well as which users are recognized as Nextcloud administrators, you would need to make this information available in Nextcloud. To achieve this you would need to create a custom `profile` scope. To do so, go to _Customisation_ -> _Property mappings_. Create a _Scope mapping_ with the following parameters: + +- Name: Nextcloud Profile +- Scope name: profile +- Expression: + +```python +# Extract all groups the user is a member of +groups = [group.name for group in user.ak_groups.all()] + +# Nextcloud admins must be members of a group called "admin". +# This is static and cannot be changed. +# We append a fictional "admin" group to the user's groups if they are an admin in authentik. +# This group would only be visible in Nextcloud and does not exist in authentik. +if user.is_superuser and "admin" not in groups: + groups.append("admin") + +return { + "name": request.user.name, + "groups": groups, + # To set a quota set the "nextcloud_quota" property in the user's attributes + "quota": user.group_attributes().get("nextcloud_quota", None) +} +``` + +:::note +To set a quota set the "nextcloud_quota" property in the user's attributes. This can be set for individual users or a group of users, as long as the target user is a member of a group which has this attribute set. + +If set to a value, for example `1 GB`, user(s) will have 1GB storage quota. If the attribute is not set, user(s) will have unlimited storage. +::: + +##### Provider and Application + +Create a provider for Nextcloud. In the Admin Interface, go to _Applications_ -> _Providers_. Create an _OAuth2/OpenID Provider_ with the following parameters: + +- Name: Nextcloud +- Client type: Confidential +- Redirect URIs/Origins (RegEx): `https://nextcloud.company/apps/user_oidc/code` +- Signing key: Any valid certificate +- Under advanced settings: + - Scopes: + - `authentik default Oauth Mapping email` + - `Nextcloud Profile` (or `authentik default Oauth Mapping profile` if you skipped the [custom profile scope](#custom-profile-scope) section) + - Subject mode: Based on the User's UUID + :::danger + Nextcloud will use the UUID as username. However, mapping the subject mode to authentik usernames is **not recommended** due to their mutable nature. This can lead to security issues such as user impersonation. If you still wish to map the subject mode to an username, [disable username changing](../../../docs/installation/configuration#authentik_default_user_change_username) in authentik and set this to `Based on the User's username`. + ::: + - Include claims in ID token: ✔️ + +Before continuing, make sure to take note of your `client ID` and `secret ID`. Don't worry you can go back to see/change them at any time. + +:::warning +Currently there is a bug in the Nextcloud OIDC app, that is [limiting the size of the secret ID](https://github.com/nextcloud/user_oidc/issues/405) token to 64 characters. Since authentik uses 128 characters for a secret ID by default, you will need to trim it down to 64 characters in order to be able to set it in Nextcloud. Don't worry, 64 characters is still sufficiently long and should not compromise security. +::: + +:::note +Depending on your Nextcloud configuration, you might need to use `https://nextcloud.company/index.php/` instead of `https://nextcloud.company/` +::: + +After the provider is created, link it to an app. Go to _Applications_ -> _Applications_. Create an application and choose the provider you just created. Make sure to take note of the _application slug_. You will need this later. + +#### Nextcloud + +In Nextcloud, ensure that the `OpenID Connect user backend` app is installed. Navigate to `Settings`, then `OpenID Connect`. + +Add a new provider using the `+` button and set the following values: + +- Identifier: Authentik +- Client ID: The client ID from the provider +- Client secret: The secret ID from the provider +- Discovery endpoint: `https://authentik.company/application/o//.well-known/openid-configuration` + :::tip + If you are running both your authentik and Nextcloud instances behind a reverse proxy, you can go ahead and use your internal FQDN here (i.e. `http://authentik.local`, however, note that if you do so there is [extra configuration required](#extra-configuration-when-running-behind-a-reverse-proxy)). + ::: +- Scope: `email`, `profile` (you can safely omit `openid` if you prefer) +- Attribute mappings: + - User ID mapping: sub + - Display name mapping: name + - Email mapping: email + - Quota mapping: quota (leave empty if you have skipped the [custom profile scope](#custom-profile-scope) section) + - Groups mapping: group (leave empty if you have skipped the [custom profile scope](#custom-profile-scope) section) + :::tip + You need to enable the "Use group provisioning" checkmark to be able to write to this field + ::: +- Use unique user ID: If you only have one provider you can uncheck this if you prefer. + +At this stage you should be able to login with SSO. + +##### Making the OIDC provider the default login method + +If you intend to only login to Nextcloud using your freshly configured authentik provider, you may wish to make it the default login method. This will allow your users to be automatically redirected to authentik when they attempt to access your Nextcloud instance, as opposed to having to manually click on "Log in with Authentik" every time they wish to login. + +To achieve this, you will need to use the `occ` command of your Nextcloud instance: + +```bash +sudo -u www-data php var/www/nextcloud/occ config:app:set --value=0 user_oidc allow_multiple_user_backends +``` + +##### Extra configuration when running behind a reverse proxy + +The OpendID Connect discovery endpoint is queried by Nextcloud and contains a list of endpoints for use by both the relying party (Nextcloud) and the authenticating user. + +:::note +If you are configuring an insecure (http) discovery endpoint, Nextcloud will, by default, refuse to connect to it. To change this behaviour, you must add `allow_local_remote_servers => true` to your `config.php` +::: + +:::note +It is currently not possible force Nextcloud to connect to an https endpoint which uses an untrusted (selfsigned) certificate. If this is the case with your setup, you can do one of 3 things: + +- switch to using a trusted certificate +- add the selfsigned certificate to Nextcloud's trust store +- switch to using an http endpoint and add `allow_local_remote_servers => true` to your `config.php` + +::: + +Because authentik has no knowledge of where each endpoint is/can be accessed from, it will always return endpoints with domain names matching the one used to make the discovery endpoint request. + +For example, if your Nextcloud instance queries the discovery endpoint using an internal domain name (`authentik.local`), all returned endpoints will have the same domain name. In this case: + +- `http://authentik.local/application/o//` +- `http://authentik.local/application/o/authorize/` +- `http://authentik.local/application/o/token/` +- `http://authentik.local/application/o/userinfo/` +- `http://authentik.local/application/o//end-session/` +- `http://authentik.local/application/o/introspect/` +- `http://authentik.local/application/o/revoke/` +- `http://authentik.local/application/o/device/` +- `http://authentik.local/application/o//jwks/` + +This represents a problem, because Nextcloud will attempt to redirect the user to the received `authorization` and `end-session` endpoints during login and logout respectively. When that happens, the user will try to access an internal domain and fail. + +The easiest way to fix this is to modify the redirect response's `Location` header coming back from Nextcloud during login and logout. Different proxies have different ways of achieving this. For example with Traefik, a 3rd party plugin called [Rewrite Header](https://plugins.traefik.io/plugins/628c9eb5108ecc83915d7758/rewrite-header) can be used. + +At a minimum, the `authorize` and `end-session` endpoints must be edited in-flight like so: + +- `http://authentik.local/application/o/authorize/` -> `https://authentik.company/application/o/authorize/` +- `http://authentik.local/application/o//end-session/` -> `https://authentik.company/application/o//end-session/` + +:::note +HTTP headers are usually capitalised (e.g. **L**ocation), however, at least some versions of Nextcloud seem to return all lowercase headers (e.g. **l**ocation). To be safe, make sure to add header replacement rules for both cases. +::: + +If you prefer, you may also edit the rest of the endpoints, though that should not be necessary, as they should not be accessed by the user. + +:::tip +If you do not have any relying parties accessing authentik from the outside, you may also configure your proxy to only allow access to the `authorize` and `end-session` endpoints from the outside world. +::: + +### SAML auth + +#### Preparation The following placeholders will be used: @@ -40,7 +225,7 @@ Depending on your Nextcloud configuration, you might need to use `https://nextcl You can of course use a custom signing certificate, and adjust durations. -## Nextcloud +#### Nextcloud In Nextcloud, ensure that the `SSO & SAML Authentication` app is installed. Navigate to `Settings`, then `SSO & SAML Authentication`. @@ -70,7 +255,7 @@ To do this you will need to add the line `'overwriteprotocol' => 'https'` to `co See https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html#overwrite-parameters for additional information ::: -## Group Quotas +#### Group Quotas Create a group for each different level of quota you want users to have. Set a custom attribute, for example called `nextcloud_quota`, to the quota you want, for example `15 GB`. @@ -91,7 +276,7 @@ In Nextcloud, go to `Settings`, then `SSO & SAML Authentication`Under `Attribute - Attribute to map the quota to.: `nextcloud_quota` -## Admin Group +#### Admin Group To give authentik users admin access to your Nextcloud instance, you need to create a custom Property Mapping that maps an authentik group to "admin". It has to be mapped to "admin" as this is static in Nextcloud and cannot be changed. diff --git a/website/package-lock.json b/website/package-lock.json index 0c7239845..de2318266 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -19,14 +19,14 @@ "clsx": "^2.0.0", "disqus-react": "^1.1.5", "postcss": "^8.4.31", - "prism-react-renderer": "^2.2.0", + "prism-react-renderer": "^2.3.0", "rapidoc": "^9.3.4", "react": "^18.2.0", "react-before-after-slider-component": "^1.1.8", "react-dom": "^18.2.0", "react-feather": "^2.0.10", "react-toggle": "^4.1.3", - "react-tooltip": "^5.23.0", + "react-tooltip": "^5.24.0", "remark-github": "^12.0.0" }, "devDependencies": { @@ -13617,25 +13617,17 @@ } }, "node_modules/prism-react-renderer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.2.0.tgz", - "integrity": "sha512-j4AN0VkEr72598+47xDvpzeYyeh/wPPRNTt9nJFZqIZUxwGKwYqYgt7RVigZ3ZICJWJWN84KEuMKPNyypyhNIw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.0.tgz", + "integrity": "sha512-UYRg2TkVIaI6tRVHC5OJ4/BxqPUxJkJvq/odLT/ykpt1zGYXooNperUxQcCvi87LyRnR4nCh81ceOA+e7nrydg==", "dependencies": { "@types/prismjs": "^1.26.0", - "clsx": "^1.2.1" + "clsx": "^2.0.0" }, "peerDependencies": { "react": ">=16.0.0" } }, - "node_modules/prism-react-renderer/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, "node_modules/prismjs": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", @@ -14238,9 +14230,9 @@ } }, "node_modules/react-tooltip": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.23.0.tgz", - "integrity": "sha512-MYqn6n+Af8NHHDL3zrSqzVSoK2LLqTNFp30CuuHCYlBEf+q88FWfg+8pSO+0GnDvOa5ZaryNDq9sAVQeNhnsgw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.24.0.tgz", + "integrity": "sha512-HjstgpOrUwP4eN6mHU4EThpbxVuKO5SvqumRt1aAcPq0ya+pIVVxlwltndtdIIMBJ7w3jnN05vNfcfh2sxE2mQ==", "dependencies": { "@floating-ui/dom": "^1.0.0", "classnames": "^2.3.0" diff --git a/website/package.json b/website/package.json index b28d61f1e..4c694e476 100644 --- a/website/package.json +++ b/website/package.json @@ -26,13 +26,13 @@ "clsx": "^2.0.0", "disqus-react": "^1.1.5", "postcss": "^8.4.31", - "prism-react-renderer": "^2.2.0", + "prism-react-renderer": "^2.3.0", "rapidoc": "^9.3.4", "react-before-after-slider-component": "^1.1.8", "react-dom": "^18.2.0", "react-feather": "^2.0.10", "react-toggle": "^4.1.3", - "react-tooltip": "^5.23.0", + "react-tooltip": "^5.24.0", "react": "^18.2.0", "remark-github": "^12.0.0" },