*: fix typos in code
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
		
							
								
								
									
										1
									
								
								.github/codespell-words.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.github/codespell-words.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | keypair | ||||||
							
								
								
									
										5
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Makefile
									
									
									
									
									
								
							| @ -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 | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								Pipfile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Pipfile
									
									
									
									
									
								
							| @ -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
									
									
									
								
							
							
						
						
									
										184
									
								
								Pipfile.lock
									
									
									
										generated
									
									
									
								
							| @ -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": [ | ||||||
|  | |||||||
| @ -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 "" | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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"), | ||||||
|  | |||||||
| @ -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): | ||||||
|  | |||||||
| @ -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()) | ||||||
|  |  | ||||||
|  | |||||||
| @ -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( | ||||||
|  | |||||||
| @ -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", | ||||||
|  | |||||||
| @ -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] | ||||||
|  | |||||||
| @ -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)""" | ||||||
|  | |||||||
| @ -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( | ||||||
|             "/", |             "/", | ||||||
|             **{ |             **{ | ||||||
|  | |||||||
| @ -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, | ||||||
|             ) |             ) | ||||||
|  | |||||||
| @ -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): | ||||||
|  | |||||||
| @ -30,7 +30,7 @@ class DockerInlineTLS: | |||||||
|         return str(path) |         return str(path) | ||||||
|  |  | ||||||
|     def write(self) -> TLSConfig: |     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 |         # 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 |         # docker-py (which is using requests (which is using urllib3)) a certificate | ||||||
|         # for verification or authentication as string. |         # for verification or authentication as string. | ||||||
|  | |||||||
| @ -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") | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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) | ||||||
|  |  | ||||||
|  | |||||||
| @ -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) | ||||||
|  |  | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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), | ||||||
|                     ) |                     ) | ||||||
|  | |||||||
| @ -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"), | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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", "")) | ||||||
|  | |||||||
| @ -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", | ||||||
|             ), |             ), | ||||||
|  | |||||||
| @ -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", | ||||||
|             ), |             ), | ||||||
|  | |||||||
| @ -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", | ||||||
|  | |||||||
| @ -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, | ||||||
|  | |||||||
| @ -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", | ||||||
|  | |||||||
| @ -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"), | ||||||
|         ), |         ), | ||||||
|     ] |     ] | ||||||
|  | |||||||
| @ -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: | ||||||
|  | |||||||
| @ -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 | ||||||
|  |  | ||||||
|  | |||||||
| @ -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 = { | ||||||
|  | |||||||
| @ -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." | ||||||
|  | |||||||
| @ -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 "" | ||||||
|  | |||||||
| @ -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"> | ||||||
|  | |||||||
| @ -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>`; | ||||||
|  | |||||||
| @ -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.`} | ||||||
|  | |||||||
| @ -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.`} | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer