*: fix typos in code

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
Jens Langhammer 2021-09-25 00:01:11 +02:00
parent 919336a519
commit 79b92e764e
45 changed files with 168 additions and 145 deletions

1
.github/codespell-words.txt vendored Normal file
View File

@ -0,0 +1 @@
keypair

View File

@ -20,6 +20,11 @@ test:
lint-fix: lint-fix:
isort authentik tests lifecycle isort authentik tests lifecycle
black authentik tests lifecycle black authentik tests lifecycle
codespell -I .github/codespell-words.txt -w authentik
codespell -I .github/codespell-words.txt -w internal
codespell -I .github/codespell-words.txt -w cmd
codespell -I .github/codespell-words.txt -w web/src
codespell -I .github/codespell-words.txt -w website/src
lint: lint:
pyright authentik tests lifecycle pyright authentik tests lifecycle

View File

@ -48,6 +48,7 @@ duo-client = "*"
ua-parser = "*" ua-parser = "*"
deepmerge = "*" deepmerge = "*"
colorama = "*" colorama = "*"
codespell = "*"
[dev-packages] [dev-packages]
bandit = "*" bandit = "*"

184
Pipfile.lock generated
View File

@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "19d5324fd1a4af125ed57a683030ca14ee2d3648117748e4b32656875484728e" "sha256": "babb6061c555f8f239f00210b2a0356763bdaaca2f3d704cf3444891b84db84d"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": {}, "requires": {},
@ -120,19 +120,19 @@
}, },
"boto3": { "boto3": {
"hashes": [ "hashes": [
"sha256:07260ec42a21c31a13b07ffbf219811a79be60d2eb9a99cedfec65c2a5f2155d", "sha256:7b45b224442c479de4bc6e6e9cb0557b642fc7a77edc8702e393ccaa2e0aa128",
"sha256:52d87c94511226ccacd9e94335eb8f8f980b97964f63db92b97148b5486330a7" "sha256:c388da7dc1a596755f39de990a72e05cee558d098e81de63de55bd9598cc5134"
], ],
"index": "pypi", "index": "pypi",
"version": "==1.18.47" "version": "==1.18.48"
}, },
"botocore": { "botocore": {
"hashes": [ "hashes": [
"sha256:282951e8cde2c93fa436e5a7acfeb02f815de823bc3dac745ea51f971a1052e4", "sha256:2c25a76f09223b2f00ad578df34492b7b84cd4828fc90c08ccbdd1d70abbd7eb",
"sha256:57637772b837da290239b1a9a6676ae2dd8a64833ab7770dc67d169d09bc80b3" "sha256:9d5b70be2f417d0aa30788049fd20473ad27218eccd05e71f545b4b4e09c79a0"
], ],
"markers": "python_version >= '3.6'", "markers": "python_version >= '3.6'",
"version": "==1.21.47" "version": "==1.21.48"
}, },
"cachetools": { "cachetools": {
"hashes": [ "hashes": [
@ -286,6 +286,14 @@
], ],
"version": "==0.2.0" "version": "==0.2.0"
}, },
"codespell": {
"hashes": [
"sha256:19d3fe5644fef3425777e66f225a8c82d39059dcfe9edb3349a8a2cf48383ee5",
"sha256:b864c7d917316316ac24272ee992d7937c3519be4569209c5b60035ac5d569b5"
],
"index": "pypi",
"version": "==2.1.0"
},
"colorama": { "colorama": {
"hashes": [ "hashes": [
"sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b",
@ -371,11 +379,11 @@
}, },
"django-filter": { "django-filter": {
"hashes": [ "hashes": [
"sha256:84e9d5bb93f237e451db814ed422a3a625751cbc9968b484ecc74964a8696b06", "sha256:632a251fa8f1aadb4b8cceff932bb52fe2f826dd7dfe7f3eac40e5c463d6836e",
"sha256:e00d32cebdb3d54273c48f4f878f898dced8d5dfaad009438fe61ebdf535ace1" "sha256:f4a6737a30104c98d2e2a5fb93043f36dd7978e0c7ddc92f5998e85433ea5063"
], ],
"index": "pypi", "index": "pypi",
"version": "==2.4.0" "version": "==21.1"
}, },
"django-guardian": { "django-guardian": {
"hashes": [ "hashes": [
@ -482,11 +490,11 @@
}, },
"geoip2": { "geoip2": {
"hashes": [ "hashes": [
"sha256:599914784cea08b50fb50c22ed6a59143b5ff2d027ba782d2d5b6f3668293821", "sha256:f150bed3190d543712a17467208388d31bd8ddb49b2226fba53db8aaedb8ba89",
"sha256:7ad10942e9fd6c54bc850d8311618f04dacd3fff5b55ba48b7ad83502fc884bd" "sha256:f9172cdfb2a5f9225ace5e30dd7426413ad28798a5f474cd1538780686bd6a87"
], ],
"index": "pypi", "index": "pypi",
"version": "==4.3.0" "version": "==4.4.0"
}, },
"google-auth": { "google-auth": {
"hashes": [ "hashes": [
@ -706,10 +714,10 @@
}, },
"maxminddb": { "maxminddb": {
"hashes": [ "hashes": [
"sha256:c47b8acba98d03b8c762684d899623c257976f3eb0c9d557ff865d20cddc9d6b" "sha256:e37707ec4fab115804670e0fb7aedb4b57075a8b6f80052bdc648d3c005184e5"
], ],
"markers": "python_version >= '3.6'", "markers": "python_version >= '3.6'",
"version": "==2.1.0" "version": "==2.2.0"
}, },
"msgpack": { "msgpack": {
"hashes": [ "hashes": [
@ -900,39 +908,39 @@
}, },
"pycryptodome": { "pycryptodome": {
"hashes": [ "hashes": [
"sha256:09c1555a3fa450e7eaca41ea11cd00afe7c91fef52353488e65663777d8524e0", "sha256:01983746d01c9f16514d08711b27ba599ef5f66f3928215804bfe9f011427b14",
"sha256:12222a5edc9ca4a29de15fbd5339099c4c26c56e13c2ceddf0b920794f26165d", "sha256:03a8b3b61eee27348ee45dfee9138a6ba997e8f4f222537ae4bbafa000b88379",
"sha256:1723ebee5561628ce96748501cdaa7afaa67329d753933296321f0be55358dce", "sha256:3a26d7b7517822e68c2f08be6b78673c545be73ed5cb83698e53f18877223b05",
"sha256:1c5e1ca507de2ad93474be5cfe2bfa76b7cf039a1a32fc196f40935944871a06", "sha256:41b7b0603b969b9c6caf748a969ffbab145145abe89ab340676c1d1339f97f2d",
"sha256:2603c98ae04aac675fefcf71a6c87dc4bb74a75e9071ae3923bbc91a59f08d35", "sha256:4a7d6f50104f9720e095949ebb650131ba87dcf728adac7ad7bc02653190d7bd",
"sha256:2dea65df54349cdfa43d6b2e8edb83f5f8d6861e5cf7b1fbc3e34c5694c85e27", "sha256:4cfd0b7d10ecba55a26fba88bec1bc002715dae1a9814677bc5fa2cb451584eb",
"sha256:31c1df17b3dc5f39600a4057d7db53ac372f492c955b9b75dd439f5d8b460129", "sha256:587e775d9993d4fcfb6d75b80fdb5b216cc0e0505a047cd35da91072df4cafb5",
"sha256:38661348ecb71476037f1e1f553159b80d256c00f6c0b00502acac891f7116d9", "sha256:5aa657b1e2a5323de420266f876472e6b1e2e565a1b32e117cdb71a11fecf809",
"sha256:3e2e3a06580c5f190df843cdb90ea28d61099cf4924334d5297a995de68e4673", "sha256:5c2fb9e5b2bcd4b3eb144d7a6fa573376b6651f3d49d03a03989bdf51ae65aa1",
"sha256:3f840c49d38986f6e17dbc0673d37947c88bc9d2d9dba1c01b979b36f8447db1", "sha256:5f35fac714e4b5faf6d8ba4121357d6d5918d29b39846c011c3ea4d6f7fcfe56",
"sha256:501ab36aae360e31d0ec370cf5ce8ace6cb4112060d099b993bc02b36ac83fb6", "sha256:63c5c36095fed6300a2a839fb866203b391aadf2d51845f439ddc56519edd293",
"sha256:60386d1d4cfaad299803b45a5bc2089696eaf6cdd56f9fc17479a6f89595cfc8", "sha256:6ace02faf7428615fc76ecd8aaa995809d66d230f226b27dda30ea70fb2f8e27",
"sha256:6260e24d41149268122dd39d4ebd5941e9d107f49463f7e071fd397e29923b0c", "sha256:6d6420786210348767ee494035151344cbca7dca565e39e7bff576cbcbf5c96c",
"sha256:6bbf7fee7b7948b29d7e71fcacf48bac0c57fb41332007061a933f2d996f9713", "sha256:79870ea4f14ea405e2f89b7351361cb32b2fbf1b9f4bd300e224d9e98c26cecc",
"sha256:6d2df5223b12437e644ce0a3be7809471ffa71de44ccd28b02180401982594a6", "sha256:82c26ceb052a41cf6a3a58b4aacf2b0cd25a51fba33fb6c75918bd34669969ac",
"sha256:758949ca62690b1540dfb24ad773c6da9cd0e425189e83e39c038bbd52b8e438", "sha256:87ecb556a0137d7f8e75e62baac7ae43804ebedcbef89301fe756369201b52f5",
"sha256:77997519d8eb8a4adcd9a47b9cec18f9b323e296986528186c0e9a7a15d6a07e", "sha256:a20b53826ed71df7c805fd0c26415a77302405f81e3c630d55447380de66b840",
"sha256:7fd519b89585abf57bf47d90166903ec7b43af4fe23c92273ea09e6336af5c07", "sha256:a480aa37e72175ca4103fa9df1358e5b32a201f65749a99dad86295fc796a8bb",
"sha256:98213ac2b18dc1969a47bc65a79a8fca02a414249d0c8635abb081c7f38c91b6", "sha256:a4fe3a7c01c58dae879a12af8ffecd5471da2fbe166d97685dd2ee43553b6e79",
"sha256:99b2f3fc51d308286071d0953f92055504a6ffe829a832a9fc7a04318a7683dd", "sha256:a5a83d802d43c86898ce48e17fa6beb11bf2f3ca7cebf25e10b318ddbdb36b06",
"sha256:9b6f711b25e01931f1c61ce0115245a23cdc8b80bf8539ac0363bdcf27d649b6", "sha256:a6d47b268fa0cedc9d43239bfbed6abdee99028bdc77305e20465b91cd36d8e8",
"sha256:a3105a0eb63eacf98c2ecb0eb4aa03f77f40fbac2bdde22020bb8a536b226bb8", "sha256:a723cdd7c9f5dd8bf2ce25583fde7baec0f3f4b5dc324756adaa698a87570595",
"sha256:a8eb8b6ea09ec1c2535bf39914377bc8abcab2c7d30fa9225eb4fe412024e427", "sha256:aaa572c97970f215e7ebccaa835d4b8b176afba2791e405cbdaa983953c9a0d8",
"sha256:a92d5c414e8ee1249e850789052608f582416e82422502dc0ac8c577808a9067", "sha256:aac9fed6a528d5c1afb413b4fcc619d6e1349edf52a6ce84557d0aaa2ec2037a",
"sha256:d3d6958d53ad307df5e8469cc44474a75393a434addf20ecd451f38a72fe29b8", "sha256:bbf27d63e656b7333f17234bace91142a3bd30345f57eea670c34dcadd9db28a",
"sha256:e0a4d5933a88a2c98bbe19c0c722f5483dc628d7a38338ac2cb64a7dbd34064b", "sha256:c0c62d1dabb1c00220dda864a580ae9fb17a0ba39509b90369878fd8f08ab1bb",
"sha256:e3bf558c6aeb49afa9f0c06cee7fb5947ee5a1ff3bd794b653d39926b49077fa", "sha256:c13b363b168c74af37ca29fc138b29dcb58a934582986e1abcbb2b052f616ac6",
"sha256:e61e363d9a5d7916f3a4ce984a929514c0df3daf3b1b2eb5e6edbb131ee771cf", "sha256:cc0cc285e237b0fe10d06c7821e3cf341b4f72da55a3b0abcec1b9de005b2bd0",
"sha256:f977cdf725b20f6b8229b0c87acb98c7717e742ef9f46b113985303ae12a99da", "sha256:d8d04f2a4bcdcdef635c6d58a8647a76ef4d9a292cd537368d23b37f24052d7d",
"sha256:fc7489a50323a0df02378bc2fff86eb69d94cc5639914346c736be981c6a02e7" "sha256:e286e0f4c1a558603573125ffdd3a7c52e18005c01ea4ab41e98adee1fc88c5d"
], ],
"index": "pypi", "index": "pypi",
"version": "==3.10.1" "version": "==3.10.3"
}, },
"pyjwt": { "pyjwt": {
"hashes": [ "hashes": [
@ -1750,49 +1758,49 @@
}, },
"regex": { "regex": {
"hashes": [ "hashes": [
"sha256:04f6b9749e335bb0d2f68c707f23bb1773c3fb6ecd10edf0f04df12a8920d468", "sha256:0628ed7d6334e8f896f882a5c1240de8c4d9b0dd7c7fb8e9f4692f5684b7d656",
"sha256:08d74bfaa4c7731b8dac0a992c63673a2782758f7cfad34cf9c1b9184f911354", "sha256:09eb62654030f39f3ba46bc6726bea464069c29d00a9709e28c9ee9623a8da4a",
"sha256:0fc1f8f06977c2d4f5e3d3f0d4a08089be783973fc6b6e278bde01f0544ff308", "sha256:0bba1f6df4eafe79db2ecf38835c2626dbd47911e0516f6962c806f83e7a99ae",
"sha256:121f4b3185feaade3f85f70294aef3f777199e9b5c0c0245c774ae884b110a2d", "sha256:10a7a9cbe30bd90b7d9a1b4749ef20e13a3528e4215a2852be35784b6bd070f0",
"sha256:1413b5022ed6ac0d504ba425ef02549a57d0f4276de58e3ab7e82437892704fc", "sha256:17310b181902e0bb42b29c700e2c2346b8d81f26e900b1328f642e225c88bce1",
"sha256:1743345e30917e8c574f273f51679c294effba6ad372db1967852f12c76759d8", "sha256:1e8d1898d4fb817120a5f684363b30108d7b0b46c7261264b100d14ec90a70e7",
"sha256:28fc475f560d8f67cc8767b94db4c9440210f6958495aeae70fac8faec631797", "sha256:2054dea683f1bda3a804fcfdb0c1c74821acb968093d0be16233873190d459e3",
"sha256:31a99a4796bf5aefc8351e98507b09e1b09115574f7c9dbb9cf2111f7220d2e2", "sha256:29385c4dbb3f8b3a55ce13de6a97a3d21bd00de66acd7cdfc0b49cb2f08c906c",
"sha256:328a1fad67445550b982caa2a2a850da5989fd6595e858f02d04636e7f8b0b13", "sha256:295bc8a13554a25ad31e44c4bedabd3c3e28bba027e4feeb9bb157647a2344a7",
"sha256:473858730ef6d6ff7f7d5f19452184cd0caa062a20047f6d6f3e135a4648865d", "sha256:2cdb3789736f91d0b3333ac54d12a7e4f9efbc98f53cb905d3496259a893a8b3",
"sha256:4cde065ab33bcaab774d84096fae266d9301d1a2f5519d7bd58fc55274afbf7a", "sha256:3baf3eaa41044d4ced2463fd5d23bf7bd4b03d68739c6c99a59ce1f95599a673",
"sha256:5f6a808044faae658f546dd5f525e921de9fa409de7a5570865467f03a626fc0", "sha256:4e61100200fa6ab7c99b61476f9f9653962ae71b931391d0264acfb4d9527d9c",
"sha256:610b690b406653c84b7cb6091facb3033500ee81089867ee7d59e675f9ca2b73", "sha256:6266fde576e12357b25096351aac2b4b880b0066263e7bc7a9a1b4307991bb0e",
"sha256:66256b6391c057305e5ae9209941ef63c33a476b73772ca967d4a2df70520ec1", "sha256:650c4f1fc4273f4e783e1d8e8b51a3e2311c2488ba0fcae6425b1e2c248a189d",
"sha256:6eebf512aa90751d5ef6a7c2ac9d60113f32e86e5687326a50d7686e309f66ed", "sha256:658e3477676009083422042c4bac2bdad77b696e932a3de001c42cc046f8eda2",
"sha256:79aef6b5cd41feff359acaf98e040844613ff5298d0d19c455b3d9ae0bc8c35a", "sha256:6adc1bd68f81968c9d249aab8c09cdc2cbe384bf2d2cb7f190f56875000cdc72",
"sha256:808ee5834e06f57978da3e003ad9d6292de69d2bf6263662a1a8ae30788e080b", "sha256:6c4d83d21d23dd854ffbc8154cf293f4e43ba630aa9bd2539c899343d7f59da3",
"sha256:8e44769068d33e0ea6ccdf4b84d80c5afffe5207aa4d1881a629cf0ef3ec398f", "sha256:6f74b6d8f59f3cfb8237e25c532b11f794b96f5c89a6f4a25857d85f84fbef11",
"sha256:999ad08220467b6ad4bd3dd34e65329dd5d0df9b31e47106105e407954965256", "sha256:7783d89bd5413d183a38761fbc68279b984b9afcfbb39fa89d91f63763fbfb90",
"sha256:9b006628fe43aa69259ec04ca258d88ed19b64791693df59c422b607b6ece8bb", "sha256:7e3536f305f42ad6d31fc86636c54c7dafce8d634e56fef790fbacb59d499dd5",
"sha256:9d05ad5367c90814099000442b2125535e9d77581855b9bee8780f1b41f2b1a2", "sha256:821e10b73e0898544807a0692a276e539e5bafe0a055506a6882814b6a02c3ec",
"sha256:a577a21de2ef8059b58f79ff76a4da81c45a75fe0bfb09bc8b7bb4293fa18983", "sha256:835962f432bce92dc9bf22903d46c50003c8d11b1dc64084c8fae63bca98564a",
"sha256:a617593aeacc7a691cc4af4a4410031654f2909053bd8c8e7db837f179a630eb", "sha256:85c61bee5957e2d7be390392feac7e1d7abd3a49cbaed0c8cee1541b784c8561",
"sha256:abb48494d88e8a82601af905143e0de838c776c1241d92021e9256d5515b3645", "sha256:86f9931eb92e521809d4b64ec8514f18faa8e11e97d6c2d1afa1bcf6c20a8eab",
"sha256:ac88856a8cbccfc14f1b2d0b829af354cc1743cb375e7f04251ae73b2af6adf8", "sha256:8a5c2250c0a74428fd5507ae8853706fdde0f23bfb62ee1ec9418eeacf216078",
"sha256:b4c220a1fe0d2c622493b0a1fd48f8f991998fb447d3cd368033a4b86cf1127a", "sha256:8aec4b4da165c4a64ea80443c16e49e3b15df0f56c124ac5f2f8708a65a0eddc",
"sha256:b844fb09bd9936ed158ff9df0ab601e2045b316b17aa8b931857365ea8586906", "sha256:8c268e78d175798cd71d29114b0a1f1391c7d011995267d3b62319ec1a4ecaa1",
"sha256:bdc178caebd0f338d57ae445ef8e9b737ddf8fbc3ea187603f65aec5b041248f", "sha256:8d80087320632457aefc73f686f66139801959bf5b066b4419b92be85be3543c",
"sha256:c206587c83e795d417ed3adc8453a791f6d36b67c81416676cad053b4104152c", "sha256:95e89a8558c8c48626dcffdf9c8abac26b7c251d352688e7ab9baf351e1c7da6",
"sha256:c61dcc1cf9fd165127a2853e2c31eb4fb961a4f26b394ac9fe5669c7a6592892", "sha256:9c371dd326289d85906c27ec2bc1dcdedd9d0be12b543d16e37bad35754bde48",
"sha256:c7cb4c512d2d3b0870e00fbbac2f291d4b4bf2634d59a31176a87afe2777c6f0", "sha256:9c7cb25adba814d5f419733fe565f3289d6fa629ab9e0b78f6dff5fa94ab0456",
"sha256:d4a332404baa6665b54e5d283b4262f41f2103c255897084ec8f5487ce7b9e8e", "sha256:a731552729ee8ae9c546fb1c651c97bf5f759018fdd40d0e9b4d129e1e3a44c8",
"sha256:d5111d4c843d80202e62b4fdbb4920db1dcee4f9366d6b03294f45ed7b18b42e", "sha256:aea4006b73b555fc5bdb650a8b92cf486d678afa168cf9b38402bb60bf0f9c18",
"sha256:e1e8406b895aba6caa63d9fd1b6b1700d7e4825f78ccb1e5260551d168db38ed", "sha256:b0e3f59d3c772f2c3baaef2db425e6fc4149d35a052d874bb95ccfca10a1b9f4",
"sha256:e8690ed94481f219a7a967c118abaf71ccc440f69acd583cab721b90eeedb77c", "sha256:b15dc34273aefe522df25096d5d087abc626e388a28a28ac75a4404bb7668736",
"sha256:ed283ab3a01d8b53de3a05bfdf4473ae24e43caee7dcb5584e86f3f3e5ab4374", "sha256:c000635fd78400a558bd7a3c2981bb2a430005ebaa909d31e6e300719739a949",
"sha256:ed4b50355b066796dacdd1cf538f2ce57275d001838f9b132fab80b75e8c84dd", "sha256:c31f35a984caffb75f00a86852951a337540b44e4a22171354fb760cefa09346",
"sha256:ee329d0387b5b41a5dddbb6243a21cb7896587a651bebb957e2d2bb8b63c0791", "sha256:c50a6379763c733562b1fee877372234d271e5c78cd13ade5f25978aa06744db",
"sha256:f3bf1bc02bc421047bfec3343729c4bbbea42605bcfd6d6bfe2c07ade8b12d2a", "sha256:c94722bf403b8da744b7d0bb87e1f2529383003ceec92e754f768ef9323f69ad",
"sha256:f585cbbeecb35f35609edccb95efd95a3e35824cd7752b586503f7e6087303f1", "sha256:dcbbc9cfa147d55a577d285fd479b43103188855074552708df7acc31a476dd9",
"sha256:f60667673ff9c249709160529ab39667d1ae9fd38634e006bec95611f632e759" "sha256:fb9f5844db480e2ef9fce3a72e71122dd010ab7b2920f777966ba25f7eb63819"
], ],
"version": "==2021.8.28" "version": "==2021.9.24"
}, },
"requests": { "requests": {
"hashes": [ "hashes": [

View File

@ -84,7 +84,7 @@ class SystemSerializer(PassiveSerializer):
return now() return now()
def get_embedded_outpost_host(self, request: Request) -> str: def get_embedded_outpost_host(self, request: Request) -> str:
"""Get the FQDN configured on the embeddded outpost""" """Get the FQDN configured on the embedded outpost"""
outposts = Outpost.objects.filter(managed=MANAGED_OUTPOST) outposts = Outpost.objects.filter(managed=MANAGED_OUTPOST)
if not outposts.exists(): if not outposts.exists():
return "" return ""

View File

@ -11,7 +11,7 @@ from drf_spectacular.types import OpenApiTypes
def build_standard_type(obj, **kwargs): def build_standard_type(obj, **kwargs):
"""Build a basic type with optional add ons.""" """Build a basic type with optional add owns."""
schema = build_basic_type(obj) schema = build_basic_type(obj)
schema.update(kwargs) schema.update(kwargs)
return schema return schema

View File

@ -63,7 +63,7 @@ class ConfigView(APIView):
@extend_schema(responses={200: ConfigSerializer(many=False)}) @extend_schema(responses={200: ConfigSerializer(many=False)})
def get(self, request: Request) -> Response: def get(self, request: Request) -> Response:
"""Retrive public configuration options""" """Retrieve public configuration options"""
config = ConfigSerializer( config = ConfigSerializer(
{ {
"error_reporting_enabled": CONFIG.y("error_reporting.enabled"), "error_reporting_enabled": CONFIG.y("error_reporting.enabled"),

View File

@ -77,7 +77,7 @@ def sanitize_dict(source: dict[Any, Any]) -> dict[Any, Any]:
final_dict = {} final_dict = {}
for key, value in source.items(): for key, value in source.items():
if is_dataclass(value): if is_dataclass(value):
# Because asdict calls `copy.deepcopy(obj)` on everything thats not tuple/dict, # Because asdict calls `copy.deepcopy(obj)` on everything that's not tuple/dict,
# and deepcopy doesn't work with HttpRequests (neither django nor rest_framework). # and deepcopy doesn't work with HttpRequests (neither django nor rest_framework).
# Currently, the only dataclass that actually holds an http request is a PolicyRequest # Currently, the only dataclass that actually holds an http request is a PolicyRequest
if isinstance(value, PolicyRequest): if isinstance(value, PolicyRequest):

View File

@ -57,11 +57,11 @@ class FlowPlan:
markers: list[StageMarker] = field(default_factory=list) markers: list[StageMarker] = field(default_factory=list)
def append_stage(self, stage: Stage, marker: Optional[StageMarker] = None): def append_stage(self, stage: Stage, marker: Optional[StageMarker] = None):
"""Append `stage` to all stages, optionall with stage marker""" """Append `stage` to all stages, optionally with stage marker"""
return self.append(FlowStageBinding(stage=stage), marker) return self.append(FlowStageBinding(stage=stage), marker)
def append(self, binding: FlowStageBinding, marker: Optional[StageMarker] = None): def append(self, binding: FlowStageBinding, marker: Optional[StageMarker] = None):
"""Append `stage` to all stages, optionall with stage marker""" """Append `stage` to all stages, optionally with stage marker"""
self.bindings.append(binding) self.bindings.append(binding)
self.markers.append(marker or StageMarker()) self.markers.append(marker or StageMarker())

View File

@ -438,7 +438,7 @@ class TestFlowExecutor(APITestCase):
# third request, this should trigger the re-evaluate # third request, this should trigger the re-evaluate
# A get request will evaluate the policies and this will return stage 4 # A get request will evaluate the policies and this will return stage 4
# but it won't save it, hence we cant' check the plan # but it won't save it, hence we can't check the plan
response = self.client.get(exec_url) response = self.client.get(exec_url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertJSONEqual( self.assertJSONEqual(

View File

@ -11,7 +11,7 @@ from authentik.lib.sentry import SentryIgnoredException
def get_attrs(obj: SerializerModel) -> dict[str, Any]: def get_attrs(obj: SerializerModel) -> dict[str, Any]:
"""Get object's attributes via their serializer, and covert it to a normal dict""" """Get object's attributes via their serializer, and convert it to a normal dict"""
data = dict(obj.serializer(obj).data) data = dict(obj.serializer(obj).data)
to_remove = ( to_remove = (
"policies", "policies",

View File

@ -126,12 +126,12 @@ class FlowExecutorView(APIView):
# pylint: disable=unused-argument, too-many-return-statements # pylint: disable=unused-argument, too-many-return-statements
def dispatch(self, request: HttpRequest, flow_slug: str) -> HttpResponse: def dispatch(self, request: HttpRequest, flow_slug: str) -> HttpResponse:
# Early check if theres an active Plan for the current session # Early check if there's an active Plan for the current session
if SESSION_KEY_PLAN in self.request.session: if SESSION_KEY_PLAN in self.request.session:
self.plan = self.request.session[SESSION_KEY_PLAN] self.plan = self.request.session[SESSION_KEY_PLAN]
if self.plan.flow_pk != self.flow.pk.hex: if self.plan.flow_pk != self.flow.pk.hex:
self._logger.warning( self._logger.warning(
"f(exec): Found existing plan for other flow, deleteing plan", "f(exec): Found existing plan for other flow, deleting plan",
) )
# Existing plan is deleted from session and instance # Existing plan is deleted from session and instance
self.plan = None self.plan = None
@ -433,7 +433,7 @@ class ToDefaultFlow(View):
plan: FlowPlan = self.request.session[SESSION_KEY_PLAN] plan: FlowPlan = self.request.session[SESSION_KEY_PLAN]
if plan.flow_pk != flow.pk.hex: if plan.flow_pk != flow.pk.hex:
LOGGER.warning( LOGGER.warning(
"f(def): Found existing plan for other flow, deleteing plan", "f(def): Found existing plan for other flow, deleting plan",
flow_slug=flow.slug, flow_slug=flow.slug,
) )
del self.request.session[SESSION_KEY_PLAN] del self.request.session[SESSION_KEY_PLAN]

View File

@ -32,7 +32,7 @@ class TestConfig(TestCase):
config = ConfigLoader() config = ConfigLoader()
environ["foo"] = "bar" environ["foo"] = "bar"
self.assertEqual(config.parse_uri("env://foo"), "bar") self.assertEqual(config.parse_uri("env://foo"), "bar")
self.assertEqual(config.parse_uri("env://fo?bar"), "bar") self.assertEqual(config.parse_uri("env://foo?bar"), "bar")
def test_uri_file(self): def test_uri_file(self):
"""Test URI parsing (file load)""" """Test URI parsing (file load)"""

View File

@ -27,7 +27,7 @@ class TestHTTP(TestCase):
token = Token.objects.create( token = Token.objects.create(
identifier="test", user=self.user, intent=TokenIntents.INTENT_API identifier="test", user=self.user, intent=TokenIntents.INTENT_API
) )
# Invalid, non-existant token # Invalid, non-existent token
request = self.factory.get( request = self.factory.get(
"/", "/",
**{ **{
@ -36,7 +36,7 @@ class TestHTTP(TestCase):
}, },
) )
self.assertEqual(get_client_ip(request), "127.0.0.1") self.assertEqual(get_client_ip(request), "127.0.0.1")
# Invalid, user doesn't have permisions # Invalid, user doesn't have permissions
request = self.factory.get( request = self.factory.get(
"/", "/",
**{ **{

View File

@ -104,7 +104,7 @@ class OutpostConsumer(AuthJsonConsumer):
expected=self.outpost.config.kubernetes_replicas, expected=self.outpost.config.kubernetes_replicas,
).inc() ).inc()
LOGGER.debug( LOGGER.debug(
"added outpost instace to cache", "added outpost instance to cache",
outpost=self.outpost, outpost=self.outpost,
instance_uuid=self.last_uid, instance_uuid=self.last_uid,
) )

View File

@ -109,7 +109,7 @@ class KubernetesObjectReconciler(Generic[T]):
except (OpenApiException, HTTPError) as exc: except (OpenApiException, HTTPError) as exc:
# pylint: disable=no-member # pylint: disable=no-member
if isinstance(exc, ApiException) and exc.status == 404: if isinstance(exc, ApiException) and exc.status == 404:
self.logger.debug("Failed to get current, assuming non-existant") self.logger.debug("Failed to get current, assuming non-existent")
return return
self.logger.debug("Other unhandled error", exc=exc) self.logger.debug("Other unhandled error", exc=exc)
raise exc raise exc
@ -129,7 +129,7 @@ class KubernetesObjectReconciler(Generic[T]):
raise NotImplementedError raise NotImplementedError
def retrieve(self) -> T: def retrieve(self) -> T:
"""API Wrapper to retrive object""" """API Wrapper to retrieve object"""
raise NotImplementedError raise NotImplementedError
def delete(self, reference: T): def delete(self, reference: T):

View File

@ -181,7 +181,7 @@ def outpost_post_save(model_class: str, model_pk: Any):
def outpost_send_update(model_instace: Model): def outpost_send_update(model_instace: Model):
"""Send outpost update to all registered outposts, irregardless to which authentik """Send outpost update to all registered outposts, regardless to which authentik
instance they are connected""" instance they are connected"""
channel_layer = get_channel_layer() channel_layer = get_channel_layer()
if isinstance(model_instace, OutpostModel): if isinstance(model_instace, OutpostModel):
@ -208,7 +208,7 @@ def _outpost_single_update(outpost: Outpost, layer=None):
@CELERY_APP.task() @CELERY_APP.task()
def outpost_local_connection(): def outpost_local_connection():
"""Checks the local environment and create Service connections.""" """Checks the local environment and create Service connections."""
# Explicitly check against token filename, as thats # Explicitly check against token filename, as that's
# only present when the integration is enabled # only present when the integration is enabled
if Path(SERVICE_TOKEN_FILENAME).exists(): if Path(SERVICE_TOKEN_FILENAME).exists():
LOGGER.debug("Detected in-cluster Kubernetes Config") LOGGER.debug("Detected in-cluster Kubernetes Config")

View File

@ -46,7 +46,7 @@ def cache_key(binding: PolicyBinding, request: PolicyRequest) -> str:
class PolicyProcess(PROCESS_CLASS): class PolicyProcess(PROCESS_CLASS):
"""Evaluate a single policy within a seprate process""" """Evaluate a single policy within a separate process"""
connection: Connection connection: Connection
binding: PolicyBinding binding: PolicyBinding

View File

@ -34,7 +34,7 @@ def update_score(request: HttpRequest, username: str, amount: int):
@receiver(user_login_failed) @receiver(user_login_failed)
# pylint: disable=unused-argument # pylint: disable=unused-argument
def handle_failed_login(sender, request, credentials, **_): def handle_failed_login(sender, request, credentials, **_):
"""Lower Score for failed loging attempts""" """Lower Score for failed login attempts"""
if "username" in credentials: if "username" in credentials:
update_score(request, credentials.get("username"), -1) update_score(request, credentials.get("username"), -1)

View File

@ -14,7 +14,7 @@ from authentik.policies.types import PolicyRequest
def clear_policy_cache(): def clear_policy_cache():
"""Ensure no policy-related keys are stil cached""" """Ensure no policy-related keys are still cached"""
keys = cache.keys("policy_*") keys = cache.keys("policy_*")
cache.delete(keys) cache.delete(keys)

View File

@ -1,11 +1,11 @@
"""LDAP Provider Docker Contoller""" """LDAP Provider Docker Controller"""
from authentik.outposts.controllers.base import DeploymentPort from authentik.outposts.controllers.base import DeploymentPort
from authentik.outposts.controllers.docker import DockerController from authentik.outposts.controllers.docker import DockerController
from authentik.outposts.models import DockerServiceConnection, Outpost from authentik.outposts.models import DockerServiceConnection, Outpost
class LDAPDockerController(DockerController): class LDAPDockerController(DockerController):
"""LDAP Provider Docker Contoller""" """LDAP Provider Docker Controller"""
def __init__(self, outpost: Outpost, connection: DockerServiceConnection): def __init__(self, outpost: Outpost, connection: DockerServiceConnection):
super().__init__(outpost, connection) super().__init__(outpost, connection)

View File

@ -1,11 +1,11 @@
"""LDAP Provider Kubernetes Contoller""" """LDAP Provider Kubernetes Controller"""
from authentik.outposts.controllers.base import DeploymentPort from authentik.outposts.controllers.base import DeploymentPort
from authentik.outposts.controllers.kubernetes import KubernetesController from authentik.outposts.controllers.kubernetes import KubernetesController
from authentik.outposts.models import KubernetesServiceConnection, Outpost from authentik.outposts.models import KubernetesServiceConnection, Outpost
class LDAPKubernetesController(KubernetesController): class LDAPKubernetesController(KubernetesController):
"""LDAP Provider Kubernetes Contoller""" """LDAP Provider Kubernetes Controller"""
def __init__(self, outpost: Outpost, connection: KubernetesServiceConnection): def __init__(self, outpost: Outpost, connection: KubernetesServiceConnection):
super().__init__(outpost, connection) super().__init__(outpost, connection)

View File

@ -153,7 +153,7 @@ def protected_resource_view(scopes: list[str]):
if not set(scopes).issubset(set(token.scope)): if not set(scopes).issubset(set(token.scope)):
LOGGER.warning( LOGGER.warning(
"Scope missmatch.", "Scope mismatch.",
required=set(scopes), required=set(scopes),
token_has=set(token.scope), token_has=set(token.scope),
) )

View File

@ -33,7 +33,7 @@ class UserInfoView(View):
for scope in ScopeMapping.objects.filter(scope_name__in=scopes).order_by("scope_name"): for scope in ScopeMapping.objects.filter(scope_name__in=scopes).order_by("scope_name"):
if scope.description != "": if scope.description != "":
scope_descriptions.append({"id": scope.scope_name, "name": scope.description}) scope_descriptions.append({"id": scope.scope_name, "name": scope.description})
# GitHub Compatibility Scopes are handeled differently, since they required custom paths # GitHub Compatibility Scopes are handled differently, since they required custom paths
# Hence they don't exist as Scope objects # Hence they don't exist as Scope objects
github_scope_map = { github_scope_map = {
SCOPE_GITHUB_USER: ("GitHub Compatibility: Access your User Information"), SCOPE_GITHUB_USER: ("GitHub Compatibility: Access your User Information"),

View File

@ -1,4 +1,4 @@
"""Proxy Provider Docker Contoller""" """Proxy Provider Docker Controller"""
from urllib.parse import urlparse from urllib.parse import urlparse
from authentik.outposts.controllers.base import DeploymentPort from authentik.outposts.controllers.base import DeploymentPort
@ -8,7 +8,7 @@ from authentik.providers.proxy.models import ProxyProvider
class ProxyDockerController(DockerController): class ProxyDockerController(DockerController):
"""Proxy Provider Docker Contoller""" """Proxy Provider Docker Controller"""
def __init__(self, outpost: Outpost, connection: DockerServiceConnection): def __init__(self, outpost: Outpost, connection: DockerServiceConnection):
super().__init__(outpost, connection) super().__init__(outpost, connection)

View File

@ -1,4 +1,4 @@
"""Proxy Provider Kubernetes Contoller""" """Proxy Provider Kubernetes Controller"""
from authentik.outposts.controllers.base import DeploymentPort from authentik.outposts.controllers.base import DeploymentPort
from authentik.outposts.controllers.kubernetes import KubernetesController from authentik.outposts.controllers.kubernetes import KubernetesController
from authentik.outposts.models import KubernetesServiceConnection, Outpost from authentik.outposts.models import KubernetesServiceConnection, Outpost
@ -7,7 +7,7 @@ from authentik.providers.proxy.controllers.k8s.traefik import TraefikMiddlewareR
class ProxyKubernetesController(KubernetesController): class ProxyKubernetesController(KubernetesController):
"""Proxy Provider Kubernetes Contoller""" """Proxy Provider Kubernetes Controller"""
def __init__(self, outpost: Outpost, connection: KubernetesServiceConnection): def __init__(self, outpost: Outpost, connection: KubernetesServiceConnection):
super().__init__(outpost, connection) super().__init__(outpost, connection)

View File

@ -119,7 +119,7 @@ class LDAPPasswordChanger:
return True return True
def ad_password_complexity(self, password: str, user: Optional[User] = None) -> bool: def ad_password_complexity(self, password: str, user: Optional[User] = None) -> bool:
"""Check if password matches Active direcotry password policies """Check if password matches Active directory password policies
https://docs.microsoft.com/en-us/windows/security/threat-protection/ https://docs.microsoft.com/en-us/windows/security/threat-protection/
security-policy-settings/password-must-meet-complexity-requirements security-policy-settings/password-must-meet-complexity-requirements

View File

@ -48,7 +48,7 @@ def ldap_password_validate(sender, password: str, plan_context: dict[str, Any],
password, plan_context.get(PLAN_CONTEXT_PENDING_USER, None) password, plan_context.get(PLAN_CONTEXT_PENDING_USER, None)
) )
if not passing: if not passing:
raise ValidationError(_("Password does not match Active Direcory Complexity.")) raise ValidationError(_("Password does not match Active Directory Complexity."))
@receiver(password_changed) @receiver(password_changed)

View File

@ -46,9 +46,9 @@ class OAuthSourceSerializer(SourceSerializer):
type = SerializerMethodField() type = SerializerMethodField()
@extend_schema_field(SourceTypeSerializer) @extend_schema_field(SourceTypeSerializer)
def get_type(self, instace: OAuthSource) -> SourceTypeSerializer: def get_type(self, instance: OAuthSource) -> SourceTypeSerializer:
"""Get source's type configuration""" """Get source's type configuration"""
return SourceTypeSerializer(instace.type).data return SourceTypeSerializer(instance.type).data
def validate(self, attrs: dict) -> dict: def validate(self, attrs: dict) -> dict:
provider_type = MANAGER.find_type(attrs.get("provider_type", "")) provider_type = MANAGER.find_type(attrs.get("provider_type", ""))

View File

@ -14,7 +14,7 @@ class Migration(migrations.Migration):
model_name="oauthsource", model_name="oauthsource",
name="access_token_url", name="access_token_url",
field=models.CharField( field=models.CharField(
help_text="URL used by authentik to retrive tokens.", help_text="URL used by authentik to retrieve tokens.",
max_length=255, max_length=255,
verbose_name="Access Token URL", verbose_name="Access Token URL",
), ),

View File

@ -15,7 +15,7 @@ class Migration(migrations.Migration):
name="access_token_url", name="access_token_url",
field=models.CharField( field=models.CharField(
blank=True, blank=True,
help_text="URL used by authentik to retrive tokens.", help_text="URL used by authentik to retrieve tokens.",
max_length=255, max_length=255,
verbose_name="Access Token URL", verbose_name="Access Token URL",
), ),

View File

@ -39,7 +39,7 @@ class Migration(migrations.Migration):
model_name="oauthsource", model_name="oauthsource",
name="access_token_url", name="access_token_url",
field=models.CharField( field=models.CharField(
help_text="URL used by authentik to retrive tokens.", help_text="URL used by authentik to retrieve tokens.",
max_length=255, max_length=255,
null=True, null=True,
verbose_name="Access Token URL", verbose_name="Access Token URL",

View File

@ -37,7 +37,7 @@ class OAuthSource(Source):
max_length=255, max_length=255,
null=True, null=True,
verbose_name=_("Access Token URL"), verbose_name=_("Access Token URL"),
help_text=_("URL used by authentik to retrive tokens."), help_text=_("URL used by authentik to retrieve tokens."),
) )
profile_url = models.CharField( profile_url = models.CharField(
max_length=255, max_length=255,

View File

@ -24,7 +24,7 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name="plexsource", model_name="plexsource",
name="plex_token", name="plex_token",
field=models.TextField(default="", help_text="Plex token used to check firends"), field=models.TextField(default="", help_text="Plex token used to check friends"),
), ),
migrations.AlterField( migrations.AlterField(
model_name="plexsource", model_name="plexsource",

View File

@ -13,6 +13,6 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name="plexsource", model_name="plexsource",
name="plex_token", name="plex_token",
field=models.TextField(help_text="Plex token used to check firends"), field=models.TextField(help_text="Plex token used to check friends"),
), ),
] ]

View File

@ -50,7 +50,7 @@ class PlexSource(Source):
default=True, default=True,
help_text=_("Allow friends to authenticate, even if you don't share a server."), help_text=_("Allow friends to authenticate, even if you don't share a server."),
) )
plex_token = models.TextField(help_text=_("Plex token used to check firends")) plex_token = models.TextField(help_text=_("Plex token used to check friends"))
@property @property
def component(self) -> str: def component(self) -> str:

View File

@ -54,7 +54,7 @@ class CaptchaChallengeResponse(ChallengeResponse):
class CaptchaStageView(ChallengeStageView): class CaptchaStageView(ChallengeStageView):
"""Simple captcha checker, logic is handeled in django-captcha module""" """Simple captcha checker, logic is handled in django-captcha module"""
response_class = CaptchaChallengeResponse response_class = CaptchaChallengeResponse

View File

@ -15,7 +15,7 @@ import { EVENT_SIDEBAR_TOGGLE } from "../../constants";
import { first } from "../../utils"; import { first } from "../../utils";
// If the viewport is wider than MIN_WIDTH, the sidebar // If the viewport is wider than MIN_WIDTH, the sidebar
// is shown besides the content, and not overlayed. // is shown besides the content, and not overlaid.
export const MIN_WIDTH = 1200; export const MIN_WIDTH = 1200;
export const DefaultTenant: CurrentTenant = { export const DefaultTenant: CurrentTenant = {

View File

@ -605,8 +605,8 @@ msgid "Certificate Fingerprint (SHA256)"
msgstr "Certificate Fingerprint (SHA256)" msgstr "Certificate Fingerprint (SHA256)"
#: src/pages/crypto/CertificateKeyPairListPage.ts #: src/pages/crypto/CertificateKeyPairListPage.ts
msgid "Certificate Subjet" msgid "Certificate Subject"
msgstr "Certificate Subjet" msgstr "Certificate Subject"
#: src/pages/providers/saml/SAMLProviderForm.ts #: src/pages/providers/saml/SAMLProviderForm.ts
msgid "Certificate used to sign outgoing Responses going to the Service Provider." msgid "Certificate used to sign outgoing Responses going to the Service Provider."
@ -3659,8 +3659,8 @@ msgid "Select users to add"
msgstr "Select users to add" msgstr "Select users to add"
#: src/pages/providers/oauth2/OAuth2ProviderForm.ts #: src/pages/providers/oauth2/OAuth2ProviderForm.ts
msgid "Select which scopes can be used by the client. The client stil has to specify the scope to access the data." msgid "Select which scopes can be used by the client. The client still has to specify the scope to access the data."
msgstr "Select which scopes can be used by the client. The client stil has to specify the scope to access the data." msgstr "Select which scopes can be used by the client. The client still has to specify the scope to access the data."
#: src/pages/sources/plex/PlexSourceForm.ts #: src/pages/sources/plex/PlexSourceForm.ts
msgid "Select which server a user has to be a member of to be allowed to authenticate." msgid "Select which server a user has to be a member of to be allowed to authenticate."
@ -4552,6 +4552,10 @@ msgstr "Title"
msgid "To" msgid "To"
msgstr "To" msgstr "To"
#: src/pages/users/UserListPage.ts
msgid "To directly reset a user's password, configure a recovery flow on the currently active tenant."
msgstr "To directly reset a user's password, configure a recovery flow on the currently active tenant."
#: src/pages/sources/ldap/LDAPSourceForm.ts #: src/pages/sources/ldap/LDAPSourceForm.ts
msgid "To use SSL instead, use 'ldaps://' and disable this option." msgid "To use SSL instead, use 'ldaps://' and disable this option."
msgstr "To use SSL instead, use 'ldaps://' and disable this option." msgstr "To use SSL instead, use 'ldaps://' and disable this option."

View File

@ -601,7 +601,7 @@ msgid "Certificate Fingerprint (SHA256)"
msgstr "" msgstr ""
#: src/pages/crypto/CertificateKeyPairListPage.ts #: src/pages/crypto/CertificateKeyPairListPage.ts
msgid "Certificate Subjet" msgid "Certificate Subject"
msgstr "" msgstr ""
#: src/pages/providers/saml/SAMLProviderForm.ts #: src/pages/providers/saml/SAMLProviderForm.ts
@ -3651,7 +3651,7 @@ msgid "Select users to add"
msgstr "" msgstr ""
#: src/pages/providers/oauth2/OAuth2ProviderForm.ts #: src/pages/providers/oauth2/OAuth2ProviderForm.ts
msgid "Select which scopes can be used by the client. The client stil has to specify the scope to access the data." msgid "Select which scopes can be used by the client. The client still has to specify the scope to access the data."
msgstr "" msgstr ""
#: src/pages/sources/plex/PlexSourceForm.ts #: src/pages/sources/plex/PlexSourceForm.ts
@ -4537,6 +4537,10 @@ msgstr ""
msgid "To" msgid "To"
msgstr "" msgstr ""
#: src/pages/users/UserListPage.ts
msgid "To directly reset a user's password, configure a recovery flow on the currently active tenant."
msgstr ""
#: src/pages/sources/ldap/LDAPSourceForm.ts #: src/pages/sources/ldap/LDAPSourceForm.ts
msgid "To use SSL instead, use 'ldaps://' and disable this option." msgid "To use SSL instead, use 'ldaps://' and disable this option."
msgstr "" msgstr ""

View File

@ -137,7 +137,7 @@ export class CertificateKeyPairListPage extends TablePage<CertificateKeyPair> {
<div class="pf-c-description-list__group"> <div class="pf-c-description-list__group">
<dt class="pf-c-description-list__term"> <dt class="pf-c-description-list__term">
<span class="pf-c-description-list__text" <span class="pf-c-description-list__text"
>${t`Certificate Subjet`}</span >${t`Certificate Subject`}</span
> >
</dt> </dt>
<dd class="pf-c-description-list__description"> <dd class="pf-c-description-list__description">

View File

@ -104,7 +104,7 @@ export class StageBindingForm extends ModelForm<FlowStageBinding, string> {
}) })
.then((flows) => { .then((flows) => {
return flows.results.map((flow) => { return flows.results.map((flow) => {
// No ?selected check here, as this input isnt shown on update forms // No ?selected check here, as this input isn't shown on update forms
return html`<option value=${ifDefined(flow.pk)}> return html`<option value=${ifDefined(flow.pk)}>
${flow.name} (${flow.slug}) ${flow.name} (${flow.slug})
</option>`; </option>`;

View File

@ -277,7 +277,7 @@ ${this.instance?.redirectUris}</textarea
)} )}
</select> </select>
<p class="pf-c-form__helper-text"> <p class="pf-c-form__helper-text">
${t`Select which scopes can be used by the client. The client stil has to specify the scope to access the data.`} ${t`Select which scopes can be used by the client. The client still has to specify the scope to access the data.`}
</p> </p>
<p class="pf-c-form__helper-text"> <p class="pf-c-form__helper-text">
${t`Hold control/command to select multiple items.`} ${t`Hold control/command to select multiple items.`}

View File

@ -178,8 +178,8 @@ export class UserListPage extends TablePage<User> {
<dd class="pf-c-description-list__description"> <dd class="pf-c-description-list__description">
<div class="pf-c-description-list__text"> <div class="pf-c-description-list__text">
${until( ${until(
tenant().then((te) => { tenant().then((tenant) => {
if (!te.flowRecovery) { if (!tenant.flowRecovery) {
return html` return html`
<p> <p>
${t`To directly reset a user's password, configure a recovery flow on the currently active tenant.`} ${t`To directly reset a user's password, configure a recovery flow on the currently active tenant.`}