mirror of
				https://github.com/nitnelave/lldap.git
				synced 2023-04-12 14:25:13 +00:00 
			
		
		
		
	sqlx: update dependency and protect against injections
This commit is contained in:
		
							parent
							
								
									bafb1dc5cc
								
							
						
					
					
						commit
						5e2eea0d97
					
				
							
								
								
									
										457
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										457
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -75,7 +75,7 @@ dependencies = [
 | 
				
			|||||||
 "actix-service",
 | 
					 "actix-service",
 | 
				
			||||||
 "actix-tls",
 | 
					 "actix-tls",
 | 
				
			||||||
 "actix-utils",
 | 
					 "actix-utils",
 | 
				
			||||||
 "ahash 0.7.4",
 | 
					 "ahash",
 | 
				
			||||||
 "base64",
 | 
					 "base64",
 | 
				
			||||||
 "bitflags",
 | 
					 "bitflags",
 | 
				
			||||||
 "brotli2",
 | 
					 "brotli2",
 | 
				
			||||||
@ -89,7 +89,7 @@ dependencies = [
 | 
				
			|||||||
 "h2",
 | 
					 "h2",
 | 
				
			||||||
 "http",
 | 
					 "http",
 | 
				
			||||||
 "httparse",
 | 
					 "httparse",
 | 
				
			||||||
 "itoa",
 | 
					 "itoa 0.4.8",
 | 
				
			||||||
 "language-tags",
 | 
					 "language-tags",
 | 
				
			||||||
 "local-channel",
 | 
					 "local-channel",
 | 
				
			||||||
 "log",
 | 
					 "log",
 | 
				
			||||||
@ -212,7 +212,7 @@ dependencies = [
 | 
				
			|||||||
 "actix-service",
 | 
					 "actix-service",
 | 
				
			||||||
 "actix-utils",
 | 
					 "actix-utils",
 | 
				
			||||||
 "actix-web-codegen",
 | 
					 "actix-web-codegen",
 | 
				
			||||||
 "ahash 0.7.4",
 | 
					 "ahash",
 | 
				
			||||||
 "bytes",
 | 
					 "bytes",
 | 
				
			||||||
 "cfg-if 1.0.0",
 | 
					 "cfg-if 1.0.0",
 | 
				
			||||||
 "cookie",
 | 
					 "cookie",
 | 
				
			||||||
@ -221,7 +221,7 @@ dependencies = [
 | 
				
			|||||||
 "encoding_rs",
 | 
					 "encoding_rs",
 | 
				
			||||||
 "futures-core",
 | 
					 "futures-core",
 | 
				
			||||||
 "futures-util",
 | 
					 "futures-util",
 | 
				
			||||||
 "itoa",
 | 
					 "itoa 0.4.8",
 | 
				
			||||||
 "language-tags",
 | 
					 "language-tags",
 | 
				
			||||||
 "log",
 | 
					 "log",
 | 
				
			||||||
 "mime",
 | 
					 "mime",
 | 
				
			||||||
@ -306,26 +306,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "ahash"
 | 
					name = "ahash"
 | 
				
			||||||
version = "0.4.7"
 | 
					version = "0.7.6"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e"
 | 
					checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
 | 
				
			||||||
 | 
					 | 
				
			||||||
[[package]]
 | 
					 | 
				
			||||||
name = "ahash"
 | 
					 | 
				
			||||||
version = "0.6.3"
 | 
					 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					 | 
				
			||||||
checksum = "796540673305a66d127804eef19ad696f1f204b8c1025aaca4958c17eab32877"
 | 
					 | 
				
			||||||
dependencies = [
 | 
					 | 
				
			||||||
 "getrandom 0.2.3",
 | 
					 | 
				
			||||||
 "once_cell",
 | 
					 | 
				
			||||||
 "version_check",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[package]]
 | 
					 | 
				
			||||||
name = "ahash"
 | 
					 | 
				
			||||||
version = "0.7.4"
 | 
					 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					 | 
				
			||||||
checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98"
 | 
					 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "getrandom 0.2.3",
 | 
					 "getrandom 0.2.3",
 | 
				
			||||||
 "once_cell",
 | 
					 "once_cell",
 | 
				
			||||||
@ -465,6 +448,12 @@ version = "0.13.0"
 | 
				
			|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
 | 
					checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "base64ct"
 | 
				
			||||||
 | 
					version = "1.1.1"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "e6b4d9b1225d28d360ec6a231d65af1fd99a2a095154c8040689617290569c5c"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "bincode"
 | 
					name = "bincode"
 | 
				
			||||||
version = "1.3.3"
 | 
					version = "1.3.3"
 | 
				
			||||||
@ -555,12 +544,6 @@ dependencies = [
 | 
				
			|||||||
 "uuid",
 | 
					 "uuid",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					 | 
				
			||||||
name = "build_const"
 | 
					 | 
				
			||||||
version = "0.2.2"
 | 
					 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					 | 
				
			||||||
checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "bumpalo"
 | 
					name = "bumpalo"
 | 
				
			||||||
version = "3.7.0"
 | 
					version = "3.7.0"
 | 
				
			||||||
@ -693,6 +676,12 @@ dependencies = [
 | 
				
			|||||||
 "wasm-bindgen",
 | 
					 "wasm-bindgen",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "const-oid"
 | 
				
			||||||
 | 
					version = "0.6.2"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "9d6f2aa4d0537bcc1c74df8755072bd31c1ef1a3a1b85a68e8404a8c353b7b8b"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "const_fn"
 | 
					name = "const_fn"
 | 
				
			||||||
version = "0.4.8"
 | 
					version = "0.4.8"
 | 
				
			||||||
@ -749,13 +738,19 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "crc"
 | 
					name = "crc"
 | 
				
			||||||
version = "1.8.1"
 | 
					version = "2.1.0"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
 | 
					checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "build_const",
 | 
					 "crc-catalog",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "crc-catalog"
 | 
				
			||||||
 | 
					version = "1.1.1"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "crc32fast"
 | 
					name = "crc32fast"
 | 
				
			||||||
version = "1.2.1"
 | 
					version = "1.2.1"
 | 
				
			||||||
@ -831,6 +826,17 @@ dependencies = [
 | 
				
			|||||||
 "winapi",
 | 
					 "winapi",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "crypto-bigint"
 | 
				
			||||||
 | 
					version = "0.2.11"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "f83bd3bb4314701c568e340cd8cf78c975aa0ca79e03d3f6d1677d5b0c9c0c03"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "generic-array",
 | 
				
			||||||
 | 
					 "rand_core 0.6.3",
 | 
				
			||||||
 | 
					 "subtle",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "crypto-mac"
 | 
					name = "crypto-mac"
 | 
				
			||||||
version = "0.10.1"
 | 
					version = "0.10.1"
 | 
				
			||||||
@ -906,6 +912,16 @@ dependencies = [
 | 
				
			|||||||
 "syn",
 | 
					 "syn",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "der"
 | 
				
			||||||
 | 
					version = "0.4.5"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "79b71cca7d95d7681a4b3b9cdf63c8dbc3730d0584c2c74e31416d64a90493f4"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "const-oid",
 | 
				
			||||||
 | 
					 "crypto-bigint",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "derive_builder"
 | 
					name = "derive_builder"
 | 
				
			||||||
version = "0.10.2"
 | 
					version = "0.10.2"
 | 
				
			||||||
@ -976,6 +992,26 @@ dependencies = [
 | 
				
			|||||||
 "generic-array",
 | 
					 "generic-array",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "dirs"
 | 
				
			||||||
 | 
					version = "4.0.0"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "dirs-sys",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "dirs-sys"
 | 
				
			||||||
 | 
					version = "0.3.7"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "libc",
 | 
				
			||||||
 | 
					 "redox_users",
 | 
				
			||||||
 | 
					 "winapi",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "discard"
 | 
					name = "discard"
 | 
				
			||||||
version = "1.0.4"
 | 
					version = "1.0.4"
 | 
				
			||||||
@ -1086,6 +1122,18 @@ dependencies = [
 | 
				
			|||||||
 "num-traits",
 | 
					 "num-traits",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "flume"
 | 
				
			||||||
 | 
					version = "0.10.12"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "843c03199d0c0ca54bc1ea90ac0d507274c28abcc4f691ae8b4eaa375087c76a"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "futures-core",
 | 
				
			||||||
 | 
					 "futures-sink",
 | 
				
			||||||
 | 
					 "pin-project",
 | 
				
			||||||
 | 
					 "spin 0.9.2",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "fnv"
 | 
					name = "fnv"
 | 
				
			||||||
version = "1.0.7"
 | 
					version = "1.0.7"
 | 
				
			||||||
@ -1146,9 +1194,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-channel"
 | 
					name = "futures-channel"
 | 
				
			||||||
version = "0.3.17"
 | 
					version = "0.3.21"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888"
 | 
					checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "futures-core",
 | 
					 "futures-core",
 | 
				
			||||||
 "futures-sink",
 | 
					 "futures-sink",
 | 
				
			||||||
@ -1156,9 +1204,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-core"
 | 
					name = "futures-core"
 | 
				
			||||||
version = "0.3.17"
 | 
					version = "0.3.21"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d"
 | 
					checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-enum"
 | 
					name = "futures-enum"
 | 
				
			||||||
@ -1173,9 +1221,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-executor"
 | 
					name = "futures-executor"
 | 
				
			||||||
version = "0.3.17"
 | 
					version = "0.3.21"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c"
 | 
					checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "futures-core",
 | 
					 "futures-core",
 | 
				
			||||||
 "futures-task",
 | 
					 "futures-task",
 | 
				
			||||||
@ -1183,19 +1231,28 @@ dependencies = [
 | 
				
			|||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-io"
 | 
					name = "futures-intrusive"
 | 
				
			||||||
version = "0.3.17"
 | 
					version = "0.4.0"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377"
 | 
					checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "futures-core",
 | 
				
			||||||
 | 
					 "lock_api",
 | 
				
			||||||
 | 
					 "parking_lot",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "futures-io"
 | 
				
			||||||
 | 
					version = "0.3.21"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-macro"
 | 
					name = "futures-macro"
 | 
				
			||||||
version = "0.3.17"
 | 
					version = "0.3.21"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb"
 | 
					checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "autocfg 1.0.1",
 | 
					 | 
				
			||||||
 "proc-macro-hack",
 | 
					 | 
				
			||||||
 "proc-macro2",
 | 
					 "proc-macro2",
 | 
				
			||||||
 "quote",
 | 
					 "quote",
 | 
				
			||||||
 "syn",
 | 
					 "syn",
 | 
				
			||||||
@ -1203,23 +1260,22 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-sink"
 | 
					name = "futures-sink"
 | 
				
			||||||
version = "0.3.17"
 | 
					version = "0.3.21"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11"
 | 
					checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-task"
 | 
					name = "futures-task"
 | 
				
			||||||
version = "0.3.17"
 | 
					version = "0.3.21"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99"
 | 
					checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-util"
 | 
					name = "futures-util"
 | 
				
			||||||
version = "0.3.17"
 | 
					version = "0.3.21"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481"
 | 
					checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "autocfg 1.0.1",
 | 
					 | 
				
			||||||
 "futures-channel",
 | 
					 "futures-channel",
 | 
				
			||||||
 "futures-core",
 | 
					 "futures-core",
 | 
				
			||||||
 "futures-io",
 | 
					 "futures-io",
 | 
				
			||||||
@ -1229,8 +1285,6 @@ dependencies = [
 | 
				
			|||||||
 "memchr",
 | 
					 "memchr",
 | 
				
			||||||
 "pin-project-lite",
 | 
					 "pin-project-lite",
 | 
				
			||||||
 "pin-utils",
 | 
					 "pin-utils",
 | 
				
			||||||
 "proc-macro-hack",
 | 
					 | 
				
			||||||
 "proc-macro-nested",
 | 
					 | 
				
			||||||
 "slab",
 | 
					 "slab",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1430,23 +1484,23 @@ name = "hashbrown"
 | 
				
			|||||||
version = "0.9.1"
 | 
					version = "0.9.1"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
 | 
					checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
 | 
				
			||||||
dependencies = [
 | 
					 | 
				
			||||||
 "ahash 0.4.7",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "hashbrown"
 | 
					name = "hashbrown"
 | 
				
			||||||
version = "0.11.2"
 | 
					version = "0.11.2"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
 | 
					checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "ahash",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "hashlink"
 | 
					name = "hashlink"
 | 
				
			||||||
version = "0.6.0"
 | 
					version = "0.7.0"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "d99cf782f0dc4372d26846bec3de7804ceb5df083c2d4462c0b8d2330e894fa8"
 | 
					checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "hashbrown 0.9.1",
 | 
					 "hashbrown 0.11.2",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@ -1528,7 +1582,7 @@ checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11"
 | 
				
			|||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "bytes",
 | 
					 "bytes",
 | 
				
			||||||
 "fnv",
 | 
					 "fnv",
 | 
				
			||||||
 "itoa",
 | 
					 "itoa 0.4.8",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@ -1575,7 +1629,7 @@ dependencies = [
 | 
				
			|||||||
 "http-body",
 | 
					 "http-body",
 | 
				
			||||||
 "httparse",
 | 
					 "httparse",
 | 
				
			||||||
 "httpdate",
 | 
					 "httpdate",
 | 
				
			||||||
 "itoa",
 | 
					 "itoa 0.4.8",
 | 
				
			||||||
 "pin-project-lite",
 | 
					 "pin-project-lite",
 | 
				
			||||||
 "socket2",
 | 
					 "socket2",
 | 
				
			||||||
 "tokio",
 | 
					 "tokio",
 | 
				
			||||||
@ -1622,12 +1676,12 @@ checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "indexmap"
 | 
					name = "indexmap"
 | 
				
			||||||
version = "1.7.0"
 | 
					version = "1.6.2"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
 | 
					checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "autocfg 1.0.1",
 | 
					 "autocfg 1.0.1",
 | 
				
			||||||
 "hashbrown 0.11.2",
 | 
					 "hashbrown 0.9.1",
 | 
				
			||||||
 "serde",
 | 
					 "serde",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1667,6 +1721,12 @@ version = "0.4.8"
 | 
				
			|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
 | 
					checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "itoa"
 | 
				
			||||||
 | 
					version = "1.0.1"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "jobserver"
 | 
					name = "jobserver"
 | 
				
			||||||
version = "0.1.24"
 | 
					version = "0.1.24"
 | 
				
			||||||
@ -1765,7 +1825,7 @@ version = "1.4.0"
 | 
				
			|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 | 
					checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "spin",
 | 
					 "spin 0.5.2",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@ -1856,9 +1916,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "libc"
 | 
					name = "libc"
 | 
				
			||||||
version = "0.2.101"
 | 
					version = "0.2.121"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21"
 | 
					checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "libm"
 | 
					name = "libm"
 | 
				
			||||||
@ -1868,9 +1928,9 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "libsqlite3-sys"
 | 
					name = "libsqlite3-sys"
 | 
				
			||||||
version = "0.20.1"
 | 
					version = "0.23.2"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "64d31059f22935e6c31830db5249ba2b7ecd54fd73a9909286f0a67aa55c2fbd"
 | 
					checksum = "d2cafc7c74096c336d9d27145f7ebd4f4b6f95ba16aa5a282387267e6925cb58"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "cc",
 | 
					 "cc",
 | 
				
			||||||
 "pkg-config",
 | 
					 "pkg-config",
 | 
				
			||||||
@ -1923,6 +1983,7 @@ dependencies = [
 | 
				
			|||||||
 "orion",
 | 
					 "orion",
 | 
				
			||||||
 "rand 0.8.4",
 | 
					 "rand 0.8.4",
 | 
				
			||||||
 "sea-query",
 | 
					 "sea-query",
 | 
				
			||||||
 | 
					 "sea-query-binder",
 | 
				
			||||||
 "secstr",
 | 
					 "secstr",
 | 
				
			||||||
 "serde",
 | 
					 "serde",
 | 
				
			||||||
 "serde_json",
 | 
					 "serde_json",
 | 
				
			||||||
@ -1949,6 +2010,7 @@ dependencies = [
 | 
				
			|||||||
 "chrono",
 | 
					 "chrono",
 | 
				
			||||||
 "graphql_client",
 | 
					 "graphql_client",
 | 
				
			||||||
 "http",
 | 
					 "http",
 | 
				
			||||||
 | 
					 "indexmap",
 | 
				
			||||||
 "jwt",
 | 
					 "jwt",
 | 
				
			||||||
 "lldap_auth",
 | 
					 "lldap_auth",
 | 
				
			||||||
 "rand 0.8.4",
 | 
					 "rand 0.8.4",
 | 
				
			||||||
@ -2232,17 +2294,6 @@ dependencies = [
 | 
				
			|||||||
 "winapi",
 | 
					 "winapi",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					 | 
				
			||||||
name = "num-bigint"
 | 
					 | 
				
			||||||
version = "0.2.6"
 | 
					 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					 | 
				
			||||||
checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304"
 | 
					 | 
				
			||||||
dependencies = [
 | 
					 | 
				
			||||||
 "autocfg 1.0.1",
 | 
					 | 
				
			||||||
 "num-integer",
 | 
					 | 
				
			||||||
 "num-traits",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "num-bigint"
 | 
					name = "num-bigint"
 | 
				
			||||||
version = "0.3.3"
 | 
					version = "0.3.3"
 | 
				
			||||||
@ -2256,9 +2307,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "num-bigint-dig"
 | 
					name = "num-bigint-dig"
 | 
				
			||||||
version = "0.6.1"
 | 
					version = "0.7.0"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "5d51546d704f52ef14b3c962b5776e53d5b862e5790e40a350d366c209bd7f7a"
 | 
					checksum = "4547ee5541c18742396ae2c895d0717d0f886d8823b8399cdaf7b07d63ad0480"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "autocfg 0.1.7",
 | 
					 "autocfg 0.1.7",
 | 
				
			||||||
 "byteorder",
 | 
					 "byteorder",
 | 
				
			||||||
@ -2267,8 +2318,7 @@ dependencies = [
 | 
				
			|||||||
 "num-integer",
 | 
					 "num-integer",
 | 
				
			||||||
 "num-iter",
 | 
					 "num-iter",
 | 
				
			||||||
 "num-traits",
 | 
					 "num-traits",
 | 
				
			||||||
 "rand 0.7.3",
 | 
					 "rand 0.8.4",
 | 
				
			||||||
 "serde",
 | 
					 | 
				
			||||||
 "smallvec",
 | 
					 "smallvec",
 | 
				
			||||||
 "zeroize",
 | 
					 "zeroize",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
@ -2301,6 +2351,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			|||||||
checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
 | 
					checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "autocfg 1.0.1",
 | 
					 "autocfg 1.0.1",
 | 
				
			||||||
 | 
					 "libm",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@ -2324,9 +2375,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "once_cell"
 | 
					name = "once_cell"
 | 
				
			||||||
version = "1.8.0"
 | 
					version = "1.10.0"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
 | 
					checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "opaque-debug"
 | 
					name = "opaque-debug"
 | 
				
			||||||
@ -2443,9 +2494,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "paste"
 | 
					name = "paste"
 | 
				
			||||||
version = "1.0.5"
 | 
					version = "1.0.6"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58"
 | 
					checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "pear"
 | 
					name = "pear"
 | 
				
			||||||
@ -2471,14 +2522,12 @@ dependencies = [
 | 
				
			|||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "pem"
 | 
					name = "pem-rfc7468"
 | 
				
			||||||
version = "0.8.3"
 | 
					version = "0.2.4"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb"
 | 
					checksum = "84e93a3b1cc0510b03020f33f21e62acdde3dcaef432edc95bea377fbd4c2cd4"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "base64",
 | 
					 "base64ct",
 | 
				
			||||||
 "once_cell",
 | 
					 | 
				
			||||||
 "regex",
 | 
					 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
@ -2528,6 +2577,30 @@ version = "0.1.0"
 | 
				
			|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 | 
					checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "pkcs1"
 | 
				
			||||||
 | 
					version = "0.2.4"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "116bee8279d783c0cf370efa1a94632f2108e5ef0bb32df31f051647810a4e2c"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "der",
 | 
				
			||||||
 | 
					 "pem-rfc7468",
 | 
				
			||||||
 | 
					 "zeroize",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "pkcs8"
 | 
				
			||||||
 | 
					version = "0.7.6"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "ee3ef9b64d26bad0536099c816c6734379e45bbd5f14798def6809e5cc350447"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "der",
 | 
				
			||||||
 | 
					 "pem-rfc7468",
 | 
				
			||||||
 | 
					 "pkcs1",
 | 
				
			||||||
 | 
					 "spki",
 | 
				
			||||||
 | 
					 "zeroize",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "pkg-config"
 | 
					name = "pkg-config"
 | 
				
			||||||
version = "0.3.19"
 | 
					version = "0.3.19"
 | 
				
			||||||
@ -2599,17 +2672,11 @@ version = "0.5.19"
 | 
				
			|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
 | 
					checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					 | 
				
			||||||
name = "proc-macro-nested"
 | 
					 | 
				
			||||||
version = "0.1.7"
 | 
					 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					 | 
				
			||||||
checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "proc-macro2"
 | 
					name = "proc-macro2"
 | 
				
			||||||
version = "1.0.29"
 | 
					version = "1.0.36"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d"
 | 
					checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "unicode-xid",
 | 
					 "unicode-xid",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
@ -2629,9 +2696,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "quote"
 | 
					name = "quote"
 | 
				
			||||||
version = "1.0.9"
 | 
					version = "1.0.16"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
 | 
					checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "proc-macro2",
 | 
					 "proc-macro2",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
@ -2742,13 +2809,24 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "redox_syscall"
 | 
					name = "redox_syscall"
 | 
				
			||||||
version = "0.2.10"
 | 
					version = "0.2.11"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
 | 
					checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "bitflags",
 | 
					 "bitflags",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "redox_users"
 | 
				
			||||||
 | 
					version = "0.4.2"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "7776223e2696f1aa4c6b0170e83212f47296a00424305117d013dfe86fb0fe55"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "getrandom 0.2.3",
 | 
				
			||||||
 | 
					 "redox_syscall",
 | 
				
			||||||
 | 
					 "thiserror",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "regex"
 | 
					name = "regex"
 | 
				
			||||||
version = "1.5.4"
 | 
					version = "1.5.4"
 | 
				
			||||||
@ -2835,9 +2913,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "rsa"
 | 
					name = "rsa"
 | 
				
			||||||
version = "0.3.0"
 | 
					version = "0.5.0"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "3648b669b10afeab18972c105e284a7b953a669b0be3514c27f9b17acab2f9cd"
 | 
					checksum = "e05c2603e2823634ab331437001b411b9ed11660fbc4066f3908c84a9439260d"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "byteorder",
 | 
					 "byteorder",
 | 
				
			||||||
 "digest",
 | 
					 "digest",
 | 
				
			||||||
@ -2846,12 +2924,10 @@ dependencies = [
 | 
				
			|||||||
 "num-integer",
 | 
					 "num-integer",
 | 
				
			||||||
 "num-iter",
 | 
					 "num-iter",
 | 
				
			||||||
 "num-traits",
 | 
					 "num-traits",
 | 
				
			||||||
 "pem",
 | 
					 "pkcs1",
 | 
				
			||||||
 "rand 0.7.3",
 | 
					 "pkcs8",
 | 
				
			||||||
 "sha2",
 | 
					 "rand 0.8.4",
 | 
				
			||||||
 "simple_asn1",
 | 
					 | 
				
			||||||
 "subtle",
 | 
					 "subtle",
 | 
				
			||||||
 "thiserror",
 | 
					 | 
				
			||||||
 "zeroize",
 | 
					 "zeroize",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2924,21 +3000,40 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "sea-query"
 | 
					name = "sea-query"
 | 
				
			||||||
version = "0.9.6"
 | 
					version = "0.25.0"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "git+https://github.com/SeaQL/sea-query/?rev=f2b74b2875a1a5a5550a7c8658d3fcd385134925#f2b74b2875a1a5a5550a7c8658d3fcd385134925"
 | 
				
			||||||
checksum = "f3266fa53846a5ac9eaf85709979acde05d9ba54a5fa4a0b35d897074f1569a2"
 | 
					 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "chrono",
 | 
					 "chrono",
 | 
				
			||||||
 "sea-query-derive",
 | 
					 "sea-query-derive",
 | 
				
			||||||
 | 
					 "sea-query-driver",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "sea-query-binder"
 | 
				
			||||||
 | 
					version = "0.1.0"
 | 
				
			||||||
 | 
					source = "git+https://github.com/SeaQL/sea-query/?rev=f2b74b2875a1a5a5550a7c8658d3fcd385134925#f2b74b2875a1a5a5550a7c8658d3fcd385134925"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "sea-query",
 | 
				
			||||||
 | 
					 "sqlx",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "sea-query-derive"
 | 
					name = "sea-query-derive"
 | 
				
			||||||
version = "0.1.2"
 | 
					version = "0.2.0"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "git+https://github.com/SeaQL/sea-query/?rev=f2b74b2875a1a5a5550a7c8658d3fcd385134925#f2b74b2875a1a5a5550a7c8658d3fcd385134925"
 | 
				
			||||||
checksum = "0f30d6681c05300d4d92aa3dce08585b52c775735d632bb1f16f9f68f29c832d"
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "heck 0.4.0",
 | 
				
			||||||
 | 
					 "proc-macro2",
 | 
				
			||||||
 | 
					 "quote",
 | 
				
			||||||
 | 
					 "syn",
 | 
				
			||||||
 | 
					 "thiserror",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "sea-query-driver"
 | 
				
			||||||
 | 
					version = "0.1.1"
 | 
				
			||||||
 | 
					source = "git+https://github.com/SeaQL/sea-query/?rev=f2b74b2875a1a5a5550a7c8658d3fcd385134925#f2b74b2875a1a5a5550a7c8658d3fcd385134925"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "heck 0.3.3",
 | 
					 | 
				
			||||||
 "proc-macro2",
 | 
					 "proc-macro2",
 | 
				
			||||||
 "quote",
 | 
					 "quote",
 | 
				
			||||||
 "syn",
 | 
					 "syn",
 | 
				
			||||||
@ -3012,18 +3107,18 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "serde"
 | 
					name = "serde"
 | 
				
			||||||
version = "1.0.130"
 | 
					version = "1.0.136"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913"
 | 
					checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "serde_derive",
 | 
					 "serde_derive",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "serde_derive"
 | 
					name = "serde_derive"
 | 
				
			||||||
version = "1.0.130"
 | 
					version = "1.0.136"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
 | 
					checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "proc-macro2",
 | 
					 "proc-macro2",
 | 
				
			||||||
 "quote",
 | 
					 "quote",
 | 
				
			||||||
@ -3032,12 +3127,12 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "serde_json"
 | 
					name = "serde_json"
 | 
				
			||||||
version = "1.0.67"
 | 
					version = "1.0.79"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "a7f9e390c27c3c0ce8bc5d725f6e4d30a29d26659494aa4b17535f7522c5c950"
 | 
					checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "indexmap",
 | 
					 "indexmap",
 | 
				
			||||||
 "itoa",
 | 
					 "itoa 1.0.1",
 | 
				
			||||||
 "ryu",
 | 
					 "ryu",
 | 
				
			||||||
 "serde",
 | 
					 "serde",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
@ -3049,7 +3144,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			|||||||
checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9"
 | 
					checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "form_urlencoded",
 | 
					 "form_urlencoded",
 | 
				
			||||||
 "itoa",
 | 
					 "itoa 0.4.8",
 | 
				
			||||||
 "ryu",
 | 
					 "ryu",
 | 
				
			||||||
 "serde",
 | 
					 "serde",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
@ -3075,9 +3170,9 @@ checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "sha2"
 | 
					name = "sha2"
 | 
				
			||||||
version = "0.9.6"
 | 
					version = "0.9.9"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "9204c41a1597a8c5af23c82d1c921cb01ec0a4c59e07a9c7306062829a3903f3"
 | 
					checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "block-buffer",
 | 
					 "block-buffer",
 | 
				
			||||||
 "cfg-if 1.0.0",
 | 
					 "cfg-if 1.0.0",
 | 
				
			||||||
@ -3125,17 +3220,6 @@ dependencies = [
 | 
				
			|||||||
 "libc",
 | 
					 "libc",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					 | 
				
			||||||
name = "simple_asn1"
 | 
					 | 
				
			||||||
version = "0.4.1"
 | 
					 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					 | 
				
			||||||
checksum = "692ca13de57ce0613a363c8c2f1de925adebc81b04c923ac60c5488bb44abe4b"
 | 
					 | 
				
			||||||
dependencies = [
 | 
					 | 
				
			||||||
 "chrono",
 | 
					 | 
				
			||||||
 "num-bigint 0.2.6",
 | 
					 | 
				
			||||||
 "num-traits",
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "slab"
 | 
					name = "slab"
 | 
				
			||||||
version = "0.4.4"
 | 
					version = "0.4.4"
 | 
				
			||||||
@ -3144,9 +3228,9 @@ checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "smallvec"
 | 
					name = "smallvec"
 | 
				
			||||||
version = "1.6.1"
 | 
					version = "1.8.0"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
 | 
					checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "smartstring"
 | 
					name = "smartstring"
 | 
				
			||||||
@ -3180,23 +3264,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			|||||||
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
 | 
					checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "sqlformat"
 | 
					name = "spin"
 | 
				
			||||||
version = "0.1.7"
 | 
					version = "0.9.2"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "684001e7985ec1a9a66963b77ed151ef22a7876b3fdd7e37a57ec774f54b7d96"
 | 
					checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "lazy_static",
 | 
					 "lock_api",
 | 
				
			||||||
 "maplit",
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "spki"
 | 
				
			||||||
 | 
					version = "0.4.1"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "5c01a0c15da1b0b0e1494112e7af814a678fec9bd157881b49beac661e9b6f32"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "der",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "sqlformat"
 | 
				
			||||||
 | 
					version = "0.1.8"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "itertools",
 | 
				
			||||||
 "nom 7.0.0",
 | 
					 "nom 7.0.0",
 | 
				
			||||||
 "regex",
 | 
					 | 
				
			||||||
 "unicode_categories",
 | 
					 "unicode_categories",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "sqlx"
 | 
					name = "sqlx"
 | 
				
			||||||
version = "0.5.1"
 | 
					version = "0.5.11"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "c2739d54a2ae9fdd0f545cb4e4b5574efb95e2ec71b7f921678e246fb20dcaaf"
 | 
					checksum = "fc15591eb44ffb5816a4a70a7efd5dd87bfd3aa84c4c200401c4396140525826"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "sqlx-core",
 | 
					 "sqlx-core",
 | 
				
			||||||
 "sqlx-macros",
 | 
					 "sqlx-macros",
 | 
				
			||||||
@ -3204,11 +3304,11 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "sqlx-core"
 | 
					name = "sqlx-core"
 | 
				
			||||||
version = "0.5.1"
 | 
					version = "0.5.11"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "b1cad9cae4ca8947eba1a90e8ec7d3c59e7a768e2f120dc9013b669c34a90711"
 | 
					checksum = "195183bf6ff8328bb82c0511a83faf60aacf75840103388851db61d7a9854ae3"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "ahash 0.6.3",
 | 
					 "ahash",
 | 
				
			||||||
 "atoi",
 | 
					 "atoi",
 | 
				
			||||||
 "base64",
 | 
					 "base64",
 | 
				
			||||||
 "bitflags",
 | 
					 "bitflags",
 | 
				
			||||||
@ -3216,29 +3316,32 @@ dependencies = [
 | 
				
			|||||||
 "bytes",
 | 
					 "bytes",
 | 
				
			||||||
 "chrono",
 | 
					 "chrono",
 | 
				
			||||||
 "crc",
 | 
					 "crc",
 | 
				
			||||||
 "crossbeam-channel",
 | 
					 | 
				
			||||||
 "crossbeam-queue",
 | 
					 "crossbeam-queue",
 | 
				
			||||||
 "crossbeam-utils",
 | 
					 | 
				
			||||||
 "digest",
 | 
					 "digest",
 | 
				
			||||||
 | 
					 "dirs",
 | 
				
			||||||
 "either",
 | 
					 "either",
 | 
				
			||||||
 | 
					 "flume",
 | 
				
			||||||
 "futures-channel",
 | 
					 "futures-channel",
 | 
				
			||||||
 "futures-core",
 | 
					 "futures-core",
 | 
				
			||||||
 | 
					 "futures-executor",
 | 
				
			||||||
 | 
					 "futures-intrusive",
 | 
				
			||||||
 "futures-util",
 | 
					 "futures-util",
 | 
				
			||||||
 "generic-array",
 | 
					 "generic-array",
 | 
				
			||||||
 "hashlink",
 | 
					 "hashlink",
 | 
				
			||||||
 "hex",
 | 
					 "hex",
 | 
				
			||||||
 "hmac 0.10.1",
 | 
					 "hmac 0.11.0",
 | 
				
			||||||
 "itoa",
 | 
					 "indexmap",
 | 
				
			||||||
 | 
					 "itoa 1.0.1",
 | 
				
			||||||
 "libc",
 | 
					 "libc",
 | 
				
			||||||
 "libsqlite3-sys",
 | 
					 "libsqlite3-sys",
 | 
				
			||||||
 "log",
 | 
					 "log",
 | 
				
			||||||
 "md-5",
 | 
					 "md-5",
 | 
				
			||||||
 "memchr",
 | 
					 "memchr",
 | 
				
			||||||
 "num-bigint 0.3.3",
 | 
					 "num-bigint",
 | 
				
			||||||
 "once_cell",
 | 
					 "once_cell",
 | 
				
			||||||
 "parking_lot",
 | 
					 "paste",
 | 
				
			||||||
 "percent-encoding",
 | 
					 "percent-encoding",
 | 
				
			||||||
 "rand 0.7.3",
 | 
					 "rand 0.8.4",
 | 
				
			||||||
 "rsa",
 | 
					 "rsa",
 | 
				
			||||||
 "serde",
 | 
					 "serde",
 | 
				
			||||||
 "serde_json",
 | 
					 "serde_json",
 | 
				
			||||||
@ -3256,14 +3359,14 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "sqlx-macros"
 | 
					name = "sqlx-macros"
 | 
				
			||||||
version = "0.5.1"
 | 
					version = "0.5.11"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "01caee2b3935b4efe152f3262afbe51546ce3b1fc27ad61014e1b3cf5f55366e"
 | 
					checksum = "eee35713129561f5e55c554bba1c378e2a7e67f81257b7311183de98c50e6f94"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "dotenv",
 | 
					 "dotenv",
 | 
				
			||||||
 "either",
 | 
					 "either",
 | 
				
			||||||
 "futures",
 | 
					 | 
				
			||||||
 "heck 0.3.3",
 | 
					 "heck 0.3.3",
 | 
				
			||||||
 | 
					 "once_cell",
 | 
				
			||||||
 "proc-macro2",
 | 
					 "proc-macro2",
 | 
				
			||||||
 "quote",
 | 
					 "quote",
 | 
				
			||||||
 "sha2",
 | 
					 "sha2",
 | 
				
			||||||
@ -3275,9 +3378,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "sqlx-rt"
 | 
					name = "sqlx-rt"
 | 
				
			||||||
version = "0.3.0"
 | 
					version = "0.5.11"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "4ce2e16b6774c671cc183e1d202386fdf9cde1e8468c1894a7f2a63eb671c4f4"
 | 
					checksum = "b555e70fbbf84e269ec3858b7a6515bcfe7a166a7cc9c636dd6efd20431678b6"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "actix-rt",
 | 
					 "actix-rt",
 | 
				
			||||||
 "native-tls",
 | 
					 "native-tls",
 | 
				
			||||||
@ -3374,9 +3477,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "syn"
 | 
					name = "syn"
 | 
				
			||||||
version = "1.0.75"
 | 
					version = "1.0.89"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7"
 | 
					checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "proc-macro2",
 | 
					 "proc-macro2",
 | 
				
			||||||
 "quote",
 | 
					 "quote",
 | 
				
			||||||
@ -3443,18 +3546,18 @@ checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "thiserror"
 | 
					name = "thiserror"
 | 
				
			||||||
version = "1.0.28"
 | 
					version = "1.0.30"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "283d5230e63df9608ac7d9691adc1dfb6e701225436eb64d0b9a7f0a5a04f6ec"
 | 
					checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "thiserror-impl",
 | 
					 "thiserror-impl",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "thiserror-impl"
 | 
					name = "thiserror-impl"
 | 
				
			||||||
version = "1.0.28"
 | 
					version = "1.0.30"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "fa3884228611f5cd3608e2d409bf7dce832e4eb3135e3f11addbd7e41bd68e71"
 | 
					checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "proc-macro2",
 | 
					 "proc-macro2",
 | 
				
			||||||
 "quote",
 | 
					 "quote",
 | 
				
			||||||
@ -3576,9 +3679,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "tokio-stream"
 | 
					name = "tokio-stream"
 | 
				
			||||||
version = "0.1.7"
 | 
					version = "0.1.8"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f"
 | 
					checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "futures-core",
 | 
					 "futures-core",
 | 
				
			||||||
 "pin-project-lite",
 | 
					 "pin-project-lite",
 | 
				
			||||||
@ -3976,9 +4079,9 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "whoami"
 | 
					name = "whoami"
 | 
				
			||||||
version = "1.1.3"
 | 
					version = "1.2.1"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "f7741161a40200a867c96dfa5574544efa4178cf4c8f770b62dd1cc0362d7ae1"
 | 
					checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "wasm-bindgen",
 | 
					 "wasm-bindgen",
 | 
				
			||||||
 "web-sys",
 | 
					 "web-sys",
 | 
				
			||||||
 | 
				
			|||||||
@ -16,3 +16,12 @@ rev = '67050812695b7a8a90b81b0637e347fc6629daed'
 | 
				
			|||||||
[patch.crates-io.yew_form_derive]
 | 
					[patch.crates-io.yew_form_derive]
 | 
				
			||||||
git = 'https://github.com/sassman/yew_form/'
 | 
					git = 'https://github.com/sassman/yew_form/'
 | 
				
			||||||
rev = '67050812695b7a8a90b81b0637e347fc6629daed'
 | 
					rev = '67050812695b7a8a90b81b0637e347fc6629daed'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# TODO: remove after https://github.com/SeaQL/sea-query has a release >0.25
 | 
				
			||||||
 | 
					[patch.crates-io.sea-query]
 | 
				
			||||||
 | 
					git = 'https://github.com/SeaQL/sea-query/'
 | 
				
			||||||
 | 
					rev = 'f2b74b2875a1a5a5550a7c8658d3fcd385134925'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[patch.crates-io.sea-query-binder]
 | 
				
			||||||
 | 
					git = 'https://github.com/SeaQL/sea-query/'
 | 
				
			||||||
 | 
					rev = 'f2b74b2875a1a5a5550a7c8658d3fcd385134925'
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,9 @@ yew-router = "0.15"
 | 
				
			|||||||
yew_form = "0.1.8"
 | 
					yew_form = "0.1.8"
 | 
				
			||||||
yew_form_derive = "*"
 | 
					yew_form_derive = "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Needed because of https://github.com/tkaitchuck/aHash/issues/95
 | 
				
			||||||
 | 
					indexmap = "=1.6.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies.web-sys]
 | 
					[dependencies.web-sys]
 | 
				
			||||||
version = "0.3"
 | 
					version = "0.3"
 | 
				
			||||||
features = [
 | 
					features = [
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@ js = []
 | 
				
			|||||||
[dependencies]
 | 
					[dependencies]
 | 
				
			||||||
rust-argon2 = "0.8"
 | 
					rust-argon2 = "0.8"
 | 
				
			||||||
curve25519-dalek = "3"
 | 
					curve25519-dalek = "3"
 | 
				
			||||||
digest = "*"
 | 
					digest = "0.9"
 | 
				
			||||||
generic-array = "*"
 | 
					generic-array = "*"
 | 
				
			||||||
rand = "0.8"
 | 
					rand = "0.8"
 | 
				
			||||||
serde = "*"
 | 
					serde = "*"
 | 
				
			||||||
 | 
				
			|||||||
@ -34,7 +34,7 @@ native-tls = "0.2.10"
 | 
				
			|||||||
serde = "*"
 | 
					serde = "*"
 | 
				
			||||||
serde_json = "1"
 | 
					serde_json = "1"
 | 
				
			||||||
sha2 = "0.9"
 | 
					sha2 = "0.9"
 | 
				
			||||||
sqlx-core = "=0.5.1"
 | 
					sqlx-core = "0.5.11"
 | 
				
			||||||
thiserror = "*"
 | 
					thiserror = "*"
 | 
				
			||||||
time = "0.2"
 | 
					time = "0.2"
 | 
				
			||||||
tokio = { version = "1.13.1", features = ["full"] }
 | 
					tokio = { version = "1.13.1", features = ["full"] }
 | 
				
			||||||
@ -64,7 +64,7 @@ features = [
 | 
				
			|||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies.sqlx]
 | 
					[dependencies.sqlx]
 | 
				
			||||||
version = "0.5.1"
 | 
					version = "0.5.11"
 | 
				
			||||||
features = [
 | 
					features = [
 | 
				
			||||||
  "any",
 | 
					  "any",
 | 
				
			||||||
  "chrono",
 | 
					  "chrono",
 | 
				
			||||||
@ -76,8 +76,12 @@ features = [
 | 
				
			|||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies.sea-query]
 | 
					[dependencies.sea-query]
 | 
				
			||||||
version = "0.9.4"
 | 
					version = "^0.25"
 | 
				
			||||||
features = ["with-chrono"]
 | 
					features = ["with-chrono", "sqlx-sqlite"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[dependencies.sea-query-binder]
 | 
				
			||||||
 | 
					version = "*"
 | 
				
			||||||
 | 
					features = ["with-chrono", "sqlx-sqlite", "sqlx-any"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies.figment]
 | 
					[dependencies.figment]
 | 
				
			||||||
features = ["env", "toml"]
 | 
					features = ["env", "toml"]
 | 
				
			||||||
 | 
				
			|||||||
@ -2,8 +2,9 @@ use super::{error::*, handler::*, sql_tables::*};
 | 
				
			|||||||
use crate::infra::configuration::Configuration;
 | 
					use crate::infra::configuration::Configuration;
 | 
				
			||||||
use async_trait::async_trait;
 | 
					use async_trait::async_trait;
 | 
				
			||||||
use futures_util::StreamExt;
 | 
					use futures_util::StreamExt;
 | 
				
			||||||
use sea_query::{Expr, Iden, Order, Query, SimpleExpr};
 | 
					use sea_query::{Cond, Expr, Iden, Order, Query, SimpleExpr};
 | 
				
			||||||
use sqlx::{FromRow, Row};
 | 
					use sea_query_binder::SqlxBinder;
 | 
				
			||||||
 | 
					use sqlx::{query_as_with, query_with, FromRow, Row};
 | 
				
			||||||
use std::collections::HashSet;
 | 
					use std::collections::HashSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Clone)]
 | 
					#[derive(Debug, Clone)]
 | 
				
			||||||
@ -101,7 +102,7 @@ fn get_group_filter_expr(filter: GroupRequestFilter) -> SimpleExpr {
 | 
				
			|||||||
            Query::select()
 | 
					            Query::select()
 | 
				
			||||||
                .column(Memberships::GroupId)
 | 
					                .column(Memberships::GroupId)
 | 
				
			||||||
                .from(Memberships::Table)
 | 
					                .from(Memberships::Table)
 | 
				
			||||||
                .and_where(Expr::col(Memberships::UserId).eq(user))
 | 
					                .cond_where(Expr::col(Memberships::UserId).eq(user))
 | 
				
			||||||
                .take(),
 | 
					                .take(),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -114,7 +115,7 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
        filters: Option<UserRequestFilter>,
 | 
					        filters: Option<UserRequestFilter>,
 | 
				
			||||||
        get_groups: bool,
 | 
					        get_groups: bool,
 | 
				
			||||||
    ) -> Result<Vec<UserAndGroups>> {
 | 
					    ) -> Result<Vec<UserAndGroups>> {
 | 
				
			||||||
        let query = {
 | 
					        let (query, values) = {
 | 
				
			||||||
            let mut query_builder = Query::select()
 | 
					            let mut query_builder = Query::select()
 | 
				
			||||||
                .column((Users::Table, Users::UserId))
 | 
					                .column((Users::Table, Users::UserId))
 | 
				
			||||||
                .column(Users::Email)
 | 
					                .column(Users::Email)
 | 
				
			||||||
@ -154,14 +155,24 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
                    && filter != UserRequestFilter::Or(Vec::new())
 | 
					                    && filter != UserRequestFilter::Or(Vec::new())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    let (RequiresGroup(requires_group), condition) = get_user_filter_expr(filter);
 | 
					                    let (RequiresGroup(requires_group), condition) = get_user_filter_expr(filter);
 | 
				
			||||||
                    query_builder.and_where(condition);
 | 
					                    query_builder.cond_where(condition);
 | 
				
			||||||
                    if requires_group && !get_groups {
 | 
					                    if requires_group {
 | 
				
			||||||
                        add_join_group_tables(&mut query_builder);
 | 
					                        query_builder
 | 
				
			||||||
 | 
					                            .left_join(
 | 
				
			||||||
 | 
					                                Memberships::Table,
 | 
				
			||||||
 | 
					                                Expr::tbl(Users::Table, Users::UserId)
 | 
				
			||||||
 | 
					                                    .equals(Memberships::Table, Memberships::UserId),
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
 | 
					                            .left_join(
 | 
				
			||||||
 | 
					                                Groups::Table,
 | 
				
			||||||
 | 
					                                Expr::tbl(Memberships::Table, Memberships::GroupId)
 | 
				
			||||||
 | 
					                                    .equals(Groups::Table, Groups::GroupId),
 | 
				
			||||||
 | 
					                            );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            query_builder.to_string(DbQueryBuilder {})
 | 
					            query_builder.build_sqlx(DbQueryBuilder {})
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        log::error!("query: {}", &query);
 | 
					        log::error!("query: {}", &query);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -170,7 +181,7 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
        let mut users = Vec::new();
 | 
					        let mut users = Vec::new();
 | 
				
			||||||
        // The rows are returned sorted by user_id. We group them by
 | 
					        // The rows are returned sorted by user_id. We group them by
 | 
				
			||||||
        // this key which gives us one element (`rows`) per group.
 | 
					        // this key which gives us one element (`rows`) per group.
 | 
				
			||||||
        for (_, rows) in &sqlx::query(&query)
 | 
					        for (_, rows) in &query_with(&query, values)
 | 
				
			||||||
            .fetch_all(&self.sql_pool)
 | 
					            .fetch_all(&self.sql_pool)
 | 
				
			||||||
            .await?
 | 
					            .await?
 | 
				
			||||||
            .into_iter()
 | 
					            .into_iter()
 | 
				
			||||||
@ -200,7 +211,7 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn list_groups(&self, filters: Option<GroupRequestFilter>) -> Result<Vec<Group>> {
 | 
					    async fn list_groups(&self, filters: Option<GroupRequestFilter>) -> Result<Vec<Group>> {
 | 
				
			||||||
        let query: String = {
 | 
					        let (query, values) = {
 | 
				
			||||||
            let mut query_builder = Query::select()
 | 
					            let mut query_builder = Query::select()
 | 
				
			||||||
                .column((Groups::Table, Groups::GroupId))
 | 
					                .column((Groups::Table, Groups::GroupId))
 | 
				
			||||||
                .column(Groups::DisplayName)
 | 
					                .column(Groups::DisplayName)
 | 
				
			||||||
@ -223,11 +234,11 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
                if filter != GroupRequestFilter::And(Vec::new())
 | 
					                if filter != GroupRequestFilter::And(Vec::new())
 | 
				
			||||||
                    && filter != GroupRequestFilter::Or(Vec::new())
 | 
					                    && filter != GroupRequestFilter::Or(Vec::new())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query_builder.and_where(get_group_filter_expr(filter));
 | 
					                    query_builder.cond_where(get_group_filter_expr(filter));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            query_builder.to_string(DbQueryBuilder {})
 | 
					            query_builder.build_sqlx(DbQueryBuilder {})
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // For group_by.
 | 
					        // For group_by.
 | 
				
			||||||
@ -235,7 +246,7 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
        let mut groups = Vec::new();
 | 
					        let mut groups = Vec::new();
 | 
				
			||||||
        // The rows are returned sorted by display_name, equivalent to group_id. We group them by
 | 
					        // The rows are returned sorted by display_name, equivalent to group_id. We group them by
 | 
				
			||||||
        // this key which gives us one element (`rows`) per group.
 | 
					        // this key which gives us one element (`rows`) per group.
 | 
				
			||||||
        for ((group_id, display_name), rows) in &sqlx::query(&query)
 | 
					        for ((group_id, display_name), rows) in &query_with(query.as_str(), values)
 | 
				
			||||||
            .fetch_all(&self.sql_pool)
 | 
					            .fetch_all(&self.sql_pool)
 | 
				
			||||||
            .await?
 | 
					            .await?
 | 
				
			||||||
            .into_iter()
 | 
					            .into_iter()
 | 
				
			||||||
@ -261,7 +272,7 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn get_user_details(&self, user_id: &UserId) -> Result<User> {
 | 
					    async fn get_user_details(&self, user_id: &UserId) -> Result<User> {
 | 
				
			||||||
        let query = Query::select()
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .column(Users::UserId)
 | 
					            .column(Users::UserId)
 | 
				
			||||||
            .column(Users::Email)
 | 
					            .column(Users::Email)
 | 
				
			||||||
            .column(Users::DisplayName)
 | 
					            .column(Users::DisplayName)
 | 
				
			||||||
@ -270,25 +281,27 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
            .column(Users::Avatar)
 | 
					            .column(Users::Avatar)
 | 
				
			||||||
            .column(Users::CreationDate)
 | 
					            .column(Users::CreationDate)
 | 
				
			||||||
            .from(Users::Table)
 | 
					            .from(Users::Table)
 | 
				
			||||||
            .and_where(Expr::col(Users::UserId).eq(user_id))
 | 
					            .cond_where(Expr::col(Users::UserId).eq(user_id))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Ok(sqlx::query_as::<_, User>(&query)
 | 
					        Ok(query_as_with::<_, User, _>(query.as_str(), values)
 | 
				
			||||||
            .fetch_one(&self.sql_pool)
 | 
					            .fetch_one(&self.sql_pool)
 | 
				
			||||||
            .await?)
 | 
					            .await?)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn get_group_details(&self, group_id: GroupId) -> Result<GroupIdAndName> {
 | 
					    async fn get_group_details(&self, group_id: GroupId) -> Result<GroupIdAndName> {
 | 
				
			||||||
        let query = Query::select()
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .column(Groups::GroupId)
 | 
					            .column(Groups::GroupId)
 | 
				
			||||||
            .column(Groups::DisplayName)
 | 
					            .column(Groups::DisplayName)
 | 
				
			||||||
            .from(Groups::Table)
 | 
					            .from(Groups::Table)
 | 
				
			||||||
            .and_where(Expr::col(Groups::GroupId).eq(group_id))
 | 
					            .cond_where(Expr::col(Groups::GroupId).eq(group_id))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Ok(sqlx::query_as::<_, GroupIdAndName>(&query)
 | 
					        Ok(
 | 
				
			||||||
 | 
					            query_as_with::<_, GroupIdAndName, _>(query.as_str(), values)
 | 
				
			||||||
                .fetch_one(&self.sql_pool)
 | 
					                .fetch_one(&self.sql_pool)
 | 
				
			||||||
            .await?)
 | 
					                .await?,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn get_user_groups(&self, user_id: &UserId) -> Result<HashSet<GroupIdAndName>> {
 | 
					    async fn get_user_groups(&self, user_id: &UserId) -> Result<HashSet<GroupIdAndName>> {
 | 
				
			||||||
@ -297,7 +310,7 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
            groups.insert(GroupIdAndName(GroupId(1), "lldap_admin".to_string()));
 | 
					            groups.insert(GroupIdAndName(GroupId(1), "lldap_admin".to_string()));
 | 
				
			||||||
            return Ok(groups);
 | 
					            return Ok(groups);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        let query: String = Query::select()
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .column((Groups::Table, Groups::GroupId))
 | 
					            .column((Groups::Table, Groups::GroupId))
 | 
				
			||||||
            .column(Groups::DisplayName)
 | 
					            .column(Groups::DisplayName)
 | 
				
			||||||
            .from(Groups::Table)
 | 
					            .from(Groups::Table)
 | 
				
			||||||
@ -306,10 +319,10 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
                Expr::tbl(Groups::Table, Groups::GroupId)
 | 
					                Expr::tbl(Groups::Table, Groups::GroupId)
 | 
				
			||||||
                    .equals(Memberships::Table, Memberships::GroupId),
 | 
					                    .equals(Memberships::Table, Memberships::GroupId),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            .and_where(Expr::col(Memberships::UserId).eq(user_id))
 | 
					            .cond_where(Expr::col(Memberships::UserId).eq(user_id))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        sqlx::query(&query)
 | 
					        query_with(query.as_str(), values)
 | 
				
			||||||
            // Extract the group id from the row.
 | 
					            // Extract the group id from the row.
 | 
				
			||||||
            .map(|row: DbRow| {
 | 
					            .map(|row: DbRow| {
 | 
				
			||||||
                GroupIdAndName(
 | 
					                GroupIdAndName(
 | 
				
			||||||
@ -338,20 +351,21 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
            Users::LastName,
 | 
					            Users::LastName,
 | 
				
			||||||
            Users::CreationDate,
 | 
					            Users::CreationDate,
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
        let values = vec![
 | 
					        let (query, values) = Query::insert()
 | 
				
			||||||
 | 
					            .into_table(Users::Table)
 | 
				
			||||||
 | 
					            .columns(columns)
 | 
				
			||||||
 | 
					            .values_panic(vec![
 | 
				
			||||||
                request.user_id.into(),
 | 
					                request.user_id.into(),
 | 
				
			||||||
                request.email.into(),
 | 
					                request.email.into(),
 | 
				
			||||||
                request.display_name.unwrap_or_default().into(),
 | 
					                request.display_name.unwrap_or_default().into(),
 | 
				
			||||||
                request.first_name.unwrap_or_default().into(),
 | 
					                request.first_name.unwrap_or_default().into(),
 | 
				
			||||||
                request.last_name.unwrap_or_default().into(),
 | 
					                request.last_name.unwrap_or_default().into(),
 | 
				
			||||||
                chrono::Utc::now().naive_utc().into(),
 | 
					                chrono::Utc::now().naive_utc().into(),
 | 
				
			||||||
        ];
 | 
					            ])
 | 
				
			||||||
        let query = Query::insert()
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
            .into_table(Users::Table)
 | 
					        query_with(query.as_str(), values)
 | 
				
			||||||
            .columns(columns)
 | 
					            .execute(&self.sql_pool)
 | 
				
			||||||
            .values_panic(values)
 | 
					            .await?;
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -372,12 +386,14 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
        if values.is_empty() {
 | 
					        if values.is_empty() {
 | 
				
			||||||
            return Ok(());
 | 
					            return Ok(());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        let query = Query::update()
 | 
					        let (query, values) = Query::update()
 | 
				
			||||||
            .table(Users::Table)
 | 
					            .table(Users::Table)
 | 
				
			||||||
            .values(values)
 | 
					            .values(values)
 | 
				
			||||||
            .and_where(Expr::col(Users::UserId).eq(request.user_id))
 | 
					            .cond_where(Expr::col(Users::UserId).eq(request.user_id))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					        query_with(query.as_str(), values)
 | 
				
			||||||
 | 
					            .execute(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await?;
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -389,66 +405,83 @@ impl BackendHandler for SqlBackendHandler {
 | 
				
			|||||||
        if values.is_empty() {
 | 
					        if values.is_empty() {
 | 
				
			||||||
            return Ok(());
 | 
					            return Ok(());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        let query = Query::update()
 | 
					        let (query, values) = Query::update()
 | 
				
			||||||
            .table(Groups::Table)
 | 
					            .table(Groups::Table)
 | 
				
			||||||
            .values(values)
 | 
					            .values(values)
 | 
				
			||||||
            .and_where(Expr::col(Groups::GroupId).eq(request.group_id))
 | 
					            .cond_where(Expr::col(Groups::GroupId).eq(request.group_id))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					        query_with(query.as_str(), values)
 | 
				
			||||||
 | 
					            .execute(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await?;
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn delete_user(&self, user_id: &UserId) -> Result<()> {
 | 
					    async fn delete_user(&self, user_id: &UserId) -> Result<()> {
 | 
				
			||||||
        let delete_query = Query::delete()
 | 
					        let (delete_query, values) = Query::delete()
 | 
				
			||||||
            .from_table(Users::Table)
 | 
					            .from_table(Users::Table)
 | 
				
			||||||
            .and_where(Expr::col(Users::UserId).eq(user_id))
 | 
					            .cond_where(Expr::col(Users::UserId).eq(user_id))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&delete_query).execute(&self.sql_pool).await?;
 | 
					        query_with(delete_query.as_str(), values)
 | 
				
			||||||
 | 
					            .execute(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await?;
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn create_group(&self, group_name: &str) -> Result<GroupId> {
 | 
					    async fn create_group(&self, group_name: &str) -> Result<GroupId> {
 | 
				
			||||||
        let query = Query::insert()
 | 
					        let (query, values) = Query::insert()
 | 
				
			||||||
            .into_table(Groups::Table)
 | 
					            .into_table(Groups::Table)
 | 
				
			||||||
            .columns(vec![Groups::DisplayName])
 | 
					            .columns(vec![Groups::DisplayName])
 | 
				
			||||||
            .values_panic(vec![group_name.into()])
 | 
					            .values_panic(vec![group_name.into()])
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					        query_with(query.as_str(), values)
 | 
				
			||||||
        let query = Query::select()
 | 
					            .execute(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await?;
 | 
				
			||||||
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .column(Groups::GroupId)
 | 
					            .column(Groups::GroupId)
 | 
				
			||||||
            .from(Groups::Table)
 | 
					            .from(Groups::Table)
 | 
				
			||||||
            .and_where(Expr::col(Groups::DisplayName).eq(group_name))
 | 
					            .cond_where(Expr::col(Groups::DisplayName).eq(group_name))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        let row = sqlx::query(&query).fetch_one(&self.sql_pool).await?;
 | 
					        let row = query_with(query.as_str(), values)
 | 
				
			||||||
 | 
					            .fetch_one(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await?;
 | 
				
			||||||
        Ok(GroupId(row.get::<i32, _>(&*Groups::GroupId.to_string())))
 | 
					        Ok(GroupId(row.get::<i32, _>(&*Groups::GroupId.to_string())))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn delete_group(&self, group_id: GroupId) -> Result<()> {
 | 
					    async fn delete_group(&self, group_id: GroupId) -> Result<()> {
 | 
				
			||||||
        let delete_query = Query::delete()
 | 
					        let (delete_query, values) = Query::delete()
 | 
				
			||||||
            .from_table(Groups::Table)
 | 
					            .from_table(Groups::Table)
 | 
				
			||||||
            .and_where(Expr::col(Groups::GroupId).eq(group_id))
 | 
					            .cond_where(Expr::col(Groups::GroupId).eq(group_id))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&delete_query).execute(&self.sql_pool).await?;
 | 
					        query_with(delete_query.as_str(), values)
 | 
				
			||||||
 | 
					            .execute(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await?;
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn add_user_to_group(&self, user_id: &UserId, group_id: GroupId) -> Result<()> {
 | 
					    async fn add_user_to_group(&self, user_id: &UserId, group_id: GroupId) -> Result<()> {
 | 
				
			||||||
        let query = Query::insert()
 | 
					        let (query, values) = Query::insert()
 | 
				
			||||||
            .into_table(Memberships::Table)
 | 
					            .into_table(Memberships::Table)
 | 
				
			||||||
            .columns(vec![Memberships::UserId, Memberships::GroupId])
 | 
					            .columns(vec![Memberships::UserId, Memberships::GroupId])
 | 
				
			||||||
            .values_panic(vec![user_id.into(), group_id.into()])
 | 
					            .values_panic(vec![user_id.into(), group_id.into()])
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					        query_with(query.as_str(), values)
 | 
				
			||||||
 | 
					            .execute(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await?;
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn remove_user_from_group(&self, user_id: &UserId, group_id: GroupId) -> Result<()> {
 | 
					    async fn remove_user_from_group(&self, user_id: &UserId, group_id: GroupId) -> Result<()> {
 | 
				
			||||||
        let query = Query::delete()
 | 
					        let (query, values) = Query::delete()
 | 
				
			||||||
            .from_table(Memberships::Table)
 | 
					            .from_table(Memberships::Table)
 | 
				
			||||||
            .and_where(Expr::col(Memberships::GroupId).eq(group_id))
 | 
					            .cond_where(
 | 
				
			||||||
            .and_where(Expr::col(Memberships::UserId).eq(user_id))
 | 
					                Cond::all()
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					                    .add(Expr::col(Memberships::GroupId).eq(group_id))
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					                    .add(Expr::col(Memberships::UserId).eq(user_id)),
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
 | 
					        query_with(query.as_str(), values)
 | 
				
			||||||
 | 
					            .execute(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await?;
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -846,4 +879,26 @@ mod tests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        assert_eq!(get_user_names(&handler, None).await, vec!["val"]);
 | 
					        assert_eq!(get_user_names(&handler, None).await, vec!["val"]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[tokio::test]
 | 
				
			||||||
 | 
					    async fn test_sql_injection() {
 | 
				
			||||||
 | 
					        let sql_pool = get_initialized_db().await;
 | 
				
			||||||
 | 
					        let config = get_default_config();
 | 
				
			||||||
 | 
					        let handler = SqlBackendHandler::new(config, sql_pool);
 | 
				
			||||||
 | 
					        let user_name = UserId::new(r#"bob"e"i'o;aü"#);
 | 
				
			||||||
 | 
					        insert_user(&handler, user_name.as_str(), "bob00").await;
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            let users = handler
 | 
				
			||||||
 | 
					                .list_users(None, false)
 | 
				
			||||||
 | 
					                .await
 | 
				
			||||||
 | 
					                .unwrap()
 | 
				
			||||||
 | 
					                .into_iter()
 | 
				
			||||||
 | 
					                .map(|u| u.user.user_id)
 | 
				
			||||||
 | 
					                .collect::<Vec<_>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            assert_eq!(users, vec![user_name.clone()]);
 | 
				
			||||||
 | 
					            let user = handler.get_user_details(&user_name).await.unwrap();
 | 
				
			||||||
 | 
					            assert_eq!(user.user_id, user_name);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@ use async_trait::async_trait;
 | 
				
			|||||||
use lldap_auth::opaque;
 | 
					use lldap_auth::opaque;
 | 
				
			||||||
use log::*;
 | 
					use log::*;
 | 
				
			||||||
use sea_query::{Expr, Iden, Query};
 | 
					use sea_query::{Expr, Iden, Query};
 | 
				
			||||||
 | 
					use sea_query_binder::SqlxBinder;
 | 
				
			||||||
use secstr::SecUtf8;
 | 
					use secstr::SecUtf8;
 | 
				
			||||||
use sqlx::Row;
 | 
					use sqlx::Row;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -53,12 +54,15 @@ impl SqlBackendHandler {
 | 
				
			|||||||
    ) -> Result<Option<opaque::server::ServerRegistration>> {
 | 
					    ) -> Result<Option<opaque::server::ServerRegistration>> {
 | 
				
			||||||
        // Fetch the previously registered password file from the DB.
 | 
					        // Fetch the previously registered password file from the DB.
 | 
				
			||||||
        let password_file_bytes = {
 | 
					        let password_file_bytes = {
 | 
				
			||||||
            let query = Query::select()
 | 
					            let (query, values) = Query::select()
 | 
				
			||||||
                .column(Users::PasswordHash)
 | 
					                .column(Users::PasswordHash)
 | 
				
			||||||
                .from(Users::Table)
 | 
					                .from(Users::Table)
 | 
				
			||||||
                .and_where(Expr::col(Users::UserId).eq(username))
 | 
					                .cond_where(Expr::col(Users::UserId).eq(username))
 | 
				
			||||||
                .to_string(DbQueryBuilder {});
 | 
					                .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
            if let Some(row) = sqlx::query(&query).fetch_optional(&self.sql_pool).await? {
 | 
					            if let Some(row) = sqlx::query_with(query.as_str(), values)
 | 
				
			||||||
 | 
					                .fetch_optional(&self.sql_pool)
 | 
				
			||||||
 | 
					                .await?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                if let Some(bytes) =
 | 
					                if let Some(bytes) =
 | 
				
			||||||
                    row.get::<Option<Vec<u8>>, _>(&*Users::PasswordHash.to_string())
 | 
					                    row.get::<Option<Vec<u8>>, _>(&*Users::PasswordHash.to_string())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@ -94,12 +98,15 @@ impl LoginHandler for SqlBackendHandler {
 | 
				
			|||||||
                )));
 | 
					                )));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        let query = Query::select()
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .column(Users::PasswordHash)
 | 
					            .column(Users::PasswordHash)
 | 
				
			||||||
            .from(Users::Table)
 | 
					            .from(Users::Table)
 | 
				
			||||||
            .and_where(Expr::col(Users::UserId).eq(&request.name))
 | 
					            .cond_where(Expr::col(Users::UserId).eq(&request.name))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        if let Ok(row) = sqlx::query(&query).fetch_one(&self.sql_pool).await {
 | 
					        if let Ok(row) = sqlx::query_with(&query, values)
 | 
				
			||||||
 | 
					            .fetch_one(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            if let Some(password_hash) =
 | 
					            if let Some(password_hash) =
 | 
				
			||||||
                row.get::<Option<Vec<u8>>, _>(&*Users::PasswordHash.to_string())
 | 
					                row.get::<Option<Vec<u8>>, _>(&*Users::PasswordHash.to_string())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@ -209,15 +216,14 @@ impl OpaqueHandler for SqlOpaqueHandler {
 | 
				
			|||||||
            opaque::server::registration::get_password_file(request.registration_upload);
 | 
					            opaque::server::registration::get_password_file(request.registration_upload);
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            // Set the user password to the new password.
 | 
					            // Set the user password to the new password.
 | 
				
			||||||
            let update_query = Query::update()
 | 
					            let (update_query, values) = Query::update()
 | 
				
			||||||
                .table(Users::Table)
 | 
					                .table(Users::Table)
 | 
				
			||||||
                .values(vec![(
 | 
					                .value(Users::PasswordHash, password_file.serialize().into())
 | 
				
			||||||
                    Users::PasswordHash,
 | 
					                .cond_where(Expr::col(Users::UserId).eq(username))
 | 
				
			||||||
                    password_file.serialize().into(),
 | 
					                .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
                )])
 | 
					            sqlx::query_with(update_query.as_str(), values)
 | 
				
			||||||
                .and_where(Expr::col(Users::UserId).eq(username))
 | 
					                .execute(&self.sql_pool)
 | 
				
			||||||
                .to_string(DbQueryBuilder {});
 | 
					                .await?;
 | 
				
			||||||
            sqlx::query(&update_query).execute(&self.sql_pool).await?;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -169,16 +169,16 @@ pub async fn init_table(pool: &Pool) -> sqlx::Result<()> {
 | 
				
			|||||||
            .foreign_key(
 | 
					            .foreign_key(
 | 
				
			||||||
                ForeignKey::create()
 | 
					                ForeignKey::create()
 | 
				
			||||||
                    .name("MembershipUserForeignKey")
 | 
					                    .name("MembershipUserForeignKey")
 | 
				
			||||||
                    .table(Memberships::Table, Users::Table)
 | 
					                    .from(Memberships::Table, Memberships::UserId)
 | 
				
			||||||
                    .col(Memberships::UserId, Users::UserId)
 | 
					                    .to(Users::Table, Users::UserId)
 | 
				
			||||||
                    .on_delete(ForeignKeyAction::Cascade)
 | 
					                    .on_delete(ForeignKeyAction::Cascade)
 | 
				
			||||||
                    .on_update(ForeignKeyAction::Cascade),
 | 
					                    .on_update(ForeignKeyAction::Cascade),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            .foreign_key(
 | 
					            .foreign_key(
 | 
				
			||||||
                ForeignKey::create()
 | 
					                ForeignKey::create()
 | 
				
			||||||
                    .name("MembershipGroupForeignKey")
 | 
					                    .name("MembershipGroupForeignKey")
 | 
				
			||||||
                    .table(Memberships::Table, Groups::Table)
 | 
					                    .from(Memberships::Table, Memberships::GroupId)
 | 
				
			||||||
                    .col(Memberships::GroupId, Groups::GroupId)
 | 
					                    .to(Groups::Table, Groups::GroupId)
 | 
				
			||||||
                    .on_delete(ForeignKeyAction::Cascade)
 | 
					                    .on_delete(ForeignKeyAction::Cascade)
 | 
				
			||||||
                    .on_update(ForeignKeyAction::Cascade),
 | 
					                    .on_update(ForeignKeyAction::Cascade),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
				
			|||||||
@ -55,8 +55,8 @@ pub async fn init_table(pool: &Pool) -> sqlx::Result<()> {
 | 
				
			|||||||
            .foreign_key(
 | 
					            .foreign_key(
 | 
				
			||||||
                ForeignKey::create()
 | 
					                ForeignKey::create()
 | 
				
			||||||
                    .name("JwtRefreshStorageUserForeignKey")
 | 
					                    .name("JwtRefreshStorageUserForeignKey")
 | 
				
			||||||
                    .table(JwtRefreshStorage::Table, Users::Table)
 | 
					                    .from(JwtRefreshStorage::Table, JwtRefreshStorage::UserId)
 | 
				
			||||||
                    .col(JwtRefreshStorage::UserId, Users::UserId)
 | 
					                    .to(Users::Table, Users::UserId)
 | 
				
			||||||
                    .on_delete(ForeignKeyAction::Cascade)
 | 
					                    .on_delete(ForeignKeyAction::Cascade)
 | 
				
			||||||
                    .on_update(ForeignKeyAction::Cascade),
 | 
					                    .on_update(ForeignKeyAction::Cascade),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
@ -94,8 +94,8 @@ pub async fn init_table(pool: &Pool) -> sqlx::Result<()> {
 | 
				
			|||||||
            .foreign_key(
 | 
					            .foreign_key(
 | 
				
			||||||
                ForeignKey::create()
 | 
					                ForeignKey::create()
 | 
				
			||||||
                    .name("JwtStorageUserForeignKey")
 | 
					                    .name("JwtStorageUserForeignKey")
 | 
				
			||||||
                    .table(JwtStorage::Table, Users::Table)
 | 
					                    .from(JwtStorage::Table, JwtStorage::UserId)
 | 
				
			||||||
                    .col(JwtStorage::UserId, Users::UserId)
 | 
					                    .to(Users::Table, Users::UserId)
 | 
				
			||||||
                    .on_delete(ForeignKeyAction::Cascade)
 | 
					                    .on_delete(ForeignKeyAction::Cascade)
 | 
				
			||||||
                    .on_update(ForeignKeyAction::Cascade),
 | 
					                    .on_update(ForeignKeyAction::Cascade),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
@ -127,8 +127,8 @@ pub async fn init_table(pool: &Pool) -> sqlx::Result<()> {
 | 
				
			|||||||
            .foreign_key(
 | 
					            .foreign_key(
 | 
				
			||||||
                ForeignKey::create()
 | 
					                ForeignKey::create()
 | 
				
			||||||
                    .name("PasswordResetTokensUserForeignKey")
 | 
					                    .name("PasswordResetTokensUserForeignKey")
 | 
				
			||||||
                    .table(PasswordResetTokens::Table, Users::Table)
 | 
					                    .from(PasswordResetTokens::Table, PasswordResetTokens::UserId)
 | 
				
			||||||
                    .col(PasswordResetTokens::UserId, Users::UserId)
 | 
					                    .to(Users::Table, Users::UserId)
 | 
				
			||||||
                    .on_delete(ForeignKeyAction::Cascade)
 | 
					                    .on_delete(ForeignKeyAction::Cascade)
 | 
				
			||||||
                    .on_update(ForeignKeyAction::Cascade),
 | 
					                    .on_update(ForeignKeyAction::Cascade),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,8 @@ use crate::domain::{error::*, handler::UserId, sql_backend_handler::SqlBackendHa
 | 
				
			|||||||
use async_trait::async_trait;
 | 
					use async_trait::async_trait;
 | 
				
			||||||
use futures_util::StreamExt;
 | 
					use futures_util::StreamExt;
 | 
				
			||||||
use sea_query::{Expr, Iden, Query, SimpleExpr};
 | 
					use sea_query::{Expr, Iden, Query, SimpleExpr};
 | 
				
			||||||
use sqlx::Row;
 | 
					use sea_query_binder::SqlxBinder;
 | 
				
			||||||
 | 
					use sqlx::{query_as_with, query_with, Row};
 | 
				
			||||||
use std::collections::HashSet;
 | 
					use std::collections::HashSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn gen_random_string(len: usize) -> String {
 | 
					fn gen_random_string(len: usize) -> String {
 | 
				
			||||||
@ -19,12 +20,12 @@ fn gen_random_string(len: usize) -> String {
 | 
				
			|||||||
#[async_trait]
 | 
					#[async_trait]
 | 
				
			||||||
impl TcpBackendHandler for SqlBackendHandler {
 | 
					impl TcpBackendHandler for SqlBackendHandler {
 | 
				
			||||||
    async fn get_jwt_blacklist(&self) -> anyhow::Result<HashSet<u64>> {
 | 
					    async fn get_jwt_blacklist(&self) -> anyhow::Result<HashSet<u64>> {
 | 
				
			||||||
        let query = Query::select()
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .column(JwtStorage::JwtHash)
 | 
					            .column(JwtStorage::JwtHash)
 | 
				
			||||||
            .from(JwtStorage::Table)
 | 
					            .from(JwtStorage::Table)
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        sqlx::query(&query)
 | 
					        query_with(&query, values)
 | 
				
			||||||
            .map(|row: DbRow| row.get::<i64, _>(&*JwtStorage::JwtHash.to_string()) as u64)
 | 
					            .map(|row: DbRow| row.get::<i64, _>(&*JwtStorage::JwtHash.to_string()) as u64)
 | 
				
			||||||
            .fetch(&self.sql_pool)
 | 
					            .fetch(&self.sql_pool)
 | 
				
			||||||
            .collect::<Vec<sqlx::Result<u64>>>()
 | 
					            .collect::<Vec<sqlx::Result<u64>>>()
 | 
				
			||||||
@ -45,7 +46,7 @@ impl TcpBackendHandler for SqlBackendHandler {
 | 
				
			|||||||
            s.finish()
 | 
					            s.finish()
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        let duration = chrono::Duration::days(30);
 | 
					        let duration = chrono::Duration::days(30);
 | 
				
			||||||
        let query = Query::insert()
 | 
					        let (query, values) = Query::insert()
 | 
				
			||||||
            .into_table(JwtRefreshStorage::Table)
 | 
					            .into_table(JwtRefreshStorage::Table)
 | 
				
			||||||
            .columns(vec![
 | 
					            .columns(vec![
 | 
				
			||||||
                JwtRefreshStorage::RefreshTokenHash,
 | 
					                JwtRefreshStorage::RefreshTokenHash,
 | 
				
			||||||
@ -57,71 +58,75 @@ impl TcpBackendHandler for SqlBackendHandler {
 | 
				
			|||||||
                user.into(),
 | 
					                user.into(),
 | 
				
			||||||
                (chrono::Utc::now() + duration).naive_utc().into(),
 | 
					                (chrono::Utc::now() + duration).naive_utc().into(),
 | 
				
			||||||
            ])
 | 
					            ])
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					        query_with(&query, values).execute(&self.sql_pool).await?;
 | 
				
			||||||
        Ok((refresh_token, duration))
 | 
					        Ok((refresh_token, duration))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn check_token(&self, refresh_token_hash: u64, user: &UserId) -> Result<bool> {
 | 
					    async fn check_token(&self, refresh_token_hash: u64, user: &UserId) -> Result<bool> {
 | 
				
			||||||
        let query = Query::select()
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .expr(SimpleExpr::Value(1.into()))
 | 
					            .expr(SimpleExpr::Value(1.into()))
 | 
				
			||||||
            .from(JwtRefreshStorage::Table)
 | 
					            .from(JwtRefreshStorage::Table)
 | 
				
			||||||
            .and_where(Expr::col(JwtRefreshStorage::RefreshTokenHash).eq(refresh_token_hash as i64))
 | 
					            .and_where(Expr::col(JwtRefreshStorage::RefreshTokenHash).eq(refresh_token_hash as i64))
 | 
				
			||||||
            .and_where(Expr::col(JwtRefreshStorage::UserId).eq(user))
 | 
					            .and_where(Expr::col(JwtRefreshStorage::UserId).eq(user))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        Ok(sqlx::query(&query)
 | 
					        Ok(query_with(&query, values)
 | 
				
			||||||
            .fetch_optional(&self.sql_pool)
 | 
					            .fetch_optional(&self.sql_pool)
 | 
				
			||||||
            .await?
 | 
					            .await?
 | 
				
			||||||
            .is_some())
 | 
					            .is_some())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    async fn blacklist_jwts(&self, user: &UserId) -> Result<HashSet<u64>> {
 | 
					    async fn blacklist_jwts(&self, user: &UserId) -> Result<HashSet<u64>> {
 | 
				
			||||||
        use sqlx::Result;
 | 
					        use sqlx::Result;
 | 
				
			||||||
        let query = Query::select()
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .column(JwtStorage::JwtHash)
 | 
					            .column(JwtStorage::JwtHash)
 | 
				
			||||||
            .from(JwtStorage::Table)
 | 
					            .from(JwtStorage::Table)
 | 
				
			||||||
            .and_where(Expr::col(JwtStorage::UserId).eq(user))
 | 
					            .and_where(Expr::col(JwtStorage::UserId).eq(user))
 | 
				
			||||||
            .and_where(Expr::col(JwtStorage::Blacklisted).eq(true))
 | 
					            .and_where(Expr::col(JwtStorage::Blacklisted).eq(true))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        let result = sqlx::query(&query)
 | 
					        let result = query_with(&query, values)
 | 
				
			||||||
            .map(|row: DbRow| row.get::<i64, _>(&*JwtStorage::JwtHash.to_string()) as u64)
 | 
					            .map(|row: DbRow| row.get::<i64, _>(&*JwtStorage::JwtHash.to_string()) as u64)
 | 
				
			||||||
            .fetch(&self.sql_pool)
 | 
					            .fetch(&self.sql_pool)
 | 
				
			||||||
            .collect::<Vec<sqlx::Result<u64>>>()
 | 
					            .collect::<Vec<sqlx::Result<u64>>>()
 | 
				
			||||||
            .await
 | 
					            .await
 | 
				
			||||||
            .into_iter()
 | 
					            .into_iter()
 | 
				
			||||||
            .collect::<Result<HashSet<u64>>>();
 | 
					            .collect::<Result<HashSet<u64>>>();
 | 
				
			||||||
        let query = Query::update()
 | 
					        let (query, values) = Query::update()
 | 
				
			||||||
            .table(JwtStorage::Table)
 | 
					            .table(JwtStorage::Table)
 | 
				
			||||||
            .values(vec![(JwtStorage::Blacklisted, true.into())])
 | 
					            .values(vec![(JwtStorage::Blacklisted, true.into())])
 | 
				
			||||||
            .and_where(Expr::col(JwtStorage::UserId).eq(user))
 | 
					            .and_where(Expr::col(JwtStorage::UserId).eq(user))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					        query_with(&query, values).execute(&self.sql_pool).await?;
 | 
				
			||||||
        Ok(result?)
 | 
					        Ok(result?)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    async fn delete_refresh_token(&self, refresh_token_hash: u64) -> Result<()> {
 | 
					    async fn delete_refresh_token(&self, refresh_token_hash: u64) -> Result<()> {
 | 
				
			||||||
        let query = Query::delete()
 | 
					        let (query, values) = Query::delete()
 | 
				
			||||||
            .from_table(JwtRefreshStorage::Table)
 | 
					            .from_table(JwtRefreshStorage::Table)
 | 
				
			||||||
            .and_where(Expr::col(JwtRefreshStorage::RefreshTokenHash).eq(refresh_token_hash))
 | 
					            .and_where(Expr::col(JwtRefreshStorage::RefreshTokenHash).eq(refresh_token_hash))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					        query_with(&query, values).execute(&self.sql_pool).await?;
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn start_password_reset(&self, user: &UserId) -> Result<Option<String>> {
 | 
					    async fn start_password_reset(&self, user: &UserId) -> Result<Option<String>> {
 | 
				
			||||||
        let query = Query::select()
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .column(Users::UserId)
 | 
					            .column(Users::UserId)
 | 
				
			||||||
            .from(Users::Table)
 | 
					            .from(Users::Table)
 | 
				
			||||||
            .and_where(Expr::col(Users::UserId).eq(user))
 | 
					            .and_where(Expr::col(Users::UserId).eq(user))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Check that the user exists.
 | 
					        // Check that the user exists.
 | 
				
			||||||
        if sqlx::query(&query).fetch_one(&self.sql_pool).await.is_err() {
 | 
					        if query_with(&query, values)
 | 
				
			||||||
 | 
					            .fetch_one(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await
 | 
				
			||||||
 | 
					            .is_err()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            return Ok(None);
 | 
					            return Ok(None);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let token = gen_random_string(100);
 | 
					        let token = gen_random_string(100);
 | 
				
			||||||
        let duration = chrono::Duration::minutes(10);
 | 
					        let duration = chrono::Duration::minutes(10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let query = Query::insert()
 | 
					        let (query, values) = Query::insert()
 | 
				
			||||||
            .into_table(PasswordResetTokens::Table)
 | 
					            .into_table(PasswordResetTokens::Table)
 | 
				
			||||||
            .columns(vec![
 | 
					            .columns(vec![
 | 
				
			||||||
                PasswordResetTokens::Token,
 | 
					                PasswordResetTokens::Token,
 | 
				
			||||||
@ -133,31 +138,33 @@ impl TcpBackendHandler for SqlBackendHandler {
 | 
				
			|||||||
                user.into(),
 | 
					                user.into(),
 | 
				
			||||||
                (chrono::Utc::now() + duration).naive_utc().into(),
 | 
					                (chrono::Utc::now() + duration).naive_utc().into(),
 | 
				
			||||||
            ])
 | 
					            ])
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					        query_with(&query, values).execute(&self.sql_pool).await?;
 | 
				
			||||||
        Ok(Some(token))
 | 
					        Ok(Some(token))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn get_user_id_for_password_reset_token(&self, token: &str) -> Result<UserId> {
 | 
					    async fn get_user_id_for_password_reset_token(&self, token: &str) -> Result<UserId> {
 | 
				
			||||||
        let query = Query::select()
 | 
					        let (query, values) = Query::select()
 | 
				
			||||||
            .column(PasswordResetTokens::UserId)
 | 
					            .column(PasswordResetTokens::UserId)
 | 
				
			||||||
            .from(PasswordResetTokens::Table)
 | 
					            .from(PasswordResetTokens::Table)
 | 
				
			||||||
            .and_where(Expr::col(PasswordResetTokens::Token).eq(token))
 | 
					            .and_where(Expr::col(PasswordResetTokens::Token).eq(token))
 | 
				
			||||||
            .and_where(
 | 
					            .and_where(
 | 
				
			||||||
                Expr::col(PasswordResetTokens::ExpiryDate).gt(chrono::Utc::now().naive_utc()),
 | 
					                Expr::col(PasswordResetTokens::ExpiryDate).gt(chrono::Utc::now().naive_utc()),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let (user_id,) = sqlx::query_as(&query).fetch_one(&self.sql_pool).await?;
 | 
					        let (user_id,) = query_as_with(&query, values)
 | 
				
			||||||
 | 
					            .fetch_one(&self.sql_pool)
 | 
				
			||||||
 | 
					            .await?;
 | 
				
			||||||
        Ok(user_id)
 | 
					        Ok(user_id)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async fn delete_password_reset_token(&self, token: &str) -> Result<()> {
 | 
					    async fn delete_password_reset_token(&self, token: &str) -> Result<()> {
 | 
				
			||||||
        let query = Query::delete()
 | 
					        let (query, values) = Query::delete()
 | 
				
			||||||
            .from_table(PasswordResetTokens::Table)
 | 
					            .from_table(PasswordResetTokens::Table)
 | 
				
			||||||
            .and_where(Expr::col(PasswordResetTokens::Token).eq(token))
 | 
					            .and_where(Expr::col(PasswordResetTokens::Token).eq(token))
 | 
				
			||||||
            .to_string(DbQueryBuilder {});
 | 
					            .build_sqlx(DbQueryBuilder {});
 | 
				
			||||||
        sqlx::query(&query).execute(&self.sql_pool).await?;
 | 
					        query_with(&query, values).execute(&self.sql_pool).await?;
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user