From 58bd637c43954d42a758f4fbf6945ba1062b30fb Mon Sep 17 00:00:00 2001 From: Jens L Date: Wed, 11 Oct 2023 21:15:59 +0200 Subject: [PATCH 01/10] website: make get started on pricing page go to customer portal (#7147) --- website/src/pages/pricing/index.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/website/src/pages/pricing/index.jsx b/website/src/pages/pricing/index.jsx index 1d3e4ded2..7744ffd2e 100644 --- a/website/src/pages/pricing/index.jsx +++ b/website/src/pages/pricing/index.jsx @@ -66,9 +66,8 @@ export default function pricingPage() { Get Started From 52ce8ec145f2b0c38805a89489242211a86602db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 11:06:43 +0200 Subject: [PATCH 02/10] core: bump sentry-sdk from 1.31.0 to 1.32.0 (#7150) Bumps [sentry-sdk](https://github.com/getsentry/sentry-python) from 1.31.0 to 1.32.0. - [Release notes](https://github.com/getsentry/sentry-python/releases) - [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-python/compare/1.31.0...1.32.0) --- updated-dependencies: - dependency-name: sentry-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 86d0bcbf8..d509b16d1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3468,13 +3468,13 @@ urllib3 = {version = ">=1.26,<3", extras = ["socks"]} [[package]] name = "sentry-sdk" -version = "1.31.0" +version = "1.32.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.31.0.tar.gz", hash = "sha256:6de2e88304873484207fed836388e422aeff000609b104c802749fd89d56ba5b"}, - {file = "sentry_sdk-1.31.0-py2.py3-none-any.whl", hash = "sha256:64a7141005fb775b9db298a30de93e3b83e0ddd1232dc6f36eb38aebc1553291"}, + {file = "sentry-sdk-1.32.0.tar.gz", hash = "sha256:935e8fbd7787a3702457393b74b13d89a5afb67185bc0af85c00cb27cbd42e7c"}, + {file = "sentry_sdk-1.32.0-py2.py3-none-any.whl", hash = "sha256:eeb0b3550536f3bbc05bb1c7e0feb3a78d74acb43b607159a606ed2ec0a33a4d"}, ] [package.dependencies] From 4272af584f4a5b8d10e4ba6c5efd88f44bada2f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 11:07:25 +0200 Subject: [PATCH 03/10] web: bump the babel group in /web with 5 updates (#7149) Bumps the babel group in /web with 5 updates: | Package | From | To | | --- | --- | --- | | [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) | `7.23.0` | `7.23.2` | | [@babel/plugin-proposal-decorators](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-proposal-decorators) | `7.23.0` | `7.23.2` | | [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) | `7.22.15` | `7.23.2` | | [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) | `7.22.20` | `7.23.2` | | [@babel/preset-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-typescript) | `7.23.0` | `7.23.2` | Updates `@babel/core` from 7.23.0 to 7.23.2 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/@babel/core@7.23.2/packages/babel-core) Updates `@babel/plugin-proposal-decorators` from 7.23.0 to 7.23.2 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-plugin-proposal-decorators) Updates `@babel/plugin-transform-runtime` from 7.22.15 to 7.23.2 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-plugin-transform-runtime) Updates `@babel/preset-env` from 7.22.20 to 7.23.2 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-preset-env) Updates `@babel/preset-typescript` from 7.23.0 to 7.23.2 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-preset-typescript) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: babel - dependency-name: "@babel/plugin-proposal-decorators" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: babel - dependency-name: "@babel/plugin-transform-runtime" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: babel - dependency-name: "@babel/preset-env" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: babel - dependency-name: "@babel/preset-typescript" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: babel ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- web/package-lock.json | 190 +++++++++++++++++++++--------------------- web/package.json | 10 +-- 2 files changed, 100 insertions(+), 100 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 373ecf910..ec600c34c 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -43,14 +43,14 @@ "yaml": "^2.3.2" }, "devDependencies": { - "@babel/core": "^7.23.0", + "@babel/core": "^7.23.2", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.2", "@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-runtime": "^7.22.15", - "@babel/preset-env": "^7.22.20", - "@babel/preset-typescript": "^7.23.0", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.23.2", "@hcaptcha/types": "^1.0.3", "@jackfranklin/rollup-plugin-markdown": "^0.4.0", "@jeysal/storybook-addon-css-user-preferences": "^0.2.0", @@ -161,18 +161,18 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", - "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -180,10 +180,10 @@ "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.0", + "@babel/helpers": "^7.23.2", "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -301,9 +301,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -415,14 +415,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", - "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.17" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -512,27 +512,27 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", - "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.15", - "@babel/types": "^7.22.17" + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", - "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0" }, "engines": { @@ -615,9 +615,9 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.0.tgz", - "integrity": "sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz", + "integrity": "sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", @@ -991,14 +991,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", - "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1041,9 +1041,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", - "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1128,9 +1128,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", - "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1332,12 +1332,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1365,15 +1365,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1513,9 +1513,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", - "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1625,16 +1625,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", - "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", + "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "semver": "^6.3.1" }, "engines": { @@ -1802,12 +1802,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", - "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.20", + "@babel/compat-data": "^7.23.2", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -1833,15 +1833,15 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.15", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.15", + "@babel/plugin-transform-block-scoping": "^7.23.0", "@babel/plugin-transform-class-properties": "^7.22.5", "@babel/plugin-transform-class-static-block": "^7.22.11", "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.15", + "@babel/plugin-transform-destructuring": "^7.23.0", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", "@babel/plugin-transform-dynamic-import": "^7.22.11", @@ -1853,9 +1853,9 @@ "@babel/plugin-transform-literals": "^7.22.5", "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", @@ -1864,7 +1864,7 @@ "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-optional-chaining": "^7.23.0", "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-property-in-object": "^7.22.11", @@ -1881,10 +1881,10 @@ "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.19", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1927,9 +1927,9 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz", - "integrity": "sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", + "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2127,9 +2127,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", - "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -11285,13 +11285,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.4.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -11299,25 +11299,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", + "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.32.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" + "@babel/helper-define-polyfill-provider": "^0.4.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" diff --git a/web/package.json b/web/package.json index ee545d180..9555d20d9 100644 --- a/web/package.json +++ b/web/package.json @@ -61,14 +61,14 @@ "yaml": "^2.3.2" }, "devDependencies": { - "@babel/core": "^7.23.0", + "@babel/core": "^7.23.2", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.2", "@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-runtime": "^7.22.15", - "@babel/preset-env": "^7.22.20", - "@babel/preset-typescript": "^7.23.0", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.23.2", "@hcaptcha/types": "^1.0.3", "@jackfranklin/rollup-plugin-markdown": "^0.4.0", "@jeysal/storybook-addon-css-user-preferences": "^0.2.0", From 5f2b9028b8eb1ecd6e0d5a20e03fb5d823bcc9d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 11:26:52 +0200 Subject: [PATCH 04/10] core: bump golang.org/x/net from 0.16.0 to 0.17.0 (#7148) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.16.0 to 0.17.0. - [Commits](https://github.com/golang/net/compare/v0.16.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d6c711af0..0b26945b5 100644 --- a/go.mod +++ b/go.mod @@ -73,7 +73,7 @@ require ( go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel/trace v1.14.0 // indirect golang.org/x/crypto v0.14.0 // indirect - golang.org/x/net v0.16.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index daa0c0f10..d9899e759 100644 --- a/go.sum +++ b/go.sum @@ -437,8 +437,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From ccd805ed3c5767d3740f99abf48f4f3d4f4f097c Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 12:36:58 +0200 Subject: [PATCH 05/10] translate: Updates for file locale/en/LC_MESSAGES/django.po in de (#7151) Translate locale/en/LC_MESSAGES/django.po in de 100% translated source file: 'locale/en/LC_MESSAGES/django.po' on 'de'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- locale/de/LC_MESSAGES/django.po | 2068 +++++++++++++++++++++++-------- 1 file changed, 1528 insertions(+), 540 deletions(-) diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index ffafc6784..df4c59200 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -4,96 +4,189 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Lars Lehmann , 2021 -# Johannes —/—, 2021 -# flip yksflip, 2021 -# Rhea Alleen, 2021 -# David , 2021 -# Steve Oswald, 2022 +# Rhea Alleen, 2022 +# Jens L. , 2022 # 97cce0ae0cad2a2cc552d3165d04643e_de3d740, 2022 -# 8d4895d1a97955a09df504bfbc4402b0_584b927, 2022 +# Benjamin Böhmke, 2022 +# Thomas Liske, 2023 +# Lars Lehmann , 2023 +# Johannes —/—, 2023 +# Sven S , 2023 +# Dominic Wagner , 2023 +# David , 2023 +# 8d4895d1a97955a09df504bfbc4402b0_584b927, 2023 +# itxworks, 2023 +# Christian Foellmann , 2023 +# kidhab, 2023 +# L Petersen , 2023 +# Marcel Patzsch, 2023 +# Ben, 2023 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-03 12:29+0000\n" -"PO-Revision-Date: 2021-10-09 18:10+0000\n" -"Last-Translator: 8d4895d1a97955a09df504bfbc4402b0_584b927, 2022\n" -"Language-Team: German (https://www.transifex.com/authentik/teams/119923/de/)\n" +"POT-Creation-Date: 2023-10-02 12:46+0000\n" +"PO-Revision-Date: 2022-09-26 16:47+0000\n" +"Last-Translator: Ben, 2023\n" +"Language-Team: German (https://app.transifex.com/authentik/teams/119923/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: authentik/admin/api/tasks.py:95 +#: authentik/admin/api/tasks.py:125 #, python-format msgid "Successfully re-scheduled Task %(name)s!" msgstr "Erfolgreich neu geplante Aufgabe: %(name)s" -#: authentik/api/schema.py:21 +#: authentik/api/schema.py:25 msgid "Generic API Error" msgstr "Allgemeiner API Fehler" -#: authentik/api/schema.py:29 +#: authentik/api/schema.py:33 msgid "Validation Error" msgstr "Validierungsfehler" -#: authentik/core/api/providers.py:89 +#: authentik/blueprints/api.py:44 +msgid "Blueprint file does not exist" +msgstr "Blaupausen-Datei existiert nicht" + +#: authentik/blueprints/api.py:55 +#, python-format +msgid "Failed to validate blueprint: %(logs)s" +msgstr "Blaupause konnte nicht validiert werden: %(logs)s" + +#: authentik/blueprints/api.py:60 +msgid "Either path or content must be set." +msgstr "Entweder Pfad oder Inhalt muss angegeben sein." + +#: authentik/blueprints/models.py:30 +msgid "Managed by authentik" +msgstr "Verwaltet durch Authentik" + +#: authentik/blueprints/models.py:32 +msgid "" +"Objects that are managed by authentik. These objects are created and updated" +" automatically. This flag only indicates that an object can be overwritten " +"by migrations. You can still modify the objects via the API, but expect " +"changes to be overwritten in a later update." +msgstr "" +"Objekte, die von Authentik verwaltet werden. Diese Objekte werden " +"automatisch erstellt und aktualisiert. Dieses Flag zeigt nur an, dass ein " +"Objekt durch Migrationen überschrieben werden kann. Sie können die Objekte " +"weiterhin über die API ändern, müssen aber damit rechnen, dass die " +"Änderungen bei einer späteren Aktualisierung überschrieben werden." + +#: authentik/blueprints/models.py:112 +msgid "Blueprint Instance" +msgstr "Blaupause-Instanz" + +#: authentik/blueprints/models.py:113 +msgid "Blueprint Instances" +msgstr "Blaupause-Instanzen" + +#: authentik/blueprints/v1/exporter.py:62 +#, python-format +msgid "authentik Export - %(date)s" +msgstr "Authentik Export - %(date)s" + +#: authentik/blueprints/v1/tasks.py:150 authentik/crypto/tasks.py:93 +#, python-format +msgid "Successfully imported %(count)d files." +msgstr "%(count)d Dateien wurden erfolgreich importiert." + +#: authentik/core/api/providers.py:120 msgid "SAML Provider from Metadata" msgstr "SAML Anbieter aus Metadaten" -#: authentik/core/api/providers.py:90 +#: authentik/core/api/providers.py:121 msgid "Create a SAML Provider by importing its Metadata." msgstr "Erstelle eine SAML Anbieter durch Import seiner Metadaten" -#: authentik/core/models.py:69 +#: authentik/core/api/users.py:158 +msgid "No leading or trailing slashes allowed." +msgstr "Es sind keine führenden oder abschließenden Schrägstriche erlaubt." + +#: authentik/core/api/users.py:161 +msgid "No empty segments in user path allowed." +msgstr "Im Benutzerpfad sind keine leeren Segmente erlaubt." + +#: authentik/core/models.py:86 msgid "name" msgstr "Name" -#: authentik/core/models.py:71 +#: authentik/core/models.py:88 msgid "Users added to this group will be superusers." msgstr "Benutzer dieser Gruppe werden als Superuser hinzugefügt." -#: authentik/core/models.py:129 +#: authentik/core/models.py:142 msgid "User's display name." msgstr "Anzeigename" -#: authentik/core/models.py:212 authentik/providers/oauth2/models.py:299 +#: authentik/core/models.py:268 authentik/providers/oauth2/models.py:295 msgid "User" msgstr "Benutzer" -#: authentik/core/models.py:213 +#: authentik/core/models.py:269 msgid "Users" msgstr "Benutzer" -#: authentik/core/models.py:224 +#: authentik/core/models.py:282 +msgid "" +"Flow used for authentication when the associated application is accessed by " +"an un-authenticated user." +msgstr "" +"Ablauf, welcher für die Authentifizierung verwendet wird, wenn ein nicht-" +"authentifizierter Benutzer auf die zugehörige Anwendung zugreift." + +#: authentik/core/models.py:292 msgid "Flow used when authorizing this provider." msgstr "Flow der zur Authorisierung des Anbieter verwendet wird." -#: authentik/core/models.py:257 +#: authentik/core/models.py:304 +msgid "" +"Accessed from applications; optional backchannel providers for protocols " +"like LDAP and SCIM." +msgstr "" +"Zugriff aus Anwendungen; optionale Rückkanalanbieter für Protokolle wie LDAP" +" und SCIM." + +#: authentik/core/models.py:359 msgid "Application's display Name." -msgstr "Anzeigename der Anwendung" +msgstr "Anzeigename der Applikation" -#: authentik/core/models.py:258 +#: authentik/core/models.py:360 msgid "Internal application name, used in URLs." -msgstr "Interner Anwendungsname; wird in URLs verwendet." +msgstr "Interner Applikationsname, wird in URLs verwendet." -#: authentik/core/models.py:311 +#: authentik/core/models.py:372 +msgid "Open launch URL in a new browser tab or window." +msgstr "Start-URL in einem neuen Browser-Fenster öffnen." + +#: authentik/core/models.py:436 msgid "Application" msgstr "Anwendung" -#: authentik/core/models.py:312 +#: authentik/core/models.py:437 msgid "Applications" msgstr "Anwendungen" -#: authentik/core/models.py:318 +#: authentik/core/models.py:443 msgid "Use the source-specific identifier" msgstr "Verwenden Sie die quellenspezifische Kennung" -#: authentik/core/models.py:326 +#: authentik/core/models.py:445 +msgid "" +"Link to a user with identical email address. Can have security implications " +"when a source doesn't validate email addresses." +msgstr "" +"Link zu einem Benutzer mit identischer E-Mail-Adresse. Kann Auswirkungen auf" +" die Sicherheit haben, wenn eine Quelle E-Mail-Adressen nicht validiert" + +#: authentik/core/models.py:449 msgid "" "Use the user's email address, but deny enrollment when the email address " "already exists." @@ -101,7 +194,16 @@ msgstr "" "Verwenden Sie die E-Mail-Adresse des Benutzers, aber verweigern Sie die " "Registrierung, wenn die E-Mail-Adresse bereits existiert." -#: authentik/core/models.py:335 +#: authentik/core/models.py:452 +msgid "" +"Link to a user with identical username. Can have security implications when " +"a username is used with another source." +msgstr "" +"Link zu einem Benutzer mit identischem Benutzernamen. Kann Auswirkungen auf " +"die Sicherheit haben, wenn ein Benutzername mit einer anderen Quelle " +"verwendet wird." + +#: authentik/core/models.py:456 msgid "" "Use the user's username, but deny enrollment when the username already " "exists." @@ -109,73 +211,82 @@ msgstr "" "Verwenden Sie Benutzernamen des Benutzers, aber verweigern Sie die " "Registrierung, wenn der Benutzername bereits existiert." -#: authentik/core/models.py:342 +#: authentik/core/models.py:463 msgid "Source's display Name." msgstr "Quellname" -#: authentik/core/models.py:343 +#: authentik/core/models.py:464 msgid "Internal source name, used in URLs." msgstr "Interner Quellname, genutzt für URLs" -#: authentik/core/models.py:354 +#: authentik/core/models.py:483 msgid "Flow to use when authenticating existing users." msgstr "Flow der zur Authorisierung bereits ersteller Nutzer verwendet wird" -#: authentik/core/models.py:363 +#: authentik/core/models.py:492 msgid "Flow to use when enrolling new users." -msgstr "Flow der zum Anlegen neuer Nutzer verwendet wird" +msgstr "Flow der zum Anlegen bereits neuer Nutzer verwendet wird" -#: authentik/core/models.py:501 +#: authentik/core/models.py:500 +msgid "" +"How the source determines if an existing user should be authenticated or a " +"new user enrolled." +msgstr "" +"Wie die Quelle bestimmt, ob ein existierender Benutzer angemeldet oder ein " +"neuer Benutzer registriert werden soll." + +#: authentik/core/models.py:672 msgid "Token" msgstr "Token" -#: authentik/core/models.py:502 +#: authentik/core/models.py:673 msgid "Tokens" msgstr "Tokens" -#: authentik/core/models.py:545 +#: authentik/core/models.py:714 msgid "Property Mapping" msgstr "Eigenschaft" -#: authentik/core/models.py:546 +#: authentik/core/models.py:715 msgid "Property Mappings" msgstr "Eigenschaften" -#: authentik/core/models.py:582 +#: authentik/core/models.py:750 msgid "Authenticated Session" msgstr "Authentifizierte Sitzung" -#: authentik/core/models.py:583 +#: authentik/core/models.py:751 msgid "Authenticated Sessions" msgstr "Authentifizierte Sitzungen" -#: authentik/core/sources/flow_manager.py:166 -msgid "source" -msgstr "Quelle" +#: authentik/core/sources/flow_manager.py:189 +#, python-format +msgid "" +"Request to authenticate with %(source)s has been denied. Please authenticate" +" with the source you've previously signed up with." +msgstr "" +"Die Anfrage zur Benutzeranmeldung mit %(source)s wurde verweigert. Bitte " +"melden Sie sich mit der Quelle an, mit der Sie sich zuvor registriert " +"hatten." -#: authentik/core/sources/flow_manager.py:220 -#: authentik/core/sources/flow_manager.py:258 +#: authentik/core/sources/flow_manager.py:241 +msgid "Configured flow does not exist." +msgstr "Der konfigurierte Flow ist nicht vorhanden." + +#: authentik/core/sources/flow_manager.py:271 +#: authentik/core/sources/flow_manager.py:323 #, python-format msgid "Successfully authenticated with %(source)s!" msgstr "Erfolgreich authentifiziert mit %(source)s" -#: authentik/core/sources/flow_manager.py:239 +#: authentik/core/sources/flow_manager.py:295 #, python-format msgid "Successfully linked %(source)s!" msgstr "Erfolgreich verlinkt mit %(source)s" -#: authentik/core/templates/error/generic.html:27 -msgid "Go to home" -msgstr "Zur Startseite" - -#: authentik/core/templates/if/admin.html:18 -#: authentik/core/templates/if/admin.html:24 -#: authentik/core/templates/if/flow.html:28 -#: authentik/core/templates/if/flow.html:34 -#: authentik/core/templates/if/user.html:18 -#: authentik/core/templates/if/user.html:24 -msgid "Loading..." -msgstr "Laden..." +#: authentik/core/sources/flow_manager.py:314 +msgid "Source is not configured for enrollment." +msgstr "Die Quelle ist nicht zur Benutzerregistrierung eingerichtet." #: authentik/core/templates/if/end_session.html:7 msgid "End session" @@ -188,7 +299,7 @@ msgid "" "You've logged out of %(application)s.\n" msgstr "" "\n" -"Ausgeloggt aus %(application)s.\n" +"Abgemeldet von %(application)s.\n" #: authentik/core/templates/if/end_session.html:19 #, python-format @@ -198,17 +309,25 @@ msgid "" " " msgstr "" "\n" -"Sie haben sich von %(application)s abgemeldet. Sie können zurück zur Übersicht gehen, um eine andere Anwendung zu starten, oder sich von Ihrem Authentik-Konto abmelden." +" Sie haben sich von %(application)s abgemeldet. Sie können zurück zur Übersicht gehen, um eine andere Anwendung zu starten, oder sich von Ihrem Authentik-Konto abmelden.\n" +" " -#: authentik/core/templates/if/end_session.html:24 +#: authentik/core/templates/if/end_session.html:25 msgid "Go back to overview" msgstr "Zurück zur Übersicht" -#: authentik/core/templates/if/end_session.html:26 -msgid "Log out of authentik" -msgstr "Aus Authentik ausloggen" +#: authentik/core/templates/if/end_session.html:29 +#, python-format +msgid "" +"\n" +" Log out of %(branding_title)s\n" +" " +msgstr "" +"\n" +" Abmelden von %(branding_title)s\n" +" " -#: authentik/core/templates/if/end_session.html:30 +#: authentik/core/templates/if/end_session.html:36 #, python-format msgid "" "\n" @@ -218,19 +337,31 @@ msgstr "" "\n" "Wieder anmelden bei %(application)s" -#: authentik/core/templates/login/base_full.html:65 -msgid "Powered by authentik" -msgstr "Mit Authentik erstellt" +#: authentik/core/templates/if/error.html:18 +msgid "Go home" +msgstr "Zur Startseite" -#: authentik/crypto/api.py:132 +#: authentik/core/templates/login/base_full.html:89 +msgid "Powered by authentik" +msgstr "Erstellt durch Authentik" + +#: authentik/core/views/apps.py:53 +#: authentik/providers/oauth2/views/authorize.py:393 +#: authentik/providers/oauth2/views/device_init.py:70 +#: authentik/providers/saml/views/sso.py:70 +#, python-format +msgid "You're about to sign into %(application)s." +msgstr "Sie sind dabei, sich bei %(application)s anzumelden." + +#: authentik/crypto/api.py:179 msgid "Subject-alt name" msgstr "SAN" -#: authentik/crypto/models.py:34 +#: authentik/crypto/models.py:30 msgid "PEM-encoded Certificate data" msgstr "PEM-verschlüsselte Zertifikatsdaten" -#: authentik/crypto/models.py:37 +#: authentik/crypto/models.py:33 msgid "" "Optional Private Key. If this is set, you can use this keypair for " "encryption." @@ -238,40 +369,47 @@ msgstr "" "Optionaler privater Schlüssel. Wenn dies eingestellt ist, können Sie dieses " "Schlüsselpaar für die Verschlüsselung verwenden." -#: authentik/crypto/models.py:100 +#: authentik/crypto/models.py:101 msgid "Certificate-Key Pair" msgstr "Zertifikat-Schlüssel Paar" -#: authentik/crypto/models.py:101 +#: authentik/crypto/models.py:102 msgid "Certificate-Key Pairs" msgstr "Zertifikat-Schlüsselpaare" -#: authentik/crypto/tasks.py:93 -#, python-format -msgid "Successfully imported %(count)d files." -msgstr "%(count)d Dateien wurden erfolgreich importiert." +#: authentik/enterprise/models.py:193 +msgid "License Usage" +msgstr "Lizenzverwendung" -#: authentik/events/models.py:285 +#: authentik/enterprise/models.py:194 +msgid "License Usage Records" +msgstr "Lizenzverwendung Aufzeichnungen" + +#: authentik/events/models.py:290 msgid "Event" msgstr "Event" -#: authentik/events/models.py:286 +#: authentik/events/models.py:291 msgid "Events" msgstr "Events" -#: authentik/events/models.py:292 +#: authentik/events/models.py:297 +msgid "authentik inbuilt notifications" +msgstr "Von Authentik vordefinierte Benachrichtigungen" + +#: authentik/events/models.py:298 msgid "Generic Webhook" msgstr "Generischer Webhook" -#: authentik/events/models.py:293 +#: authentik/events/models.py:299 msgid "Slack Webhook (Slack/Discord)" msgstr "Slack Webhook (Slack/Discord)" -#: authentik/events/models.py:294 +#: authentik/events/models.py:300 msgid "Email" msgstr "E-Mail" -#: authentik/events/models.py:312 +#: authentik/events/models.py:318 msgid "" "Only send notification once, for example when sending a webhook into a chat " "channel." @@ -279,86 +417,178 @@ msgstr "" "Benachrichtigung nur einmal senden, z. B. beim Senden eines Webhooks in " "einen Chat-Kanal" -#: authentik/events/models.py:357 +#: authentik/events/models.py:383 msgid "Severity" msgstr "Schweregrad" -#: authentik/events/models.py:362 +#: authentik/events/models.py:388 msgid "Dispatched for user" msgstr "Versendet für Benutzer" -#: authentik/events/models.py:439 +#: authentik/events/models.py:397 +msgid "Event user" +msgstr "Event Benutzer" + +#: authentik/events/models.py:491 msgid "Notification Transport" msgstr "Mitteilungszustellungsart" -#: authentik/events/models.py:440 +#: authentik/events/models.py:492 msgid "Notification Transports" msgstr "Mitteilungszustellungsarten" -#: authentik/events/models.py:446 +#: authentik/events/models.py:498 msgid "Notice" msgstr "Hinweis" -#: authentik/events/models.py:447 +#: authentik/events/models.py:499 msgid "Warning" msgstr "Warnung" -#: authentik/events/models.py:448 +#: authentik/events/models.py:500 msgid "Alert" msgstr "Alarm" -#: authentik/events/models.py:468 +#: authentik/events/models.py:525 msgid "Notification" msgstr "Benachrichtigung" -#: authentik/events/models.py:469 +#: authentik/events/models.py:526 msgid "Notifications" msgstr "Benachrichtigungen" -#: authentik/events/models.py:488 +#: authentik/events/models.py:536 +msgid "" +"Select which transports should be used to notify the user. If none are " +"selected, the notification will only be shown in the authentik UI." +msgstr "" +"Wählen Sie, welche Zustellungsart genutzt werden soll um Benutzer zu " +"benachrichtigen. Wenn keine gewählt wurde, werden Benachrichtigungen nur in " +"der Authentik-Oberfläche angezeigt." + +#: authentik/events/models.py:544 msgid "Controls which severity level the created notifications will have." msgstr "" "Legt fest, welchen Schweregrad die erstellten Benachrichtigungen haben " "sollen." -#: authentik/events/models.py:508 +#: authentik/events/models.py:549 +msgid "" +"Define which group of users this notification should be sent and shown to. " +"If left empty, Notification won't ben sent." +msgstr "" +"Legt fest, welcher Benutzergruppe diese Benachrichtigung zugesandt und " +"angezeigt werden soll. Ohne diese Angabe wird die Benachrichtigung nicht " +"versandt." + +#: authentik/events/models.py:567 msgid "Notification Rule" msgstr "Benachrichtigungsregel" -#: authentik/events/models.py:509 +#: authentik/events/models.py:568 msgid "Notification Rules" msgstr "Benachrichtigungsregeln" -#: authentik/events/models.py:530 -msgid "Notification Webhook Mapping" -msgstr "Benachrichtigungs-Webhook Zuordnung" +#: authentik/events/models.py:588 +msgid "Webhook Mapping" +msgstr "Webhook Zuordnung" -#: authentik/events/models.py:531 -msgid "Notification Webhook Mappings" -msgstr "Benachrichtigungs-Webhook Zuordnungen" +#: authentik/events/models.py:589 +msgid "Webhook Mappings" +msgstr "Webhook Zuordnungen" -#: authentik/events/monitored_tasks.py:197 +#: authentik/events/monitored_tasks.py:205 msgid "Task has not been run yet." msgstr "Die Aufgabe wurde noch nicht ausgeführt" -#: authentik/flows/api/flows.py:350 +#: authentik/flows/api/flows.py:295 #, python-format msgid "Flow not applicable to current user/request: %(messages)s" msgstr "Flow nicht anwendbar auf aktuellen Benutzer/Anfrage: %(messages)s" -#: authentik/flows/models.py:107 +#: authentik/flows/api/flows_diagram.py:68 +#: authentik/flows/api/flows_diagram.py:94 +#, python-format +msgid "Policy (%(type)s)" +msgstr "Richtlinie (%(type)s)" + +#: authentik/flows/api/flows_diagram.py:71 +#, python-format +msgid "Binding %(order)d" +msgstr "Bindung %(order)d" + +#: authentik/flows/api/flows_diagram.py:118 +msgid "Policy passed" +msgstr "Richtlinie erfüllt" + +#: authentik/flows/api/flows_diagram.py:122 +#, python-format +msgid "Stage (%(type)s)" +msgstr "Stufe (%(type)s)" + +#: authentik/flows/api/flows_diagram.py:146 +#: authentik/flows/api/flows_diagram.py:206 +msgid "Policy denied" +msgstr "Richtlinie verweigert" + +#: authentik/flows/api/flows_diagram.py:156 +#: authentik/flows/api/flows_diagram.py:168 +#: authentik/flows/api/flows_diagram.py:205 +#: authentik/flows/api/flows_diagram.py:227 +msgid "End of the flow" +msgstr "Ende des Flow" + +#: authentik/flows/api/flows_diagram.py:169 +msgid "Requirement not fulfilled" +msgstr "Voraussetzung ist nicht erfüllt" + +#: authentik/flows/api/flows_diagram.py:177 +msgid "Flow authentication requirement" +msgstr "Authentifizierungsablauf Anforderung" + +#: authentik/flows/api/flows_diagram.py:183 +msgid "Requirement fulfilled" +msgstr "Voraussetzung erfüllt" + +#: authentik/flows/api/flows_diagram.py:196 +msgid "Pre-flow policies" +msgstr "Pre-Flow Richtlinien" + +#: authentik/flows/api/flows_diagram.py:214 authentik/flows/models.py:193 +msgid "Flow" +msgstr "Ablauf" + +#: authentik/flows/exceptions.py:19 +msgid "Flow does not apply to current user." +msgstr "Der Flow gilt nicht für den aktuellen Nutzer." + +#: authentik/flows/models.py:114 +#, python-format +msgid "Dynamic In-memory stage: %(doc)s" +msgstr "Dynamische In-Speicher-Stufe: %(doc)s" + +#: authentik/flows/models.py:129 msgid "Visible in the URL." msgstr "Sichtbar in der URL" -#: authentik/flows/models.py:109 +#: authentik/flows/models.py:131 msgid "Shown as the Title in Flow pages." msgstr "Wird als Titel auf den Ablaufseiten angezeigt." -#: authentik/flows/models.py:126 +#: authentik/flows/models.py:138 +msgid "" +"Decides what this Flow is used for. For example, the Authentication flow is " +"redirect to when an un-authenticated user visits authentik." +msgstr "" +"Entscheidet, wofür dieser Flow verwendet wird. Beispielsweise wird der " +"Authentifizierungsablauf umgeleitet, wenn ein nicht authentifizierter " +"Benutzer Authentik besucht." + +#: authentik/flows/models.py:147 msgid "Background shown during execution" msgstr "Während der Ausführung angezeigter Hintergrund" -#: authentik/flows/models.py:133 +#: authentik/flows/models.py:154 msgid "" "Enable compatibility mode, increases compatibility with password managers on" " mobile devices." @@ -366,20 +596,33 @@ msgstr "" "Aktivieren Sie den Kompatibilitätsmodus, um die Kompatibilität mit " "Passwortmanagern auf mobilen Geräten zu erhöhen." -#: authentik/flows/models.py:178 -msgid "Flow" -msgstr "Ablauf" +#: authentik/flows/models.py:162 +msgid "Configure what should happen when a flow denies access to a user." +msgstr "" +"Konfiguration, was geschehen soll, wenn ein Flow den Zugriff eines Benutzers" +" verbietet." -#: authentik/flows/models.py:179 +#: authentik/flows/models.py:168 +msgid "Required level of authentication and authorization to access a flow." +msgstr "" +"Erforderliche Stufe von Authentifizierung und Autorisierung für den Zugriff " +"auf einen Ablauf." + +#: authentik/flows/models.py:194 msgid "Flows" msgstr "Abläufe" -#: authentik/flows/models.py:209 +#: authentik/flows/models.py:215 +msgid "Evaluate policies during the Flow planning process." +msgstr "" +"Evaluierung der Richtlinien während des Planungsprozesses für den Ablauf." + +#: authentik/flows/models.py:219 msgid "Evaluate policies when the Stage is present to the user." msgstr "" "Bewerten Sie die Richtlinien, wenn die Stufe für den Benutzer sichtbar ist." -#: authentik/flows/models.py:216 +#: authentik/flows/models.py:226 msgid "" "Configure how the flow executor should handle an invalid response to a " "challenge. RETRY returns the error message and a similar challenge to the " @@ -392,59 +635,81 @@ msgstr "" "an neu, und RESTART_WITH_CONTEXT startet den Ablauf unter Beibehaltung des " "aktuellen Kontexts neu." -#: authentik/flows/models.py:240 +#: authentik/flows/models.py:249 msgid "Flow Stage Binding" msgstr "Ablaufsstufe Bindung" -#: authentik/flows/models.py:241 +#: authentik/flows/models.py:250 msgid "Flow Stage Bindings" msgstr "Ablaufsstufe Bindungen" -#: authentik/flows/models.py:291 +#: authentik/flows/models.py:265 +msgid "" +"Flow used by an authenticated user to configure this Stage. If empty, user " +"will not be able to configure this stage." +msgstr "" +"Ablauf der von einem authentifizierten Benutzer verwendet wird, um diese " +"Phase zu konfigurieren. Wenn leer, kann der Benutzer diese Phase nicht " +"konfigurieren." + +#: authentik/flows/models.py:305 msgid "Flow Token" msgstr "Ablauf-Token" -#: authentik/flows/models.py:292 +#: authentik/flows/models.py:306 msgid "Flow Tokens" msgstr "Ablauf-Token" -#: authentik/flows/templates/flows/error.html:12 -msgid "Whoops!" -msgstr "Whoops!" - -#: authentik/flows/templates/flows/error.html:17 -msgid "Something went wrong! Please try again later." -msgstr "Etwas ist schiefgelaufen. Bitte probiere es später wieder" - -#: authentik/lib/utils/time.py:24 +#: authentik/lib/utils/time.py:27 #, python-format msgid "%(value)s is not in the correct format of 'hours=3;minutes=1'." msgstr "%(value)s hat nicht das korrekte Format von \"hours=3;minutes=1\"." -#: authentik/managed/models.py:12 -msgid "Managed by authentik" -msgstr "Verwaltet durch Authentik" - -#: authentik/outposts/api/service_connections.py:131 +#: authentik/outposts/api/service_connections.py:127 msgid "" "You can only use an empty kubeconfig when connecting to a local cluster." msgstr "" "Sie können nur eine leere kubeconfig verwenden, wenn Sie sich mit einem " "lokalen Cluster verbinden." -#: authentik/outposts/api/service_connections.py:139 +#: authentik/outposts/api/service_connections.py:135 msgid "Invalid kubeconfig" msgstr "Ungültige Kube Konfiguration" -#: authentik/outposts/models.py:151 +#: authentik/outposts/models.py:122 +msgid "" +"If enabled, use the local connection. Required Docker socket/Kubernetes " +"Integration" +msgstr "" +"Wenn aktiviert, benutze die lokale Verbindung. Benötigt Docker Socket-/ " +"Kubernetes-Integration" + +#: authentik/outposts/models.py:152 msgid "Outpost Service-Connection" msgstr "Outpost Service-Verbindung" -#: authentik/outposts/models.py:152 +#: authentik/outposts/models.py:153 msgid "Outpost Service-Connections" msgstr "Outpost Service-Verbindungen" -#: authentik/outposts/models.py:188 +#: authentik/outposts/models.py:161 +msgid "" +"Can be in the format of 'unix://' when connecting to a local docker " +"daemon, or 'https://:2376' when connecting to a remote system." +msgstr "" +"Entweder im Format 'unix://' für eine Verbindung zu einem lokalen " +"Docker-Daemon oder im Format 'https://:2376' für eine Verbindung " +"zu einem entfernten System." + +#: authentik/outposts/models.py:173 +msgid "" +"CA which the endpoint's Certificate is verified against. Can be left empty " +"for no validation." +msgstr "" +"CA, anhand derer das Zertifikat des Endpunkts überprüft wird. Kann leer " +"gelassen werden, um keine Validierung durchzuführen." + +#: authentik/outposts/models.py:185 msgid "" "Certificate/Key used for authentication. Can be left empty for no " "authentication." @@ -452,167 +717,267 @@ msgstr "" "Zertifikat/Schlüssel für die Authentifizierung. Kann leer gelassen werden, " "wenn keine Authentifizierung erfolgt." -#: authentik/outposts/models.py:201 +#: authentik/outposts/models.py:203 msgid "Docker Service-Connection" msgstr "Docker Service-Verbindung" -#: authentik/outposts/models.py:202 +#: authentik/outposts/models.py:204 msgid "Docker Service-Connections" msgstr "Docker Service-Verbindungen" -#: authentik/outposts/models.py:227 +#: authentik/outposts/models.py:212 +msgid "" +"Paste your kubeconfig here. authentik will automatically use the currently " +"selected context." +msgstr "" +"Fügen Sie Ihre kubeconfig hier ein. Authentik wird automatisch den aktuell " +"ausgewählten Kontext verwenden." + +#: authentik/outposts/models.py:218 +msgid "Verify SSL Certificates of the Kubernetes API endpoint" +msgstr "SSL-Zertifikate des Kubernetes API-Endpunkts überprüfen" + +#: authentik/outposts/models.py:235 msgid "Kubernetes Service-Connection" msgstr "Kubernetes Service-Verbindung" -#: authentik/outposts/models.py:228 +#: authentik/outposts/models.py:236 msgid "Kubernetes Service-Connections" msgstr "Kubernetes Service-Verbindungen" +#: authentik/outposts/models.py:252 +msgid "" +"Select Service-Connection authentik should use to manage this outpost. Leave" +" empty if authentik should not handle the deployment." +msgstr "" +"Wählen Sie die Service-Verbindung, die Authentik benutzen soll, um diesen " +"Outpost zu verwalten. Leer lassen, um die Installation nicht von Authentik " +"verwalten zu lassen." + #: authentik/policies/denied.py:24 msgid "Access denied" msgstr "Zugriff verweigert" -#: authentik/policies/dummy/models.py:45 +#: authentik/policies/dummy/models.py:44 msgid "Dummy Policy" msgstr "Dummy Richtlinie" -#: authentik/policies/dummy/models.py:46 +#: authentik/policies/dummy/models.py:45 msgid "Dummy Policies" msgstr "Dummy Richtlinien" -#: authentik/policies/event_matcher/models.py:80 +#: authentik/policies/event_matcher/api.py:20 +#: authentik/policies/event_matcher/models.py:56 +msgid "" +"Match events created by selected application. When left empty, all " +"applications are matched." +msgstr "" +"Übereinstimmungsereignisse, die von der ausgewählten Anwendung erstellt " +"wurden. Wenn es leer gelassen wird, werden alle Anwendungen abgeglichen." + +#: authentik/policies/event_matcher/api.py:29 +#: authentik/policies/event_matcher/models.py:64 +msgid "" +"Match events created by selected model. When left empty, all models are " +"matched. When an app is selected, all the application's models are matched." +msgstr "" +"Stimmt mit Ereignissen überein, die vom ausgewählten Modell erstellt wurden." +" Bleibt sie leer, werden alle Modelle abgeglichen. Wenn eine Anwendung " +"ausgewählt ist, werden alle Modelle der Anwendung abgeglichen." + +#: authentik/policies/event_matcher/api.py:42 +msgid "At least one criteria must be set." +msgstr "Es muss mindestens ein Kriterium festgelegt werden." + +#: authentik/policies/event_matcher/models.py:48 +msgid "" +"Match created events with this action type. When left empty, all action " +"types will be matched." +msgstr "" +"Ordnen Sie erstellte Ereignisse diesem Aktionstyp zu. Wenn es leer gelassen " +"wird, werden alle Aktionstypen abgeglichen." + +#: authentik/policies/event_matcher/models.py:73 +msgid "" +"Matches Event's Client IP (strict matching, for network matching use an " +"Expression Policy)" +msgstr "" +"Stimmt mit der Client-IP des Ereignisses überein (strenge Übereinstimmung, " +"verwenden Sie für die Netzwerkübereinstimmung eine Ausdrucksrichtlinie)." + +#: authentik/policies/event_matcher/models.py:143 msgid "Event Matcher Policy" msgstr "Regelwerk für Ereignisabgleich" -#: authentik/policies/event_matcher/models.py:81 +#: authentik/policies/event_matcher/models.py:144 msgid "Event Matcher Policies" -msgstr "Regelwerk für Ereignisabgleicher" +msgstr "Richtlinie für den Ereignisvergleich" -#: authentik/policies/expiry/models.py:46 -msgid "days" -msgstr "Tage" +#: authentik/policies/expiry/models.py:45 +#, python-format +msgid "Password expired %(days)d days ago. Please update your password." +msgstr "" +"Das Passwort ist vor %(days)d Tagen abgelaufen. Bitte aktualisieren Sie Ihr " +"Passwort." #: authentik/policies/expiry/models.py:49 msgid "Password has expired." msgstr "Passwort ist abgelaufen" -#: authentik/policies/expiry/models.py:54 +#: authentik/policies/expiry/models.py:53 msgid "Password Expiry Policy" msgstr "Passwort-Ablauf Richtlinie" -#: authentik/policies/expiry/models.py:55 +#: authentik/policies/expiry/models.py:54 msgid "Password Expiry Policies" msgstr "Passwort-Ablauf Richtlinien" -#: authentik/policies/expression/models.py:41 +#: authentik/policies/expression/models.py:40 msgid "Expression Policy" -msgstr "Bezeichnungsregelwerk" +msgstr "Bezeichnungsrichtlinie" -#: authentik/policies/expression/models.py:42 +#: authentik/policies/expression/models.py:41 msgid "Expression Policies" msgstr "Bezeichnungsregelwerke" -#: authentik/policies/hibp/models.py:22 -#: authentik/policies/password/models.py:24 +#: authentik/policies/models.py:22 +msgid "all, all policies must pass" +msgstr "Alle, Alle Richtlinien müssen erfüllt werden" + +#: authentik/policies/models.py:23 +msgid "any, any policy must pass" +msgstr "Beliebig, Beliebige Richtlinien muss erfüllt werden" + +#: authentik/policies/models.py:46 +msgid "Policy Binding Model" +msgstr "Richtlinienbindungsmodell" + +#: authentik/policies/models.py:47 +msgid "Policy Binding Models" +msgstr "Modell der Regelwerksbindungen" + +#: authentik/policies/models.py:86 +msgid "Negates the outcome of the policy. Messages are unaffected." +msgstr "" +"Negiert das Ergebnis der Richtlinie. Nachrichten sind davon nicht betroffen." + +#: authentik/policies/models.py:89 +msgid "Timeout after which Policy execution is terminated." +msgstr "" +"Zeitüberschreitung, nach der die Ausführung der Richtlinie abgebrochen wird." + +#: authentik/policies/models.py:92 +msgid "Result if the Policy execution fails." +msgstr "Ergebnis, wenn die Ausführung der Richtlinie fehlschlägt." + +#: authentik/policies/models.py:145 +msgid "Policy Binding" +msgstr "Richtlinienbindung" + +#: authentik/policies/models.py:146 +msgid "Policy Bindings" +msgstr "Regelwerk Bindungen" + +#: authentik/policies/models.py:167 +msgid "" +"When this option is enabled, all executions of this policy will be logged. " +"By default, only execution errors are logged." +msgstr "" +"Wenn diese Option aktiviert ist, werden alle Ausführungen dieser Richtlinie " +"protokolliert. Standardmäßig werden nur Ausführungsfehler protokolliert." + +#: authentik/policies/models.py:189 +msgid "Policy" +msgstr "Richtlinie" + +#: authentik/policies/models.py:190 +msgid "Policies" +msgstr "Richtlinien" + +#: authentik/policies/password/models.py:27 msgid "Field key to check, field keys defined in Prompt stages are available." msgstr "" "Zu prüfender Feldschlüssel, die in den Aufforderungsstufen definierten " "Feldschlüssel sind verfügbar." -#: authentik/policies/hibp/models.py:47 -#: authentik/policies/password/models.py:57 +#: authentik/policies/password/models.py:44 +msgid "How many times the password hash is allowed to be on haveibeenpwned" +msgstr "Wie häufig der Passwort-Hash auf haveibeenpwned vertreten sein darf" + +#: authentik/policies/password/models.py:49 +msgid "" +"If the zxcvbn score is equal or less than this value, the policy will fail." +msgstr "" +"Die Richtlinie wird verweigert, wenn die zxcvbn-Bewertung gleich oder " +"kleiner diesem Wert ist." + +#: authentik/policies/password/models.py:72 msgid "Password not set in context" msgstr "Passwort nicht im Kontext festgelegt" -#: authentik/policies/hibp/models.py:60 +#: authentik/policies/password/models.py:134 #, python-format msgid "Password exists on %(count)d online lists." msgstr "Passwort existiert auf %(count)d Listen." -#: authentik/policies/hibp/models.py:66 -msgid "Have I Been Pwned Policy" -msgstr "Have I Been Pwned Richtlinie" +#: authentik/policies/password/models.py:154 +msgid "Password is too weak." +msgstr "Das Passwort ist zu schwach." -#: authentik/policies/hibp/models.py:67 -msgid "Have I Been Pwned Policies" -msgstr "Have I Been Pwned Richtlinien" - -#: authentik/policies/models.py:23 -msgid "ALL, all policies must pass" -msgstr "ALLE, alle Regelwerke müssen erfüllt sein" - -#: authentik/policies/models.py:25 -msgid "ANY, any policy must pass" -msgstr "BELIEBIG, beliebige Regelwerke müssen erfüllt sein" - -#: authentik/policies/models.py:45 -msgid "Policy Binding Model" -msgstr "Modell der Regelwerksbindung" - -#: authentik/policies/models.py:46 -msgid "Policy Binding Models" -msgstr "Modell der Regelwerksbindungen" - -#: authentik/policies/models.py:85 -msgid "Negates the outcome of the policy. Messages are unaffected." -msgstr "" -"Negiert das Ergebnis der Richtlinie. Nachrichten sind davon nicht betroffen." - -#: authentik/policies/models.py:88 -msgid "Timeout after which Policy execution is terminated." -msgstr "" -"Zeitüberschreitung, nach der die Ausführung der Richtlinie abgebrochen wird." - -#: authentik/policies/models.py:141 -msgid "Policy Binding" -msgstr "Regelwerk Bindung" - -#: authentik/policies/models.py:142 -msgid "Policy Bindings" -msgstr "Regelwerk Bindungen" - -#: authentik/policies/models.py:181 -msgid "Policy" -msgstr "Richtlinie" - -#: authentik/policies/models.py:182 -msgid "Policies" -msgstr "Richtlinien" - -#: authentik/policies/password/models.py:89 +#: authentik/policies/password/models.py:162 msgid "Password Policy" msgstr "Passwort Richtlinie" -#: authentik/policies/password/models.py:90 +#: authentik/policies/password/models.py:163 msgid "Password Policies" msgstr "Passwort Richtlinien" -#: authentik/policies/reputation/models.py:54 -msgid "Reputation Policy" -msgstr "Reputations Regelwerk" +#: authentik/policies/reputation/api.py:18 +msgid "Either IP or Username must be checked" +msgstr "Entweder IP oder Benutzername muss ausgewählt werden" -#: authentik/policies/reputation/models.py:55 +#: authentik/policies/reputation/models.py:67 +msgid "Reputation Policy" +msgstr "Reputationsrichtlinie" + +#: authentik/policies/reputation/models.py:68 msgid "Reputation Policies" msgstr "Reputations Regelwerke" +#: authentik/policies/reputation/models.py:95 +msgid "Reputation Score" +msgstr "Reputationswert" + +#: authentik/policies/reputation/models.py:96 +msgid "Reputation Scores" +msgstr "Reputationswert" + #: authentik/policies/templates/policies/denied.html:7 #: authentik/policies/templates/policies/denied.html:11 msgid "Permission denied" msgstr "Erlaubnis verweigert" -#: authentik/policies/templates/policies/denied.html:20 +#: authentik/policies/templates/policies/denied.html:21 +msgid "User's avatar" +msgstr "Avatar des Benutzers" + +#: authentik/policies/templates/policies/denied.html:25 +msgid "Not you?" +msgstr "Nicht Sie?" + +#: authentik/policies/templates/policies/denied.html:33 msgid "Request has been denied." msgstr "Anfrage wurde verweigert" -#: authentik/policies/templates/policies/denied.html:31 +#: authentik/policies/templates/policies/denied.html:44 msgid "Messages:" msgstr "Nachrichten:" -#: authentik/policies/templates/policies/denied.html:41 +#: authentik/policies/templates/policies/denied.html:54 msgid "Explanation:" msgstr "Erklärung:" -#: authentik/policies/templates/policies/denied.html:45 +#: authentik/policies/templates/policies/denied.html:58 #, python-format msgid "" "\n" @@ -640,145 +1005,233 @@ msgstr "" #: authentik/providers/ldap/models.py:53 msgid "" -"The start for uidNumbers, this number is added to the user.Pk to make sure " +"The start for uidNumbers, this number is added to the user.pk to make sure " "that the numbers aren't too low for POSIX users. Default is 2000 to ensure " "that we don't collide with local users uidNumber" msgstr "" -"Der Anfang für uidNumbers, diese Zahl wird zu user.Pk hinzugefügt, um " -"sicherzustellen, dass die Zahlen für POSIX-Benutzer nicht zu niedrig sind. " -"Standardwert ist 2000, um sicherzustellen, dass wir nicht mit lokalen " -"Benutzer kollidieren" +"Der Standardwert für die uid-Nummern. Diese Zahl wird zur user.pk " +"hinzugefügt, um sicherzustellen, dass die Nummern für POSIX-Benutzer nicht " +"zu niedrig sind. Standardwert ist 2000, um sicherzustellen, dass wir nicht " +"mit lokalen Benutzern uid-Nummern kollidieren." #: authentik/providers/ldap/models.py:62 msgid "" "The start for gidNumbers, this number is added to a number generated from " -"the group.Pk to make sure that the numbers aren't too low for POSIX groups. " +"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" msgstr "" -"Der Anfang für gidNumbers, diese Zahl wird zu einer aus der group.Pk " -"generierten Zahl addiert, um sicherzustellen, dass die Zahlen für POSIX-" +"Der Startwert für die gid-Nummern. Diese Zahl wird zu einer aus der group.pk" +" generierten Zahl addiert, um sicherzustellen, dass die Zahlen für POSIX-" "Gruppen nicht zu niedrig sind. Der Standardwert ist 4000, um " "sicherzustellen, dass wir nicht mit lokalen Gruppen oder primären " -"Benutzergruppen kollidieren." +"Benutzergruppen gid-Nummern kollidieren." -#: authentik/providers/ldap/models.py:97 +#: authentik/providers/ldap/models.py:76 +msgid "" +"When enabled, code-based multi-factor authentication can be used by " +"appending a semicolon and the TOTP code to the password. This should only be" +" 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." +msgstr "" +"Wenn diese Option aktiviert ist, kann eine codebasierte Multi-Faktor-" +"Authentifizierung verwendet werden, indem ein Semikolon und der TOTP-Code an" +" das Passwort angehängt werden. Dies sollte nur aktiviert werden, wenn alle " +"Benutzer, die sich an diesen Anbieter binden, ein TOTP-Gerät konfiguriert " +"haben, da andernfalls ein Passwort fälschlicherweise zurückgewiesen werden " +"kann, wenn es ein Semikolon enthält." + +#: authentik/providers/ldap/models.py:108 msgid "LDAP Provider" msgstr "LDAP Anbieter" -#: authentik/providers/ldap/models.py:98 +#: authentik/providers/ldap/models.py:109 msgid "LDAP Providers" msgstr "LDAP Anbietern" -#: authentik/providers/oauth2/models.py:36 -msgid "Confidential" -msgstr "Vertraulich" - -#: authentik/providers/oauth2/models.py:37 -msgid "Public" -msgstr "Öffentlich" - -#: authentik/providers/oauth2/models.py:51 +#: authentik/providers/oauth2/id_token.py:27 msgid "Based on the Hashed User ID" msgstr "Basierend auf der gehashten Benutzer ID" -#: authentik/providers/oauth2/models.py:52 +#: authentik/providers/oauth2/id_token.py:28 +msgid "Based on user ID" +msgstr "Basierend auf Benuzter ID" + +#: authentik/providers/oauth2/id_token.py:29 +msgid "Based on user UUID" +msgstr "Basierend auf der Benutzer UUID" + +#: authentik/providers/oauth2/id_token.py:30 msgid "Based on the username" msgstr "Basierend auf dem Benutzernamen" -#: authentik/providers/oauth2/models.py:55 +#: authentik/providers/oauth2/id_token.py:33 msgid "Based on the User's Email. This is recommended over the UPN method." msgstr "" "Basierend auf der E-Mail des Benutzers. Dies wird gegenüber der UPN-Methode " "empfohlen." -#: authentik/providers/oauth2/models.py:71 +#: authentik/providers/oauth2/id_token.py:38 +msgid "" +"Based on the User's UPN, only works if user has a 'upn' attribute set. Use " +"this method only if you have different UPN and Mail domains." +msgstr "" +"Basierend auf dem UPN des Benutzers, funktioniert nur, wenn der Benutzer ein" +" 'upn'-Attribut gesetzt hat. Verwenden Sie diese Methode nur, wenn Sie " +"unterschiedliche UPN- und Mail-Domänen haben." + +#: authentik/providers/oauth2/models.py:43 +msgid "Confidential" +msgstr "Vertraulich" + +#: authentik/providers/oauth2/models.py:44 +msgid "Public" +msgstr "Öffentlich" + +#: authentik/providers/oauth2/models.py:66 msgid "Same identifier is used for all providers" msgstr "Für alle Anbieter wird dieselbe Kennung verwendet" -#: authentik/providers/oauth2/models.py:73 +#: authentik/providers/oauth2/models.py:68 msgid "Each provider has a different issuer, based on the application slug." msgstr "" "Jeder Anbieter hat einen anderen Aussteller, der auf dem Slug der Anwendung " "basiert." -#: authentik/providers/oauth2/models.py:80 +#: authentik/providers/oauth2/models.py:75 msgid "code (Authorization Code Flow)" msgstr "Code (Autorisierungsablauf)" -#: authentik/providers/oauth2/models.py:81 +#: authentik/providers/oauth2/models.py:76 msgid "id_token (Implicit Flow)" msgstr "id_token (Implizierter Ablauf)" -#: authentik/providers/oauth2/models.py:82 +#: authentik/providers/oauth2/models.py:77 msgid "id_token token (Implicit Flow)" msgstr "id_token token (Implizierter Ablauf)" -#: authentik/providers/oauth2/models.py:83 +#: authentik/providers/oauth2/models.py:78 msgid "code token (Hybrid Flow)" msgstr "code token (Hybrid Ablauf)" -#: authentik/providers/oauth2/models.py:84 +#: authentik/providers/oauth2/models.py:79 msgid "code id_token (Hybrid Flow)" msgstr "code id_token (Hybrid Ablauf)" -#: authentik/providers/oauth2/models.py:85 +#: authentik/providers/oauth2/models.py:80 msgid "code id_token token (Hybrid Flow)" msgstr "code id_token token (Hybrid Ablauf)" -#: authentik/providers/oauth2/models.py:91 +#: authentik/providers/oauth2/models.py:86 msgid "HS256 (Symmetric Encryption)" msgstr "HS256 (Symmetrische Verschlüsselung)" -#: authentik/providers/oauth2/models.py:92 +#: authentik/providers/oauth2/models.py:87 msgid "RS256 (Asymmetric Encryption)" msgstr "RS256 (Asymmetrische Verschlüsselung)" -#: authentik/providers/oauth2/models.py:93 +#: authentik/providers/oauth2/models.py:88 msgid "ES256 (Asymmetric Encryption)" msgstr "ES256 (Asymmetrische Verschlüsselung)" -#: authentik/providers/oauth2/models.py:99 +#: authentik/providers/oauth2/models.py:94 msgid "Scope used by the client" msgstr "Vom Client verwendeter Scope" -#: authentik/providers/oauth2/models.py:125 +#: authentik/providers/oauth2/models.py:98 +msgid "" +"Description shown to the user when consenting. If left empty, the user won't" +" be informed." +msgstr "" +"Beschreibung, die Benutzer sehen, wenn sie Einwilligen. Falls leer gelassen," +" werden Benutzer nicht informiert." + +#: authentik/providers/oauth2/models.py:117 msgid "Scope Mapping" msgstr "Umfang Zuordnung" -#: authentik/providers/oauth2/models.py:126 +#: authentik/providers/oauth2/models.py:118 msgid "Scope Mappings" msgstr "Umfang Zuordnungen" -#: authentik/providers/oauth2/models.py:136 +#: authentik/providers/oauth2/models.py:128 msgid "Client Type" msgstr "Client Typ" -#: authentik/providers/oauth2/models.py:142 +#: authentik/providers/oauth2/models.py:130 +msgid "" +"Confidential clients are capable of maintaining the confidentiality of their" +" credentials. Public clients are incapable" +msgstr "" +"Vertrauliche Clients sind in der Lage, die Vertraulichkeit ihrer " +"Anmeldedaten zu wahren. Öffentliche Clients sind dazu nicht in der Lage." + +#: authentik/providers/oauth2/models.py:137 msgid "Client ID" msgstr "Client ID" -#: authentik/providers/oauth2/models.py:148 +#: authentik/providers/oauth2/models.py:143 msgid "Client Secret" msgstr "Client Geheimnis" -#: authentik/providers/oauth2/models.py:154 +#: authentik/providers/oauth2/models.py:149 msgid "Redirect URIs" msgstr "URIs weiterleiten" -#: authentik/providers/oauth2/models.py:155 +#: authentik/providers/oauth2/models.py:150 msgid "Enter each URI on a new line." msgstr "Geben Sie jeden URI in eine neue Zeile ein." -#: authentik/providers/oauth2/models.py:160 +#: authentik/providers/oauth2/models.py:155 msgid "Include claims in id_token" msgstr "Ansprüche in id_token berücksichtigen" -#: authentik/providers/oauth2/models.py:208 -msgid "RSA Key" -msgstr "RSA Schlüssel" +#: authentik/providers/oauth2/models.py:157 +msgid "" +"Include User claims from scopes in the id_token, for applications that don't" +" access the userinfo endpoint." +msgstr "" +"Schließen Sie Benutzeransprüche aus Bereichen in das id_token ein, für " +"Anwendungen, die nicht auf den userinfo-Endpunkt zugreifen." -#: authentik/providers/oauth2/models.py:212 +#: authentik/providers/oauth2/models.py:166 +msgid "" +"Access codes not valid on or after current time + this value (Format: " +"hours=1;minutes=2;seconds=3)." +msgstr "" +"Zugangsschlüssel laufen ab nach dieser Zeitspanne (Format: " +"hours=1;minutes=2;seconds=3)." + +#: authentik/providers/oauth2/models.py:174 +#: authentik/providers/oauth2/models.py:182 +msgid "" +"Tokens not valid on or after current time + this value (Format: " +"hours=1;minutes=2;seconds=3)." +msgstr "" +"Tokens laufen ab nach dieser Zeitspanne (Format: " +"hours=1;minutes=2;seconds=3)." + +#: authentik/providers/oauth2/models.py:191 +msgid "" +"Configure what data should be used as unique User Identifier. For most " +"cases, the default should be fine." +msgstr "" +"Konfigurieren Sie, welche Daten als eindeutige Benutzerkennung verwendet " +"werden sollen. In den meisten Fällen sollte die Standardeinstellung in " +"Ordnung sein." + +#: authentik/providers/oauth2/models.py:198 +msgid "Configure how the issuer field of the ID Token should be filled." +msgstr "" +"Konfigurieren Sie, wie der Flow-Executor mit einer ungültigen Antwort auf " +"eine Abfrage umgehen soll." + +#: authentik/providers/oauth2/models.py:203 +msgid "Signing Key" +msgstr "Signaturschlüssel" + +#: authentik/providers/oauth2/models.py:207 msgid "" "Key used to sign the tokens. Only required when JWT Algorithm is set to " "RS256." @@ -786,81 +1239,126 @@ msgstr "" "Schlüssel, der zum Signieren der Token verwendet wird. Nur erforderlich, " "wenn der JWT-Algorithmus auf RS256 eingestellt ist." -#: authentik/providers/oauth2/models.py:291 +#: authentik/providers/oauth2/models.py:214 +msgid "" +"Any JWT signed by the JWK of the selected source can be used to " +"authenticate." +msgstr "" +"Jedes JWT, das von der JWK der gewählten Quelle signiert ist, kann zur " +"Authentifizierung verwendet werden." + +#: authentik/providers/oauth2/models.py:287 msgid "OAuth2/OpenID Provider" msgstr "OAuth2/OpenID Anbieter" -#: authentik/providers/oauth2/models.py:292 +#: authentik/providers/oauth2/models.py:288 msgid "OAuth2/OpenID Providers" msgstr "OAuth2/OpenID Anbietern" -#: authentik/providers/oauth2/models.py:300 +#: authentik/providers/oauth2/models.py:297 +#: authentik/providers/oauth2/models.py:429 msgid "Scopes" msgstr "Umfang" -#: authentik/providers/oauth2/models.py:319 +#: authentik/providers/oauth2/models.py:316 msgid "Code" msgstr "Code" -#: authentik/providers/oauth2/models.py:320 +#: authentik/providers/oauth2/models.py:317 msgid "Nonce" msgstr "Nonce" -#: authentik/providers/oauth2/models.py:321 -msgid "Is Authentication?" -msgstr "Ist Authentifizierung?" - -#: authentik/providers/oauth2/models.py:322 +#: authentik/providers/oauth2/models.py:318 msgid "Code Challenge" msgstr "Code-Herausforderung" -#: authentik/providers/oauth2/models.py:324 +#: authentik/providers/oauth2/models.py:320 msgid "Code Challenge Method" msgstr "Code-Herausforderung Methode" -#: authentik/providers/oauth2/models.py:338 +#: authentik/providers/oauth2/models.py:340 msgid "Authorization Code" msgstr "Autorisierungscode" -#: authentik/providers/oauth2/models.py:339 +#: authentik/providers/oauth2/models.py:341 msgid "Authorization Codes" msgstr "Autorisierungs-Codes" -#: authentik/providers/oauth2/models.py:382 -msgid "Access Token" -msgstr "Zugangs-Token" - #: authentik/providers/oauth2/models.py:383 -msgid "Refresh Token" -msgstr "Token aktualisieren" +msgid "OAuth2 Access Token" +msgstr "OAuth2-Zugangs-Token" #: authentik/providers/oauth2/models.py:384 +msgid "OAuth2 Access Tokens" +msgstr "OAuth2-Zugangs-Token" + +#: authentik/providers/oauth2/models.py:394 msgid "ID Token" msgstr "ID-Token" -#: authentik/providers/oauth2/models.py:387 -msgid "OAuth2 Token" -msgstr "OAuth2-Token" +#: authentik/providers/oauth2/models.py:413 +msgid "OAuth2 Refresh Token" +msgstr "OAuth2-Aktualisierungs-Token" -#: authentik/providers/oauth2/models.py:388 -msgid "OAuth2 Tokens" -msgstr "OAuth2-Tokens" +#: authentik/providers/oauth2/models.py:414 +msgid "OAuth2 Refresh Tokens" +msgstr "OAuth2-Aktualisierungs-Token" -#: authentik/providers/oauth2/views/authorize.py:458 -#: authentik/providers/saml/views/sso.py:69 +#: authentik/providers/oauth2/models.py:441 +msgid "Device Token" +msgstr "Geräte-Token" + +#: authentik/providers/oauth2/models.py:442 +msgid "Device Tokens" +msgstr "Geräte-Token" + +#: authentik/providers/oauth2/views/authorize.py:448 +#: authentik/providers/saml/views/flows.py:87 #, python-format -msgid "You're about to sign into %(application)s." -msgstr "Sie sind dabei, sich bei %(application)s anzumelden." +msgid "Redirecting to %(app)s..." +msgstr "Umleitung zu %(app)s..." -#: authentik/providers/proxy/models.py:52 +#: authentik/providers/oauth2/views/device_init.py:151 +msgid "Invalid code" +msgstr "Ungültiger Code" + +#: authentik/providers/oauth2/views/userinfo.py:55 +#: authentik/providers/oauth2/views/userinfo.py:56 +msgid "GitHub Compatibility: Access your User Information" +msgstr "GitHub-Kompatibilität: Zugriff auf Benutzer" + +#: authentik/providers/oauth2/views/userinfo.py:57 +msgid "GitHub Compatibility: Access you Email addresses" +msgstr "GitHub-Kompatibilität: Zugriff auf E-Mail" + +#: authentik/providers/oauth2/views/userinfo.py:58 +msgid "GitHub Compatibility: Access your Groups" +msgstr "GitHub-Kompatibilität: Zugriff auf Gruppen" + +#: authentik/providers/oauth2/views/userinfo.py:59 +msgid "authentik API Access on behalf of your user" +msgstr "Authentik API-Zugriff im Namen Ihres Benutzers" + +#: authentik/providers/proxy/api.py:52 +msgid "User and password attributes must be set when basic auth is enabled." +msgstr "" +"Für Basisauthentifizierung müssen Benutzer- und Passwort-Attribute gesetzt " +"sein." + +#: authentik/providers/proxy/api.py:63 +msgid "Internal host cannot be empty when forward auth is disabled." +msgstr "" +"Interner Host muss angegeben werden, wenn Forward Auth deaktiviert ist." + +#: authentik/providers/proxy/models.py:54 msgid "Validate SSL Certificates of upstream servers" msgstr "SSL-Zertifikate von Upstream-Servern validieren" -#: authentik/providers/proxy/models.py:53 +#: authentik/providers/proxy/models.py:55 msgid "Internal host SSL Validation" msgstr "Interne Host-SSL-Validierung" -#: authentik/providers/proxy/models.py:59 +#: authentik/providers/proxy/models.py:61 msgid "" "Enable support for forwardAuth in traefik and nginx auth_request. Exclusive " "with internal_host." @@ -868,39 +1366,95 @@ msgstr "" "Aktivieren Sie die Unterstützung für forwardAuth in traefik und nginx " "auth_request. Ausschließlich mit internal_host." -#: authentik/providers/proxy/models.py:77 -msgid "Set HTTP-Basic Authentication" -msgstr "HTTP-Basisauthentifizierung einstellen" +#: authentik/providers/proxy/models.py:70 +msgid "" +"Regular expressions for which authentication is not required. Each new line " +"is interpreted as a new Regular Expression." +msgstr "" +"Reguläre Ausdrücke, für die keine Authentifizierung erforderlich ist. Jede " +"neue Zeile wird als ein neuer regulärer Ausdruck interpretiert." -#: authentik/providers/proxy/models.py:79 +#: authentik/providers/proxy/models.py:78 +msgid "" +"When enabled, this provider will intercept the authorization header and " +"authenticate requests based on its value." +msgstr "" +"Wenn aktiviert, fängt dieser Anbieter den Authorization-Header ab und " +"authentifiziert Anfragen basierend auf dessen Wert." + +#: authentik/providers/proxy/models.py:84 +msgid "Set HTTP-Basic Authentication" +msgstr "HTTP-Basic Authentifizierung einstellen" + +#: authentik/providers/proxy/models.py:86 msgid "" "Set a custom HTTP-Basic Authentication header based on values from " "authentik." msgstr "" "Legen Sie einen benutzerdefinierten HTTP-Basic Authentication-Header fest, " -"der auf den Werten von authentik basiert." +"der auf den Werten von Authentik basiert." -#: authentik/providers/proxy/models.py:84 +#: authentik/providers/proxy/models.py:91 msgid "HTTP-Basic Username Key" msgstr "HTTP-Basic Benutzername Schlüssel" -#: authentik/providers/proxy/models.py:94 +#: authentik/providers/proxy/models.py:93 +msgid "" +"User/Group Attribute used for the user part of the HTTP-Basic Header. If not" +" set, the user's Email address is used." +msgstr "" +"Benutzer-/Gruppenattribut, das für den Benutzerteil des HTTP-Basic-Headers " +"verwendet wird. Wenn nicht festgelegt, wird die E-Mail-Adresse des Benutzers" +" verwendet." + +#: authentik/providers/proxy/models.py:99 msgid "HTTP-Basic Password Key" msgstr "HTTP-Basic Passwort Schlüssel" -#: authentik/providers/proxy/models.py:149 +#: authentik/providers/proxy/models.py:100 +msgid "" +"User/Group Attribute used for the password part of the HTTP-Basic Header." +msgstr "" +"Nutzer-/Gruppe-Attribut wird für den Passwort-Teil im HTTP-Basic Header " +"verwendet." + +#: authentik/providers/proxy/models.py:154 msgid "Proxy Provider" msgstr "Proxy Anbieter" -#: authentik/providers/proxy/models.py:150 +#: authentik/providers/proxy/models.py:155 msgid "Proxy Providers" msgstr "Proxy Anbietern" -#: authentik/providers/saml/api.py:176 +#: authentik/providers/radius/models.py:18 +msgid "Shared secret between clients and server to hash packets." +msgstr "" +"Gemeinsames Geheimnis zwischen Clients und Server zum Hashing von Paketen." + +#: authentik/providers/radius/models.py:24 +msgid "" +"List of CIDRs (comma-separated) that clients can connect from. A more " +"specific CIDR will match before a looser one. Clients connecting from a non-" +"specified CIDR will be dropped." +msgstr "" +"Liste der CIDRs (durch Komma getrennt), von denen aus Clients eine " +"Verbindung herstellen können. Eine spezifischere CIDR wird vor einer " +"unspezifischeren abgeglichen. Clients, die sich von einer nicht " +"spezifizierten CIDR aus verbinden, werden abgewiesen." + +#: authentik/providers/radius/models.py:49 +msgid "Radius Provider" +msgstr "Radius-Anbieter" + +#: authentik/providers/radius/models.py:50 +msgid "Radius Providers" +msgstr "Radius-Anbieter" + +#: authentik/providers/saml/api/providers.py:257 msgid "Invalid XML Syntax" msgstr "Ungültige XML-Syntax" -#: authentik/providers/saml/api.py:186 +#: authentik/providers/saml/api/providers.py:267 #, python-format msgid "Failed to import Metadata: %(message)s" msgstr "Der Import von Metadaten ist fehlgeschlagen: %(message)s" @@ -909,84 +1463,204 @@ msgstr "Der Import von Metadaten ist fehlgeschlagen: %(message)s" msgid "ACS URL" msgstr "ACS URL" -#: authentik/providers/saml/models.py:49 +#: authentik/providers/saml/models.py:43 +msgid "" +"Value of the audience restriction field of the assertion. When left empty, " +"no audience restriction will be added." +msgstr "" +"Wert des Feldes für die Zielgruppenbeschränkung in der Prüfung. Bleibt das " +"Feld leer, wird keine Zielgruppenbeschränkung hinzugefügt." + +#: authentik/providers/saml/models.py:47 msgid "Also known as EntityID" msgstr "Auch bekannt als EntityID" -#: authentik/providers/saml/models.py:53 +#: authentik/providers/saml/models.py:51 msgid "Service Provider Binding" msgstr "Service Anbieter Bindung" -#: authentik/providers/saml/models.py:65 +#: authentik/providers/saml/models.py:53 +msgid "" +"This determines how authentik sends the response back to the Service " +"Provider." +msgstr "" +"Damit wird festgelegt, wie Authentik die Antwort an den Dienstanbieter " +"zurücksendet." + +#: authentik/providers/saml/models.py:63 msgid "NameID Property Mapping" msgstr "Name ID Eigenschaft" -#: authentik/providers/saml/models.py:109 authentik/sources/saml/models.py:128 +#: authentik/providers/saml/models.py:65 +msgid "" +"Configure how the NameID value will be created. When left empty, the " +"NameIDPolicy of the incoming request will be considered" +msgstr "" +"Legen Sie fest, wie der NameID-Wert erstellt werden soll. Bleibt der Wert " +"leer, wird die NameIDPolicy der eingehenden Anfrage berücksichtigt" + +#: authentik/providers/saml/models.py:74 +msgid "" +"Assertion valid not before current time + this value (Format: " +"hours=-1;minutes=-2;seconds=-3)." +msgstr "" +"Prüfung nicht gültig vor aktueller Zeit + diesem Wert (Format: " +"hours=-1;minutes=-2;seconds=-3)." + +#: authentik/providers/saml/models.py:82 +msgid "" +"Assertion not valid on or after current time + this value (Format: " +"hours=1;minutes=2;seconds=3)." +msgstr "" +"SAML Assertion nicht gültig am oder nach der aktuellen Uhrzeit + diesem Wert" +" (Format: Stunden=1;Minuten=2;Sekunden=3)." + +#: authentik/providers/saml/models.py:91 +msgid "" +"Session not valid on or after current time + this value (Format: " +"hours=1;minutes=2;seconds=3)." +msgstr "" +"Session am oder nach der aktuellen Uhrzeit + diesem Wert nicht gültig " +"(Format: Stunden=1;Minuten=2;Sekunden=3)." + +#: authentik/providers/saml/models.py:99 authentik/sources/saml/models.py:150 msgid "SHA1" msgstr "SHA1" -#: authentik/providers/saml/models.py:110 authentik/sources/saml/models.py:129 +#: authentik/providers/saml/models.py:100 authentik/sources/saml/models.py:151 msgid "SHA256" msgstr "SHA256" -#: authentik/providers/saml/models.py:111 authentik/sources/saml/models.py:130 +#: authentik/providers/saml/models.py:101 authentik/sources/saml/models.py:152 msgid "SHA384" msgstr "SHA384" -#: authentik/providers/saml/models.py:112 authentik/sources/saml/models.py:131 +#: authentik/providers/saml/models.py:102 authentik/sources/saml/models.py:153 msgid "SHA512" msgstr "SHA512" -#: authentik/providers/saml/models.py:119 authentik/sources/saml/models.py:138 +#: authentik/providers/saml/models.py:109 authentik/sources/saml/models.py:160 msgid "RSA-SHA1" msgstr "RSA-SHA1" -#: authentik/providers/saml/models.py:120 authentik/sources/saml/models.py:139 +#: authentik/providers/saml/models.py:110 authentik/sources/saml/models.py:161 msgid "RSA-SHA256" msgstr "RSA-SHA256" -#: authentik/providers/saml/models.py:121 authentik/sources/saml/models.py:140 +#: authentik/providers/saml/models.py:111 authentik/sources/saml/models.py:162 msgid "RSA-SHA384" msgstr "RSA-SHA384" -#: authentik/providers/saml/models.py:122 authentik/sources/saml/models.py:141 +#: authentik/providers/saml/models.py:112 authentik/sources/saml/models.py:163 msgid "RSA-SHA512" msgstr "RSA-SHA512" -#: authentik/providers/saml/models.py:123 authentik/sources/saml/models.py:142 +#: authentik/providers/saml/models.py:113 authentik/sources/saml/models.py:164 msgid "DSA-SHA1" msgstr "DSA-SHA1" -#: authentik/providers/saml/models.py:140 +#: authentik/providers/saml/models.py:124 authentik/sources/saml/models.py:130 +msgid "" +"When selected, incoming assertion's Signatures will be validated against " +"this certificate. To allow unsigned Requests, leave on default." +msgstr "" +"Wenn diese Option ausgewählt ist, werden die Signaturen eingehender " +"Behauptungen anhand dieses Zertifikats validiert. Um nicht signierte " +"Anfragen zuzulassen, belassen Sie die Standardeinstellung." + +#: authentik/providers/saml/models.py:128 authentik/sources/saml/models.py:134 msgid "Verification Certificate" msgstr "Zertifikat zur Überprüfung" -#: authentik/providers/saml/models.py:148 +#: authentik/providers/saml/models.py:136 msgid "Keypair used to sign outgoing Responses going to the Service Provider." msgstr "" "Schlüsselpaar, das zum Signieren ausgehender Antworten an den Dienstanbieter" " verwendet wird." -#: authentik/providers/saml/models.py:150 authentik/sources/saml/models.py:118 +#: authentik/providers/saml/models.py:138 authentik/sources/saml/models.py:144 msgid "Signing Keypair" msgstr "Schlüsselpaar für Signierung" -#: authentik/providers/saml/models.py:180 +#: authentik/providers/saml/models.py:167 msgid "SAML Provider" msgstr "SAML Anbieter" -#: authentik/providers/saml/models.py:181 +#: authentik/providers/saml/models.py:168 msgid "SAML Providers" msgstr "SAML Anbietern" -#: authentik/providers/saml/models.py:206 +#: authentik/providers/saml/models.py:192 msgid "SAML Property Mapping" msgstr "SAML Eigenschaft" -#: authentik/providers/saml/models.py:207 +#: authentik/providers/saml/models.py:193 msgid "SAML Property Mappings" msgstr "SAML Eigenschaften" +#: authentik/providers/scim/models.py:20 +msgid "Base URL to SCIM requests, usually ends in /v2" +msgstr "Basis-URL für SCIM-Anfragen, endet normalerweise auf /v2" + +#: authentik/providers/scim/models.py:21 +msgid "Authentication token" +msgstr "Authentifizierungstoken" + +#: authentik/providers/scim/models.py:27 authentik/sources/ldap/models.py:94 +msgid "Property mappings used for group creation/updating." +msgstr "" +"Eigenschaft, die für die Erstellung/Aktualisierung von Gruppen verwendet " +"werden." + +#: authentik/providers/scim/models.py:60 +msgid "SCIM Provider" +msgstr "SCIM-Anbieter" + +#: authentik/providers/scim/models.py:61 +msgid "SCIM Providers" +msgstr "SCIM-Anbieter" + +#: authentik/providers/scim/models.py:81 +msgid "SCIM Mapping" +msgstr "SCIM-Zuweisung" + +#: authentik/providers/scim/models.py:82 +msgid "SCIM Mappings" +msgstr "SCIM-Zuweisungen" + +#: authentik/providers/scim/tasks.py:52 +msgid "Starting full SCIM sync" +msgstr "Vollständige SCIM-Synchronisation starten" + +#: authentik/providers/scim/tasks.py:59 +#, python-format +msgid "Syncing page %(page)d of users" +msgstr "Seite %(page)d der Benutzer synchronisieren" + +#: authentik/providers/scim/tasks.py:63 +#, python-format +msgid "Syncing page %(page)d of groups" +msgstr "Seite %(page)d der Gruppen synchronisieren" + +#: authentik/providers/scim/tasks.py:92 +#, python-format +msgid "Failed to sync user %(user_name)s due to remote error: %(error)s" +msgstr "" +"Die Synchronisierung des Benutzers %(user_name)s ist aufgrund eines Remote-" +"Fehlers fehlgeschlagen: %(error)s" + +#: authentik/providers/scim/tasks.py:103 authentik/providers/scim/tasks.py:144 +#, python-format +msgid "Stopping sync due to error: %(error)s" +msgstr "Synchronisierung wird aufgrund eines Fehlers gestoppt: %(error)s" + +#: authentik/providers/scim/tasks.py:133 +#, python-format +msgid "Failed to sync group %(group_name)s due to remote error: %(error)s" +msgstr "" +"Die Synchronisierung der Gruppe %(group_name)s ist aufgrund eines Remote-" +"Fehlers fehlgeschlagen: %(error)s" + #: authentik/recovery/management/commands/create_admin_group.py:11 msgid "Create admin group if the default group gets deleted." msgstr "Erstelle Admingruppe, wenn Standardgruppe gelöscht wird" @@ -1001,11 +1675,11 @@ msgstr "" msgid "Used recovery-link to authenticate." msgstr "Verwendeter Recovery-Link zur Authentifizierung." -#: authentik/sources/ldap/models.py:32 +#: authentik/sources/ldap/models.py:37 msgid "Server URI" msgstr "Server URI" -#: authentik/sources/ldap/models.py:40 +#: authentik/sources/ldap/models.py:46 msgid "" "Optionally verify the LDAP Server's Certificate against the CA Chain in this" " keypair." @@ -1013,77 +1687,93 @@ msgstr "" "Optionales Abgleichen des Zertifikats des LDAP-Servers mit der CA-Kette in " "diesem Schlüsselpaar." -#: authentik/sources/ldap/models.py:45 +#: authentik/sources/ldap/models.py:55 +msgid "" +"Client certificate to authenticate against the LDAP Server's Certificate." +msgstr "" +"Client-Zertifikat zur Authentifizierung des Zertifikats des LDAP-Servers." + +#: authentik/sources/ldap/models.py:58 msgid "Bind CN" msgstr "Bind CN" -#: authentik/sources/ldap/models.py:47 +#: authentik/sources/ldap/models.py:60 msgid "Enable Start TLS" msgstr "Aktiviere StartTLS" -#: authentik/sources/ldap/models.py:49 +#: authentik/sources/ldap/models.py:61 +msgid "Use Server URI for SNI verification" +msgstr "Server-URI für SNI-Überprüfung verwenden" + +#: authentik/sources/ldap/models.py:63 msgid "Base DN" msgstr "Base DN" -#: authentik/sources/ldap/models.py:51 +#: authentik/sources/ldap/models.py:65 msgid "Prepended to Base DN for User-queries." msgstr "Wird dem Basis-DN für Benutzerabfragen vorangestellt." -#: authentik/sources/ldap/models.py:52 +#: authentik/sources/ldap/models.py:66 msgid "Addition User DN" msgstr "Zusatz Benutzer-DN" -#: authentik/sources/ldap/models.py:56 +#: authentik/sources/ldap/models.py:70 msgid "Prepended to Base DN for Group-queries." msgstr "Wird dem Basis-DN für Gruppenabfragen vorangestellt." -#: authentik/sources/ldap/models.py:57 +#: authentik/sources/ldap/models.py:71 msgid "Addition Group DN" msgstr "Zusatz Gruppen-DN" -#: authentik/sources/ldap/models.py:63 +#: authentik/sources/ldap/models.py:77 msgid "Consider Objects matching this filter to be Users." msgstr "Betrachten Sie Objekte, die diesem Filter entsprechen, als Benutzer." -#: authentik/sources/ldap/models.py:66 +#: authentik/sources/ldap/models.py:80 msgid "Field which contains members of a group." msgstr "Feld, das die Mitglieder einer Gruppe enthält." -#: authentik/sources/ldap/models.py:70 +#: authentik/sources/ldap/models.py:84 msgid "Consider Objects matching this filter to be Groups." msgstr "Betrachten Sie Objekte, die diesem Filter entsprechen, als Gruppen." -#: authentik/sources/ldap/models.py:73 +#: authentik/sources/ldap/models.py:87 msgid "Field which contains a unique Identifier." msgstr "Feld das eine einzigartige Kennung beinhaltet" -#: authentik/sources/ldap/models.py:80 -msgid "Property mappings used for group creation/updating." +#: authentik/sources/ldap/models.py:101 +msgid "" +"When a user changes their password, sync it back to LDAP. This can only be " +"enabled on a single LDAP source." msgstr "" -"Eigenschaft, die für die Erstellung/Aktualisierung von Gruppen verwendet " -"werden." +"Wenn ein Benutzer sein Passwort ändert, wird es zurück zum LDAP " +"synchronisiert. Dies kann nur für eine einzige LDAP-Quelle aktiviert werden." -#: authentik/sources/ldap/models.py:145 +#: authentik/sources/ldap/models.py:190 msgid "LDAP Source" msgstr "LDAP Quelle" -#: authentik/sources/ldap/models.py:146 +#: authentik/sources/ldap/models.py:191 msgid "LDAP Sources" msgstr "LDAP Quellen" -#: authentik/sources/ldap/models.py:169 +#: authentik/sources/ldap/models.py:213 msgid "LDAP Property Mapping" msgstr "LDAP Eigenschaft" -#: authentik/sources/ldap/models.py:170 +#: authentik/sources/ldap/models.py:214 msgid "LDAP Property Mappings" msgstr "LDAP Eigenschaften" -#: authentik/sources/ldap/signals.py:58 +#: authentik/sources/ldap/signals.py:50 msgid "Password does not match Active Directory Complexity." msgstr "" "Das Passwort stimmt nicht mit der Active Directory-Komplexität überein." +#: authentik/sources/oauth/clients/oauth2.py:68 +msgid "No token received." +msgstr "Kein Token empfangen." + #: authentik/sources/oauth/models.py:24 msgid "Request Token URL" msgstr "Token-URL anfordern" @@ -1122,170 +1812,215 @@ msgid "URL used by authentik to get user information." msgstr "" "URL, die von Authentik verwendet wird, um Benutzerinformationen zu erhalten." -#: authentik/sources/oauth/models.py:97 +#: authentik/sources/oauth/models.py:48 +msgid "Additional Scopes" +msgstr "zusätzliche Scopes" + +#: authentik/sources/oauth/models.py:108 msgid "OAuth Source" msgstr "Outh Quelle" -#: authentik/sources/oauth/models.py:98 +#: authentik/sources/oauth/models.py:109 msgid "OAuth Sources" msgstr "Outh Quellen" -#: authentik/sources/oauth/models.py:107 +#: authentik/sources/oauth/models.py:117 msgid "GitHub OAuth Source" msgstr "GitHub OAuth Quelle" -#: authentik/sources/oauth/models.py:108 +#: authentik/sources/oauth/models.py:118 msgid "GitHub OAuth Sources" msgstr "GitHub OAuth Quellen" -#: authentik/sources/oauth/models.py:117 +#: authentik/sources/oauth/models.py:126 +msgid "Twitch OAuth Source" +msgstr "Twitch OAuth Quelle" + +#: authentik/sources/oauth/models.py:127 +msgid "Twitch OAuth Sources" +msgstr "Twitch OAuth Quellen" + +#: authentik/sources/oauth/models.py:135 +msgid "Mailcow OAuth Source" +msgstr "Mailcow OAuth Quelle" + +#: authentik/sources/oauth/models.py:136 +msgid "Mailcow OAuth Sources" +msgstr "Mailcow OAuth Quellen" + +#: authentik/sources/oauth/models.py:144 msgid "Twitter OAuth Source" msgstr "Twitter OAuth Quelle" -#: authentik/sources/oauth/models.py:118 +#: authentik/sources/oauth/models.py:145 msgid "Twitter OAuth Sources" msgstr "Twitter OAuth Quellen" -#: authentik/sources/oauth/models.py:127 +#: authentik/sources/oauth/models.py:153 msgid "Facebook OAuth Source" msgstr "Facebook OAuth Quelle" -#: authentik/sources/oauth/models.py:128 +#: authentik/sources/oauth/models.py:154 msgid "Facebook OAuth Sources" msgstr "Facebook OAuth Quellen" -#: authentik/sources/oauth/models.py:137 +#: authentik/sources/oauth/models.py:162 msgid "Discord OAuth Source" msgstr "Discord OAuth Quelle" -#: authentik/sources/oauth/models.py:138 +#: authentik/sources/oauth/models.py:163 msgid "Discord OAuth Sources" msgstr "Discord OAuth Quellen" -#: authentik/sources/oauth/models.py:147 +#: authentik/sources/oauth/models.py:171 +msgid "Patreon OAuth Source" +msgstr "Patreon OAuth Quelle" + +#: authentik/sources/oauth/models.py:172 +msgid "Patreon OAuth Sources" +msgstr "Patreon OAuth-Quellen" + +#: authentik/sources/oauth/models.py:180 msgid "Google OAuth Source" msgstr "Google OAuth Quelle" -#: authentik/sources/oauth/models.py:148 +#: authentik/sources/oauth/models.py:181 msgid "Google OAuth Sources" msgstr "Google OAuth Quellen" -#: authentik/sources/oauth/models.py:157 +#: authentik/sources/oauth/models.py:189 msgid "Azure AD OAuth Source" msgstr "Azure AD OAuth Quelle" -#: authentik/sources/oauth/models.py:158 +#: authentik/sources/oauth/models.py:190 msgid "Azure AD OAuth Sources" msgstr "Azure AD OAuth Quellen" -#: authentik/sources/oauth/models.py:167 +#: authentik/sources/oauth/models.py:198 msgid "OpenID OAuth Source" msgstr "OpenID OAuth Quelle" -#: authentik/sources/oauth/models.py:168 +#: authentik/sources/oauth/models.py:199 msgid "OpenID OAuth Sources" msgstr "OpenID OAuth Quellen" -#: authentik/sources/oauth/models.py:177 +#: authentik/sources/oauth/models.py:207 msgid "Apple OAuth Source" msgstr "Apple OAuth Quelle" -#: authentik/sources/oauth/models.py:178 +#: authentik/sources/oauth/models.py:208 msgid "Apple OAuth Sources" msgstr "Apple OAuth Quellen" -#: authentik/sources/oauth/models.py:187 +#: authentik/sources/oauth/models.py:216 msgid "Okta OAuth Source" msgstr "Okta OAuth Quelle" -#: authentik/sources/oauth/models.py:188 +#: authentik/sources/oauth/models.py:217 msgid "Okta OAuth Sources" msgstr "Okta OAuth Quellen" -#: authentik/sources/oauth/models.py:203 +#: authentik/sources/oauth/models.py:225 +msgid "Reddit OAuth Source" +msgstr "Reddit OAuth Quelle" + +#: authentik/sources/oauth/models.py:226 +msgid "Reddit OAuth Sources" +msgstr "Reddit OAuth-Quellen" + +#: authentik/sources/oauth/models.py:248 msgid "User OAuth Source Connection" msgstr "Benutzer OAuth-Quellverbindung" -#: authentik/sources/oauth/models.py:204 +#: authentik/sources/oauth/models.py:249 msgid "User OAuth Source Connections" msgstr "Benutzer OAuth-Quellverbindungen" -#: authentik/sources/oauth/views/callback.py:98 -msgid "Authentication Failed." -msgstr "Authentifizierung fehlgeschlagen" +#: authentik/sources/oauth/views/callback.py:100 +#, python-format +msgid "Authentication failed: %(reason)s" +msgstr "Authentifizierung fehlgeschlagen: %(reason)s" #: authentik/sources/plex/models.py:37 msgid "Client identifier used to talk to Plex." msgstr "Client-Kennung, die für die Kommunikation mit Plex verwendet wird." -#: authentik/sources/plex/models.py:52 +#: authentik/sources/plex/models.py:44 +msgid "" +"Which servers a user has to be a member of to be granted access. Empty list " +"allows every server." +msgstr "" +"Bei welchen Servern ein Benutzer Mitglied sein muss, um Zugang zu erhalten. " +"Eine leere Liste erlaubt jeden Server." + +#: authentik/sources/plex/models.py:50 msgid "Allow friends to authenticate, even if you don't share a server." msgstr "" "Erlauben Sie Freunden, sich zu authentifizieren, auch wenn Sie keinen " "gemeinsamen Server haben." -#: authentik/sources/plex/models.py:54 +#: authentik/sources/plex/models.py:52 msgid "Plex token used to check friends" msgstr "Plex-Token zur Überprüfung von Freunden" -#: authentik/sources/plex/models.py:92 +#: authentik/sources/plex/models.py:95 msgid "Plex Source" msgstr "Plex Quelle" -#: authentik/sources/plex/models.py:93 +#: authentik/sources/plex/models.py:96 msgid "Plex Sources" msgstr "Plex Quellen" -#: authentik/sources/plex/models.py:104 +#: authentik/sources/plex/models.py:112 msgid "User Plex Source Connection" msgstr "Benutzer Plex-Quellverbindung" -#: authentik/sources/plex/models.py:105 +#: authentik/sources/plex/models.py:113 msgid "User Plex Source Connections" msgstr "Benutzer Plex-Quellverbindungen" -#: authentik/sources/saml/models.py:36 +#: authentik/sources/saml/models.py:40 msgid "Redirect Binding" msgstr "Umleitungs Bindung" -#: authentik/sources/saml/models.py:37 +#: authentik/sources/saml/models.py:41 msgid "POST Binding" msgstr "POST Bindung" -#: authentik/sources/saml/models.py:38 +#: authentik/sources/saml/models.py:42 msgid "POST Binding with auto-confirmation" msgstr "POST Bindung mit automatischer Bestätigung" -#: authentik/sources/saml/models.py:57 +#: authentik/sources/saml/models.py:70 msgid "Flow used before authentication." msgstr "Flow der vor Authorisierung verwendet wird" -#: authentik/sources/saml/models.py:64 +#: authentik/sources/saml/models.py:77 msgid "Issuer" msgstr "Aussteller" -#: authentik/sources/saml/models.py:65 +#: authentik/sources/saml/models.py:78 msgid "Also known as Entity ID. Defaults the Metadata URL." msgstr "" "Auch bekannt als Entity ID. Standardmäßig wird die Metadaten-URL verwendet." -#: authentik/sources/saml/models.py:69 +#: authentik/sources/saml/models.py:82 msgid "SSO URL" msgstr "SSO URL" -#: authentik/sources/saml/models.py:70 +#: authentik/sources/saml/models.py:83 msgid "URL that the initial Login request is sent to." msgstr "URL, an die die erste Login-Anfrage gesendet wird." -#: authentik/sources/saml/models.py:76 +#: authentik/sources/saml/models.py:89 msgid "SLO URL" msgstr "SLO URL" -#: authentik/sources/saml/models.py:77 +#: authentik/sources/saml/models.py:90 msgid "Optional URL if your IDP supports Single-Logout." msgstr "Optionale URL, wenn Ihr IDP Single-Logout unterstützt." -#: authentik/sources/saml/models.py:83 +#: authentik/sources/saml/models.py:96 msgid "" "Allows authentication flows initiated by the IdP. This can be a security " "risk, as no validation of the request ID is done." @@ -1293,7 +2028,7 @@ msgstr "" "Ermöglicht vom IdP initiierte Authentifizierungsströmen. Dies kann ein " "Sicherheitsrisiko darstellen, da keine Validierung der Anfrage-ID erfolgt." -#: authentik/sources/saml/models.py:91 +#: authentik/sources/saml/models.py:104 msgid "" "NameID Policy sent to the IdP. Can be unset, in which case no Policy is " "sent." @@ -1301,230 +2036,325 @@ msgstr "" "NameID Richtlinie, die an den IdP gesendet wird. Kann nicht gesetzt werden; " "in diesem Fall wird keine Richtlinie gesendet." -#: authentik/sources/saml/models.py:102 +#: authentik/sources/saml/models.py:115 msgid "Delete temporary users after" msgstr "Temporäre Benutzer danach löschen" -#: authentik/sources/saml/models.py:120 +#: authentik/sources/saml/models.py:118 msgid "" -"Keypair which is used to sign outgoing requests. Leave empty to disable " -"signing." +"Time offset when temporary users should be deleted. This only applies if " +"your IDP uses the NameID Format 'transient', and the user doesn't log out " +"manually. (Format: hours=1;minutes=2;seconds=3)." msgstr "" -"Schlüsselpaar, das zum Signieren ausgehender Anfragen verwendet wird. Leer " -"lassen, um das Signieren zu deaktivieren." +"Zeitversatz, wann temporäre Benutzer gelöscht werden sollen. Dies gilt nur, " +"wenn Ihr IDP das NameID-Format „transient“ verwendet und der Benutzer sich " +"nicht manuell abmeldet. (Format: Stunden=1;Minuten=2;Sekunden=3)." -#: authentik/sources/saml/models.py:188 +#: authentik/sources/saml/models.py:142 +msgid "" +"Keypair used to sign outgoing Responses going to the Identity Provider." +msgstr "" +"Schlüsselpaar, das zum Signieren ausgehender Antworten an den " +"Identitätsanbieter verwendet wird." + +#: authentik/sources/saml/models.py:226 msgid "SAML Source" msgstr "SAML Quelle" -#: authentik/sources/saml/models.py:189 +#: authentik/sources/saml/models.py:227 msgid "SAML Sources" msgstr "SAML Quellen" -#: authentik/stages/authenticator_duo/models.py:64 +#: authentik/sources/saml/models.py:242 +msgid "User SAML Source Connection" +msgstr "Benutzer SAML-Quellverbindung" + +#: authentik/sources/saml/models.py:243 +msgid "User SAML Source Connections" +msgstr "Benutzer SAML-Quellverbindungen" + +#: authentik/stages/authenticator_duo/models.py:79 msgid "Duo Authenticator Setup Stage" msgstr "Duo Authentikator Einrichtungsstufe" -#: authentik/stages/authenticator_duo/models.py:65 +#: authentik/stages/authenticator_duo/models.py:80 msgid "Duo Authenticator Setup Stages" msgstr "Duo Authentikator Einrichtungsstufen" -#: authentik/stages/authenticator_duo/models.py:82 +#: authentik/stages/authenticator_duo/models.py:103 msgid "Duo Device" msgstr "Duo Gerät" -#: authentik/stages/authenticator_duo/models.py:83 +#: authentik/stages/authenticator_duo/models.py:104 msgid "Duo Devices" msgstr "Duo Geräte" -#: authentik/stages/authenticator_sms/models.py:157 +#: authentik/stages/authenticator_sms/models.py:57 +msgid "" +"When enabled, the Phone number is only used during enrollment to verify the " +"users authenticity. Only a hash of the phone number is saved to ensure it is" +" not reused in the future." +msgstr "" +"Wenn diese Option aktiviert ist, wird die Telefonnummer nur während der " +"Registrierung verwendet, um die Authentizität des Benutzers zu überprüfen. " +"Es wird nur ein Hash der Telefonnummer gespeichert, um sicherzustellen, dass" +" sie in Zukunft nicht wiederverwendet wird." + +#: authentik/stages/authenticator_sms/models.py:68 +msgid "Optionally modify the payload being sent to custom providers." +msgstr "" +"Optionale Modifikation der Payload, die zu benutzerdefinierten Anbietern " +"gesandt wird." + +#: authentik/stages/authenticator_sms/models.py:81 +#, python-format +msgid "Use this code to authenticate in authentik: %(token)s" +msgstr "Verwenden Sie diesen Code zur Anmeldung in Authentik: %(token)s" + +#: authentik/stages/authenticator_sms/models.py:180 msgid "SMS Authenticator Setup Stage" msgstr "SMS Authentikator Einrichtungsstufe" -#: authentik/stages/authenticator_sms/models.py:158 +#: authentik/stages/authenticator_sms/models.py:181 msgid "SMS Authenticator Setup Stages" msgstr "SMS Authentikator Einrichtungsstufen" -#: authentik/stages/authenticator_sms/models.py:175 +#: authentik/stages/authenticator_sms/models.py:226 msgid "SMS Device" msgstr "SMS Gerät" -#: authentik/stages/authenticator_sms/models.py:176 +#: authentik/stages/authenticator_sms/models.py:227 msgid "SMS Devices" msgstr "SMS Geräte" -#: authentik/stages/authenticator_sms/stage.py:54 -#: authentik/stages/authenticator_totp/stage.py:45 +#: authentik/stages/authenticator_sms/stage.py:55 +#: authentik/stages/authenticator_totp/stage.py:41 +#: authentik/stages/authenticator_totp/stage.py:44 msgid "Code does not match" msgstr "Code stimmt nicht überein" -#: authentik/stages/authenticator_static/models.py:47 +#: authentik/stages/authenticator_sms/stage.py:71 +msgid "Invalid phone number" +msgstr "Ungültige Telefonnummer" + +#: authentik/stages/authenticator_static/models.py:52 msgid "Static Authenticator Stage" msgstr "Statischer Authentikator Einrichtungsstufe" -#: authentik/stages/authenticator_static/models.py:48 +#: authentik/stages/authenticator_static/models.py:53 msgid "Static Authenticator Stages" msgstr "Statischer Authentikator Einrichtungsstufen" -#: authentik/stages/authenticator_totp/models.py:16 +#: authentik/stages/authenticator_static/models.py:98 +msgid "Static device" +msgstr "Statisches Gerät" + +#: authentik/stages/authenticator_static/models.py:99 +msgid "Static devices" +msgstr "Statische Geräte" + +#: authentik/stages/authenticator_totp/models.py:25 msgid "6 digits, widely compatible" msgstr "6 Ziffern, weitestgehend kompatibel" -#: authentik/stages/authenticator_totp/models.py:17 +#: authentik/stages/authenticator_totp/models.py:26 msgid "8 digits, not compatible with apps like Google Authenticator" msgstr "8 Ziffern, nicht kompatibel mit Anwendungen wie Google Authenticator" -#: authentik/stages/authenticator_totp/models.py:54 +#: authentik/stages/authenticator_totp/models.py:62 msgid "TOTP Authenticator Setup Stage" msgstr "TOTP Authentikator Einrichtungsstufe" -#: authentik/stages/authenticator_totp/models.py:55 +#: authentik/stages/authenticator_totp/models.py:63 msgid "TOTP Authenticator Setup Stages" msgstr "TOTP Authentikator Einrichtungsstufen" -#: authentik/stages/authenticator_validate/challenge.py:99 +#: authentik/stages/authenticator_totp/models.py:244 +msgid "TOTP device" +msgstr "TOTP-Gerät" + +#: authentik/stages/authenticator_totp/models.py:245 +msgid "TOTP devices" +msgstr "TOTP-Geräte" + +#: authentik/stages/authenticator_validate/challenge.py:131 msgid "Invalid Token" msgstr "Ungültiger Token" -#: authentik/stages/authenticator_validate/models.py:17 +#: authentik/stages/authenticator_validate/models.py:18 +msgid "Static" +msgstr "Statisch" + +#: authentik/stages/authenticator_validate/models.py:19 msgid "TOTP" msgstr "TOTP" -#: authentik/stages/authenticator_validate/models.py:18 +#: authentik/stages/authenticator_validate/models.py:20 msgid "WebAuthn" msgstr "WebAuth" -#: authentik/stages/authenticator_validate/models.py:19 +#: authentik/stages/authenticator_validate/models.py:21 msgid "Duo" msgstr "Duo" -#: authentik/stages/authenticator_validate/models.py:20 +#: authentik/stages/authenticator_validate/models.py:22 msgid "SMS" msgstr "SMS" -#: authentik/stages/authenticator_validate/models.py:58 +#: authentik/stages/authenticator_validate/models.py:49 +msgid "" +"Stages used to configure Authenticator when user doesn't have any compatible" +" devices. After this configuration Stage passes, the user is not prompted " +"again." +msgstr "" +"Stufen zur Konfiguration des Authenticators, wenn der Benutzer keine " +"kompatiblen Geräte besitzt. Nachdem diese Konfigurationsstufe abgeschlossen " +"ist, wird der Benutzer nicht mehr dazu aufgefordert." + +#: authentik/stages/authenticator_validate/models.py:56 msgid "Device classes which can be used to authenticate" msgstr "Geräteklassen, die zur Authentifizierung verwendet werden können" -#: authentik/stages/authenticator_validate/models.py:80 +#: authentik/stages/authenticator_validate/models.py:64 +msgid "" +"If any of the user's device has been used within this threshold, this stage " +"will be skipped" +msgstr "" +"Wenn eines der Geräte des Benutzers innerhalb dieses Schwellenwerts " +"verwendet wurde, wird diese Phase übersprungen" + +#: authentik/stages/authenticator_validate/models.py:70 +msgid "Enforce user verification for WebAuthn devices." +msgstr "Erzwinge Benutzerüberprüfung für WebAuthn-Geräte." + +#: authentik/stages/authenticator_validate/models.py:92 msgid "Authenticator Validation Stage" msgstr "Authentifikator-Validierungsstufe" -#: authentik/stages/authenticator_validate/models.py:81 +#: authentik/stages/authenticator_validate/models.py:93 msgid "Authenticator Validation Stages" msgstr "Authentifikator-Validierungsstufen" -#: authentik/stages/authenticator_webauthn/models.py:71 +#: authentik/stages/authenticator_webauthn/models.py:112 msgid "WebAuthn Authenticator Setup Stage" msgstr "WebAuthn Authentifikator-Validierungsstufe" -#: authentik/stages/authenticator_webauthn/models.py:72 +#: authentik/stages/authenticator_webauthn/models.py:113 msgid "WebAuthn Authenticator Setup Stages" msgstr "WebAuthn Authentifikator-Validierungsstufen" -#: authentik/stages/authenticator_webauthn/models.py:105 +#: authentik/stages/authenticator_webauthn/models.py:151 msgid "WebAuthn Device" msgstr "WebAuthn Gerät" -#: authentik/stages/authenticator_webauthn/models.py:106 +#: authentik/stages/authenticator_webauthn/models.py:152 msgid "WebAuthn Devices" msgstr "WebAuthn Geräte" +#: authentik/stages/captcha/models.py:14 +msgid "Public key, acquired your captcha Provider." +msgstr "Öffentlicher Schlüssel, erworben von Ihrem Captcha-Provider." + #: authentik/stages/captcha/models.py:15 -msgid "" -"Public key, acquired from https://www.google.com/recaptcha/intro/v3.html" -msgstr "" -"Öffentlicher Schlüssel, erhalten durch " -"https://www.google.com/recaptcha/intro/v3.html" +msgid "Private key, acquired your captcha Provider." +msgstr "Privater Schlüssel, erworben von Ihrem Captcha-Provider." -#: authentik/stages/captcha/models.py:18 -msgid "" -"Private key, acquired from https://www.google.com/recaptcha/intro/v3.html" -msgstr "" -"Privater Schlüssel, erhalten durch " -"https://www.google.com/recaptcha/intro/v3.html" - -#: authentik/stages/captcha/models.py:39 +#: authentik/stages/captcha/models.py:37 msgid "Captcha Stage" msgstr "Captcha Stufe" -#: authentik/stages/captcha/models.py:40 +#: authentik/stages/captcha/models.py:38 msgid "Captcha Stages" msgstr "Captcha Stufen" -#: authentik/stages/consent/models.py:52 +#: authentik/stages/consent/models.py:30 +msgid "" +"Offset after which consent expires. (Format: hours=1;minutes=2;seconds=3)." +msgstr "" +"Die Einwilligung erlischt in. (Format: Stunden=1;Minuten=2;Sekunden=3)." + +#: authentik/stages/consent/models.py:50 msgid "Consent Stage" msgstr "Zustimmungsstufe" -#: authentik/stages/consent/models.py:53 +#: authentik/stages/consent/models.py:51 msgid "Consent Stages" msgstr "Zustimmungsstufen" -#: authentik/stages/consent/models.py:68 +#: authentik/stages/consent/models.py:72 msgid "User Consent" msgstr "Zustimmung der Benutzer" -#: authentik/stages/consent/models.py:69 +#: authentik/stages/consent/models.py:73 msgid "User Consents" msgstr "Zustimmungen der Benutzer" -#: authentik/stages/deny/models.py:31 +#: authentik/stages/deny/models.py:30 msgid "Deny Stage" msgstr "Verweigerungsstufe" -#: authentik/stages/deny/models.py:32 +#: authentik/stages/deny/models.py:31 msgid "Deny Stages" msgstr "Verweigerungsstufen" -#: authentik/stages/dummy/models.py:33 +#: authentik/stages/dummy/models.py:34 msgid "Dummy Stage" msgstr "Dummy Stufe" -#: authentik/stages/dummy/models.py:34 +#: authentik/stages/dummy/models.py:35 msgid "Dummy Stages" msgstr "Dummy Stufen" -#: authentik/stages/email/models.py:25 +#: authentik/stages/email/models.py:26 msgid "Password Reset" msgstr "Passwort zurücksetzen" -#: authentik/stages/email/models.py:29 +#: authentik/stages/email/models.py:30 msgid "Account Confirmation" msgstr "Konto-Bestätigung" -#: authentik/stages/email/models.py:75 +#: authentik/stages/email/models.py:59 +msgid "" +"When enabled, global Email connection settings will be used and connection " +"settings below will be ignored." +msgstr "" +"Wenn diese Option aktiviert ist, werden die globalen E-Mail " +"Verbindungseinstellungen benutzt und die unten angegebenen Einstellungen " +"ignoriert" + +#: authentik/stages/email/models.py:74 msgid "Activate users upon completion of stage." msgstr "Aktivieren Sie die Benutzer nach Abschluss der Stufe." -#: authentik/stages/email/models.py:79 +#: authentik/stages/email/models.py:78 msgid "Time in minutes the token sent is valid." msgstr "Zeit in Minuten wie lange der verschickte Token gültig ist" -#: authentik/stages/email/models.py:125 +#: authentik/stages/email/models.py:132 msgid "Email Stage" msgstr "E-Mail Stufe" -#: authentik/stages/email/models.py:126 +#: authentik/stages/email/models.py:133 msgid "Email Stages" msgstr "E-Mail Stufen" -#: authentik/stages/email/stage.py:106 +#: authentik/stages/email/stage.py:117 msgid "Successfully verified Email." msgstr "Erfolgreich Mailadresse verifiziert." -#: authentik/stages/email/stage.py:113 authentik/stages/email/stage.py:135 +#: authentik/stages/email/stage.py:124 authentik/stages/email/stage.py:146 msgid "No pending user." msgstr "Keine ausstehende Benutzer." -#: authentik/stages/email/stage.py:125 +#: authentik/stages/email/stage.py:136 msgid "Email sent." msgstr "Email verschickt" -#: authentik/stages/email/templates/email/account_confirmation.html:9 +#: authentik/stages/email/templates/email/account_confirmation.html:10 msgid "Welcome!" msgstr "Willkommen!" -#: authentik/stages/email/templates/email/account_confirmation.html:12 +#: authentik/stages/email/templates/email/account_confirmation.html:19 msgid "" "We're excited to have you get started. First, you need to confirm your " "account. Just press the button below." @@ -1532,11 +2362,11 @@ msgstr "" "Wir freuen uns darauf, dass Sie loslegen können. Zuerst müssen Sie Ihr Konto" " bestätigen. Klicken Sie einfach auf die Schaltfläche unten." -#: authentik/stages/email/templates/email/account_confirmation.html:21 +#: authentik/stages/email/templates/email/account_confirmation.html:24 msgid "Confirm Account" msgstr "Account bestätigen" -#: authentik/stages/email/templates/email/account_confirmation.html:30 +#: authentik/stages/email/templates/email/account_confirmation.html:36 #, python-format msgid "" "\n" @@ -1546,50 +2376,52 @@ msgstr "" "\n" "Wenn das nicht funktioniert, kopieren Sie den folgenden Link und fügen ihn in Ihren Browser ein: %(url)s" -#: authentik/stages/email/templates/email/account_confirmation.html:35 -msgid "" -"If you have any questions, just reply to this email—we're always happy to " -"help out." -msgstr "" -"Wenn Sie Fragen haben, antworten Sie einfach auf diese E-Mail - wir helfen " -"Ihnen gerne weiter." - -#: authentik/stages/email/templates/email/generic.html:24 -msgid "Additional Information" -msgstr "Zusätzliche Informationen" - -#: authentik/stages/email/templates/email/password_reset.html:9 +#: authentik/stages/email/templates/email/event_notification.html:46 #, python-format msgid "" "\n" -" Hi %(username)s,\n" -" " +" This email was sent from the notification transport %(name)s.\n" +" " msgstr "" "\n" -"Hi %(username)s," +" Diese E-Mail wurde vom Benachrichtigungsdienst %(name)s gesendet.\n" +" " -#: authentik/stages/email/templates/email/password_reset.html:19 +#: authentik/stages/email/templates/email/password_reset.html:10 +#, python-format msgid "" "\n" -" You recently requested to change your password for you authentik account. Use the button below to set a new password.\n" -" " +" Hi %(username)s,\n" +" " msgstr "" "\n" -"Sie haben vor kurzem eine Passwortänderung für ihr Authentik-Konto beantragt. Benutzen Sie die Schaltfläche unten, um ein neues Passwort festzulegen" +" Hallo %(username)s,\n" +" " -#: authentik/stages/email/templates/email/password_reset.html:33 +#: authentik/stages/email/templates/email/password_reset.html:21 +msgid "" +"\n" +" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n" +" " +msgstr "" +"\n" +" Sie haben kürzlich beantragt, Ihr Passwort für Ihr Authentik-Konto zu ändern. Benutzen Sie auf die Schaltfläche unten, um ein neues Passwort festzulegen.\n" +" " + +#: authentik/stages/email/templates/email/password_reset.html:28 msgid "Reset Password" msgstr "Passwort zurücksetzen" -#: authentik/stages/email/templates/email/password_reset.html:45 +#: authentik/stages/email/templates/email/password_reset.html:39 #, python-format msgid "" "\n" -" If you did not request a password change, please ignore this Email. The link above is valid for %(expires)s.\n" -" " +" If you did not request a password change, please ignore this Email. The link above is valid for %(expires)s.\n" +" " msgstr "" "\n" -"Wenn Sie keine Passwortänderung beantragt haben, ignorieren Sie bitte diese E-Mail. Der obige Link ist gültig für %(expires)s." +" Wenn Sie keine Passwortänderung beantragt haben, ignorieren Sie bitte diese E-Mail. Der obige Link ist gültig für %(expires)s.\n" +" " #: authentik/stages/email/templates/email/setup.html:9 msgid "authentik Test-Email" @@ -1604,77 +2436,118 @@ msgstr "" "\n" "Dies ist eine Test-E-Mail, um Sie darüber zu informieren, dass Sie Mailversand aus Authentik erfolgreich konfiguriert haben." -#: authentik/stages/identification/models.py:42 -msgid "" -"When set, shows a password field, instead of showing the password field as " -"seaprate step." +#: authentik/stages/identification/api.py:20 +msgid "When no user fields are selected, at least one source must be selected" msgstr "" -"Wenn diese Option gesetzt ist, wird ein Kennwortfeld angezeigt, anstatt das " -"Kennwortfeld als Schritt von seaprate anzuzeigen." +"Wenn keine Benutzerfelder ausgewählt sind, muss mindestens eine Quelle " +"ausgewählt werden" -#: authentik/stages/identification/models.py:48 +#: authentik/stages/identification/models.py:29 +msgid "" +"Fields of the user object to match against. (Hold shift to select multiple " +"options)" +msgstr "" +"Felder des Benutzerobjekts, mit denen abgeglichen werden soll. (Halten Sie " +"die Umschalttaste gedrückt, um mehrere Optionen auszuwählen)" + +#: authentik/stages/identification/models.py:47 msgid "When enabled, user fields are matched regardless of their casing." msgstr "" "Wenn diese Option aktiviert ist, werden Benutzerfelder unabhängig von ihrem " "Format abgeglichen." -#: authentik/stages/identification/models.py:68 +#: authentik/stages/identification/models.py:52 +msgid "" +"When a valid username/email has been entered, and this option is enabled, " +"the user's username and avatar will be shown. Otherwise, the text that the " +"user entered will be shown" +msgstr "" +"Wenn ein gültiger Benutzername/E-Mail eingegeben wurde und diese Option " +"aktiviert ist, werden der Benutzername und der Avatar des Benutzers " +"angezeigt. Andernfalls wird der Text angezeigt, den der Benutzer eingegeben " +"hat" + +#: authentik/stages/identification/models.py:65 msgid "Optional enrollment flow, which is linked at the bottom of the page." msgstr "Optionaler Anmeldevorgang, der unten auf der Seite verlinkt ist." -#: authentik/stages/identification/models.py:77 +#: authentik/stages/identification/models.py:74 msgid "Optional recovery flow, which is linked at the bottom of the page." msgstr "" "Optionaler Wiederherstellungsablauf, der unten auf der Seite verlinkt ist." -#: authentik/stages/identification/models.py:86 +#: authentik/stages/identification/models.py:83 msgid "Optional passwordless flow, which is linked at the bottom of the page." msgstr "" "Optionaler, passwortloser Flow, welcher unten auf der Seite verlinkt ist." -#: authentik/stages/identification/models.py:90 +#: authentik/stages/identification/models.py:87 msgid "Specify which sources should be shown." msgstr "Geben Sie an, welche Quellen angezeigt werden sollen." -#: authentik/stages/identification/models.py:112 +#: authentik/stages/identification/models.py:108 msgid "Identification Stage" msgstr "Identifizierungsstufe" -#: authentik/stages/identification/models.py:113 +#: authentik/stages/identification/models.py:109 msgid "Identification Stages" msgstr "Identifizierungsstufen" -#: authentik/stages/identification/stage.py:175 +#: authentik/stages/identification/stage.py:188 msgid "Log in" -msgstr "Log In" +msgstr "Anmelden" -#: authentik/stages/invitation/models.py:46 +#: authentik/stages/identification/stage.py:189 +msgid "Continue" +msgstr "Weiter" + +#: authentik/stages/invitation/models.py:21 +msgid "" +"If this flag is set, this Stage will jump to the next Stage when no " +"Invitation is given. By default this Stage will cancel the Flow when no " +"invitation is given." +msgstr "" +"Wenn dieses Flag gesetzt ist, springt diese Stufe zur nächsten Stufe, wenn " +"keine Einladung gegeben wird. Standardmäßig bricht diese Phase den Flow ab, " +"wenn keine Einladung gegeben wird." + +#: authentik/stages/invitation/models.py:44 msgid "Invitation Stage" msgstr "Einladungsstufe" -#: authentik/stages/invitation/models.py:47 +#: authentik/stages/invitation/models.py:45 msgid "Invitation Stages" msgstr "Einladungsstufen" -#: authentik/stages/invitation/models.py:57 +#: authentik/stages/invitation/models.py:60 +msgid "When set, only the configured flow can use this invitation." +msgstr "" +"Wenn ausgewählt, kann nur der konfigurierte Ablauf diese Einladung " +"verwenden." + +#: authentik/stages/invitation/models.py:64 msgid "When enabled, the invitation will be deleted after usage." msgstr "" "Wenn diese Option aktiviert ist, wird die Einladung nach ihrer Benutzung " "gelöscht." -#: authentik/stages/invitation/models.py:64 +#: authentik/stages/invitation/models.py:71 msgid "Optional fixed data to enforce on user enrollment." msgstr "" "Optionale feste Daten, die bei der Benutzerregistrierung erzwungen werden." -#: authentik/stages/invitation/models.py:72 +#: authentik/stages/invitation/models.py:84 msgid "Invitation" msgstr "Einladung" -#: authentik/stages/invitation/models.py:73 +#: authentik/stages/invitation/models.py:85 msgid "Invitations" msgstr "Einladungen" +#: authentik/stages/invitation/stage.py:62 +msgid "Invalid invite/invite not found" +msgstr "Ungültige Einladung/Einladung nicht gefunden" + #: authentik/stages/password/models.py:20 msgid "User database + standard password" msgstr "Benutzer Datenbank + Standardpasswort" @@ -1691,78 +2564,154 @@ msgstr "Benutzer Datenbank + LDAP Passwort" msgid "Selection of backends to test the password against." msgstr "Auswahl der Backends, mit denen das Kennwort getestet werden soll." -#: authentik/stages/password/models.py:78 +#: authentik/stages/password/models.py:43 +msgid "" +"How many attempts a user has before the flow is canceled. To lock the user " +"out, use a reputation policy and a user_write stage." +msgstr "" +"Anzahl der Versuche, die Benutzer haben, bevor der Ablauf abgebrochen wird. " +"Um Benutzer auszuschließen kann eine Reputations-Richtlinie und eine " +"user_write-Stufe genutzt werden." + +#: authentik/stages/password/models.py:75 msgid "Password Stage" msgstr "Passwortstufe" -#: authentik/stages/password/models.py:79 +#: authentik/stages/password/models.py:76 msgid "Password Stages" msgstr "Passwortstufen" -#: authentik/stages/password/stage.py:152 +#: authentik/stages/password/stage.py:124 msgid "Invalid password" msgstr "Ungültiges Passwort" -#: authentik/stages/prompt/models.py:29 +#: authentik/stages/prompt/models.py:43 msgid "Text: Simple Text input" msgstr "Text: Einfaches Texteingabefeld" -#: authentik/stages/prompt/models.py:32 +#: authentik/stages/prompt/models.py:45 +msgid "Text area: Multiline Text Input." +msgstr "Textbereich: Mehrzeilige Texteingabe." + +#: authentik/stages/prompt/models.py:48 msgid "Text (read-only): Simple Text input, but cannot be edited." msgstr "Text (read-only): Einfaches Texteingabefeld, nicht editierbar" -#: authentik/stages/prompt/models.py:39 +#: authentik/stages/prompt/models.py:52 +msgid "Text area (read-only): Multiline Text input, but cannot be edited." +msgstr "" +"Textbereich (schreibgeschützt): Mehrzeilige Texteingabe, kann aber nicht " +"bearbeitet werden." + +#: authentik/stages/prompt/models.py:58 +msgid "" +"Username: Same as Text input, but checks for and prevents duplicate " +"usernames." +msgstr "" +"Benutzername: Wie bei der Texteingabe, prüft jedoch auf doppelte " +"Benutzernamen und verhindert diese." + +#: authentik/stages/prompt/models.py:60 msgid "Email: Text field with Email type." msgstr "E-Mail: Textfeld mit E-Mail-Typ." -#: authentik/stages/prompt/models.py:55 +#: authentik/stages/prompt/models.py:64 +msgid "" +"Password: Masked input, multiple inputs of this type on the same prompt need" +" to be identical." +msgstr "" +"Passwort: Maskierte Eingabe, mehrere Eingaben dieses Typs in derselben " +"Eingabeaufforderung müssen identisch sein." + +#: authentik/stages/prompt/models.py:71 +msgid "Fixed choice field rendered as a group of radio buttons." +msgstr "Auswahlfeld, das als Gruppe von Optionsfeldern dargestellt wird." + +#: authentik/stages/prompt/models.py:73 +msgid "Fixed choice field rendered as a dropdown." +msgstr "Auswahlfeld, dargestellt als Dropdown-Menü." + +#: authentik/stages/prompt/models.py:80 +msgid "" +"File: File upload for arbitrary files. File content will be available in " +"flow context as data-URI" +msgstr "" +"Datei: Upload beliebiger Dateien. Der Dateiinhalt steht im Kontext des " +"Ablaufs als Daten-URI zur Verfügung." + +#: authentik/stages/prompt/models.py:85 msgid "Separator: Static Separator Line" msgstr "Trennzeichen: Statische Trennungslinie" -#: authentik/stages/prompt/models.py:56 +#: authentik/stages/prompt/models.py:86 msgid "Hidden: Hidden field, can be used to insert data into form." msgstr "" "Versteckt: Verstecktes Feld, kann zum Einfügen von Daten in das Formular " "verwendet werden." -#: authentik/stages/prompt/models.py:57 +#: authentik/stages/prompt/models.py:87 msgid "Static: Static value, displayed as-is." msgstr "Statisch: Statischer Wert, wird so angezeigt, wie er ist." -#: authentik/stages/prompt/models.py:66 +#: authentik/stages/prompt/models.py:89 +msgid "authentik: Selection of locales authentik supports" +msgstr "Authentik: Auswahl der von Authentik unterstützten Gebietsschemata" + +#: authentik/stages/prompt/models.py:116 msgid "Name of the form field, also used to store the value" msgstr "" "Name des Formularfeldes, das auch zum Speichern des Wertes verwendet wird" -#: authentik/stages/prompt/models.py:131 +#: authentik/stages/prompt/models.py:124 +msgid "" +"Optionally provide a short hint that describes the expected input value. " +"When creating a fixed choice field, enable interpreting as expression and " +"return a list to return multiple choices." +msgstr "" +"Geben Sie optional einen kurzen Hinweis, der den erwarteten Eingabewert " +"beschreibt. Aktivieren Sie bei der Erstellung eines Auswahlfeldes die " +"Interpretation als Ausdruck und geben Sie eine Liste zurück, um mehrere " +"Auswahlmöglichkeiten zu erhalten." + +#: authentik/stages/prompt/models.py:132 +msgid "" +"Optionally pre-fill the input with an initial value. When creating a fixed " +"choice field, enable interpreting as expression and return a list to return " +"multiple default choices." +msgstr "" +"Füllen Sie die Eingabe optional mit einem Anfangswert vor. Aktivieren Sie " +"bei der Erstellung eines Auswahlfeldes die Interpretation als Ausdruck und " +"geben Sie eine Liste zurück, um mehrere Auswahlmöglichkeiten zu erhalten." + +#: authentik/stages/prompt/models.py:321 msgid "Prompt" msgstr "Eingabeaufforderung" -#: authentik/stages/prompt/models.py:132 +#: authentik/stages/prompt/models.py:322 msgid "Prompts" msgstr "Eingabeaufforderungen" -#: authentik/stages/prompt/models.py:160 +#: authentik/stages/prompt/models.py:349 msgid "Prompt Stage" msgstr "Aufforderungsstufe" -#: authentik/stages/prompt/models.py:161 +#: authentik/stages/prompt/models.py:350 msgid "Prompt Stages" msgstr "Aufforderungsstufen" -#: authentik/stages/prompt/stage.py:94 +#: authentik/stages/prompt/stage.py:108 msgid "Passwords don't match." msgstr "Passwörter stimmen nicht überein" -#: authentik/stages/user_delete/models.py:32 +#: authentik/stages/user_delete/models.py:31 msgid "User Delete Stage" msgstr "Benutzer löschen Stufe" -#: authentik/stages/user_delete/models.py:33 +#: authentik/stages/user_delete/models.py:32 msgid "User Delete Stages" msgstr "Benutzer löschen Stufen" -#: authentik/stages/user_delete/stage.py:24 +#: authentik/stages/user_delete/stage.py:18 msgid "No Pending User." msgstr "Keine ausstehende Benutzer." @@ -1775,54 +2724,81 @@ msgstr "" "die Sitzung so lange dauert, bis der Browser geschlossen wird. (Format: " "hours=-1;minutes=-2;seconds=-3)" -#: authentik/stages/user_login/models.py:43 +#: authentik/stages/user_login/models.py:25 +msgid "Terminate all other sessions of the user logging in." +msgstr "Beenden Sie alle anderen Sitzungen des angemeldeten Benutzers." + +#: authentik/stages/user_login/models.py:31 +msgid "" +"Offset the session will be extended by when the user picks the remember me " +"option. Default of 0 means that the remember me option will not be shown. " +"(Format: hours=-1;minutes=-2;seconds=-3)" +msgstr "" +"Offset, um den die Sitzung verlängert wird, wenn der Benutzer die Option " +"\"Remember me\" auswählt. Der Standardwert 0 bedeutet, dass die " +"Erinnerungsoption nicht angezeigt wird. (Format: " +"Stunden=-1;Minuten=-2;Sekunden=-3)" + +#: authentik/stages/user_login/models.py:54 msgid "User Login Stage" msgstr "Benutzeranmeldestufe" -#: authentik/stages/user_login/models.py:44 +#: authentik/stages/user_login/models.py:55 msgid "User Login Stages" msgstr "Benutzeranmeldestufen" -#: authentik/stages/user_login/stage.py:29 +#: authentik/stages/user_login/stage.py:57 msgid "No Pending user to login." msgstr "Kein ausstehender Benutzer zur Anmeldung." -#: authentik/stages/user_login/stage.py:57 +#: authentik/stages/user_login/stage.py:90 msgid "Successfully logged in!" msgstr "Erfolgreich angemeldet!" -#: authentik/stages/user_logout/models.py:31 +#: authentik/stages/user_logout/models.py:30 msgid "User Logout Stage" msgstr "Benutzerabmeldestufe" -#: authentik/stages/user_logout/models.py:32 +#: authentik/stages/user_logout/models.py:31 msgid "User Logout Stages" msgstr "Benutzerabmeldestufen" -#: authentik/stages/user_write/models.py:18 +#: authentik/stages/user_write/models.py:31 msgid "When set, newly created users are inactive and cannot login." msgstr "" "Wenn diese Option aktiviert ist, sind neu angelegte Benutzer inaktiv und " "können sich nicht anmelden." -#: authentik/stages/user_write/models.py:26 +#: authentik/stages/user_write/models.py:39 msgid "Optionally add newly created users to this group." msgstr "" "Optional können Sie neu erstellte Benutzer zu dieser Gruppe hinzufügen." -#: authentik/stages/user_write/models.py:47 +#: authentik/stages/user_write/models.py:64 msgid "User Write Stage" msgstr "Benutzer-Schreibstufe" -#: authentik/stages/user_write/models.py:48 +#: authentik/stages/user_write/models.py:65 msgid "User Write Stages" msgstr "Benutzer-Schreibstufen" -#: authentik/stages/user_write/stage.py:53 +#: authentik/stages/user_write/stage.py:130 msgid "No Pending data." msgstr "Keine Daten ausstehend." -#: authentik/tenants/models.py:18 +#: authentik/stages/user_write/stage.py:136 +msgid "No user found and can't create new user." +msgstr "" +"Kein Benutzer vorhanden und neuer Benutzer kann nicht erstellt werden." + +#: authentik/stages/user_write/stage.py:153 +#: authentik/stages/user_write/stage.py:167 +msgid "Failed to update user. Please try again later." +msgstr "" +"Aktualisierung des Benuzters fehlgeschlagen. Bitte versuchen Sie es später " +"erneut." + +#: authentik/tenants/models.py:23 msgid "" "Domain that activates this tenant. Can be a superset, i.e. `a.b` for `aa.b` " "and `ba.b`" @@ -1830,10 +2806,22 @@ msgstr "" "Domäne, die diesen Mandanten aktiviert. Kann eine Obermenge sein, d. h. " "`a.b` für `aa.b` und `ba.b`." -#: authentik/tenants/models.py:70 +#: authentik/tenants/models.py:58 +msgid "" +"Events will be deleted after this duration.(Format: " +"weeks=3;days=2;hours=3,seconds=2)." +msgstr "" +"Die Ereignisse werden nach dieser Dauer gelöscht (Format: " +"Wochen=3;Tage=2;Stunden=3,Sekunden=2)." + +#: authentik/tenants/models.py:67 +msgid "Web Certificate used by the authentik Core webserver." +msgstr "Vom Authentik-Core-Webserver verwendetes Zertifikat." + +#: authentik/tenants/models.py:93 msgid "Tenant" msgstr "Mandant" -#: authentik/tenants/models.py:71 +#: authentik/tenants/models.py:94 msgid "Tenants" msgstr "Mandanten" From 6d1eef039ed21458ec1bcc19d09a3f69b3e4731d Mon Sep 17 00:00:00 2001 From: Jens L Date: Thu, 12 Oct 2023 13:52:32 +0200 Subject: [PATCH 06/10] ci: disable ghcr retention schedule while it's broken (#7154) Signed-off-by: Jens Langhammer --- .github/workflows/ghcr-retention.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ghcr-retention.yml b/.github/workflows/ghcr-retention.yml index 8dc32f5f7..f1543820f 100644 --- a/.github/workflows/ghcr-retention.yml +++ b/.github/workflows/ghcr-retention.yml @@ -1,8 +1,8 @@ name: ghcr-retention on: - schedule: - - cron: "0 0 * * *" # every day at midnight + # schedule: + # - cron: "0 0 * * *" # every day at midnight workflow_dispatch: jobs: From abab635a01e5886086a7fcda7fd9e8a27aa151ad Mon Sep 17 00:00:00 2001 From: Jens L Date: Thu, 12 Oct 2023 13:57:29 +0200 Subject: [PATCH 07/10] tests: fix potential infinite wait in tests spinning up a container (#7153) Signed-off-by: Jens Langhammer --- authentik/root/test_runner.py | 8 +++---- tests/e2e/test_provider_oidc.py | 9 ++------ tests/e2e/test_provider_oidc_implicit.py | 9 ++------ tests/e2e/test_provider_saml.py | 9 ++------ tests/e2e/utils.py | 28 +++++++++++++++++------- tests/integration/test_outpost_docker.py | 13 ++++------- tests/integration/test_proxy_docker.py | 13 ++++------- 7 files changed, 37 insertions(+), 52 deletions(-) diff --git a/authentik/root/test_runner.py b/authentik/root/test_runner.py index 02425f016..b2bf7a3d7 100644 --- a/authentik/root/test_runner.py +++ b/authentik/root/test_runner.py @@ -17,8 +17,8 @@ TestCase.maxDiff = None class PytestTestRunner(DiscoverRunner): # pragma: no cover """Runs pytest to discover and run tests.""" - def __init__(self, verbosity=1, failfast=False, keepdb=False, **kwargs): - super().__init__(verbosity, failfast, keepdb, **kwargs) + def __init__(self, **kwargs): + super().__init__(**kwargs) self.args = [] if self.failfast: @@ -47,6 +47,7 @@ class PytestTestRunner(DiscoverRunner): # pragma: no cover @classmethod def add_arguments(cls, parser: ArgumentParser): """Add more pytest-specific arguments""" + DiscoverRunner.add_arguments(parser) parser.add_argument( "--randomly-seed", type=int, @@ -55,9 +56,6 @@ class PytestTestRunner(DiscoverRunner): # pragma: no cover "Default behaviour: use random.Random().getrandbits(32), so the seed is" "different on each run.", ) - parser.add_argument( - "--keepdb", action="store_true", help="Preserves the test DB between runs." - ) def run_tests(self, test_labels, extra_tests=None, **kwargs): """Run pytest and return the exitcode. diff --git a/tests/e2e/test_provider_oidc.py b/tests/e2e/test_provider_oidc.py index e56817836..23cbd1412 100644 --- a/tests/e2e/test_provider_oidc.py +++ b/tests/e2e/test_provider_oidc.py @@ -49,13 +49,8 @@ class TestProviderOAuth2OIDC(SeleniumTestCase): "OIDC_PROVIDER": f"{self.live_server_url}/application/o/{self.application_slug}/", }, ) - while True: - container.reload() - status = container.attrs.get("State", {}).get("Health", {}).get("Status") - if status == "healthy": - return container - self.logger.info("Container failed healthcheck") - sleep(1) + self.wait_for_container(container) + return container @retry() @apply_blueprint( diff --git a/tests/e2e/test_provider_oidc_implicit.py b/tests/e2e/test_provider_oidc_implicit.py index 71e1c15f4..e952d4e18 100644 --- a/tests/e2e/test_provider_oidc_implicit.py +++ b/tests/e2e/test_provider_oidc_implicit.py @@ -49,13 +49,8 @@ class TestProviderOAuth2OIDCImplicit(SeleniumTestCase): "OIDC_PROVIDER": f"{self.live_server_url}/application/o/{self.application_slug}/", }, ) - while True: - container.reload() - status = container.attrs.get("State", {}).get("Health", {}).get("Status") - if status == "healthy": - return container - self.logger.info("Container failed healthcheck") - sleep(1) + self.wait_for_container(container) + return container @retry() @apply_blueprint( diff --git a/tests/e2e/test_provider_saml.py b/tests/e2e/test_provider_saml.py index ef7baf8cc..9252ab0c0 100644 --- a/tests/e2e/test_provider_saml.py +++ b/tests/e2e/test_provider_saml.py @@ -48,13 +48,8 @@ class TestProviderSAML(SeleniumTestCase): "SP_METADATA_URL": metadata_url, }, ) - while True: - container.reload() - status = container.attrs.get("State", {}).get("Health", {}).get("Status") - if status == "healthy": - return container - self.logger.info("Container failed healthcheck") - sleep(1) + self.wait_for_container(container) + return container @retry() @apply_blueprint( diff --git a/tests/e2e/utils.py b/tests/e2e/utils.py index 90314465f..7092ac4e9 100644 --- a/tests/e2e/utils.py +++ b/tests/e2e/utils.py @@ -43,7 +43,24 @@ def get_docker_tag() -> str: return f"gh-{branch_name}" -class SeleniumTestCase(StaticLiveServerTestCase): +class DockerTestCase: + """Mixin for dealing with containers""" + + def wait_for_container(self, container: Container): + """Check that container is health""" + attempt = 0 + while True: + container.reload() + status = container.attrs.get("State", {}).get("Health", {}).get("Status") + if status == "healthy": + return container + sleep(1) + attempt += 1 + if attempt >= 30: + self.failureException("Container failed to start") + + +class SeleniumTestCase(DockerTestCase, StaticLiveServerTestCase): """StaticLiveServerTestCase which automatically creates a Webdriver instance""" container: Optional[Container] = None @@ -82,13 +99,8 @@ class SeleniumTestCase(StaticLiveServerTestCase): state = container.attrs.get("State", {}) if "Health" not in state: return container - while True: - container.reload() - status = container.attrs.get("State", {}).get("Health", {}).get("Status") - if status == "healthy": - return container - self.logger.info("Container failed healthcheck") - sleep(1) + self.wait_for_container(container) + return container def output_container_logs(self, container: Optional[Container] = None): """Output the container logs to our STDOUT""" diff --git a/tests/integration/test_outpost_docker.py b/tests/integration/test_outpost_docker.py index 98e4ec48a..4e12cbbca 100644 --- a/tests/integration/test_outpost_docker.py +++ b/tests/integration/test_outpost_docker.py @@ -1,7 +1,6 @@ """outpost tests""" from shutil import rmtree from tempfile import mkdtemp -from time import sleep import yaml from channels.testing import ChannelsLiveServerTestCase @@ -20,10 +19,10 @@ from authentik.outposts.models import ( ) from authentik.outposts.tasks import outpost_connection_discovery from authentik.providers.proxy.models import ProxyProvider -from tests.e2e.utils import get_docker_tag +from tests.e2e.utils import DockerTestCase, get_docker_tag -class OutpostDockerTests(ChannelsLiveServerTestCase): +class OutpostDockerTests(DockerTestCase, ChannelsLiveServerTestCase): """Test Docker Controllers""" def _start_container(self, ssl_folder: str) -> Container: @@ -45,12 +44,8 @@ class OutpostDockerTests(ChannelsLiveServerTestCase): } }, ) - while True: - container.reload() - status = container.attrs.get("State", {}).get("Health", {}).get("Status") - if status == "healthy": - return container - sleep(1) + self.wait_for_container(container) + return container def setUp(self): super().setUp() diff --git a/tests/integration/test_proxy_docker.py b/tests/integration/test_proxy_docker.py index 147088ee6..8cbeb0bdd 100644 --- a/tests/integration/test_proxy_docker.py +++ b/tests/integration/test_proxy_docker.py @@ -1,7 +1,6 @@ """outpost tests""" from shutil import rmtree from tempfile import mkdtemp -from time import sleep import yaml from channels.testing.live import ChannelsLiveServerTestCase @@ -20,10 +19,10 @@ from authentik.outposts.models import ( from authentik.outposts.tasks import outpost_connection_discovery from authentik.providers.proxy.controllers.docker import DockerController from authentik.providers.proxy.models import ProxyProvider -from tests.e2e.utils import get_docker_tag +from tests.e2e.utils import DockerTestCase, get_docker_tag -class TestProxyDocker(ChannelsLiveServerTestCase): +class TestProxyDocker(DockerTestCase, ChannelsLiveServerTestCase): """Test Docker Controllers""" def _start_container(self, ssl_folder: str) -> Container: @@ -45,12 +44,8 @@ class TestProxyDocker(ChannelsLiveServerTestCase): } }, ) - while True: - container.reload() - status = container.attrs.get("State", {}).get("Health", {}).get("Status") - if status == "healthy": - return container - sleep(1) + self.wait_for_container(container) + return container def setUp(self): super().setUp() From d1f2e7c0cdca9d3442267f7896bb3a25ebfc5b23 Mon Sep 17 00:00:00 2001 From: Jens L Date: Thu, 12 Oct 2023 14:00:45 +0200 Subject: [PATCH 08/10] web/admin: add additional Flow info (#7155) Signed-off-by: Jens Langhammer --- web/src/admin/flows/FlowViewPage.ts | 35 +++++++++++++++++++-- web/xliff/de.xlf | 3 ++ web/xliff/en.xlf | 3 ++ web/xliff/es.xlf | 3 ++ web/xliff/fr.xlf | 3 ++ web/xliff/pl.xlf | 3 ++ web/xliff/pseudo-LOCALE.xlf | 3 ++ web/xliff/tr.xlf | 3 ++ web/xliff/zh-Hans.xlf | 49 +++++++++++++++-------------- web/xliff/zh-Hant.xlf | 3 ++ web/xliff/zh_TW.xlf | 3 ++ 11 files changed, 86 insertions(+), 25 deletions(-) diff --git a/web/src/admin/flows/FlowViewPage.ts b/web/src/admin/flows/FlowViewPage.ts index ee88ff2e3..edd752c7f 100644 --- a/web/src/admin/flows/FlowViewPage.ts +++ b/web/src/admin/flows/FlowViewPage.ts @@ -2,6 +2,7 @@ import "@goauthentik/admin/flows/BoundStagesList"; import "@goauthentik/admin/flows/FlowDiagram"; import "@goauthentik/admin/flows/FlowForm"; import "@goauthentik/admin/policies/BoundPoliciesList"; +import { DesignationToLabel } from "@goauthentik/app/admin/flows/utils"; import { AndNext, DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import "@goauthentik/components/events/ObjectChangelog"; import { AKElement } from "@goauthentik/elements/Base"; @@ -70,13 +71,43 @@ export class FlowViewPage extends AKElement {
-
${msg("Related actions")}
+
${msg("Flow Info")}
${msg("Edit")}${msg("Name")} +
+
+
+ ${this.flow.name} +
+
+
+ ${msg("Slug")} +
+
+
+ ${this.flow.slug} +
+
+
+ ${msg("Designation")} +
+
+
+ ${DesignationToLabel(this.flow.designation)} +
+
+
+ ${msg("Related actions")}
diff --git a/web/xliff/de.xlf b/web/xliff/de.xlf index 87200a67c..d831532c1 100644 --- a/web/xliff/de.xlf +++ b/web/xliff/de.xlf @@ -5930,6 +5930,9 @@ Bindings to groups/users are checked against the user of the event. When using IDP-initiated logins, the relay state will be set to this value. + + + Flow Info diff --git a/web/xliff/en.xlf b/web/xliff/en.xlf index 66b8f5427..dc4a9f124 100644 --- a/web/xliff/en.xlf +++ b/web/xliff/en.xlf @@ -6244,6 +6244,9 @@ Bindings to groups/users are checked against the user of the event. When using IDP-initiated logins, the relay state will be set to this value. + + + Flow Info diff --git a/web/xliff/es.xlf b/web/xliff/es.xlf index f0995aeb7..e24886318 100644 --- a/web/xliff/es.xlf +++ b/web/xliff/es.xlf @@ -5838,6 +5838,9 @@ Bindings to groups/users are checked against the user of the event. When using IDP-initiated logins, the relay state will be set to this value. + + + Flow Info diff --git a/web/xliff/fr.xlf b/web/xliff/fr.xlf index 332d2ca4d..8c3e4f6f5 100644 --- a/web/xliff/fr.xlf +++ b/web/xliff/fr.xlf @@ -7820,6 +7820,9 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti When using IDP-initiated logins, the relay state will be set to this value. + + + Flow Info diff --git a/web/xliff/pl.xlf b/web/xliff/pl.xlf index b1456ad59..609b27630 100644 --- a/web/xliff/pl.xlf +++ b/web/xliff/pl.xlf @@ -6077,6 +6077,9 @@ Bindings to groups/users are checked against the user of the event. When using IDP-initiated logins, the relay state will be set to this value. + + + Flow Info diff --git a/web/xliff/pseudo-LOCALE.xlf b/web/xliff/pseudo-LOCALE.xlf index a14093264..22d95eebf 100644 --- a/web/xliff/pseudo-LOCALE.xlf +++ b/web/xliff/pseudo-LOCALE.xlf @@ -6179,6 +6179,9 @@ Bindings to groups/users are checked against the user of the event. When using IDP-initiated logins, the relay state will be set to this value. + + + Flow Info diff --git a/web/xliff/tr.xlf b/web/xliff/tr.xlf index f304d5ae3..3d205ba57 100644 --- a/web/xliff/tr.xlf +++ b/web/xliff/tr.xlf @@ -5831,6 +5831,9 @@ Bindings to groups/users are checked against the user of the event. When using IDP-initiated logins, the relay state will be set to this value. + + + Flow Info diff --git a/web/xliff/zh-Hans.xlf b/web/xliff/zh-Hans.xlf index 6fdf19dd8..005605c39 100644 --- a/web/xliff/zh-Hans.xlf +++ b/web/xliff/zh-Hans.xlf @@ -1,4 +1,4 @@ - + @@ -613,9 +613,9 @@ - The URL "" was not found. - 未找到 URL " - "。 + The URL "" was not found. + 未找到 URL " + "。 @@ -1067,8 +1067,8 @@ - To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. - 要允许任何重定向 URI,请将此值设置为 ".*"。请注意这可能带来的安全影响。 + To allow any redirect URI, set this value to ".*". Be aware of the possible security implications this can have. + 要允许任何重定向 URI,请将此值设置为 ".*"。请注意这可能带来的安全影响。 @@ -1809,8 +1809,8 @@ - Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". - 输入完整 URL、相对路径,或者使用 'fa://fa-test' 来使用 Font Awesome 图标 "fa-test"。 + Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test". + 输入完整 URL、相对路径,或者使用 'fa://fa-test' 来使用 Font Awesome 图标 "fa-test"。 @@ -3233,8 +3233,8 @@ doesn't pass when either or both of the selected options are equal or above the - Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' - 包含组成员的字段。请注意,如果使用 "memberUid" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...' + Field which contains members of a group. Note that if using the "memberUid" field, the value is assumed to contain a relative distinguished name. e.g. 'memberUid=some-user' instead of 'memberUid=cn=some-user,ou=groups,...' + 包含组成员的字段。请注意,如果使用 "memberUid" 字段,则假定该值包含相对可分辨名称。例如,'memberUid=some-user' 而不是 'memberUid=cn=some-user,ou=groups,...' @@ -4026,8 +4026,8 @@ doesn't pass when either or both of the selected options are equal or above the - When using an external logging solution for archiving, this can be set to "minutes=5". - 使用外部日志记录解决方案进行存档时,可以将其设置为 "minutes=5"。 + When using an external logging solution for archiving, this can be set to "minutes=5". + 使用外部日志记录解决方案进行存档时,可以将其设置为 "minutes=5"。 @@ -4036,8 +4036,8 @@ doesn't pass when either or both of the selected options are equal or above the - Format: "weeks=3;days=2;hours=3,seconds=2". - 格式:"weeks=3;days=2;hours=3,seconds=2"。 + Format: "weeks=3;days=2;hours=3,seconds=2". + 格式:"weeks=3;days=2;hours=3,seconds=2"。 @@ -4233,10 +4233,10 @@ doesn't pass when either or both of the selected options are equal or above the - Are you sure you want to update ""? + Are you sure you want to update ""? 您确定要更新 - " - " 吗? + " + " 吗? @@ -5337,7 +5337,7 @@ doesn't pass when either or both of the selected options are equal or above the - A "roaming" authenticator, like a YubiKey + A "roaming" authenticator, like a YubiKey 像 YubiKey 这样的“漫游”身份验证器 @@ -5672,10 +5672,10 @@ doesn't pass when either or both of the selected options are equal or above the - ("", of type ) + ("", of type ) - (" - ",类型为 + (" + ",类型为 @@ -5724,7 +5724,7 @@ doesn't pass when either or both of the selected options are equal or above the - If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. + If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here. 如果设置时长大于 0,用户可以选择“保持登录”选项,这将使用户的会话延长此处设置的时间。 @@ -7825,7 +7825,10 @@ Bindings to groups/users are checked against the user of the event. When using IDP-initiated logins, the relay state will be set to this value. 当使用 IDP 发起的登录时,中继状态会被设置为此值。 + + + Flow Info - \ No newline at end of file + diff --git a/web/xliff/zh-Hant.xlf b/web/xliff/zh-Hant.xlf index 3389edfd1..45a082416 100644 --- a/web/xliff/zh-Hant.xlf +++ b/web/xliff/zh-Hant.xlf @@ -5883,6 +5883,9 @@ Bindings to groups/users are checked against the user of the event. When using IDP-initiated logins, the relay state will be set to this value. + + + Flow Info diff --git a/web/xliff/zh_TW.xlf b/web/xliff/zh_TW.xlf index 8392c2a81..ee0b59c1a 100644 --- a/web/xliff/zh_TW.xlf +++ b/web/xliff/zh_TW.xlf @@ -5882,6 +5882,9 @@ Bindings to groups/users are checked against the user of the event. When using IDP-initiated logins, the relay state will be set to this value. + + + Flow Info From b503379319c2c0ed68dd9280ae55488e96467dc7 Mon Sep 17 00:00:00 2001 From: Jens L Date: Thu, 12 Oct 2023 15:12:46 +0200 Subject: [PATCH 09/10] web: fix form default submit handler (#7122) * web/elements: rename renderInlineForm to renderForm set submit handler to empty function Signed-off-by: Jens Langhammer * fix all kinds of forms not using the form inheritance correctly Signed-off-by: Jens Langhammer --------- Signed-off-by: Jens Langhammer --- .../ApplicationCheckAccessForm.ts | 2 +- web/src/admin/applications/ApplicationForm.ts | 6 ++--- web/src/admin/blueprints/BlueprintForm.ts | 6 ++--- .../admin/crypto/CertificateGenerateForm.ts | 2 +- .../admin/crypto/CertificateKeyPairForm.ts | 6 ++--- .../admin/enterprise/EnterpriseLicenseForm.ts | 5 ++-- web/src/admin/events/RuleForm.ts | 6 ++--- web/src/admin/events/TransportForm.ts | 6 ++--- web/src/admin/flows/FlowForm.ts | 6 ++--- web/src/admin/flows/FlowImportForm.ts | 2 +- web/src/admin/flows/StageBindingForm.ts | 6 ++--- web/src/admin/groups/GroupForm.ts | 6 ++--- web/src/admin/groups/RelatedGroupList.ts | 2 +- web/src/admin/outposts/OutpostForm.ts | 6 ++--- .../outposts/ServiceConnectionDockerForm.ts | 6 ++--- .../ServiceConnectionKubernetesForm.ts | 6 ++--- web/src/admin/policies/PolicyBindingForm.ts | 6 ++--- web/src/admin/policies/PolicyTestForm.ts | 2 +- .../admin/policies/dummy/DummyPolicyForm.ts | 6 ++--- .../event_matcher/EventMatcherPolicyForm.ts | 6 ++--- .../admin/policies/expiry/ExpiryPolicyForm.ts | 6 ++--- .../expression/ExpressionPolicyForm.ts | 6 ++--- .../policies/password/PasswordPolicyForm.ts | 6 ++--- .../reputation/ReputationPolicyForm.ts | 6 ++--- .../PropertyMappingLDAPForm.ts | 6 ++--- .../PropertyMappingNotification.ts | 6 ++--- .../PropertyMappingSAMLForm.ts | 6 ++--- .../PropertyMappingSCIMForm.ts | 6 ++--- .../PropertyMappingScopeForm.ts | 6 ++--- .../PropertyMappingTestForm.ts | 2 +- .../admin/providers/ldap/LDAPProviderForm.ts | 6 ++--- .../providers/oauth2/OAuth2ProviderForm.ts | 6 ++--- .../providers/proxy/ProxyProviderForm.ts | 6 ++--- .../providers/radius/RadiusProviderForm.ts | 6 ++--- .../admin/providers/saml/SAMLProviderForm.ts | 6 ++--- .../providers/saml/SAMLProviderImportForm.ts | 2 +- .../admin/providers/scim/SCIMProviderForm.ts | 6 ++--- web/src/admin/sources/ldap/LDAPSourceForm.ts | 6 ++--- .../admin/sources/oauth/OAuthSourceForm.ts | 6 ++--- web/src/admin/sources/plex/PlexSourceForm.ts | 6 ++--- web/src/admin/sources/saml/SAMLSourceForm.ts | 6 ++--- .../AuthenticatorDuoStageForm.ts | 6 ++--- .../authenticator_duo/DuoDeviceImportForm.ts | 8 +++--- .../AuthenticatorSMSStageForm.ts | 8 +++--- .../AuthenticatorStaticStageForm.ts | 6 ++--- .../AuthenticatorTOTPStageForm.ts | 6 ++--- .../AuthenticatorValidateStageForm.ts | 6 ++--- .../AuthenticateWebAuthnStageForm.ts | 8 +++--- .../admin/stages/captcha/CaptchaStageForm.ts | 6 ++--- .../admin/stages/consent/ConsentStageForm.ts | 6 ++--- web/src/admin/stages/deny/DenyStageForm.ts | 6 ++--- web/src/admin/stages/dummy/DummyStageForm.ts | 6 ++--- web/src/admin/stages/email/EmailStageForm.ts | 6 ++--- .../identification/IdentificationStageForm.ts | 6 ++--- .../admin/stages/invitation/InvitationForm.ts | 6 ++--- .../stages/invitation/InvitationStageForm.ts | 6 ++--- .../stages/password/PasswordStageForm.ts | 8 +++--- web/src/admin/stages/prompt/PromptForm.ts | 6 ++--- .../admin/stages/prompt/PromptStageForm.ts | 6 ++--- .../stages/user_delete/UserDeleteStageForm.ts | 6 ++--- .../stages/user_login/UserLoginStageForm.ts | 6 ++--- .../stages/user_logout/UserLogoutStageForm.ts | 6 ++--- .../stages/user_write/UserWriteStageForm.ts | 6 ++--- web/src/admin/tenants/TenantForm.ts | 10 +++++--- web/src/admin/tokens/TokenForm.ts | 6 ++--- web/src/admin/users/RelatedUserList.ts | 2 +- web/src/admin/users/ServiceAccountForm.ts | 6 ++--- web/src/admin/users/UserForm.ts | 10 +++++--- web/src/admin/users/UserPasswordForm.ts | 2 +- web/src/admin/users/UserResetEmailForm.ts | 2 +- web/src/elements/forms/Form.ts | 25 ++++++++++--------- .../user/user-settings/mfa/MFADeviceForm.ts | 18 ++++++------- .../user-settings/tokens/UserTokenForm.ts | 6 ++--- web/xliff/de.xlf | 7 +++--- web/xliff/en.xlf | 7 +++--- web/xliff/es.xlf | 7 +++--- web/xliff/fr.xlf | 8 +++--- web/xliff/pl.xlf | 7 +++--- web/xliff/pseudo-LOCALE.xlf | 7 +++--- web/xliff/tr.xlf | 7 +++--- web/xliff/zh-Hans.xlf | 8 +++--- web/xliff/zh-Hant.xlf | 7 +++--- web/xliff/zh_TW.xlf | 7 +++--- 83 files changed, 199 insertions(+), 317 deletions(-) diff --git a/web/src/admin/applications/ApplicationCheckAccessForm.ts b/web/src/admin/applications/ApplicationCheckAccessForm.ts index 90beb3786..59292e17d 100644 --- a/web/src/admin/applications/ApplicationCheckAccessForm.ts +++ b/web/src/admin/applications/ApplicationCheckAccessForm.ts @@ -114,7 +114,7 @@ export class ApplicationCheckAccessForm extends Form<{ forUser: number }> { `; } - renderInlineForm(): TemplateResult { + renderForm(): TemplateResult { return html` { } renderForm(): TemplateResult { - return html`
- + return html`
- - `; + `; } } diff --git a/web/src/admin/blueprints/BlueprintForm.ts b/web/src/admin/blueprints/BlueprintForm.ts index d8d34dd82..f47b967cf 100644 --- a/web/src/admin/blueprints/BlueprintForm.ts +++ b/web/src/admin/blueprints/BlueprintForm.ts @@ -68,8 +68,7 @@ export class BlueprintForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

- - `; + `; } } diff --git a/web/src/admin/crypto/CertificateGenerateForm.ts b/web/src/admin/crypto/CertificateGenerateForm.ts index 000c18462..85f2fde9e 100644 --- a/web/src/admin/crypto/CertificateGenerateForm.ts +++ b/web/src/admin/crypto/CertificateGenerateForm.ts @@ -20,7 +20,7 @@ export class CertificateKeyPairForm extends Form { }); } - renderInlineForm(): TemplateResult { + renderForm(): TemplateResult { return html` - + return html` - - `; + `; } } diff --git a/web/src/admin/enterprise/EnterpriseLicenseForm.ts b/web/src/admin/enterprise/EnterpriseLicenseForm.ts index c54c59423..ebce9938d 100644 --- a/web/src/admin/enterprise/EnterpriseLicenseForm.ts +++ b/web/src/admin/enterprise/EnterpriseLicenseForm.ts @@ -46,13 +46,12 @@ export class EnterpriseLicenseForm extends ModelForm { renderForm(): TemplateResult { // prettier-ignore - return html`
+ return html` - -
`; +
`; } } diff --git a/web/src/admin/events/RuleForm.ts b/web/src/admin/events/RuleForm.ts index b0d0c017c..43e54ab89 100644 --- a/web/src/admin/events/RuleForm.ts +++ b/web/src/admin/events/RuleForm.ts @@ -58,8 +58,7 @@ export class RuleForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` { .value=${this.instance?.severity} > - - `; +
`; } } diff --git a/web/src/admin/events/TransportForm.ts b/web/src/admin/events/TransportForm.ts index 5042be939..46fce43cb 100644 --- a/web/src/admin/events/TransportForm.ts +++ b/web/src/admin/events/TransportForm.ts @@ -68,8 +68,7 @@ export class TransportForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` { "Only send notification once, for example when sending a webhook into a chat channel.", )}

-
- `; +
`; } } diff --git a/web/src/admin/flows/FlowForm.ts b/web/src/admin/flows/FlowForm.ts index 2bc32bde5..a78c0f4fa 100644 --- a/web/src/admin/flows/FlowForm.ts +++ b/web/src/admin/flows/FlowForm.ts @@ -78,8 +78,7 @@ export class FlowForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

`}
- - `; + `; } } diff --git a/web/src/admin/flows/FlowImportForm.ts b/web/src/admin/flows/FlowImportForm.ts index 3db49d056..d04f0c8e9 100644 --- a/web/src/admin/flows/FlowImportForm.ts +++ b/web/src/admin/flows/FlowImportForm.ts @@ -86,7 +86,7 @@ export class FlowImportForm extends Form { `; } - renderInlineForm(): TemplateResult { + renderForm(): TemplateResult { return html`

diff --git a/web/src/admin/flows/StageBindingForm.ts b/web/src/admin/flows/StageBindingForm.ts index 8c5492be2..839f2c26c 100644 --- a/web/src/admin/flows/StageBindingForm.ts +++ b/web/src/admin/flows/StageBindingForm.ts @@ -92,8 +92,7 @@ export class StageBindingForm extends ModelForm { } renderForm(): TemplateResult { - return html`

- ${this.renderTarget()} + return html` ${this.renderTarget()} => { @@ -224,7 +223,6 @@ export class StageBindingForm extends ModelForm { .value=${this.instance?.policyEngineMode} > - -
`; +
`; } } diff --git a/web/src/admin/groups/GroupForm.ts b/web/src/admin/groups/GroupForm.ts index d849d67f8..6525d1aa8 100644 --- a/web/src/admin/groups/GroupForm.ts +++ b/web/src/admin/groups/GroupForm.ts @@ -58,8 +58,7 @@ export class GroupForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

${msg("Set custom attributes using YAML or JSON.")}

-
- `; +
`; } } diff --git a/web/src/admin/groups/RelatedGroupList.ts b/web/src/admin/groups/RelatedGroupList.ts index 8a94f4cf0..d0b965648 100644 --- a/web/src/admin/groups/RelatedGroupList.ts +++ b/web/src/admin/groups/RelatedGroupList.ts @@ -46,7 +46,7 @@ export class RelatedGroupAdd extends Form<{ groups: string[] }> { return data; } - renderInlineForm(): TemplateResult { + renderForm(): TemplateResult { return html`
{ } renderForm(): TemplateResult { - return html`
- + return html` { >${msg("Documentation")}

-
- `; +
`; } } diff --git a/web/src/admin/outposts/ServiceConnectionDockerForm.ts b/web/src/admin/outposts/ServiceConnectionDockerForm.ts index c6840d50d..7fd8731ad 100644 --- a/web/src/admin/outposts/ServiceConnectionDockerForm.ts +++ b/web/src/admin/outposts/ServiceConnectionDockerForm.ts @@ -42,8 +42,7 @@ export class ServiceConnectionDockerForm extends ModelForm - + return html` ${msg("When connecting via SSH, this keypair is used for authentication.")}

-
- `; +
`; } } diff --git a/web/src/admin/outposts/ServiceConnectionKubernetesForm.ts b/web/src/admin/outposts/ServiceConnectionKubernetesForm.ts index afa0c1be3..4b4f88f00 100644 --- a/web/src/admin/outposts/ServiceConnectionKubernetesForm.ts +++ b/web/src/admin/outposts/ServiceConnectionKubernetesForm.ts @@ -45,8 +45,7 @@ export class ServiceConnectionKubernetesForm extends ModelForm< } renderForm(): TemplateResult { - return html`
- + return html` ${msg("Verify Kubernetes API SSL Certificate")} - - `; +
`; } } diff --git a/web/src/admin/policies/PolicyBindingForm.ts b/web/src/admin/policies/PolicyBindingForm.ts index 7c830a56b..c98d0082b 100644 --- a/web/src/admin/policies/PolicyBindingForm.ts +++ b/web/src/admin/policies/PolicyBindingForm.ts @@ -133,8 +133,7 @@ export class PolicyBindingForm extends ModelForm { } renderForm(): TemplateResult { - return html`
-
+ return html`
${this.renderModeSelector()}
- - `; + `; } } diff --git a/web/src/admin/policies/event_matcher/EventMatcherPolicyForm.ts b/web/src/admin/policies/event_matcher/EventMatcherPolicyForm.ts index 3160189ea..a8198d8f6 100644 --- a/web/src/admin/policies/event_matcher/EventMatcherPolicyForm.ts +++ b/web/src/admin/policies/event_matcher/EventMatcherPolicyForm.ts @@ -53,8 +53,7 @@ export class EventMatcherPolicyForm extends ModelForm - + return html` ${msg( "Matches an event against a set of criteria. If any of the configured values match, the policy passes.", )} @@ -187,7 +186,6 @@ export class EventMatcherPolicyForm extends ModelForm
- - `; + `; } } diff --git a/web/src/admin/policies/expiry/ExpiryPolicyForm.ts b/web/src/admin/policies/expiry/ExpiryPolicyForm.ts index 7fede7aa8..0ec7caae3 100644 --- a/web/src/admin/policies/expiry/ExpiryPolicyForm.ts +++ b/web/src/admin/policies/expiry/ExpiryPolicyForm.ts @@ -41,8 +41,7 @@ export class PasswordExpiryPolicyForm extends ModelForm - + return html` ${msg( "Checks if the request's user's password has been changed in the last x days, and denys based on settings.", )} @@ -110,7 +109,6 @@ export class PasswordExpiryPolicyForm extends ModelForm
- - `; + `; } } diff --git a/web/src/admin/policies/expression/ExpressionPolicyForm.ts b/web/src/admin/policies/expression/ExpressionPolicyForm.ts index 13687eac9..707dc9f1c 100644 --- a/web/src/admin/policies/expression/ExpressionPolicyForm.ts +++ b/web/src/admin/policies/expression/ExpressionPolicyForm.ts @@ -43,8 +43,7 @@ export class ExpressionPolicyForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( "Executes the python snippet to determine whether to allow or deny a request.", )} @@ -101,7 +100,6 @@ export class ExpressionPolicyForm extends ModelForm {

- - `; + `; } } diff --git a/web/src/admin/policies/password/PasswordPolicyForm.ts b/web/src/admin/policies/password/PasswordPolicyForm.ts index cb936a678..126d7386b 100644 --- a/web/src/admin/policies/password/PasswordPolicyForm.ts +++ b/web/src/admin/policies/password/PasswordPolicyForm.ts @@ -229,8 +229,7 @@ export class PasswordPolicyForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( "Checks the value from the policy request against several rules, mostly used to ensure password strength.", )} @@ -348,7 +347,6 @@ export class PasswordPolicyForm extends ModelForm { ${this.showStatic ? this.renderStaticRules() : html``} ${this.showHIBP ? this.renderHIBP() : html``} - ${this.showZxcvbn ? this.renderZxcvbn() : html``} - `; + ${this.showZxcvbn ? this.renderZxcvbn() : html``}`; } } diff --git a/web/src/admin/policies/reputation/ReputationPolicyForm.ts b/web/src/admin/policies/reputation/ReputationPolicyForm.ts index 33903caab..a32d6febf 100644 --- a/web/src/admin/policies/reputation/ReputationPolicyForm.ts +++ b/web/src/admin/policies/reputation/ReputationPolicyForm.ts @@ -41,8 +41,7 @@ export class ReputationPolicyForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg("Allows/denys requests based on the users and/or the IPs reputation.")} @@ -131,7 +130,6 @@ doesn't pass when either or both of the selected options are equal or above the /> - - `; + `; } } diff --git a/web/src/admin/property-mappings/PropertyMappingLDAPForm.ts b/web/src/admin/property-mappings/PropertyMappingLDAPForm.ts index 359e76799..5629f07d2 100644 --- a/web/src/admin/property-mappings/PropertyMappingLDAPForm.ts +++ b/web/src/admin/property-mappings/PropertyMappingLDAPForm.ts @@ -41,8 +41,7 @@ export class PropertyMappingLDAPForm extends ModelForm - + return html`

-
- `; +
`; } } diff --git a/web/src/admin/property-mappings/PropertyMappingNotification.ts b/web/src/admin/property-mappings/PropertyMappingNotification.ts index 36c9344f5..6b9692c4f 100644 --- a/web/src/admin/property-mappings/PropertyMappingNotification.ts +++ b/web/src/admin/property-mappings/PropertyMappingNotification.ts @@ -41,8 +41,7 @@ export class PropertyMappingNotification extends ModelForm - + return html`

-
- `; +
`; } } diff --git a/web/src/admin/property-mappings/PropertyMappingSAMLForm.ts b/web/src/admin/property-mappings/PropertyMappingSAMLForm.ts index 54f7c07d8..b61bc168c 100644 --- a/web/src/admin/property-mappings/PropertyMappingSAMLForm.ts +++ b/web/src/admin/property-mappings/PropertyMappingSAMLForm.ts @@ -41,8 +41,7 @@ export class PropertyMappingSAMLForm extends ModelForm - + return html`

-
- `; +
`; } } diff --git a/web/src/admin/property-mappings/PropertyMappingSCIMForm.ts b/web/src/admin/property-mappings/PropertyMappingSCIMForm.ts index 36c5df7a5..24d567d11 100644 --- a/web/src/admin/property-mappings/PropertyMappingSCIMForm.ts +++ b/web/src/admin/property-mappings/PropertyMappingSCIMForm.ts @@ -41,8 +41,7 @@ export class PropertyMappingSCIMForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` { ${msg("See documentation for a list of all variables.")}

-
- `; +
`; } } diff --git a/web/src/admin/property-mappings/PropertyMappingScopeForm.ts b/web/src/admin/property-mappings/PropertyMappingScopeForm.ts index 945f0b01e..9dc01c174 100644 --- a/web/src/admin/property-mappings/PropertyMappingScopeForm.ts +++ b/web/src/admin/property-mappings/PropertyMappingScopeForm.ts @@ -41,8 +41,7 @@ export class PropertyMappingScopeForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` { ${msg("See documentation for a list of all variables.")}

-
- `; +
`; } } diff --git a/web/src/admin/property-mappings/PropertyMappingTestForm.ts b/web/src/admin/property-mappings/PropertyMappingTestForm.ts index 10617238f..00a288d15 100644 --- a/web/src/admin/property-mappings/PropertyMappingTestForm.ts +++ b/web/src/admin/property-mappings/PropertyMappingTestForm.ts @@ -118,7 +118,7 @@ export class PolicyTestForm extends Form { `; } - renderInlineForm(): TemplateResult { + renderForm(): TemplateResult { return html` => { diff --git a/web/src/admin/providers/ldap/LDAPProviderForm.ts b/web/src/admin/providers/ldap/LDAPProviderForm.ts index 8e125312c..f7853e7e1 100644 --- a/web/src/admin/providers/ldap/LDAPProviderForm.ts +++ b/web/src/admin/providers/ldap/LDAPProviderForm.ts @@ -60,8 +60,7 @@ export class LDAPProviderFormPage extends ModelForm { // weird-- we're looking up Authentication flows, but we're storing them in the Authorization // field of the target Provider. renderForm(): TemplateResult { - return html`
- + return html` {

- - `; + `; } } diff --git a/web/src/admin/providers/oauth2/OAuth2ProviderForm.ts b/web/src/admin/providers/oauth2/OAuth2ProviderForm.ts index e20c63d9a..95bb9fdae 100644 --- a/web/src/admin/providers/oauth2/OAuth2ProviderForm.ts +++ b/web/src/admin/providers/oauth2/OAuth2ProviderForm.ts @@ -167,8 +167,7 @@ export class OAuth2ProviderFormPage extends ModelForm { renderForm(): TemplateResult { const provider = this.instance; - return html`
- {

- - `; + `; } } diff --git a/web/src/admin/providers/proxy/ProxyProviderForm.ts b/web/src/admin/providers/proxy/ProxyProviderForm.ts index f5d931408..9886c9be3 100644 --- a/web/src/admin/providers/proxy/ProxyProviderForm.ts +++ b/web/src/admin/providers/proxy/ProxyProviderForm.ts @@ -266,8 +266,7 @@ export class ProxyProviderFormPage extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` - - `; + `; } } diff --git a/web/src/admin/providers/radius/RadiusProviderForm.ts b/web/src/admin/providers/radius/RadiusProviderForm.ts index 9b1dc5452..e38307074 100644 --- a/web/src/admin/providers/radius/RadiusProviderForm.ts +++ b/web/src/admin/providers/radius/RadiusProviderForm.ts @@ -49,8 +49,7 @@ export class RadiusProviderFormPage extends ModelForm { // weird-- we're looking up Authentication flows, but we're storing them in the Authorization // field of the target Provider. renderForm(): TemplateResult { - return html`
- + return html` {

- - `; + `; } } diff --git a/web/src/admin/providers/saml/SAMLProviderForm.ts b/web/src/admin/providers/saml/SAMLProviderForm.ts index 012abdcae..c48993e84 100644 --- a/web/src/admin/providers/saml/SAMLProviderForm.ts +++ b/web/src/admin/providers/saml/SAMLProviderForm.ts @@ -66,8 +66,7 @@ export class SAMLProviderFormPage extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` { - - `; + `; } } diff --git a/web/src/admin/providers/saml/SAMLProviderImportForm.ts b/web/src/admin/providers/saml/SAMLProviderImportForm.ts index b9eb8efce..b63c1512b 100644 --- a/web/src/admin/providers/saml/SAMLProviderImportForm.ts +++ b/web/src/admin/providers/saml/SAMLProviderImportForm.ts @@ -29,7 +29,7 @@ export class SAMLProviderImportForm extends Form { }); } - renderInlineForm(): TemplateResult { + renderForm(): TemplateResult { return html` diff --git a/web/src/admin/providers/scim/SCIMProviderForm.ts b/web/src/admin/providers/scim/SCIMProviderForm.ts index 20a736ca5..cdc935973 100644 --- a/web/src/admin/providers/scim/SCIMProviderForm.ts +++ b/web/src/admin/providers/scim/SCIMProviderForm.ts @@ -61,8 +61,7 @@ export class SCIMProviderFormPage extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

- - `; + `; } } diff --git a/web/src/admin/sources/ldap/LDAPSourceForm.ts b/web/src/admin/sources/ldap/LDAPSourceForm.ts index 67e415fc8..a927eae29 100644 --- a/web/src/admin/sources/ldap/LDAPSourceForm.ts +++ b/web/src/admin/sources/ldap/LDAPSourceForm.ts @@ -63,8 +63,7 @@ export class LDAPSourceForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

- - `; + `; } } diff --git a/web/src/admin/sources/oauth/OAuthSourceForm.ts b/web/src/admin/sources/oauth/OAuthSourceForm.ts index fdf4d22b0..9fa70aef3 100644 --- a/web/src/admin/sources/oauth/OAuthSourceForm.ts +++ b/web/src/admin/sources/oauth/OAuthSourceForm.ts @@ -231,8 +231,7 @@ export class OAuthSourceForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

- - `; + `; } } diff --git a/web/src/admin/sources/plex/PlexSourceForm.ts b/web/src/admin/sources/plex/PlexSourceForm.ts index 729654edb..1318a1ae9 100644 --- a/web/src/admin/sources/plex/PlexSourceForm.ts +++ b/web/src/admin/sources/plex/PlexSourceForm.ts @@ -178,8 +178,7 @@ export class PlexSourceForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

- - `; + `; } } diff --git a/web/src/admin/sources/saml/SAMLSourceForm.ts b/web/src/admin/sources/saml/SAMLSourceForm.ts index ac168ae5b..9e9fb8392 100644 --- a/web/src/admin/sources/saml/SAMLSourceForm.ts +++ b/web/src/admin/sources/saml/SAMLSourceForm.ts @@ -83,8 +83,7 @@ export class SAMLSourceForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

- - `; + `; } } diff --git a/web/src/admin/stages/authenticator_duo/AuthenticatorDuoStageForm.ts b/web/src/admin/stages/authenticator_duo/AuthenticatorDuoStageForm.ts index 98d8fa5d9..4d74059be 100644 --- a/web/src/admin/stages/authenticator_duo/AuthenticatorDuoStageForm.ts +++ b/web/src/admin/stages/authenticator_duo/AuthenticatorDuoStageForm.ts @@ -50,8 +50,7 @@ export class AuthenticatorDuoStageForm extends ModelForm - + return html` ${msg( "Stage used to configure a duo-based authenticator. This stage should be used for configuration flows.", )} @@ -189,7 +188,6 @@ export class AuthenticatorDuoStageForm extends ModelForm
- - `; + `; } } diff --git a/web/src/admin/stages/authenticator_duo/DuoDeviceImportForm.ts b/web/src/admin/stages/authenticator_duo/DuoDeviceImportForm.ts index 3fe57ba44..2fbb24b10 100644 --- a/web/src/admin/stages/authenticator_duo/DuoDeviceImportForm.ts +++ b/web/src/admin/stages/authenticator_duo/DuoDeviceImportForm.ts @@ -42,10 +42,10 @@ export class DuoDeviceImportForm extends ModelForm - ${this.instance?.adminIntegrationKey !== "" ? this.renderFormAutomatic() : html``} - ${this.renderFormManual()} - `; + return html` ${this.instance?.adminIntegrationKey !== "" + ? this.renderFormAutomatic() + : html``} + ${this.renderFormManual()}`; } renderFormManual(): TemplateResult { diff --git a/web/src/admin/stages/authenticator_sms/AuthenticatorSMSStageForm.ts b/web/src/admin/stages/authenticator_sms/AuthenticatorSMSStageForm.ts index f7f46b7ed..4522d050b 100644 --- a/web/src/admin/stages/authenticator_sms/AuthenticatorSMSStageForm.ts +++ b/web/src/admin/stages/authenticator_sms/AuthenticatorSMSStageForm.ts @@ -207,8 +207,9 @@ export class AuthenticatorSMSStageForm extends ModelForm - ${msg("Stage used to configure an SMS-based TOTP authenticator.")} + return html` + ${msg("Stage used to configure an SMS-based TOTP authenticator.")} + - - `; + `; } } diff --git a/web/src/admin/stages/authenticator_static/AuthenticatorStaticStageForm.ts b/web/src/admin/stages/authenticator_static/AuthenticatorStaticStageForm.ts index 4ad86d541..f9f2684d0 100644 --- a/web/src/admin/stages/authenticator_static/AuthenticatorStaticStageForm.ts +++ b/web/src/admin/stages/authenticator_static/AuthenticatorStaticStageForm.ts @@ -48,8 +48,7 @@ export class AuthenticatorStaticStageForm extends ModelForm - + return html` ${msg( "Stage used to configure a static authenticator (i.e. static tokens). This stage should be used for configuration flows.", )} @@ -156,7 +155,6 @@ export class AuthenticatorStaticStageForm extends ModelForm
- - `; + `; } } diff --git a/web/src/admin/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts b/web/src/admin/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts index 55de84e00..ff44f9349 100644 --- a/web/src/admin/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts +++ b/web/src/admin/stages/authenticator_totp/AuthenticatorTOTPStageForm.ts @@ -50,8 +50,7 @@ export class AuthenticatorTOTPStageForm extends ModelForm - + return html` ${msg( "Stage used to configure a TOTP authenticator (i.e. Authy/Google Authenticator).", )} @@ -146,7 +145,6 @@ export class AuthenticatorTOTPStageForm extends ModelForm
- - `; + `; } } diff --git a/web/src/admin/stages/authenticator_validate/AuthenticatorValidateStageForm.ts b/web/src/admin/stages/authenticator_validate/AuthenticatorValidateStageForm.ts index 6cc8e8ed9..146422988 100644 --- a/web/src/admin/stages/authenticator_validate/AuthenticatorValidateStageForm.ts +++ b/web/src/admin/stages/authenticator_validate/AuthenticatorValidateStageForm.ts @@ -71,8 +71,7 @@ export class AuthenticatorValidateStageForm extends ModelForm - + return html` ${msg( "Stage used to validate any authenticator. This stage should be used during authentication or authorization flows.", )} @@ -254,7 +253,6 @@ export class AuthenticatorValidateStageForm extends ModelForm - - `; + `; } } diff --git a/web/src/admin/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts b/web/src/admin/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts index 0ab4afbaf..9bd8bebe1 100644 --- a/web/src/admin/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts +++ b/web/src/admin/stages/authenticator_webauthn/AuthenticateWebAuthnStageForm.ts @@ -55,10 +55,9 @@ export class AuthenticateWebAuthnStageForm extends ModelForm - + return html` ${msg( - "Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello).", + "Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello).", )} @@ -214,7 +213,6 @@ export class AuthenticateWebAuthnStageForm extends ModelForm - - `; + `; } } diff --git a/web/src/admin/stages/captcha/CaptchaStageForm.ts b/web/src/admin/stages/captcha/CaptchaStageForm.ts index 2fec02eaf..cc8299f30 100644 --- a/web/src/admin/stages/captcha/CaptchaStageForm.ts +++ b/web/src/admin/stages/captcha/CaptchaStageForm.ts @@ -40,8 +40,7 @@ export class CaptchaStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( "This stage checks the user's current session against the Google reCaptcha (or compatible) service.", )} @@ -133,7 +132,6 @@ export class CaptchaStageForm extends ModelForm {

- - `; + `; } } diff --git a/web/src/admin/stages/consent/ConsentStageForm.ts b/web/src/admin/stages/consent/ConsentStageForm.ts index 487c63c88..84866b10d 100644 --- a/web/src/admin/stages/consent/ConsentStageForm.ts +++ b/web/src/admin/stages/consent/ConsentStageForm.ts @@ -49,8 +49,7 @@ export class ConsentStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( "Prompt for the user's consent. The consent can either be permanent or expire in a defined amount of time.", )} @@ -120,7 +119,6 @@ export class ConsentStageForm extends ModelForm { - - `; + `; } } diff --git a/web/src/admin/stages/deny/DenyStageForm.ts b/web/src/admin/stages/deny/DenyStageForm.ts index 7be798c37..929496a78 100644 --- a/web/src/admin/stages/deny/DenyStageForm.ts +++ b/web/src/admin/stages/deny/DenyStageForm.ts @@ -39,8 +39,7 @@ export class DenyStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( "Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding.", )} @@ -52,7 +51,6 @@ export class DenyStageForm extends ModelForm { class="pf-c-form-control" required /> - - `; +
`; } } diff --git a/web/src/admin/stages/dummy/DummyStageForm.ts b/web/src/admin/stages/dummy/DummyStageForm.ts index 61620bfa2..03fbbb4c3 100644 --- a/web/src/admin/stages/dummy/DummyStageForm.ts +++ b/web/src/admin/stages/dummy/DummyStageForm.ts @@ -40,8 +40,7 @@ export class DummyStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( "Dummy stage used for testing. Shows a simple continue button and always passes.", )} @@ -68,7 +67,6 @@ export class DummyStageForm extends ModelForm { ${msg("Throw error?")} - - `; +
`; } } diff --git a/web/src/admin/stages/email/EmailStageForm.ts b/web/src/admin/stages/email/EmailStageForm.ts index 406051448..a08b5c115 100644 --- a/web/src/admin/stages/email/EmailStageForm.ts +++ b/web/src/admin/stages/email/EmailStageForm.ts @@ -147,8 +147,7 @@ export class EmailStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( "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.", )} @@ -256,7 +255,6 @@ export class EmailStageForm extends ModelForm { - ${this.renderConnectionSettings()} - `; + ${this.renderConnectionSettings()}`; } } diff --git a/web/src/admin/stages/identification/IdentificationStageForm.ts b/web/src/admin/stages/identification/IdentificationStageForm.ts index 5e4ebd828..769caaa76 100644 --- a/web/src/admin/stages/identification/IdentificationStageForm.ts +++ b/web/src/admin/stages/identification/IdentificationStageForm.ts @@ -68,8 +68,7 @@ export class IdentificationStageForm extends ModelForm - + return html` ${msg("Let the user identify themselves with their username or Email address.")} @@ -299,7 +298,6 @@ export class IdentificationStageForm extends ModelForm - - `; + `; } } diff --git a/web/src/admin/stages/invitation/InvitationForm.ts b/web/src/admin/stages/invitation/InvitationForm.ts index 0ee755389..be110eb46 100644 --- a/web/src/admin/stages/invitation/InvitationForm.ts +++ b/web/src/admin/stages/invitation/InvitationForm.ts @@ -43,8 +43,7 @@ export class InvitationForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- {

${msg("When enabled, the invitation will be deleted after usage.")}

-
-
`; +
`; } } diff --git a/web/src/admin/stages/invitation/InvitationStageForm.ts b/web/src/admin/stages/invitation/InvitationStageForm.ts index 8a566af44..549c58ae6 100644 --- a/web/src/admin/stages/invitation/InvitationStageForm.ts +++ b/web/src/admin/stages/invitation/InvitationStageForm.ts @@ -40,8 +40,7 @@ export class InvitationStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg("This stage can be included in enrollment flows to accept invitations.")} @@ -81,7 +80,6 @@ export class InvitationStageForm extends ModelForm {

- - `; + `; } } diff --git a/web/src/admin/stages/password/PasswordStageForm.ts b/web/src/admin/stages/password/PasswordStageForm.ts index 8fa88521f..ce503ef00 100644 --- a/web/src/admin/stages/password/PasswordStageForm.ts +++ b/web/src/admin/stages/password/PasswordStageForm.ts @@ -62,8 +62,9 @@ export class PasswordStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- ${msg("Validate the user's password against the selected backend(s).")} + return html` + ${msg("Validate the user's password against the selected backend(s).")} + {

- -
`; + `; } } diff --git a/web/src/admin/stages/prompt/PromptForm.ts b/web/src/admin/stages/prompt/PromptForm.ts index 21c982fe4..2ce0b77d8 100644 --- a/web/src/admin/stages/prompt/PromptForm.ts +++ b/web/src/admin/stages/prompt/PromptForm.ts @@ -283,8 +283,7 @@ export class PromptForm extends ModelForm { } renderEditForm(): TemplateResult { - return html`
- + return html` { class="pf-c-form-control" required /> - - `; +
`; } } diff --git a/web/src/admin/stages/prompt/PromptStageForm.ts b/web/src/admin/stages/prompt/PromptStageForm.ts index 2b69b61ca..f3841e10f 100644 --- a/web/src/admin/stages/prompt/PromptStageForm.ts +++ b/web/src/admin/stages/prompt/PromptStageForm.ts @@ -60,8 +60,7 @@ export class PromptStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( "Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable.", )} @@ -146,7 +145,6 @@ export class PromptStageForm extends ModelForm {

- - `; + `; } } diff --git a/web/src/admin/stages/user_delete/UserDeleteStageForm.ts b/web/src/admin/stages/user_delete/UserDeleteStageForm.ts index 2a3de7337..3d15b52ff 100644 --- a/web/src/admin/stages/user_delete/UserDeleteStageForm.ts +++ b/web/src/admin/stages/user_delete/UserDeleteStageForm.ts @@ -39,8 +39,7 @@ export class UserDeleteStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( "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.", )} @@ -52,7 +51,6 @@ export class UserDeleteStageForm extends ModelForm { class="pf-c-form-control" required /> - - `; +
`; } } diff --git a/web/src/admin/stages/user_login/UserLoginStageForm.ts b/web/src/admin/stages/user_login/UserLoginStageForm.ts index 16ac5db7b..6ba879799 100644 --- a/web/src/admin/stages/user_login/UserLoginStageForm.ts +++ b/web/src/admin/stages/user_login/UserLoginStageForm.ts @@ -42,8 +42,7 @@ export class UserLoginStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- ${msg("Log the currently pending user in.")} + return html` ${msg("Log the currently pending user in.")} {

- -
`; + `; } } diff --git a/web/src/admin/stages/user_logout/UserLogoutStageForm.ts b/web/src/admin/stages/user_logout/UserLogoutStageForm.ts index bde31c5e8..7e90aade6 100644 --- a/web/src/admin/stages/user_logout/UserLogoutStageForm.ts +++ b/web/src/admin/stages/user_logout/UserLogoutStageForm.ts @@ -39,8 +39,7 @@ export class UserLogoutStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- ${msg("Remove the user from the current session.")} + return html` ${msg("Remove the user from the current session.")} { class="pf-c-form-control" required /> - -
`; +
`; } } diff --git a/web/src/admin/stages/user_write/UserWriteStageForm.ts b/web/src/admin/stages/user_write/UserWriteStageForm.ts index 958ada1c5..0cfefc57c 100644 --- a/web/src/admin/stages/user_write/UserWriteStageForm.ts +++ b/web/src/admin/stages/user_write/UserWriteStageForm.ts @@ -44,8 +44,7 @@ export class UserWriteStageForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` ${msg( `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.`, @@ -161,7 +160,6 @@ export class UserWriteStageForm extends ModelForm {

- - `; + `; } } diff --git a/web/src/admin/tenants/TenantForm.ts b/web/src/admin/tenants/TenantForm.ts index 9a3b88d61..38614b5cb 100644 --- a/web/src/admin/tenants/TenantForm.ts +++ b/web/src/admin/tenants/TenantForm.ts @@ -46,8 +46,11 @@ export class TenantForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

- - `; + `; } } diff --git a/web/src/admin/tokens/TokenForm.ts b/web/src/admin/tokens/TokenForm.ts index 88023488c..904c8cdac 100644 --- a/web/src/admin/tokens/TokenForm.ts +++ b/web/src/admin/tokens/TokenForm.ts @@ -58,8 +58,7 @@ export class TokenForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- { )}

- ${this.showExpiry ? this.renderExpiry() : html``} -
`; + ${this.showExpiry ? this.renderExpiry() : html``}`; } } diff --git a/web/src/admin/users/RelatedUserList.ts b/web/src/admin/users/RelatedUserList.ts index 3ebc5dbb5..d34c19bc5 100644 --- a/web/src/admin/users/RelatedUserList.ts +++ b/web/src/admin/users/RelatedUserList.ts @@ -68,7 +68,7 @@ export class RelatedUserAdd extends Form<{ users: number[] }> { return data; } - renderInlineForm(): TemplateResult { + renderForm(): TemplateResult { return html`${this.group?.isSuperuser ? html`` : html``}
diff --git a/web/src/admin/users/ServiceAccountForm.ts b/web/src/admin/users/ServiceAccountForm.ts index b5a0dc9b7..96dbb89be 100644 --- a/web/src/admin/users/ServiceAccountForm.ts +++ b/web/src/admin/users/ServiceAccountForm.ts @@ -34,7 +34,7 @@ export class ServiceAccountForm extends Form { this.result = undefined; } - renderInlineForm(): TemplateResult { + renderForm(): TemplateResult { return html` { `; } - renderForm(): TemplateResult { + renderFormWrapper(): TemplateResult { if (this.result) { return this.renderResponseForm(); } - return super.renderForm(); + return super.renderFormWrapper(); } } diff --git a/web/src/admin/users/UserForm.ts b/web/src/admin/users/UserForm.ts index b2cdef833..bdd8ed662 100644 --- a/web/src/admin/users/UserForm.ts +++ b/web/src/admin/users/UserForm.ts @@ -64,8 +64,11 @@ export class UserForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- + return html` {

${msg("Set custom attributes using YAML or JSON.")}

-
- `; +
`; } } diff --git a/web/src/admin/users/UserPasswordForm.ts b/web/src/admin/users/UserPasswordForm.ts index e96d2486f..f17cdba6f 100644 --- a/web/src/admin/users/UserPasswordForm.ts +++ b/web/src/admin/users/UserPasswordForm.ts @@ -25,7 +25,7 @@ export class UserPasswordForm extends Form { }); } - renderInlineForm(): TemplateResult { + renderForm(): TemplateResult { return html` extends AKElement { } } - renderForm(): TemplateResult { - const inline = this.renderInlineForm(); + renderFormWrapper(): TemplateResult { + const inline = this.renderForm(); if (inline) { - return html`
+ return html` { + ev.preventDefault(); + }} + > ${inline}
`; } return html``; } - /** - * Inline form render callback when inheriting this class, should be overwritten - * instead of `this.renderForm` - */ - renderInlineForm(): TemplateResult | undefined { + renderForm(): TemplateResult | undefined { return undefined; } @@ -378,7 +379,7 @@ export abstract class Form extends AKElement { } renderVisible(): TemplateResult { - return html` ${this.renderNonFieldErrors()} ${this.renderForm()}`; + return html` ${this.renderNonFieldErrors()} ${this.renderFormWrapper()}`; } render(): TemplateResult { diff --git a/web/src/user/user-settings/mfa/MFADeviceForm.ts b/web/src/user/user-settings/mfa/MFADeviceForm.ts index 0901d0bc9..a418eeb02 100644 --- a/web/src/user/user-settings/mfa/MFADeviceForm.ts +++ b/web/src/user/user-settings/mfa/MFADeviceForm.ts @@ -64,15 +64,13 @@ export class MFADeviceForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- - - -
`; + return html` + + `; } } diff --git a/web/src/user/user-settings/tokens/UserTokenForm.ts b/web/src/user/user-settings/tokens/UserTokenForm.ts index 6e5219a3d..05bb3b111 100644 --- a/web/src/user/user-settings/tokens/UserTokenForm.ts +++ b/web/src/user/user-settings/tokens/UserTokenForm.ts @@ -43,8 +43,7 @@ export class UserTokenForm extends ModelForm { } renderForm(): TemplateResult { - return html`
- { value="${ifDefined(this.instance?.description)}" class="pf-c-form-control" /> - -
`; +
`; } } diff --git a/web/xliff/de.xlf b/web/xliff/de.xlf index d831532c1..67ff47d1c 100644 --- a/web/xliff/de.xlf +++ b/web/xliff/de.xlf @@ -4021,10 +4021,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. Wenn mehrere Stufen ausgewählt sind, kann der Benutzer wählen, welche er registrieren möchte. - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - Phase zum Konfigurieren eines WebAutnn-Authentifikators (z. B. Yubikey, FaceID/Windows Hello). - User verification Benutzerüberprüfung @@ -5933,6 +5929,9 @@ Bindings to groups/users are checked against the user of the event. Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). diff --git a/web/xliff/en.xlf b/web/xliff/en.xlf index dc4a9f124..184db9c02 100644 --- a/web/xliff/en.xlf +++ b/web/xliff/en.xlf @@ -4245,10 +4245,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. When multiple stages are selected, the user can choose which one they want to enroll. - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - User verification User verification @@ -6247,6 +6243,9 @@ Bindings to groups/users are checked against the user of the event. Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). diff --git a/web/xliff/es.xlf b/web/xliff/es.xlf index e24886318..e8a81058c 100644 --- a/web/xliff/es.xlf +++ b/web/xliff/es.xlf @@ -3948,10 +3948,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - Etapa utilizada para configurar un autenticador WebAutnn (es decir, Yubikey, FaceID/Windows Hello). - User verification Verificación del usuario @@ -5841,6 +5837,9 @@ Bindings to groups/users are checked against the user of the event. Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). diff --git a/web/xliff/fr.xlf b/web/xliff/fr.xlf index 8c3e4f6f5..ef28fbb6b 100644 --- a/web/xliff/fr.xlf +++ b/web/xliff/fr.xlf @@ -5303,11 +5303,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. Lorsque plusieurs étapes sont sélectionnées, les utilisateurs peuvent choisir celle qu’ils souhaient utiliser pour s’enrôler. - - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - Étape de configuration d'un authentificateur WebAuthn (Yubikey, FaceID/Windows Hello). - User verification @@ -7823,6 +7818,9 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). diff --git a/web/xliff/pl.xlf b/web/xliff/pl.xlf index 609b27630..1b7e45c40 100644 --- a/web/xliff/pl.xlf +++ b/web/xliff/pl.xlf @@ -4118,10 +4118,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. W przypadku wybrania wielu etapów użytkownik może wybrać, na który chce się zapisać. - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - Etap używany do konfiguracji tokena uwierzytelniającego WebAuthn (tj. Yubikey, FaceID/Windows Hello). - User verification Weryfikacja użytkownika @@ -6080,6 +6076,9 @@ Bindings to groups/users are checked against the user of the event. Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). diff --git a/web/xliff/pseudo-LOCALE.xlf b/web/xliff/pseudo-LOCALE.xlf index 22d95eebf..9dad51bb7 100644 --- a/web/xliff/pseudo-LOCALE.xlf +++ b/web/xliff/pseudo-LOCALE.xlf @@ -4208,10 +4208,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. - - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - User verification @@ -6182,6 +6178,9 @@ Bindings to groups/users are checked against the user of the event. Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). diff --git a/web/xliff/tr.xlf b/web/xliff/tr.xlf index 3d205ba57..f463488df 100644 --- a/web/xliff/tr.xlf +++ b/web/xliff/tr.xlf @@ -3947,10 +3947,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - Aşama bir WebAutnn kimlik doğrulayıcısını (örn. Yubikey, FaceID/Windows Hello) yapılandırmak için kullanılır. - User verification Kullanıcı doğrulaması @@ -5834,6 +5830,9 @@ Bindings to groups/users are checked against the user of the event. Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). diff --git a/web/xliff/zh-Hans.xlf b/web/xliff/zh-Hans.xlf index 005605c39..9ac2df4ba 100644 --- a/web/xliff/zh-Hans.xlf +++ b/web/xliff/zh-Hans.xlf @@ -5305,11 +5305,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. 选中多个阶段时,用户可以选择要注册哪个。 - - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - 用来配置 WebAuthn 身份验证器(即 Yubikey、FaceID/Windows Hello)的阶段。 - User verification @@ -7828,6 +7823,9 @@ Bindings to groups/users are checked against the user of the event. Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). diff --git a/web/xliff/zh-Hant.xlf b/web/xliff/zh-Hant.xlf index 45a082416..7d26d5eb6 100644 --- a/web/xliff/zh-Hant.xlf +++ b/web/xliff/zh-Hant.xlf @@ -3984,10 +3984,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. 选中多个阶段时,用户可以选择要注册哪个。 - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - 用于配置 Webautnn 身份验证器(即 Yubikey、FaceID/Windows Hello)的阶段。 - User verification 用户验证 @@ -5886,6 +5882,9 @@ Bindings to groups/users are checked against the user of the event. Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). diff --git a/web/xliff/zh_TW.xlf b/web/xliff/zh_TW.xlf index ee0b59c1a..9a4de8148 100644 --- a/web/xliff/zh_TW.xlf +++ b/web/xliff/zh_TW.xlf @@ -3984,10 +3984,6 @@ doesn't pass when either or both of the selected options are equal or above the When multiple stages are selected, the user can choose which one they want to enroll. 选中多个阶段时,用户可以选择要注册哪个。 - - Stage used to configure a WebAutnn authenticator (i.e. Yubikey, FaceID/Windows Hello). - 用于配置 Webautnn 身份验证器(即 Yubikey、FaceID/Windows Hello)的阶段。 - User verification 用户验证 @@ -5885,6 +5881,9 @@ Bindings to groups/users are checked against the user of the event. Flow Info + + + Stage used to configure a WebAuthn authenticator (i.e. Yubikey, FaceID/Windows Hello). From 21e5441f92a6fa7a14739c5953e43e7c86fddce2 Mon Sep 17 00:00:00 2001 From: Ken Sternberg <133134217+kensternberg-authentik@users.noreply.github.com> Date: Thu, 12 Oct 2023 10:44:15 -0700 Subject: [PATCH 10/10] web: patternfly hints as ak-web-component (#7120) * web: patternfly hints as ak-web-component Patternfly 5's "Hints" React Component, but ported to web components. The discovery that CSS Custom Properties are still available in child components, even if they're within independent ShadowDOMs, made this fairly easy to port from Handlebars to Lit-HTML. Moving the definitions into `:host` and the applications into the root DIV of the component made duplicating the Patternfly 5 structure straightforward. Despite the [Patternfly Elements]documentation](https://patternflyelements.org/docs/develop/create/), there's a lot to Patternfly Elements that isn't well documented, such as their slot controller, which near as I can tell just makes it easy to determine if a slot with the given name is actually being used by the client code, but it's hard to tell why, other than that it provides an easy way to determine if some CSS should be included. * Pre-commit fixes. * web: fix some issues with styling found while testing. * web: separated the "with Title" and "without Title" stories. * Added footer story, fixed some CSS. * web: hint controller Add the `ShowHintController`. This ReactiveController takes a token in its constructor, and looks in LocalStorage for that token and an associated value. If that value is not `undefined`, it sets the field `this.host.showHint` to the value found. It also provides a `render()` method that provides an `ak-hint-footer` with a checkbox and the "Don't show this message again," and responds to clicks on the checkbox by setting the `this.hint.showHint` and LocalStorage values to "false". An example web component using it has been supplied. * web: support dark mode for hints. This was nifty. Still not entirely sure about the `theme="dark"` rippling through the product, but in this case it works quite well. All it took was defining the alternative dark mode values in a CSS entry, `:host([theme="dark"]) { ... }` and exploiting Patternfly's already intensely atomized CSS Custom Properties properly. * web: revise colors to use more of the Authentik dark-mode style. * Update web/src/components/ak-hint/ak-hint.ts Signed-off-by: Jens L. * remove any Signed-off-by: Jens Langhammer --------- Signed-off-by: Jens L. Signed-off-by: Jens Langhammer Co-authored-by: Jens L --- .../applications/ApplicationWizardHint.ts | 69 +++++++++ web/src/common/constants.ts | 2 + .../components/ak-hint/ShowHintController.ts | 63 ++++++++ web/src/components/ak-hint/ak-hint-actions.ts | 32 ++++ web/src/components/ak-hint/ak-hint-body.ts | 24 +++ web/src/components/ak-hint/ak-hint-footer.ts | 26 ++++ web/src/components/ak-hint/ak-hint-title.ts | 23 +++ web/src/components/ak-hint/ak-hint.stories.ts | 137 ++++++++++++++++++ web/src/components/ak-hint/ak-hint.ts | 72 +++++++++ 9 files changed, 448 insertions(+) create mode 100644 web/src/admin/applications/ApplicationWizardHint.ts create mode 100644 web/src/components/ak-hint/ShowHintController.ts create mode 100644 web/src/components/ak-hint/ak-hint-actions.ts create mode 100644 web/src/components/ak-hint/ak-hint-body.ts create mode 100644 web/src/components/ak-hint/ak-hint-footer.ts create mode 100644 web/src/components/ak-hint/ak-hint-title.ts create mode 100644 web/src/components/ak-hint/ak-hint.stories.ts create mode 100644 web/src/components/ak-hint/ak-hint.ts diff --git a/web/src/admin/applications/ApplicationWizardHint.ts b/web/src/admin/applications/ApplicationWizardHint.ts new file mode 100644 index 000000000..9f0a22e88 --- /dev/null +++ b/web/src/admin/applications/ApplicationWizardHint.ts @@ -0,0 +1,69 @@ +import { MessageLevel } from "@goauthentik/common/messages"; +import { + ShowHintController, + ShowHintControllerHost, +} from "@goauthentik/components/ak-hint/ShowHintController"; +import "@goauthentik/components/ak-hint/ak-hint"; +import "@goauthentik/components/ak-hint/ak-hint-body"; +import { AKElement } from "@goauthentik/elements/Base"; +import "@goauthentik/elements/buttons/ActionButton/ak-action-button"; +import { showMessage } from "@goauthentik/elements/messages/MessageContainer"; + +import { html, nothing } from "lit"; +import { customElement, property, state } from "lit/decorators.js"; + +import PFPage from "@patternfly/patternfly/components/Page/page.css"; + +@customElement("ak-application-wizard-hint") +export class AkApplicationWizardHint extends AKElement implements ShowHintControllerHost { + static get styles() { + return [PFPage]; + } + + @property({ type: Boolean, attribute: "show-hint" }) + forceHint: boolean = false; + + @state() + showHint: boolean = true; + + showHintController: ShowHintController; + + constructor() { + super(); + this.showHintController = new ShowHintController( + this, + "202310-application-wizard-announcement", + ); + } + + renderHint() { + return html`
+ + +

+ Authentik has a new Application Wizard that can configure both an + application and its authentication provider at the same time. + Learn more about the wizard here. +

+ { + showMessage({ + message: "This would have shown the wizard", + level: MessageLevel.success, + }); + }} + >Create with Wizard
+ ${this.showHintController.render()} +
+
`; + } + + render() { + return this.showHint || this.forceHint ? this.renderHint() : nothing; + } +} + +export default AkApplicationWizardHint; diff --git a/web/src/common/constants.ts b/web/src/common/constants.ts index ca6ce33a1..1e58a838a 100644 --- a/web/src/common/constants.ts +++ b/web/src/common/constants.ts @@ -22,3 +22,5 @@ export const EVENT_THEME_CHANGE = "ak-theme-change"; export const WS_MSG_TYPE_MESSAGE = "message"; export const WS_MSG_TYPE_REFRESH = "refresh"; + +export const LOCALSTORAGE_AUTHENTIK_KEY = "authentik-local-settings"; diff --git a/web/src/components/ak-hint/ShowHintController.ts b/web/src/components/ak-hint/ShowHintController.ts new file mode 100644 index 000000000..b3eb1393c --- /dev/null +++ b/web/src/components/ak-hint/ShowHintController.ts @@ -0,0 +1,63 @@ +import { LOCALSTORAGE_AUTHENTIK_KEY } from "@goauthentik/common/constants"; + +import { msg } from "@lit/localize"; +import { LitElement, ReactiveController, ReactiveControllerHost, html } from "lit"; + +type ReactiveLitElement = LitElement & ReactiveControllerHost; + +export interface ShowHintControllerHost extends ReactiveLitElement { + showHint: boolean; + + showHintController: ShowHintController; +} + +const getCurrentStorageValue = (): Record => { + try { + return JSON.parse(window?.localStorage.getItem(LOCALSTORAGE_AUTHENTIK_KEY) ?? "{}"); + } catch (_err: unknown) { + return {}; + } +}; + +export class ShowHintController implements ReactiveController { + host: ShowHintControllerHost; + + hintToken: string; + + constructor(host: ShowHintControllerHost, hintToken: string) { + (this.host = host).addController(this); + this.hintToken = hintToken; + this.hideTheHint = this.hideTheHint.bind(this); + } + + hideTheHint() { + window?.localStorage.setItem( + LOCALSTORAGE_AUTHENTIK_KEY, + JSON.stringify({ + ...getCurrentStorageValue(), + [this.hintToken]: false, + }), + ); + this.host.showHint = false; + } + + hostConnected() { + const localStores = getCurrentStorageValue(); + if (!(this.hintToken in localStores)) { + return; + } + // Note that we only do this IF the field exists and is defined. `undefined` means "do the + // default thing of showing the hint." + this.host.showHint = localStores[this.hintToken] as boolean; + } + + render() { + return html`
+ ${msg( + "Don't show this message again.", + )} +
`; + } +} diff --git a/web/src/components/ak-hint/ak-hint-actions.ts b/web/src/components/ak-hint/ak-hint-actions.ts new file mode 100644 index 000000000..8af341965 --- /dev/null +++ b/web/src/components/ak-hint/ak-hint-actions.ts @@ -0,0 +1,32 @@ +import { AKElement } from "@goauthentik/app/elements/Base"; + +import { css, html } from "lit"; +import { customElement } from "lit/decorators.js"; + +const style = css` + div { + display: inline-grid; + grid-row: 1; + grid-column: 2; + grid-auto-flow: column; + margin-left: var(--ak-hint__actions--MarginLeft); + text-align: right; + } + + ::slotted(ak-hint-body) { + grid-column: 1; + } +`; + +@customElement("ak-hint-actions") +export class AkHintActions extends AKElement { + static get styles() { + return [style]; + } + + render() { + return html`
`; + } +} + +export default AkHintActions; diff --git a/web/src/components/ak-hint/ak-hint-body.ts b/web/src/components/ak-hint/ak-hint-body.ts new file mode 100644 index 000000000..f5c122eb5 --- /dev/null +++ b/web/src/components/ak-hint/ak-hint-body.ts @@ -0,0 +1,24 @@ +import { AKElement } from "@goauthentik/app/elements/Base"; + +import { css, html } from "lit"; +import { customElement } from "lit/decorators.js"; + +const style = css` + div { + grid-column: 1 / -1; + font-size: var(--ak-hint__body--FontSize); + } +`; + +@customElement("ak-hint-body") +export class AkHintBody extends AKElement { + static get styles() { + return [style]; + } + + render() { + return html`
`; + } +} + +export default AkHintBody; diff --git a/web/src/components/ak-hint/ak-hint-footer.ts b/web/src/components/ak-hint/ak-hint-footer.ts new file mode 100644 index 000000000..a08197d11 --- /dev/null +++ b/web/src/components/ak-hint/ak-hint-footer.ts @@ -0,0 +1,26 @@ +import { AKElement } from "@goauthentik/app/elements/Base"; + +import { css, html } from "lit"; +import { customElement } from "lit/decorators.js"; + +const style = css` + #host { + grid-column: 1 / -1; + } + ::slotted(div#host > *:not(:last-child)) { + margin-right: var(--ak-hint__footer--child--MarginRight); + } +`; + +@customElement("ak-hint-footer") +export class AkHintFooter extends AKElement { + static get styles() { + return [style]; + } + + render() { + return html`
`; + } +} + +export default AkHintFooter; diff --git a/web/src/components/ak-hint/ak-hint-title.ts b/web/src/components/ak-hint/ak-hint-title.ts new file mode 100644 index 000000000..accc881d0 --- /dev/null +++ b/web/src/components/ak-hint/ak-hint-title.ts @@ -0,0 +1,23 @@ +import { AKElement } from "@goauthentik/app/elements/Base"; + +import { css, html } from "lit"; +import { customElement } from "lit/decorators.js"; + +const style = css` + #host { + font-size: var(--ak-hint__title--FontSize); + } +`; + +@customElement("ak-hint-title") +export class AkHintTitle extends AKElement { + static get styles() { + return [style]; + } + + render() { + return html`
`; + } +} + +export default AkHintTitle; diff --git a/web/src/components/ak-hint/ak-hint.stories.ts b/web/src/components/ak-hint/ak-hint.stories.ts new file mode 100644 index 000000000..281913761 --- /dev/null +++ b/web/src/components/ak-hint/ak-hint.stories.ts @@ -0,0 +1,137 @@ +import { MessageLevel } from "@goauthentik/common/messages"; +import "@goauthentik/elements/buttons/ActionButton/ak-action-button"; +import { showMessage } from "@goauthentik/elements/messages/MessageContainer"; +import { Meta } from "@storybook/web-components"; + +import { TemplateResult, html } from "lit"; + +import "../ak-radio-input"; +import "./ak-hint"; +import AkHint from "./ak-hint"; +import "./ak-hint-body"; +import "./ak-hint-title"; + +const metadata: Meta = { + title: "Components / Patternfly Hint", + component: "ak-hint", + parameters: { + docs: { + description: { + component: "A stylized hint box", + }, + }, + }, +}; + +export default metadata; + +const container = (testItem: TemplateResult) => + html`
+ + + ${testItem} + +
    +
    `; + +export const Default = () => { + return container( + html`
    + + +

    + Authentik has a new Application Wizard that can configure both an + application and its authentication provider at the same time. + Learn more about the wizard here. +

    + { + showMessage({ + message: "This would have shown the wizard", + level: MessageLevel.success, + }); + }} + >Create with Wizard
    +
    +
    `, + ); +}; + +export const WithTitle = () => { + return container( + html`
    + + New Application Wizard + +

    + Authentik has a new Application Wizard that can configure both an + application and its authentication provider at the same time. + Learn more about the wizard here. +

    + { + showMessage({ + message: "This would have shown the wizard", + level: MessageLevel.success, + }); + }} + >Create with Wizard
    +
    +
    `, + ); +}; + +export const WithTitleAndFooter = () => { + return container( + html`
    + + New Application Wizard + +

    + Authentik has a new Application Wizard that can configure both an + application and its authentication provider at the same time. + Learn more about the wizard here. +

    + { + showMessage({ + message: "This would have shown the wizard", + level: MessageLevel.success, + }); + }} + >Create with Wizard
    +
    + Don't show this message again. +
    +
    +
    `, + ); +}; diff --git a/web/src/components/ak-hint/ak-hint.ts b/web/src/components/ak-hint/ak-hint.ts new file mode 100644 index 000000000..731dbe0ca --- /dev/null +++ b/web/src/components/ak-hint/ak-hint.ts @@ -0,0 +1,72 @@ +import { AKElement } from "@goauthentik/app/elements/Base"; + +import { css, html } from "lit"; +import { customElement } from "lit/decorators.js"; + +const styles = css` + :host { + --ak-hint--GridRowGap: var(--pf-global--spacer--md); + --ak-hint--PaddingTop: var(--pf-global--spacer--md); + --ak-hint--PaddingRight: var(--pf-global--spacer--lg); + --ak-hint--PaddingBottom: var(--pf-global--spacer--md); + --ak-hint--PaddingLeft: var(--pf-global--spacer--lg); + --ak-hint--BackgroundColor: var(--pf-global--palette--blue-50); + --ak-hint--BorderColor: var(--pf-global--palette--blue-100); + --ak-hint--BorderWidth: var(--pf-global--BorderWidth--sm); + --ak-hint--BoxShadow: var(--pf-global--BoxShadow--sm); + --ak-hint--Color: var(--pf-global--Color--100); + + /* Hint Title */ + --ak-hint__title--FontSize: var(--pf-global--FontSize--lg); + + /* Hint Body */ + --ak-hint__body--FontSize: var(--pf-global--FontSize--md); + + /* Hint Footer */ + --ak-hint__footer--child--MarginRight: var(--pf-global--spacer--md); + + /* Hint Actions */ + --ak-hint__actions--MarginLeft: var(--pf-global--spacer--2xl); + --ak-hint__actions--c-dropdown--MarginTop: calc( + var(--pf-global--spacer--form-element) * -1 + ); + } + + :host([theme="dark"]) { + --ak-hint--BackgroundColor: var(--ak-dark-background-darker); + --ak-hint--BorderColor: var(--ak-dark-background-lighter); + --ak-hint--Color: var(--ak-dark-foreground); + } + + div#host { + display: flex; + flex-direction: column; + gap: var(--ak-hint--GridRowGap); + background-color: var(--ak-hint--BackgroundColor); + color: var(--ak-hint--Color); + border: var(--ak-hint--BorderWidth) solid var(--ak-hint--BorderColor); + box-shadow: var(--ak-hint--BoxShadow); + padding: var(--ak-hint--PaddingTop) var(--ak-hint--PaddingRight) + var(--ak-hint--PaddingBottom) var(--ak-hint--PaddingLeft); + } + + ::slotted(ak-hint-title), + ::slotted(ak-hint-body) { + display: grid; + grid-template-columns: 1fr auto; + grid-row-gap: var(--ak-hint--GridRowGap); + } +`; + +@customElement("ak-hint") +export class AkHint extends AKElement { + static get styles() { + return [styles]; + } + + render() { + return html`
    `; + } +} + +export default AkHint;