*: fix typos in code
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
parent
919336a519
commit
79b92e764e
|
@ -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 = "*"
|
||||||
|
|
|
@ -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