diff --git a/.github/codespell-words.txt b/.github/codespell-words.txt new file mode 100644 index 000000000..31648d9d9 --- /dev/null +++ b/.github/codespell-words.txt @@ -0,0 +1 @@ +keypair diff --git a/Makefile b/Makefile index b9628f180..59b6159eb 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,11 @@ test: lint-fix: isort 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: pyright authentik tests lifecycle diff --git a/Pipfile b/Pipfile index 03c5f2a2c..0f1dcd783 100644 --- a/Pipfile +++ b/Pipfile @@ -48,6 +48,7 @@ duo-client = "*" ua-parser = "*" deepmerge = "*" colorama = "*" +codespell = "*" [dev-packages] bandit = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 891e48096..422730dfe 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "19d5324fd1a4af125ed57a683030ca14ee2d3648117748e4b32656875484728e" + "sha256": "babb6061c555f8f239f00210b2a0356763bdaaca2f3d704cf3444891b84db84d" }, "pipfile-spec": 6, "requires": {}, @@ -120,19 +120,19 @@ }, "boto3": { "hashes": [ - "sha256:07260ec42a21c31a13b07ffbf219811a79be60d2eb9a99cedfec65c2a5f2155d", - "sha256:52d87c94511226ccacd9e94335eb8f8f980b97964f63db92b97148b5486330a7" + "sha256:7b45b224442c479de4bc6e6e9cb0557b642fc7a77edc8702e393ccaa2e0aa128", + "sha256:c388da7dc1a596755f39de990a72e05cee558d098e81de63de55bd9598cc5134" ], "index": "pypi", - "version": "==1.18.47" + "version": "==1.18.48" }, "botocore": { "hashes": [ - "sha256:282951e8cde2c93fa436e5a7acfeb02f815de823bc3dac745ea51f971a1052e4", - "sha256:57637772b837da290239b1a9a6676ae2dd8a64833ab7770dc67d169d09bc80b3" + "sha256:2c25a76f09223b2f00ad578df34492b7b84cd4828fc90c08ccbdd1d70abbd7eb", + "sha256:9d5b70be2f417d0aa30788049fd20473ad27218eccd05e71f545b4b4e09c79a0" ], "markers": "python_version >= '3.6'", - "version": "==1.21.47" + "version": "==1.21.48" }, "cachetools": { "hashes": [ @@ -286,6 +286,14 @@ ], "version": "==0.2.0" }, + "codespell": { + "hashes": [ + "sha256:19d3fe5644fef3425777e66f225a8c82d39059dcfe9edb3349a8a2cf48383ee5", + "sha256:b864c7d917316316ac24272ee992d7937c3519be4569209c5b60035ac5d569b5" + ], + "index": "pypi", + "version": "==2.1.0" + }, "colorama": { "hashes": [ "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", @@ -371,11 +379,11 @@ }, "django-filter": { "hashes": [ - "sha256:84e9d5bb93f237e451db814ed422a3a625751cbc9968b484ecc74964a8696b06", - "sha256:e00d32cebdb3d54273c48f4f878f898dced8d5dfaad009438fe61ebdf535ace1" + "sha256:632a251fa8f1aadb4b8cceff932bb52fe2f826dd7dfe7f3eac40e5c463d6836e", + "sha256:f4a6737a30104c98d2e2a5fb93043f36dd7978e0c7ddc92f5998e85433ea5063" ], "index": "pypi", - "version": "==2.4.0" + "version": "==21.1" }, "django-guardian": { "hashes": [ @@ -482,11 +490,11 @@ }, "geoip2": { "hashes": [ - "sha256:599914784cea08b50fb50c22ed6a59143b5ff2d027ba782d2d5b6f3668293821", - "sha256:7ad10942e9fd6c54bc850d8311618f04dacd3fff5b55ba48b7ad83502fc884bd" + "sha256:f150bed3190d543712a17467208388d31bd8ddb49b2226fba53db8aaedb8ba89", + "sha256:f9172cdfb2a5f9225ace5e30dd7426413ad28798a5f474cd1538780686bd6a87" ], "index": "pypi", - "version": "==4.3.0" + "version": "==4.4.0" }, "google-auth": { "hashes": [ @@ -706,10 +714,10 @@ }, "maxminddb": { "hashes": [ - "sha256:c47b8acba98d03b8c762684d899623c257976f3eb0c9d557ff865d20cddc9d6b" + "sha256:e37707ec4fab115804670e0fb7aedb4b57075a8b6f80052bdc648d3c005184e5" ], "markers": "python_version >= '3.6'", - "version": "==2.1.0" + "version": "==2.2.0" }, "msgpack": { "hashes": [ @@ -900,39 +908,39 @@ }, "pycryptodome": { "hashes": [ - "sha256:09c1555a3fa450e7eaca41ea11cd00afe7c91fef52353488e65663777d8524e0", - "sha256:12222a5edc9ca4a29de15fbd5339099c4c26c56e13c2ceddf0b920794f26165d", - "sha256:1723ebee5561628ce96748501cdaa7afaa67329d753933296321f0be55358dce", - "sha256:1c5e1ca507de2ad93474be5cfe2bfa76b7cf039a1a32fc196f40935944871a06", - "sha256:2603c98ae04aac675fefcf71a6c87dc4bb74a75e9071ae3923bbc91a59f08d35", - "sha256:2dea65df54349cdfa43d6b2e8edb83f5f8d6861e5cf7b1fbc3e34c5694c85e27", - "sha256:31c1df17b3dc5f39600a4057d7db53ac372f492c955b9b75dd439f5d8b460129", - "sha256:38661348ecb71476037f1e1f553159b80d256c00f6c0b00502acac891f7116d9", - "sha256:3e2e3a06580c5f190df843cdb90ea28d61099cf4924334d5297a995de68e4673", - "sha256:3f840c49d38986f6e17dbc0673d37947c88bc9d2d9dba1c01b979b36f8447db1", - "sha256:501ab36aae360e31d0ec370cf5ce8ace6cb4112060d099b993bc02b36ac83fb6", - "sha256:60386d1d4cfaad299803b45a5bc2089696eaf6cdd56f9fc17479a6f89595cfc8", - "sha256:6260e24d41149268122dd39d4ebd5941e9d107f49463f7e071fd397e29923b0c", - "sha256:6bbf7fee7b7948b29d7e71fcacf48bac0c57fb41332007061a933f2d996f9713", - "sha256:6d2df5223b12437e644ce0a3be7809471ffa71de44ccd28b02180401982594a6", - "sha256:758949ca62690b1540dfb24ad773c6da9cd0e425189e83e39c038bbd52b8e438", - "sha256:77997519d8eb8a4adcd9a47b9cec18f9b323e296986528186c0e9a7a15d6a07e", - "sha256:7fd519b89585abf57bf47d90166903ec7b43af4fe23c92273ea09e6336af5c07", - "sha256:98213ac2b18dc1969a47bc65a79a8fca02a414249d0c8635abb081c7f38c91b6", - "sha256:99b2f3fc51d308286071d0953f92055504a6ffe829a832a9fc7a04318a7683dd", - "sha256:9b6f711b25e01931f1c61ce0115245a23cdc8b80bf8539ac0363bdcf27d649b6", - "sha256:a3105a0eb63eacf98c2ecb0eb4aa03f77f40fbac2bdde22020bb8a536b226bb8", - "sha256:a8eb8b6ea09ec1c2535bf39914377bc8abcab2c7d30fa9225eb4fe412024e427", - "sha256:a92d5c414e8ee1249e850789052608f582416e82422502dc0ac8c577808a9067", - "sha256:d3d6958d53ad307df5e8469cc44474a75393a434addf20ecd451f38a72fe29b8", - "sha256:e0a4d5933a88a2c98bbe19c0c722f5483dc628d7a38338ac2cb64a7dbd34064b", - "sha256:e3bf558c6aeb49afa9f0c06cee7fb5947ee5a1ff3bd794b653d39926b49077fa", - "sha256:e61e363d9a5d7916f3a4ce984a929514c0df3daf3b1b2eb5e6edbb131ee771cf", - "sha256:f977cdf725b20f6b8229b0c87acb98c7717e742ef9f46b113985303ae12a99da", - "sha256:fc7489a50323a0df02378bc2fff86eb69d94cc5639914346c736be981c6a02e7" + "sha256:01983746d01c9f16514d08711b27ba599ef5f66f3928215804bfe9f011427b14", + "sha256:03a8b3b61eee27348ee45dfee9138a6ba997e8f4f222537ae4bbafa000b88379", + "sha256:3a26d7b7517822e68c2f08be6b78673c545be73ed5cb83698e53f18877223b05", + "sha256:41b7b0603b969b9c6caf748a969ffbab145145abe89ab340676c1d1339f97f2d", + "sha256:4a7d6f50104f9720e095949ebb650131ba87dcf728adac7ad7bc02653190d7bd", + "sha256:4cfd0b7d10ecba55a26fba88bec1bc002715dae1a9814677bc5fa2cb451584eb", + "sha256:587e775d9993d4fcfb6d75b80fdb5b216cc0e0505a047cd35da91072df4cafb5", + "sha256:5aa657b1e2a5323de420266f876472e6b1e2e565a1b32e117cdb71a11fecf809", + "sha256:5c2fb9e5b2bcd4b3eb144d7a6fa573376b6651f3d49d03a03989bdf51ae65aa1", + "sha256:5f35fac714e4b5faf6d8ba4121357d6d5918d29b39846c011c3ea4d6f7fcfe56", + "sha256:63c5c36095fed6300a2a839fb866203b391aadf2d51845f439ddc56519edd293", + "sha256:6ace02faf7428615fc76ecd8aaa995809d66d230f226b27dda30ea70fb2f8e27", + "sha256:6d6420786210348767ee494035151344cbca7dca565e39e7bff576cbcbf5c96c", + "sha256:79870ea4f14ea405e2f89b7351361cb32b2fbf1b9f4bd300e224d9e98c26cecc", + "sha256:82c26ceb052a41cf6a3a58b4aacf2b0cd25a51fba33fb6c75918bd34669969ac", + "sha256:87ecb556a0137d7f8e75e62baac7ae43804ebedcbef89301fe756369201b52f5", + "sha256:a20b53826ed71df7c805fd0c26415a77302405f81e3c630d55447380de66b840", + "sha256:a480aa37e72175ca4103fa9df1358e5b32a201f65749a99dad86295fc796a8bb", + "sha256:a4fe3a7c01c58dae879a12af8ffecd5471da2fbe166d97685dd2ee43553b6e79", + "sha256:a5a83d802d43c86898ce48e17fa6beb11bf2f3ca7cebf25e10b318ddbdb36b06", + "sha256:a6d47b268fa0cedc9d43239bfbed6abdee99028bdc77305e20465b91cd36d8e8", + "sha256:a723cdd7c9f5dd8bf2ce25583fde7baec0f3f4b5dc324756adaa698a87570595", + "sha256:aaa572c97970f215e7ebccaa835d4b8b176afba2791e405cbdaa983953c9a0d8", + "sha256:aac9fed6a528d5c1afb413b4fcc619d6e1349edf52a6ce84557d0aaa2ec2037a", + "sha256:bbf27d63e656b7333f17234bace91142a3bd30345f57eea670c34dcadd9db28a", + "sha256:c0c62d1dabb1c00220dda864a580ae9fb17a0ba39509b90369878fd8f08ab1bb", + "sha256:c13b363b168c74af37ca29fc138b29dcb58a934582986e1abcbb2b052f616ac6", + "sha256:cc0cc285e237b0fe10d06c7821e3cf341b4f72da55a3b0abcec1b9de005b2bd0", + "sha256:d8d04f2a4bcdcdef635c6d58a8647a76ef4d9a292cd537368d23b37f24052d7d", + "sha256:e286e0f4c1a558603573125ffdd3a7c52e18005c01ea4ab41e98adee1fc88c5d" ], "index": "pypi", - "version": "==3.10.1" + "version": "==3.10.3" }, "pyjwt": { "hashes": [ @@ -1750,49 +1758,49 @@ }, "regex": { "hashes": [ - "sha256:04f6b9749e335bb0d2f68c707f23bb1773c3fb6ecd10edf0f04df12a8920d468", - "sha256:08d74bfaa4c7731b8dac0a992c63673a2782758f7cfad34cf9c1b9184f911354", - "sha256:0fc1f8f06977c2d4f5e3d3f0d4a08089be783973fc6b6e278bde01f0544ff308", - "sha256:121f4b3185feaade3f85f70294aef3f777199e9b5c0c0245c774ae884b110a2d", - "sha256:1413b5022ed6ac0d504ba425ef02549a57d0f4276de58e3ab7e82437892704fc", - "sha256:1743345e30917e8c574f273f51679c294effba6ad372db1967852f12c76759d8", - "sha256:28fc475f560d8f67cc8767b94db4c9440210f6958495aeae70fac8faec631797", - "sha256:31a99a4796bf5aefc8351e98507b09e1b09115574f7c9dbb9cf2111f7220d2e2", - "sha256:328a1fad67445550b982caa2a2a850da5989fd6595e858f02d04636e7f8b0b13", - "sha256:473858730ef6d6ff7f7d5f19452184cd0caa062a20047f6d6f3e135a4648865d", - "sha256:4cde065ab33bcaab774d84096fae266d9301d1a2f5519d7bd58fc55274afbf7a", - "sha256:5f6a808044faae658f546dd5f525e921de9fa409de7a5570865467f03a626fc0", - "sha256:610b690b406653c84b7cb6091facb3033500ee81089867ee7d59e675f9ca2b73", - "sha256:66256b6391c057305e5ae9209941ef63c33a476b73772ca967d4a2df70520ec1", - "sha256:6eebf512aa90751d5ef6a7c2ac9d60113f32e86e5687326a50d7686e309f66ed", - "sha256:79aef6b5cd41feff359acaf98e040844613ff5298d0d19c455b3d9ae0bc8c35a", - "sha256:808ee5834e06f57978da3e003ad9d6292de69d2bf6263662a1a8ae30788e080b", - "sha256:8e44769068d33e0ea6ccdf4b84d80c5afffe5207aa4d1881a629cf0ef3ec398f", - "sha256:999ad08220467b6ad4bd3dd34e65329dd5d0df9b31e47106105e407954965256", - "sha256:9b006628fe43aa69259ec04ca258d88ed19b64791693df59c422b607b6ece8bb", - "sha256:9d05ad5367c90814099000442b2125535e9d77581855b9bee8780f1b41f2b1a2", - "sha256:a577a21de2ef8059b58f79ff76a4da81c45a75fe0bfb09bc8b7bb4293fa18983", - "sha256:a617593aeacc7a691cc4af4a4410031654f2909053bd8c8e7db837f179a630eb", - "sha256:abb48494d88e8a82601af905143e0de838c776c1241d92021e9256d5515b3645", - "sha256:ac88856a8cbccfc14f1b2d0b829af354cc1743cb375e7f04251ae73b2af6adf8", - "sha256:b4c220a1fe0d2c622493b0a1fd48f8f991998fb447d3cd368033a4b86cf1127a", - "sha256:b844fb09bd9936ed158ff9df0ab601e2045b316b17aa8b931857365ea8586906", - "sha256:bdc178caebd0f338d57ae445ef8e9b737ddf8fbc3ea187603f65aec5b041248f", - "sha256:c206587c83e795d417ed3adc8453a791f6d36b67c81416676cad053b4104152c", - "sha256:c61dcc1cf9fd165127a2853e2c31eb4fb961a4f26b394ac9fe5669c7a6592892", - "sha256:c7cb4c512d2d3b0870e00fbbac2f291d4b4bf2634d59a31176a87afe2777c6f0", - "sha256:d4a332404baa6665b54e5d283b4262f41f2103c255897084ec8f5487ce7b9e8e", - "sha256:d5111d4c843d80202e62b4fdbb4920db1dcee4f9366d6b03294f45ed7b18b42e", - "sha256:e1e8406b895aba6caa63d9fd1b6b1700d7e4825f78ccb1e5260551d168db38ed", - "sha256:e8690ed94481f219a7a967c118abaf71ccc440f69acd583cab721b90eeedb77c", - "sha256:ed283ab3a01d8b53de3a05bfdf4473ae24e43caee7dcb5584e86f3f3e5ab4374", - "sha256:ed4b50355b066796dacdd1cf538f2ce57275d001838f9b132fab80b75e8c84dd", - "sha256:ee329d0387b5b41a5dddbb6243a21cb7896587a651bebb957e2d2bb8b63c0791", - "sha256:f3bf1bc02bc421047bfec3343729c4bbbea42605bcfd6d6bfe2c07ade8b12d2a", - "sha256:f585cbbeecb35f35609edccb95efd95a3e35824cd7752b586503f7e6087303f1", - "sha256:f60667673ff9c249709160529ab39667d1ae9fd38634e006bec95611f632e759" + "sha256:0628ed7d6334e8f896f882a5c1240de8c4d9b0dd7c7fb8e9f4692f5684b7d656", + "sha256:09eb62654030f39f3ba46bc6726bea464069c29d00a9709e28c9ee9623a8da4a", + "sha256:0bba1f6df4eafe79db2ecf38835c2626dbd47911e0516f6962c806f83e7a99ae", + "sha256:10a7a9cbe30bd90b7d9a1b4749ef20e13a3528e4215a2852be35784b6bd070f0", + "sha256:17310b181902e0bb42b29c700e2c2346b8d81f26e900b1328f642e225c88bce1", + "sha256:1e8d1898d4fb817120a5f684363b30108d7b0b46c7261264b100d14ec90a70e7", + "sha256:2054dea683f1bda3a804fcfdb0c1c74821acb968093d0be16233873190d459e3", + "sha256:29385c4dbb3f8b3a55ce13de6a97a3d21bd00de66acd7cdfc0b49cb2f08c906c", + "sha256:295bc8a13554a25ad31e44c4bedabd3c3e28bba027e4feeb9bb157647a2344a7", + "sha256:2cdb3789736f91d0b3333ac54d12a7e4f9efbc98f53cb905d3496259a893a8b3", + "sha256:3baf3eaa41044d4ced2463fd5d23bf7bd4b03d68739c6c99a59ce1f95599a673", + "sha256:4e61100200fa6ab7c99b61476f9f9653962ae71b931391d0264acfb4d9527d9c", + "sha256:6266fde576e12357b25096351aac2b4b880b0066263e7bc7a9a1b4307991bb0e", + "sha256:650c4f1fc4273f4e783e1d8e8b51a3e2311c2488ba0fcae6425b1e2c248a189d", + "sha256:658e3477676009083422042c4bac2bdad77b696e932a3de001c42cc046f8eda2", + "sha256:6adc1bd68f81968c9d249aab8c09cdc2cbe384bf2d2cb7f190f56875000cdc72", + "sha256:6c4d83d21d23dd854ffbc8154cf293f4e43ba630aa9bd2539c899343d7f59da3", + "sha256:6f74b6d8f59f3cfb8237e25c532b11f794b96f5c89a6f4a25857d85f84fbef11", + "sha256:7783d89bd5413d183a38761fbc68279b984b9afcfbb39fa89d91f63763fbfb90", + "sha256:7e3536f305f42ad6d31fc86636c54c7dafce8d634e56fef790fbacb59d499dd5", + "sha256:821e10b73e0898544807a0692a276e539e5bafe0a055506a6882814b6a02c3ec", + "sha256:835962f432bce92dc9bf22903d46c50003c8d11b1dc64084c8fae63bca98564a", + "sha256:85c61bee5957e2d7be390392feac7e1d7abd3a49cbaed0c8cee1541b784c8561", + "sha256:86f9931eb92e521809d4b64ec8514f18faa8e11e97d6c2d1afa1bcf6c20a8eab", + "sha256:8a5c2250c0a74428fd5507ae8853706fdde0f23bfb62ee1ec9418eeacf216078", + "sha256:8aec4b4da165c4a64ea80443c16e49e3b15df0f56c124ac5f2f8708a65a0eddc", + "sha256:8c268e78d175798cd71d29114b0a1f1391c7d011995267d3b62319ec1a4ecaa1", + "sha256:8d80087320632457aefc73f686f66139801959bf5b066b4419b92be85be3543c", + "sha256:95e89a8558c8c48626dcffdf9c8abac26b7c251d352688e7ab9baf351e1c7da6", + "sha256:9c371dd326289d85906c27ec2bc1dcdedd9d0be12b543d16e37bad35754bde48", + "sha256:9c7cb25adba814d5f419733fe565f3289d6fa629ab9e0b78f6dff5fa94ab0456", + "sha256:a731552729ee8ae9c546fb1c651c97bf5f759018fdd40d0e9b4d129e1e3a44c8", + "sha256:aea4006b73b555fc5bdb650a8b92cf486d678afa168cf9b38402bb60bf0f9c18", + "sha256:b0e3f59d3c772f2c3baaef2db425e6fc4149d35a052d874bb95ccfca10a1b9f4", + "sha256:b15dc34273aefe522df25096d5d087abc626e388a28a28ac75a4404bb7668736", + "sha256:c000635fd78400a558bd7a3c2981bb2a430005ebaa909d31e6e300719739a949", + "sha256:c31f35a984caffb75f00a86852951a337540b44e4a22171354fb760cefa09346", + "sha256:c50a6379763c733562b1fee877372234d271e5c78cd13ade5f25978aa06744db", + "sha256:c94722bf403b8da744b7d0bb87e1f2529383003ceec92e754f768ef9323f69ad", + "sha256:dcbbc9cfa147d55a577d285fd479b43103188855074552708df7acc31a476dd9", + "sha256:fb9f5844db480e2ef9fce3a72e71122dd010ab7b2920f777966ba25f7eb63819" ], - "version": "==2021.8.28" + "version": "==2021.9.24" }, "requests": { "hashes": [ diff --git a/authentik/admin/api/system.py b/authentik/admin/api/system.py index ef411469e..d61b51164 100644 --- a/authentik/admin/api/system.py +++ b/authentik/admin/api/system.py @@ -84,7 +84,7 @@ class SystemSerializer(PassiveSerializer): return now() 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) if not outposts.exists(): return "" diff --git a/authentik/api/schema.py b/authentik/api/schema.py index 38284d7a6..127d20eae 100644 --- a/authentik/api/schema.py +++ b/authentik/api/schema.py @@ -11,7 +11,7 @@ from drf_spectacular.types import OpenApiTypes 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.update(kwargs) return schema diff --git a/authentik/api/v3/config.py b/authentik/api/v3/config.py index b39a0e196..9e6bec395 100644 --- a/authentik/api/v3/config.py +++ b/authentik/api/v3/config.py @@ -63,7 +63,7 @@ class ConfigView(APIView): @extend_schema(responses={200: ConfigSerializer(many=False)}) def get(self, request: Request) -> Response: - """Retrive public configuration options""" + """Retrieve public configuration options""" config = ConfigSerializer( { "error_reporting_enabled": CONFIG.y("error_reporting.enabled"), diff --git a/authentik/events/utils.py b/authentik/events/utils.py index a8d288cfc..32c3b4466 100644 --- a/authentik/events/utils.py +++ b/authentik/events/utils.py @@ -77,7 +77,7 @@ def sanitize_dict(source: dict[Any, Any]) -> dict[Any, Any]: final_dict = {} for key, value in source.items(): 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). # Currently, the only dataclass that actually holds an http request is a PolicyRequest if isinstance(value, PolicyRequest): diff --git a/authentik/flows/planner.py b/authentik/flows/planner.py index 193421fe7..475d40de2 100644 --- a/authentik/flows/planner.py +++ b/authentik/flows/planner.py @@ -57,11 +57,11 @@ class FlowPlan: markers: list[StageMarker] = field(default_factory=list) 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) 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.markers.append(marker or StageMarker()) diff --git a/authentik/flows/tests/test_views.py b/authentik/flows/tests/test_views.py index 74cb48c69..e12f78c30 100644 --- a/authentik/flows/tests/test_views.py +++ b/authentik/flows/tests/test_views.py @@ -438,7 +438,7 @@ class TestFlowExecutor(APITestCase): # third request, this should trigger the re-evaluate # 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) self.assertEqual(response.status_code, 200) self.assertJSONEqual( diff --git a/authentik/flows/transfer/common.py b/authentik/flows/transfer/common.py index 031a43e2d..0e0e05fb1 100644 --- a/authentik/flows/transfer/common.py +++ b/authentik/flows/transfer/common.py @@ -11,7 +11,7 @@ from authentik.lib.sentry import SentryIgnoredException 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) to_remove = ( "policies", diff --git a/authentik/flows/views.py b/authentik/flows/views.py index 8a79d20bd..adb1b0fb8 100644 --- a/authentik/flows/views.py +++ b/authentik/flows/views.py @@ -126,12 +126,12 @@ class FlowExecutorView(APIView): # pylint: disable=unused-argument, too-many-return-statements 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: self.plan = self.request.session[SESSION_KEY_PLAN] if self.plan.flow_pk != self.flow.pk.hex: 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 self.plan = None @@ -433,7 +433,7 @@ class ToDefaultFlow(View): plan: FlowPlan = self.request.session[SESSION_KEY_PLAN] if plan.flow_pk != flow.pk.hex: 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, ) del self.request.session[SESSION_KEY_PLAN] diff --git a/authentik/lib/tests/test_config.py b/authentik/lib/tests/test_config.py index 30c00932e..8a67203c1 100644 --- a/authentik/lib/tests/test_config.py +++ b/authentik/lib/tests/test_config.py @@ -32,7 +32,7 @@ class TestConfig(TestCase): config = ConfigLoader() environ["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): """Test URI parsing (file load)""" diff --git a/authentik/lib/tests/test_http.py b/authentik/lib/tests/test_http.py index ac90cfdf8..c1197fedc 100644 --- a/authentik/lib/tests/test_http.py +++ b/authentik/lib/tests/test_http.py @@ -27,7 +27,7 @@ class TestHTTP(TestCase): token = Token.objects.create( identifier="test", user=self.user, intent=TokenIntents.INTENT_API ) - # Invalid, non-existant token + # Invalid, non-existent token request = self.factory.get( "/", **{ @@ -36,7 +36,7 @@ class TestHTTP(TestCase): }, ) 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( "/", **{ diff --git a/authentik/outposts/channels.py b/authentik/outposts/channels.py index 74ce0a05a..58945e72e 100644 --- a/authentik/outposts/channels.py +++ b/authentik/outposts/channels.py @@ -104,7 +104,7 @@ class OutpostConsumer(AuthJsonConsumer): expected=self.outpost.config.kubernetes_replicas, ).inc() LOGGER.debug( - "added outpost instace to cache", + "added outpost instance to cache", outpost=self.outpost, instance_uuid=self.last_uid, ) diff --git a/authentik/outposts/controllers/k8s/base.py b/authentik/outposts/controllers/k8s/base.py index 6fe95d631..d06a72b53 100644 --- a/authentik/outposts/controllers/k8s/base.py +++ b/authentik/outposts/controllers/k8s/base.py @@ -109,7 +109,7 @@ class KubernetesObjectReconciler(Generic[T]): except (OpenApiException, HTTPError) as exc: # pylint: disable=no-member 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 self.logger.debug("Other unhandled error", exc=exc) raise exc @@ -129,7 +129,7 @@ class KubernetesObjectReconciler(Generic[T]): raise NotImplementedError def retrieve(self) -> T: - """API Wrapper to retrive object""" + """API Wrapper to retrieve object""" raise NotImplementedError def delete(self, reference: T): diff --git a/authentik/outposts/docker_tls.py b/authentik/outposts/docker_tls.py index 9c61a8ca4..0630571f3 100644 --- a/authentik/outposts/docker_tls.py +++ b/authentik/outposts/docker_tls.py @@ -30,7 +30,7 @@ class DockerInlineTLS: return str(path) def write(self) -> TLSConfig: - """Create TLSConfig with Certificate Keypairs""" + """Create TLSConfig with Certificate Key pairs""" # So yes, this is quite ugly. But sadly, there is no clean way to pass # docker-py (which is using requests (which is using urllib3)) a certificate # for verification or authentication as string. diff --git a/authentik/outposts/tasks.py b/authentik/outposts/tasks.py index 005e02245..549f2e32b 100644 --- a/authentik/outposts/tasks.py +++ b/authentik/outposts/tasks.py @@ -181,7 +181,7 @@ def outpost_post_save(model_class: str, model_pk: Any): 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""" channel_layer = get_channel_layer() if isinstance(model_instace, OutpostModel): @@ -208,7 +208,7 @@ def _outpost_single_update(outpost: Outpost, layer=None): @CELERY_APP.task() def outpost_local_connection(): """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 if Path(SERVICE_TOKEN_FILENAME).exists(): LOGGER.debug("Detected in-cluster Kubernetes Config") diff --git a/authentik/policies/process.py b/authentik/policies/process.py index 640cc5b88..e8856297f 100644 --- a/authentik/policies/process.py +++ b/authentik/policies/process.py @@ -46,7 +46,7 @@ def cache_key(binding: PolicyBinding, request: PolicyRequest) -> str: class PolicyProcess(PROCESS_CLASS): - """Evaluate a single policy within a seprate process""" + """Evaluate a single policy within a separate process""" connection: Connection binding: PolicyBinding diff --git a/authentik/policies/reputation/signals.py b/authentik/policies/reputation/signals.py index 4f4267fc3..60fe788d2 100644 --- a/authentik/policies/reputation/signals.py +++ b/authentik/policies/reputation/signals.py @@ -34,7 +34,7 @@ def update_score(request: HttpRequest, username: str, amount: int): @receiver(user_login_failed) # pylint: disable=unused-argument def handle_failed_login(sender, request, credentials, **_): - """Lower Score for failed loging attempts""" + """Lower Score for failed login attempts""" if "username" in credentials: update_score(request, credentials.get("username"), -1) diff --git a/authentik/policies/tests/test_process.py b/authentik/policies/tests/test_process.py index 1c2fde4b9..0ae1ffefa 100644 --- a/authentik/policies/tests/test_process.py +++ b/authentik/policies/tests/test_process.py @@ -14,7 +14,7 @@ from authentik.policies.types import PolicyRequest def clear_policy_cache(): - """Ensure no policy-related keys are stil cached""" + """Ensure no policy-related keys are still cached""" keys = cache.keys("policy_*") cache.delete(keys) diff --git a/authentik/providers/ldap/controllers/docker.py b/authentik/providers/ldap/controllers/docker.py index 27d972917..ccb9e0a32 100644 --- a/authentik/providers/ldap/controllers/docker.py +++ b/authentik/providers/ldap/controllers/docker.py @@ -1,11 +1,11 @@ -"""LDAP Provider Docker Contoller""" +"""LDAP Provider Docker Controller""" from authentik.outposts.controllers.base import DeploymentPort from authentik.outposts.controllers.docker import DockerController from authentik.outposts.models import DockerServiceConnection, Outpost class LDAPDockerController(DockerController): - """LDAP Provider Docker Contoller""" + """LDAP Provider Docker Controller""" def __init__(self, outpost: Outpost, connection: DockerServiceConnection): super().__init__(outpost, connection) diff --git a/authentik/providers/ldap/controllers/kubernetes.py b/authentik/providers/ldap/controllers/kubernetes.py index b7449213d..da55e838e 100644 --- a/authentik/providers/ldap/controllers/kubernetes.py +++ b/authentik/providers/ldap/controllers/kubernetes.py @@ -1,11 +1,11 @@ -"""LDAP Provider Kubernetes Contoller""" +"""LDAP Provider Kubernetes Controller""" from authentik.outposts.controllers.base import DeploymentPort from authentik.outposts.controllers.kubernetes import KubernetesController from authentik.outposts.models import KubernetesServiceConnection, Outpost class LDAPKubernetesController(KubernetesController): - """LDAP Provider Kubernetes Contoller""" + """LDAP Provider Kubernetes Controller""" def __init__(self, outpost: Outpost, connection: KubernetesServiceConnection): super().__init__(outpost, connection) diff --git a/authentik/providers/oauth2/utils.py b/authentik/providers/oauth2/utils.py index b49a1f7ba..895f3eb41 100644 --- a/authentik/providers/oauth2/utils.py +++ b/authentik/providers/oauth2/utils.py @@ -153,7 +153,7 @@ def protected_resource_view(scopes: list[str]): if not set(scopes).issubset(set(token.scope)): LOGGER.warning( - "Scope missmatch.", + "Scope mismatch.", required=set(scopes), token_has=set(token.scope), ) diff --git a/authentik/providers/oauth2/views/userinfo.py b/authentik/providers/oauth2/views/userinfo.py index 223a316a6..36a875029 100644 --- a/authentik/providers/oauth2/views/userinfo.py +++ b/authentik/providers/oauth2/views/userinfo.py @@ -33,7 +33,7 @@ class UserInfoView(View): for scope in ScopeMapping.objects.filter(scope_name__in=scopes).order_by("scope_name"): if 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 github_scope_map = { SCOPE_GITHUB_USER: ("GitHub Compatibility: Access your User Information"), diff --git a/authentik/providers/proxy/controllers/docker.py b/authentik/providers/proxy/controllers/docker.py index 9047c612d..646ca13cf 100644 --- a/authentik/providers/proxy/controllers/docker.py +++ b/authentik/providers/proxy/controllers/docker.py @@ -1,4 +1,4 @@ -"""Proxy Provider Docker Contoller""" +"""Proxy Provider Docker Controller""" from urllib.parse import urlparse from authentik.outposts.controllers.base import DeploymentPort @@ -8,7 +8,7 @@ from authentik.providers.proxy.models import ProxyProvider class ProxyDockerController(DockerController): - """Proxy Provider Docker Contoller""" + """Proxy Provider Docker Controller""" def __init__(self, outpost: Outpost, connection: DockerServiceConnection): super().__init__(outpost, connection) diff --git a/authentik/providers/proxy/controllers/kubernetes.py b/authentik/providers/proxy/controllers/kubernetes.py index f8ca3d1ef..3ed04555f 100644 --- a/authentik/providers/proxy/controllers/kubernetes.py +++ b/authentik/providers/proxy/controllers/kubernetes.py @@ -1,4 +1,4 @@ -"""Proxy Provider Kubernetes Contoller""" +"""Proxy Provider Kubernetes Controller""" from authentik.outposts.controllers.base import DeploymentPort from authentik.outposts.controllers.kubernetes import KubernetesController from authentik.outposts.models import KubernetesServiceConnection, Outpost @@ -7,7 +7,7 @@ from authentik.providers.proxy.controllers.k8s.traefik import TraefikMiddlewareR class ProxyKubernetesController(KubernetesController): - """Proxy Provider Kubernetes Contoller""" + """Proxy Provider Kubernetes Controller""" def __init__(self, outpost: Outpost, connection: KubernetesServiceConnection): super().__init__(outpost, connection) diff --git a/authentik/sources/ldap/password.py b/authentik/sources/ldap/password.py index 0234fdfd2..27d7dafdf 100644 --- a/authentik/sources/ldap/password.py +++ b/authentik/sources/ldap/password.py @@ -119,7 +119,7 @@ class LDAPPasswordChanger: return True 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/ security-policy-settings/password-must-meet-complexity-requirements diff --git a/authentik/sources/ldap/signals.py b/authentik/sources/ldap/signals.py index 3565a1543..b33ba2195 100644 --- a/authentik/sources/ldap/signals.py +++ b/authentik/sources/ldap/signals.py @@ -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) ) if not passing: - raise ValidationError(_("Password does not match Active Direcory Complexity.")) + raise ValidationError(_("Password does not match Active Directory Complexity.")) @receiver(password_changed) diff --git a/authentik/sources/oauth/api/source.py b/authentik/sources/oauth/api/source.py index 0beafb976..359b2cdea 100644 --- a/authentik/sources/oauth/api/source.py +++ b/authentik/sources/oauth/api/source.py @@ -46,9 +46,9 @@ class OAuthSourceSerializer(SourceSerializer): type = SerializerMethodField() @extend_schema_field(SourceTypeSerializer) - def get_type(self, instace: OAuthSource) -> SourceTypeSerializer: + def get_type(self, instance: OAuthSource) -> SourceTypeSerializer: """Get source's type configuration""" - return SourceTypeSerializer(instace.type).data + return SourceTypeSerializer(instance.type).data def validate(self, attrs: dict) -> dict: provider_type = MANAGER.find_type(attrs.get("provider_type", "")) diff --git a/authentik/sources/oauth/migrations/0002_auto_20200520_1108.py b/authentik/sources/oauth/migrations/0002_auto_20200520_1108.py index 6c3bba15a..350321bd4 100644 --- a/authentik/sources/oauth/migrations/0002_auto_20200520_1108.py +++ b/authentik/sources/oauth/migrations/0002_auto_20200520_1108.py @@ -14,7 +14,7 @@ class Migration(migrations.Migration): model_name="oauthsource", name="access_token_url", field=models.CharField( - help_text="URL used by authentik to retrive tokens.", + help_text="URL used by authentik to retrieve tokens.", max_length=255, verbose_name="Access Token URL", ), diff --git a/authentik/sources/oauth/migrations/0003_auto_20210416_0726.py b/authentik/sources/oauth/migrations/0003_auto_20210416_0726.py index 05ad87d2b..ef43d8085 100644 --- a/authentik/sources/oauth/migrations/0003_auto_20210416_0726.py +++ b/authentik/sources/oauth/migrations/0003_auto_20210416_0726.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): name="access_token_url", field=models.CharField( blank=True, - help_text="URL used by authentik to retrive tokens.", + help_text="URL used by authentik to retrieve tokens.", max_length=255, verbose_name="Access Token URL", ), diff --git a/authentik/sources/oauth/migrations/0004_auto_20210417_1900.py b/authentik/sources/oauth/migrations/0004_auto_20210417_1900.py index a63f479c2..6df644e65 100644 --- a/authentik/sources/oauth/migrations/0004_auto_20210417_1900.py +++ b/authentik/sources/oauth/migrations/0004_auto_20210417_1900.py @@ -39,7 +39,7 @@ class Migration(migrations.Migration): model_name="oauthsource", name="access_token_url", field=models.CharField( - help_text="URL used by authentik to retrive tokens.", + help_text="URL used by authentik to retrieve tokens.", max_length=255, null=True, verbose_name="Access Token URL", diff --git a/authentik/sources/oauth/models.py b/authentik/sources/oauth/models.py index 10ac37be8..5c16178eb 100644 --- a/authentik/sources/oauth/models.py +++ b/authentik/sources/oauth/models.py @@ -37,7 +37,7 @@ class OAuthSource(Source): max_length=255, null=True, 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( max_length=255, diff --git a/authentik/sources/plex/migrations/0002_auto_20210505_1717.py b/authentik/sources/plex/migrations/0002_auto_20210505_1717.py index 6b3d5c8b9..0b2f70a22 100644 --- a/authentik/sources/plex/migrations/0002_auto_20210505_1717.py +++ b/authentik/sources/plex/migrations/0002_auto_20210505_1717.py @@ -24,7 +24,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name="plexsource", 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( model_name="plexsource", diff --git a/authentik/sources/plex/migrations/0003_alter_plexsource_plex_token.py b/authentik/sources/plex/migrations/0003_alter_plexsource_plex_token.py index f3a9e6a0b..92b658a8e 100644 --- a/authentik/sources/plex/migrations/0003_alter_plexsource_plex_token.py +++ b/authentik/sources/plex/migrations/0003_alter_plexsource_plex_token.py @@ -13,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name="plexsource", 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"), ), ] diff --git a/authentik/sources/plex/models.py b/authentik/sources/plex/models.py index 25d61823c..6a1d91583 100644 --- a/authentik/sources/plex/models.py +++ b/authentik/sources/plex/models.py @@ -50,7 +50,7 @@ class PlexSource(Source): default=True, 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 def component(self) -> str: diff --git a/authentik/stages/captcha/stage.py b/authentik/stages/captcha/stage.py index 5884d5f23..514955d81 100644 --- a/authentik/stages/captcha/stage.py +++ b/authentik/stages/captcha/stage.py @@ -54,7 +54,7 @@ class CaptchaChallengeResponse(ChallengeResponse): 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 diff --git a/web/src/elements/sidebar/SidebarBrand.ts b/web/src/elements/sidebar/SidebarBrand.ts index 6afef8424..2b9bf97a7 100644 --- a/web/src/elements/sidebar/SidebarBrand.ts +++ b/web/src/elements/sidebar/SidebarBrand.ts @@ -15,7 +15,7 @@ import { EVENT_SIDEBAR_TOGGLE } from "../../constants"; import { first } from "../../utils"; // 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 DefaultTenant: CurrentTenant = { diff --git a/web/src/locales/en.po b/web/src/locales/en.po index 07147a501..a803ba3aa 100644 --- a/web/src/locales/en.po +++ b/web/src/locales/en.po @@ -605,8 +605,8 @@ msgid "Certificate Fingerprint (SHA256)" msgstr "Certificate Fingerprint (SHA256)" #: src/pages/crypto/CertificateKeyPairListPage.ts -msgid "Certificate Subjet" -msgstr "Certificate Subjet" +msgid "Certificate Subject" +msgstr "Certificate Subject" #: src/pages/providers/saml/SAMLProviderForm.ts 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" #: 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." -msgstr "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 still has to specify the scope to access the data." #: src/pages/sources/plex/PlexSourceForm.ts 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" 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 msgid "To use SSL instead, use 'ldaps://' and disable this option." msgstr "To use SSL instead, use 'ldaps://' and disable this option." diff --git a/web/src/locales/pseudo-LOCALE.po b/web/src/locales/pseudo-LOCALE.po index 7995f45ee..f650108e7 100644 --- a/web/src/locales/pseudo-LOCALE.po +++ b/web/src/locales/pseudo-LOCALE.po @@ -601,7 +601,7 @@ msgid "Certificate Fingerprint (SHA256)" msgstr "" #: src/pages/crypto/CertificateKeyPairListPage.ts -msgid "Certificate Subjet" +msgid "Certificate Subject" msgstr "" #: src/pages/providers/saml/SAMLProviderForm.ts @@ -3651,7 +3651,7 @@ msgid "Select users to add" msgstr "" #: 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 "" #: src/pages/sources/plex/PlexSourceForm.ts @@ -4537,6 +4537,10 @@ msgstr "" msgid "To" 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 msgid "To use SSL instead, use 'ldaps://' and disable this option." msgstr "" diff --git a/web/src/pages/crypto/CertificateKeyPairListPage.ts b/web/src/pages/crypto/CertificateKeyPairListPage.ts index e915294fe..878c5889b 100644 --- a/web/src/pages/crypto/CertificateKeyPairListPage.ts +++ b/web/src/pages/crypto/CertificateKeyPairListPage.ts @@ -137,7 +137,7 @@ export class CertificateKeyPairListPage extends TablePage {
${t`Certificate Subjet`}${t`Certificate Subject`}
diff --git a/web/src/pages/flows/StageBindingForm.ts b/web/src/pages/flows/StageBindingForm.ts index 7d196d6c4..799f59ffb 100644 --- a/web/src/pages/flows/StageBindingForm.ts +++ b/web/src/pages/flows/StageBindingForm.ts @@ -104,7 +104,7 @@ export class StageBindingForm extends ModelForm { }) .then((flows) => { 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``; diff --git a/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts b/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts index 1045e180b..36f94f512 100644 --- a/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts +++ b/web/src/pages/providers/oauth2/OAuth2ProviderForm.ts @@ -277,7 +277,7 @@ ${this.instance?.redirectUris}

- ${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.`}

${t`Hold control/command to select multiple items.`} diff --git a/web/src/pages/users/UserListPage.ts b/web/src/pages/users/UserListPage.ts index a693ce13f..ed9104e9f 100644 --- a/web/src/pages/users/UserListPage.ts +++ b/web/src/pages/users/UserListPage.ts @@ -178,8 +178,8 @@ export class UserListPage extends TablePage {

${until( - tenant().then((te) => { - if (!te.flowRecovery) { + tenant().then((tenant) => { + if (!tenant.flowRecovery) { return html`

${t`To directly reset a user's password, configure a recovery flow on the currently active tenant.`}