Your locally hosted lumina server for IDAPro

Compare changes

Choose any two refs to compare.

+4
CHANGELOG.md
··· 2 2 3 3 ## [Unreleased] - _TBD_ 4 4 5 + ### Added 6 + 7 + - User management 8 + 5 9 ## [v0.4.0] - 2024-03-19 6 10 7 11 ### Added
+549 -803
Cargo.lock
··· 1 1 # This file is automatically @generated by Cargo. 2 2 # It is not intended for manual editing. 3 - version = 4 3 + version = 3 4 4 5 5 [[package]] 6 6 name = "addr2line" 7 - version = "0.24.2" 7 + version = "0.21.0" 8 8 source = "registry+https://github.com/rust-lang/crates.io-index" 9 - checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 9 + checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 10 dependencies = [ 11 11 "gimli", 12 12 ] 13 13 14 14 [[package]] 15 - name = "adler2" 16 - version = "2.0.0" 15 + name = "adler" 16 + version = "1.0.2" 17 17 source = "registry+https://github.com/rust-lang/crates.io-index" 18 - checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 18 + checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 19 20 20 [[package]] 21 21 name = "aho-corasick" ··· 28 28 29 29 [[package]] 30 30 name = "anstream" 31 - version = "0.6.19" 31 + version = "0.6.13" 32 32 source = "registry+https://github.com/rust-lang/crates.io-index" 33 - checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" 33 + checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" 34 34 dependencies = [ 35 35 "anstyle", 36 36 "anstyle-parse", 37 37 "anstyle-query", 38 38 "anstyle-wincon", 39 39 "colorchoice", 40 - "is_terminal_polyfill", 41 40 "utf8parse", 42 41 ] 43 42 44 43 [[package]] 45 44 name = "anstyle" 46 - version = "1.0.11" 45 + version = "1.0.6" 47 46 source = "registry+https://github.com/rust-lang/crates.io-index" 48 - checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" 47 + checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" 49 48 50 49 [[package]] 51 50 name = "anstyle-parse" 52 - version = "0.2.7" 51 + version = "0.2.3" 53 52 source = "registry+https://github.com/rust-lang/crates.io-index" 54 - checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 53 + checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" 55 54 dependencies = [ 56 55 "utf8parse", 57 56 ] 58 57 59 58 [[package]] 60 59 name = "anstyle-query" 61 - version = "1.1.3" 60 + version = "1.0.2" 62 61 source = "registry+https://github.com/rust-lang/crates.io-index" 63 - checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" 62 + checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" 64 63 dependencies = [ 65 - "windows-sys 0.59.0", 64 + "windows-sys 0.52.0", 66 65 ] 67 66 68 67 [[package]] 69 68 name = "anstyle-wincon" 70 - version = "3.0.9" 69 + version = "3.0.2" 71 70 source = "registry+https://github.com/rust-lang/crates.io-index" 72 - checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" 71 + checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" 73 72 dependencies = [ 74 73 "anstyle", 75 - "once_cell_polyfill", 76 - "windows-sys 0.59.0", 74 + "windows-sys 0.52.0", 77 75 ] 78 76 79 77 [[package]] 80 78 name = "anyhow" 81 - version = "1.0.98" 79 + version = "1.0.81" 82 80 source = "registry+https://github.com/rust-lang/crates.io-index" 83 - checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 81 + checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" 84 82 85 83 [[package]] 86 84 name = "async-trait" 87 - version = "0.1.88" 85 + version = "0.1.78" 88 86 source = "registry+https://github.com/rust-lang/crates.io-index" 89 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 87 + checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" 90 88 dependencies = [ 91 89 "proc-macro2", 92 90 "quote", ··· 95 93 96 94 [[package]] 97 95 name = "autocfg" 98 - version = "1.4.0" 96 + version = "1.1.0" 99 97 source = "registry+https://github.com/rust-lang/crates.io-index" 100 - checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 98 + checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 101 99 102 100 [[package]] 103 101 name = "backtrace" 104 - version = "0.3.75" 102 + version = "0.3.70" 105 103 source = "registry+https://github.com/rust-lang/crates.io-index" 106 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 104 + checksum = "95d8e92cac0961e91dbd517496b00f7e9b92363dbe6d42c3198268323798860c" 107 105 dependencies = [ 108 106 "addr2line", 107 + "cc", 109 108 "cfg-if", 110 109 "libc", 111 110 "miniz_oxide", 112 111 "object", 113 112 "rustc-demangle", 114 - "windows-targets", 115 113 ] 116 114 117 115 [[package]] ··· 121 119 checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 122 120 123 121 [[package]] 124 - name = "base64" 125 - version = "0.22.1" 126 - source = "registry+https://github.com/rust-lang/crates.io-index" 127 - checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 128 - 129 - [[package]] 130 122 name = "bb8" 131 - version = "0.8.6" 123 + version = "0.8.3" 132 124 source = "registry+https://github.com/rust-lang/crates.io-index" 133 - checksum = "d89aabfae550a5c44b43ab941844ffcd2e993cb6900b342debf59e9ea74acdb8" 125 + checksum = "df7c2093d15d6a1d33b1f972e1c5ea3177748742b97a5f392aa83a65262c6780" 134 126 dependencies = [ 135 127 "async-trait", 128 + "futures-channel", 136 129 "futures-util", 137 130 "parking_lot", 138 131 "tokio", ··· 146 139 147 140 [[package]] 148 141 name = "bitflags" 149 - version = "2.9.1" 142 + version = "1.3.2" 143 + source = "registry+https://github.com/rust-lang/crates.io-index" 144 + checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 145 + 146 + [[package]] 147 + name = "bitflags" 148 + version = "2.5.0" 150 149 source = "registry+https://github.com/rust-lang/crates.io-index" 151 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 150 + checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 152 151 153 152 [[package]] 154 153 name = "block-buffer" ··· 161 160 162 161 [[package]] 163 162 name = "bumpalo" 164 - version = "3.18.1" 163 + version = "3.15.4" 165 164 source = "registry+https://github.com/rust-lang/crates.io-index" 166 - checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" 165 + checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" 167 166 168 167 [[package]] 169 168 name = "byteorder" ··· 173 172 174 173 [[package]] 175 174 name = "bytes" 176 - version = "1.10.1" 175 + version = "1.5.0" 177 176 source = "registry+https://github.com/rust-lang/crates.io-index" 178 - checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 177 + checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 179 178 180 179 [[package]] 181 180 name = "cc" 182 - version = "1.2.26" 181 + version = "1.0.90" 183 182 source = "registry+https://github.com/rust-lang/crates.io-index" 184 - checksum = "956a5e21988b87f372569b66183b78babf23ebc2e744b733e4350a752c4dafac" 185 - dependencies = [ 186 - "shlex", 187 - ] 183 + checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" 188 184 189 185 [[package]] 190 186 name = "cfg-if" ··· 194 190 195 191 [[package]] 196 192 name = "clap" 197 - version = "4.5.39" 193 + version = "4.5.3" 198 194 source = "registry+https://github.com/rust-lang/crates.io-index" 199 - checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" 195 + checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" 200 196 dependencies = [ 201 197 "clap_builder", 202 198 ] 203 199 204 200 [[package]] 205 201 name = "clap_builder" 206 - version = "4.5.39" 202 + version = "4.5.2" 207 203 source = "registry+https://github.com/rust-lang/crates.io-index" 208 - checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" 204 + checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" 209 205 dependencies = [ 210 206 "anstream", 211 207 "anstyle", ··· 215 211 216 212 [[package]] 217 213 name = "clap_lex" 218 - version = "0.7.4" 214 + version = "0.7.0" 219 215 source = "registry+https://github.com/rust-lang/crates.io-index" 220 - checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 216 + checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" 221 217 222 218 [[package]] 223 219 name = "colorchoice" 224 - version = "1.0.4" 220 + version = "1.0.0" 225 221 source = "registry+https://github.com/rust-lang/crates.io-index" 226 - checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 222 + checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 227 223 228 224 [[package]] 229 225 name = "common" ··· 236 232 "futures-util", 237 233 "log", 238 234 "native-tls", 235 + "pbkdf2", 239 236 "postgres-native-tls", 240 237 "prometheus-client", 238 + "rand", 241 239 "serde", 240 + "sha2", 242 241 "time", 243 242 "tokio", 244 243 "tokio-postgres", ··· 258 257 259 258 [[package]] 260 259 name = "core-foundation-sys" 261 - version = "0.8.7" 260 + version = "0.8.6" 262 261 source = "registry+https://github.com/rust-lang/crates.io-index" 263 - checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 262 + checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 264 263 265 264 [[package]] 266 265 name = "cpufeatures" 267 - version = "0.2.17" 266 + version = "0.2.12" 268 267 source = "registry+https://github.com/rust-lang/crates.io-index" 269 - checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 268 + checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 270 269 dependencies = [ 271 270 "libc", 272 271 ] ··· 282 281 ] 283 282 284 283 [[package]] 285 - name = "darling" 286 - version = "0.20.11" 287 - source = "registry+https://github.com/rust-lang/crates.io-index" 288 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 289 - dependencies = [ 290 - "darling_core", 291 - "darling_macro", 292 - ] 293 - 294 - [[package]] 295 - name = "darling_core" 296 - version = "0.20.11" 297 - source = "registry+https://github.com/rust-lang/crates.io-index" 298 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 299 - dependencies = [ 300 - "fnv", 301 - "ident_case", 302 - "proc-macro2", 303 - "quote", 304 - "strsim", 305 - "syn", 306 - ] 307 - 308 - [[package]] 309 - name = "darling_macro" 310 - version = "0.20.11" 311 - source = "registry+https://github.com/rust-lang/crates.io-index" 312 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 313 - dependencies = [ 314 - "darling_core", 315 - "quote", 316 - "syn", 317 - ] 318 - 319 - [[package]] 320 284 name = "data-encoding" 321 - version = "2.9.0" 285 + version = "2.5.0" 322 286 source = "registry+https://github.com/rust-lang/crates.io-index" 323 - checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 287 + checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" 324 288 325 289 [[package]] 326 290 name = "deranged" 327 - version = "0.4.0" 291 + version = "0.3.11" 328 292 source = "registry+https://github.com/rust-lang/crates.io-index" 329 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 293 + checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 330 294 dependencies = [ 331 295 "powerfmt", 332 296 ] 333 297 334 298 [[package]] 335 299 name = "diesel" 336 - version = "2.2.10" 300 + version = "2.1.5" 337 301 source = "registry+https://github.com/rust-lang/crates.io-index" 338 - checksum = "ff3e1edb1f37b4953dd5176916347289ed43d7119cc2e6c7c3f7849ff44ea506" 302 + checksum = "03fc05c17098f21b89bc7d98fe1dd3cce2c11c2ad8e145f2a44fe08ed28eb559" 339 303 dependencies = [ 340 - "bitflags", 304 + "bitflags 2.5.0", 341 305 "byteorder", 342 306 "diesel_derives", 343 307 "itoa", ··· 346 310 347 311 [[package]] 348 312 name = "diesel-async" 349 - version = "0.5.2" 313 + version = "0.4.1" 350 314 source = "registry+https://github.com/rust-lang/crates.io-index" 351 - checksum = "51a307ac00f7c23f526a04a77761a0519b9f0eb2838ebf5b905a58580095bdcb" 315 + checksum = "acada1517534c92d3f382217b485db8a8638f111b0e3f2a2a8e26165050f77be" 352 316 dependencies = [ 353 317 "async-trait", 354 318 "bb8", ··· 361 325 362 326 [[package]] 363 327 name = "diesel_derives" 364 - version = "2.2.5" 328 + version = "2.1.3" 365 329 source = "registry+https://github.com/rust-lang/crates.io-index" 366 - checksum = "68d4216021b3ea446fd2047f5c8f8fe6e98af34508a254a01e4d6bc1e844f84d" 330 + checksum = "5d02eecb814ae714ffe61ddc2db2dd03e6c49a42e269b5001355500d431cce0c" 367 331 dependencies = [ 368 332 "diesel_table_macro_syntax", 369 - "dsl_auto_type", 370 333 "proc-macro2", 371 334 "quote", 372 335 "syn", ··· 374 337 375 338 [[package]] 376 339 name = "diesel_table_macro_syntax" 377 - version = "0.2.0" 340 + version = "0.1.0" 378 341 source = "registry+https://github.com/rust-lang/crates.io-index" 379 - checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" 342 + checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" 380 343 dependencies = [ 381 344 "syn", 382 345 ] ··· 393 356 ] 394 357 395 358 [[package]] 396 - name = "displaydoc" 397 - version = "0.2.5" 398 - source = "registry+https://github.com/rust-lang/crates.io-index" 399 - checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 400 - dependencies = [ 401 - "proc-macro2", 402 - "quote", 403 - "syn", 404 - ] 405 - 406 - [[package]] 407 - name = "dsl_auto_type" 408 - version = "0.1.3" 409 - source = "registry+https://github.com/rust-lang/crates.io-index" 410 - checksum = "139ae9aca7527f85f26dd76483eb38533fd84bd571065da1739656ef71c5ff5b" 411 - dependencies = [ 412 - "darling", 413 - "either", 414 - "heck", 415 - "proc-macro2", 416 - "quote", 417 - "syn", 418 - ] 419 - 420 - [[package]] 421 359 name = "dtoa" 422 - version = "1.0.10" 360 + version = "1.0.9" 423 361 source = "registry+https://github.com/rust-lang/crates.io-index" 424 - checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" 425 - 426 - [[package]] 427 - name = "either" 428 - version = "1.15.0" 429 - source = "registry+https://github.com/rust-lang/crates.io-index" 430 - checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 362 + checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" 431 363 432 364 [[package]] 433 365 name = "encoding_rs" 434 - version = "0.8.35" 366 + version = "0.8.33" 435 367 source = "registry+https://github.com/rust-lang/crates.io-index" 436 - checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 368 + checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" 437 369 dependencies = [ 438 370 "cfg-if", 439 371 ] ··· 453 385 454 386 [[package]] 455 387 name = "equivalent" 456 - version = "1.0.2" 388 + version = "1.0.1" 457 389 source = "registry+https://github.com/rust-lang/crates.io-index" 458 - checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 390 + checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 459 391 460 392 [[package]] 461 393 name = "errno" 462 - version = "0.3.12" 394 + version = "0.3.8" 463 395 source = "registry+https://github.com/rust-lang/crates.io-index" 464 - checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" 396 + checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 465 397 dependencies = [ 466 398 "libc", 467 - "windows-sys 0.59.0", 399 + "windows-sys 0.52.0", 468 400 ] 469 401 470 402 [[package]] ··· 475 407 476 408 [[package]] 477 409 name = "fastrand" 478 - version = "2.3.0" 410 + version = "2.0.1" 479 411 source = "registry+https://github.com/rust-lang/crates.io-index" 480 - checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 412 + checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" 413 + 414 + [[package]] 415 + name = "finl_unicode" 416 + version = "1.2.0" 417 + source = "registry+https://github.com/rust-lang/crates.io-index" 418 + checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" 481 419 482 420 [[package]] 483 421 name = "fnv" ··· 510 448 ] 511 449 512 450 [[package]] 451 + name = "futures" 452 + version = "0.3.30" 453 + source = "registry+https://github.com/rust-lang/crates.io-index" 454 + checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 455 + dependencies = [ 456 + "futures-channel", 457 + "futures-core", 458 + "futures-executor", 459 + "futures-io", 460 + "futures-sink", 461 + "futures-task", 462 + "futures-util", 463 + ] 464 + 465 + [[package]] 513 466 name = "futures-channel" 514 - version = "0.3.31" 467 + version = "0.3.30" 515 468 source = "registry+https://github.com/rust-lang/crates.io-index" 516 - checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 469 + checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 517 470 dependencies = [ 518 471 "futures-core", 519 472 "futures-sink", ··· 521 474 522 475 [[package]] 523 476 name = "futures-core" 524 - version = "0.3.31" 477 + version = "0.3.30" 478 + source = "registry+https://github.com/rust-lang/crates.io-index" 479 + checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 480 + 481 + [[package]] 482 + name = "futures-executor" 483 + version = "0.3.30" 525 484 source = "registry+https://github.com/rust-lang/crates.io-index" 526 - checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 485 + checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 486 + dependencies = [ 487 + "futures-core", 488 + "futures-task", 489 + "futures-util", 490 + ] 491 + 492 + [[package]] 493 + name = "futures-io" 494 + version = "0.3.30" 495 + source = "registry+https://github.com/rust-lang/crates.io-index" 496 + checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 527 497 528 498 [[package]] 529 499 name = "futures-macro" 530 - version = "0.3.31" 500 + version = "0.3.30" 531 501 source = "registry+https://github.com/rust-lang/crates.io-index" 532 - checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 502 + checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 533 503 dependencies = [ 534 504 "proc-macro2", 535 505 "quote", ··· 538 508 539 509 [[package]] 540 510 name = "futures-sink" 541 - version = "0.3.31" 511 + version = "0.3.30" 542 512 source = "registry+https://github.com/rust-lang/crates.io-index" 543 - checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 513 + checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 544 514 545 515 [[package]] 546 516 name = "futures-task" 547 - version = "0.3.31" 517 + version = "0.3.30" 548 518 source = "registry+https://github.com/rust-lang/crates.io-index" 549 - checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 519 + checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 550 520 551 521 [[package]] 552 522 name = "futures-util" 553 - version = "0.3.31" 523 + version = "0.3.30" 554 524 source = "registry+https://github.com/rust-lang/crates.io-index" 555 - checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 525 + checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 556 526 dependencies = [ 527 + "futures-channel", 557 528 "futures-core", 529 + "futures-io", 558 530 "futures-macro", 559 531 "futures-sink", 560 532 "futures-task", 533 + "memchr", 561 534 "pin-project-lite", 562 535 "pin-utils", 563 536 "slab", ··· 575 548 576 549 [[package]] 577 550 name = "getrandom" 578 - version = "0.2.16" 551 + version = "0.2.12" 579 552 source = "registry+https://github.com/rust-lang/crates.io-index" 580 - checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 553 + checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" 581 554 dependencies = [ 582 555 "cfg-if", 583 556 "libc", 584 - "wasi 0.11.0+wasi-snapshot-preview1", 585 - ] 586 - 587 - [[package]] 588 - name = "getrandom" 589 - version = "0.3.3" 590 - source = "registry+https://github.com/rust-lang/crates.io-index" 591 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 592 - dependencies = [ 593 - "cfg-if", 594 - "libc", 595 - "r-efi", 596 - "wasi 0.14.2+wasi-0.2.4", 557 + "wasi", 597 558 ] 598 559 599 560 [[package]] 600 561 name = "gimli" 601 - version = "0.31.1" 562 + version = "0.28.1" 602 563 source = "registry+https://github.com/rust-lang/crates.io-index" 603 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 564 + checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 604 565 605 566 [[package]] 606 567 name = "h2" 607 - version = "0.3.26" 568 + version = "0.3.25" 608 569 source = "registry+https://github.com/rust-lang/crates.io-index" 609 - checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 570 + checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" 610 571 dependencies = [ 611 572 "bytes", 612 573 "fnv", 613 574 "futures-core", 614 575 "futures-sink", 615 576 "futures-util", 616 - "http 0.2.12", 577 + "http", 617 578 "indexmap", 618 579 "slab", 619 580 "tokio", ··· 623 584 624 585 [[package]] 625 586 name = "hashbrown" 626 - version = "0.15.4" 587 + version = "0.14.3" 627 588 source = "registry+https://github.com/rust-lang/crates.io-index" 628 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 589 + checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 629 590 630 591 [[package]] 631 592 name = "headers" ··· 633 594 source = "registry+https://github.com/rust-lang/crates.io-index" 634 595 checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" 635 596 dependencies = [ 636 - "base64 0.21.7", 597 + "base64", 637 598 "bytes", 638 599 "headers-core", 639 - "http 0.2.12", 600 + "http", 640 601 "httpdate", 641 602 "mime", 642 603 "sha1", ··· 648 609 source = "registry+https://github.com/rust-lang/crates.io-index" 649 610 checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" 650 611 dependencies = [ 651 - "http 0.2.12", 612 + "http", 652 613 ] 653 614 654 615 [[package]] 655 - name = "heck" 656 - version = "0.5.0" 657 - source = "registry+https://github.com/rust-lang/crates.io-index" 658 - checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 659 - 660 - [[package]] 661 616 name = "hermit-abi" 662 - version = "0.5.1" 617 + version = "0.3.9" 663 618 source = "registry+https://github.com/rust-lang/crates.io-index" 664 - checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" 619 + checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 665 620 666 621 [[package]] 667 622 name = "hmac" ··· 684 639 ] 685 640 686 641 [[package]] 687 - name = "http" 688 - version = "1.3.1" 689 - source = "registry+https://github.com/rust-lang/crates.io-index" 690 - checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 691 - dependencies = [ 692 - "bytes", 693 - "fnv", 694 - "itoa", 695 - ] 696 - 697 - [[package]] 698 642 name = "http-body" 699 643 version = "0.4.6" 700 644 source = "registry+https://github.com/rust-lang/crates.io-index" 701 645 checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 702 646 dependencies = [ 703 647 "bytes", 704 - "http 0.2.12", 648 + "http", 705 649 "pin-project-lite", 706 650 ] 707 651 708 652 [[package]] 709 653 name = "httparse" 710 - version = "1.10.1" 654 + version = "1.8.0" 711 655 source = "registry+https://github.com/rust-lang/crates.io-index" 712 - checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 656 + checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 713 657 714 658 [[package]] 715 659 name = "httpdate" ··· 719 663 720 664 [[package]] 721 665 name = "humantime" 722 - version = "2.2.0" 666 + version = "2.1.0" 723 667 source = "registry+https://github.com/rust-lang/crates.io-index" 724 - checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" 668 + checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 725 669 726 670 [[package]] 727 671 name = "hyper" 728 - version = "0.14.32" 672 + version = "0.14.28" 729 673 source = "registry+https://github.com/rust-lang/crates.io-index" 730 - checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 674 + checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" 731 675 dependencies = [ 732 676 "bytes", 733 677 "futures-channel", 734 678 "futures-core", 735 679 "futures-util", 736 680 "h2", 737 - "http 0.2.12", 681 + "http", 738 682 "http-body", 739 683 "httparse", 740 684 "httpdate", ··· 748 692 ] 749 693 750 694 [[package]] 751 - name = "icu_collections" 752 - version = "2.0.0" 753 - source = "registry+https://github.com/rust-lang/crates.io-index" 754 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 755 - dependencies = [ 756 - "displaydoc", 757 - "potential_utf", 758 - "yoke", 759 - "zerofrom", 760 - "zerovec", 761 - ] 762 - 763 - [[package]] 764 - name = "icu_locale_core" 765 - version = "2.0.0" 766 - source = "registry+https://github.com/rust-lang/crates.io-index" 767 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 768 - dependencies = [ 769 - "displaydoc", 770 - "litemap", 771 - "tinystr", 772 - "writeable", 773 - "zerovec", 774 - ] 775 - 776 - [[package]] 777 - name = "icu_normalizer" 778 - version = "2.0.0" 779 - source = "registry+https://github.com/rust-lang/crates.io-index" 780 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 781 - dependencies = [ 782 - "displaydoc", 783 - "icu_collections", 784 - "icu_normalizer_data", 785 - "icu_properties", 786 - "icu_provider", 787 - "smallvec", 788 - "zerovec", 789 - ] 790 - 791 - [[package]] 792 - name = "icu_normalizer_data" 793 - version = "2.0.0" 794 - source = "registry+https://github.com/rust-lang/crates.io-index" 795 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 796 - 797 - [[package]] 798 - name = "icu_properties" 799 - version = "2.0.1" 800 - source = "registry+https://github.com/rust-lang/crates.io-index" 801 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 802 - dependencies = [ 803 - "displaydoc", 804 - "icu_collections", 805 - "icu_locale_core", 806 - "icu_properties_data", 807 - "icu_provider", 808 - "potential_utf", 809 - "zerotrie", 810 - "zerovec", 811 - ] 812 - 813 - [[package]] 814 - name = "icu_properties_data" 815 - version = "2.0.1" 816 - source = "registry+https://github.com/rust-lang/crates.io-index" 817 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 818 - 819 - [[package]] 820 - name = "icu_provider" 821 - version = "2.0.0" 822 - source = "registry+https://github.com/rust-lang/crates.io-index" 823 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 824 - dependencies = [ 825 - "displaydoc", 826 - "icu_locale_core", 827 - "stable_deref_trait", 828 - "tinystr", 829 - "writeable", 830 - "yoke", 831 - "zerofrom", 832 - "zerotrie", 833 - "zerovec", 834 - ] 835 - 836 - [[package]] 837 - name = "ident_case" 838 - version = "1.0.1" 839 - source = "registry+https://github.com/rust-lang/crates.io-index" 840 - checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 841 - 842 - [[package]] 843 695 name = "idna" 844 - version = "1.0.3" 696 + version = "0.5.0" 845 697 source = "registry+https://github.com/rust-lang/crates.io-index" 846 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 698 + checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 847 699 dependencies = [ 848 - "idna_adapter", 849 - "smallvec", 850 - "utf8_iter", 851 - ] 852 - 853 - [[package]] 854 - name = "idna_adapter" 855 - version = "1.2.1" 856 - source = "registry+https://github.com/rust-lang/crates.io-index" 857 - checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 858 - dependencies = [ 859 - "icu_normalizer", 860 - "icu_properties", 700 + "unicode-bidi", 701 + "unicode-normalization", 861 702 ] 862 703 863 704 [[package]] 864 705 name = "indexmap" 865 - version = "2.9.0" 706 + version = "2.2.5" 866 707 source = "registry+https://github.com/rust-lang/crates.io-index" 867 - checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 708 + checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" 868 709 dependencies = [ 869 710 "equivalent", 870 711 "hashbrown", ··· 872 713 873 714 [[package]] 874 715 name = "is-terminal" 875 - version = "0.4.16" 716 + version = "0.4.12" 876 717 source = "registry+https://github.com/rust-lang/crates.io-index" 877 - checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" 718 + checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" 878 719 dependencies = [ 879 720 "hermit-abi", 880 721 "libc", 881 - "windows-sys 0.59.0", 722 + "windows-sys 0.52.0", 882 723 ] 883 724 884 725 [[package]] 885 - name = "is_terminal_polyfill" 886 - version = "1.70.1" 887 - source = "registry+https://github.com/rust-lang/crates.io-index" 888 - checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 889 - 890 - [[package]] 891 726 name = "itoa" 892 - version = "1.0.15" 727 + version = "1.0.10" 893 728 source = "registry+https://github.com/rust-lang/crates.io-index" 894 - checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 729 + checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 895 730 896 731 [[package]] 897 732 name = "js-sys" 898 - version = "0.3.77" 733 + version = "0.3.69" 899 734 source = "registry+https://github.com/rust-lang/crates.io-index" 900 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 735 + checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 901 736 dependencies = [ 902 - "once_cell", 903 737 "wasm-bindgen", 904 738 ] 905 739 906 740 [[package]] 907 - name = "libc" 908 - version = "0.2.172" 741 + name = "lazy_static" 742 + version = "1.4.0" 909 743 source = "registry+https://github.com/rust-lang/crates.io-index" 910 - checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 744 + checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 911 745 912 746 [[package]] 913 - name = "linux-raw-sys" 914 - version = "0.9.4" 747 + name = "libc" 748 + version = "0.2.153" 915 749 source = "registry+https://github.com/rust-lang/crates.io-index" 916 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 750 + checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" 917 751 918 752 [[package]] 919 - name = "litemap" 920 - version = "0.8.0" 753 + name = "linux-raw-sys" 754 + version = "0.4.13" 921 755 source = "registry+https://github.com/rust-lang/crates.io-index" 922 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 756 + checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" 923 757 924 758 [[package]] 925 759 name = "lock_api" 926 - version = "0.4.13" 760 + version = "0.4.11" 927 761 source = "registry+https://github.com/rust-lang/crates.io-index" 928 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 762 + checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 929 763 dependencies = [ 930 764 "autocfg", 931 765 "scopeguard", ··· 933 767 934 768 [[package]] 935 769 name = "log" 936 - version = "0.4.27" 770 + version = "0.4.21" 937 771 source = "registry+https://github.com/rust-lang/crates.io-index" 938 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 772 + checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 939 773 940 774 [[package]] 941 775 name = "lumen" ··· 947 781 "native-tls", 948 782 "pretty_env_logger", 949 783 "prometheus-client", 784 + "rpassword", 950 785 "tokio", 951 786 "tokio-native-tls", 952 787 "warp", ··· 964 799 965 800 [[package]] 966 801 name = "memchr" 967 - version = "2.7.4" 802 + version = "2.7.1" 968 803 source = "registry+https://github.com/rust-lang/crates.io-index" 969 - checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 804 + checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 970 805 971 806 [[package]] 972 807 name = "mime" ··· 976 811 977 812 [[package]] 978 813 name = "mime_guess" 979 - version = "2.0.5" 814 + version = "2.0.4" 980 815 source = "registry+https://github.com/rust-lang/crates.io-index" 981 - checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 816 + checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" 982 817 dependencies = [ 983 818 "mime", 984 819 "unicase", ··· 986 821 987 822 [[package]] 988 823 name = "miniz_oxide" 989 - version = "0.8.8" 824 + version = "0.7.2" 990 825 source = "registry+https://github.com/rust-lang/crates.io-index" 991 - checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 826 + checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 992 827 dependencies = [ 993 - "adler2", 828 + "adler", 994 829 ] 995 830 996 831 [[package]] 997 832 name = "mio" 998 - version = "1.0.4" 833 + version = "0.8.11" 999 834 source = "registry+https://github.com/rust-lang/crates.io-index" 1000 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 835 + checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1001 836 dependencies = [ 1002 837 "libc", 1003 - "wasi 0.11.0+wasi-snapshot-preview1", 1004 - "windows-sys 0.59.0", 838 + "wasi", 839 + "windows-sys 0.48.0", 1005 840 ] 1006 841 1007 842 [[package]] ··· 1013 848 "bytes", 1014 849 "encoding_rs", 1015 850 "futures-util", 1016 - "http 0.2.12", 851 + "http", 1017 852 "httparse", 1018 853 "log", 1019 854 "memchr", ··· 1024 859 1025 860 [[package]] 1026 861 name = "native-tls" 1027 - version = "0.2.14" 862 + version = "0.2.11" 1028 863 source = "registry+https://github.com/rust-lang/crates.io-index" 1029 - checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 864 + checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1030 865 dependencies = [ 866 + "lazy_static", 1031 867 "libc", 1032 868 "log", 1033 869 "openssl", ··· 1046 882 checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1047 883 1048 884 [[package]] 1049 - name = "object" 1050 - version = "0.36.7" 885 + name = "num_cpus" 886 + version = "1.16.0" 1051 887 source = "registry+https://github.com/rust-lang/crates.io-index" 1052 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 888 + checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1053 889 dependencies = [ 1054 - "memchr", 890 + "hermit-abi", 891 + "libc", 1055 892 ] 1056 893 1057 894 [[package]] 1058 - name = "once_cell" 1059 - version = "1.21.3" 895 + name = "object" 896 + version = "0.32.2" 1060 897 source = "registry+https://github.com/rust-lang/crates.io-index" 1061 - checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 898 + checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 899 + dependencies = [ 900 + "memchr", 901 + ] 1062 902 1063 903 [[package]] 1064 - name = "once_cell_polyfill" 1065 - version = "1.70.1" 904 + name = "once_cell" 905 + version = "1.19.0" 1066 906 source = "registry+https://github.com/rust-lang/crates.io-index" 1067 - checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 907 + checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1068 908 1069 909 [[package]] 1070 910 name = "openssl" 1071 - version = "0.10.73" 911 + version = "0.10.64" 1072 912 source = "registry+https://github.com/rust-lang/crates.io-index" 1073 - checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 913 + checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" 1074 914 dependencies = [ 1075 - "bitflags", 915 + "bitflags 2.5.0", 1076 916 "cfg-if", 1077 917 "foreign-types", 1078 918 "libc", ··· 1094 934 1095 935 [[package]] 1096 936 name = "openssl-probe" 1097 - version = "0.1.6" 937 + version = "0.1.5" 1098 938 source = "registry+https://github.com/rust-lang/crates.io-index" 1099 - checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 939 + checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1100 940 1101 941 [[package]] 1102 942 name = "openssl-sys" 1103 - version = "0.9.109" 943 + version = "0.9.101" 1104 944 source = "registry+https://github.com/rust-lang/crates.io-index" 1105 - checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 945 + checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" 1106 946 dependencies = [ 1107 947 "cc", 1108 948 "libc", ··· 1112 952 1113 953 [[package]] 1114 954 name = "parking_lot" 1115 - version = "0.12.4" 955 + version = "0.12.1" 1116 956 source = "registry+https://github.com/rust-lang/crates.io-index" 1117 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 957 + checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1118 958 dependencies = [ 1119 959 "lock_api", 1120 960 "parking_lot_core", ··· 1122 962 1123 963 [[package]] 1124 964 name = "parking_lot_core" 1125 - version = "0.9.11" 965 + version = "0.9.9" 1126 966 source = "registry+https://github.com/rust-lang/crates.io-index" 1127 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 967 + checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 1128 968 dependencies = [ 1129 969 "cfg-if", 1130 970 "libc", 1131 971 "redox_syscall", 1132 972 "smallvec", 1133 - "windows-targets", 973 + "windows-targets 0.48.5", 974 + ] 975 + 976 + [[package]] 977 + name = "pbkdf2" 978 + version = "0.12.2" 979 + source = "registry+https://github.com/rust-lang/crates.io-index" 980 + checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" 981 + dependencies = [ 982 + "digest", 983 + "hmac", 1134 984 ] 1135 985 1136 986 [[package]] ··· 1141 991 1142 992 [[package]] 1143 993 name = "phf" 1144 - version = "0.11.3" 994 + version = "0.11.2" 1145 995 source = "registry+https://github.com/rust-lang/crates.io-index" 1146 - checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 996 + checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 1147 997 dependencies = [ 1148 998 "phf_shared", 1149 999 ] 1150 1000 1151 1001 [[package]] 1152 1002 name = "phf_shared" 1153 - version = "0.11.3" 1003 + version = "0.11.2" 1154 1004 source = "registry+https://github.com/rust-lang/crates.io-index" 1155 - checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 1005 + checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 1156 1006 dependencies = [ 1157 1007 "siphasher", 1158 1008 ] 1159 1009 1160 1010 [[package]] 1161 1011 name = "pin-project" 1162 - version = "1.1.10" 1012 + version = "1.1.5" 1163 1013 source = "registry+https://github.com/rust-lang/crates.io-index" 1164 - checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 1014 + checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 1165 1015 dependencies = [ 1166 1016 "pin-project-internal", 1167 1017 ] 1168 1018 1169 1019 [[package]] 1170 1020 name = "pin-project-internal" 1171 - version = "1.1.10" 1021 + version = "1.1.5" 1172 1022 source = "registry+https://github.com/rust-lang/crates.io-index" 1173 - checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 1023 + checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 1174 1024 dependencies = [ 1175 1025 "proc-macro2", 1176 1026 "quote", ··· 1179 1029 1180 1030 [[package]] 1181 1031 name = "pin-project-lite" 1182 - version = "0.2.16" 1032 + version = "0.2.13" 1183 1033 source = "registry+https://github.com/rust-lang/crates.io-index" 1184 - checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1034 + checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 1185 1035 1186 1036 [[package]] 1187 1037 name = "pin-utils" ··· 1191 1041 1192 1042 [[package]] 1193 1043 name = "pkg-config" 1194 - version = "0.3.32" 1044 + version = "0.3.30" 1195 1045 source = "registry+https://github.com/rust-lang/crates.io-index" 1196 - checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1046 + checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 1197 1047 1198 1048 [[package]] 1199 1049 name = "postgres-native-tls" 1200 - version = "0.5.1" 1050 + version = "0.5.0" 1201 1051 source = "registry+https://github.com/rust-lang/crates.io-index" 1202 - checksum = "a1f39498473c92f7b6820ae970382c1d83178a3454c618161cb772e8598d9f6f" 1052 + checksum = "2d442770e2b1e244bb5eb03b31c79b65bb2568f413b899eaba850fa945a65954" 1203 1053 dependencies = [ 1054 + "futures", 1204 1055 "native-tls", 1205 1056 "tokio", 1206 1057 "tokio-native-tls", ··· 1209 1060 1210 1061 [[package]] 1211 1062 name = "postgres-protocol" 1212 - version = "0.6.8" 1063 + version = "0.6.6" 1213 1064 source = "registry+https://github.com/rust-lang/crates.io-index" 1214 - checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" 1065 + checksum = "49b6c5ef183cd3ab4ba005f1ca64c21e8bd97ce4699cfea9e8d9a2c4958ca520" 1215 1066 dependencies = [ 1216 - "base64 0.22.1", 1067 + "base64", 1217 1068 "byteorder", 1218 1069 "bytes", 1219 1070 "fallible-iterator", 1220 1071 "hmac", 1221 1072 "md-5", 1222 1073 "memchr", 1223 - "rand 0.9.1", 1074 + "rand", 1224 1075 "sha2", 1225 1076 "stringprep", 1226 1077 ] 1227 1078 1228 1079 [[package]] 1229 1080 name = "postgres-types" 1230 - version = "0.2.9" 1081 + version = "0.2.6" 1231 1082 source = "registry+https://github.com/rust-lang/crates.io-index" 1232 - checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" 1083 + checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c" 1233 1084 dependencies = [ 1234 1085 "bytes", 1235 1086 "fallible-iterator", ··· 1237 1088 ] 1238 1089 1239 1090 [[package]] 1240 - name = "potential_utf" 1241 - version = "0.1.2" 1242 - source = "registry+https://github.com/rust-lang/crates.io-index" 1243 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 1244 - dependencies = [ 1245 - "zerovec", 1246 - ] 1247 - 1248 - [[package]] 1249 1091 name = "powerfmt" 1250 1092 version = "0.2.0" 1251 1093 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1253 1095 1254 1096 [[package]] 1255 1097 name = "ppv-lite86" 1256 - version = "0.2.21" 1098 + version = "0.2.17" 1257 1099 source = "registry+https://github.com/rust-lang/crates.io-index" 1258 - checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1259 - dependencies = [ 1260 - "zerocopy", 1261 - ] 1100 + checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1262 1101 1263 1102 [[package]] 1264 1103 name = "pretty_env_logger" ··· 1272 1111 1273 1112 [[package]] 1274 1113 name = "proc-macro2" 1275 - version = "1.0.95" 1114 + version = "1.0.79" 1276 1115 source = "registry+https://github.com/rust-lang/crates.io-index" 1277 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1116 + checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" 1278 1117 dependencies = [ 1279 1118 "unicode-ident", 1280 1119 ] 1281 1120 1282 1121 [[package]] 1283 1122 name = "prometheus-client" 1284 - version = "0.22.3" 1123 + version = "0.22.2" 1285 1124 source = "registry+https://github.com/rust-lang/crates.io-index" 1286 - checksum = "504ee9ff529add891127c4827eb481bd69dc0ebc72e9a682e187db4caa60c3ca" 1125 + checksum = "c1ca959da22a332509f2a73ae9e5f23f9dcfc31fd3a54d71f159495bd5909baa" 1287 1126 dependencies = [ 1288 1127 "dtoa", 1289 1128 "itoa", ··· 1304 1143 1305 1144 [[package]] 1306 1145 name = "quote" 1307 - version = "1.0.40" 1146 + version = "1.0.35" 1308 1147 source = "registry+https://github.com/rust-lang/crates.io-index" 1309 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1148 + checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 1310 1149 dependencies = [ 1311 1150 "proc-macro2", 1312 1151 ] 1313 1152 1314 1153 [[package]] 1315 - name = "r-efi" 1316 - version = "5.2.0" 1317 - source = "registry+https://github.com/rust-lang/crates.io-index" 1318 - checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1319 - 1320 - [[package]] 1321 1154 name = "rand" 1322 1155 version = "0.8.5" 1323 1156 source = "registry+https://github.com/rust-lang/crates.io-index" 1324 1157 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1325 1158 dependencies = [ 1326 1159 "libc", 1327 - "rand_chacha 0.3.1", 1328 - "rand_core 0.6.4", 1329 - ] 1330 - 1331 - [[package]] 1332 - name = "rand" 1333 - version = "0.9.1" 1334 - source = "registry+https://github.com/rust-lang/crates.io-index" 1335 - checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" 1336 - dependencies = [ 1337 - "rand_chacha 0.9.0", 1338 - "rand_core 0.9.3", 1160 + "rand_chacha", 1161 + "rand_core", 1339 1162 ] 1340 1163 1341 1164 [[package]] ··· 1345 1168 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1346 1169 dependencies = [ 1347 1170 "ppv-lite86", 1348 - "rand_core 0.6.4", 1349 - ] 1350 - 1351 - [[package]] 1352 - name = "rand_chacha" 1353 - version = "0.9.0" 1354 - source = "registry+https://github.com/rust-lang/crates.io-index" 1355 - checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1356 - dependencies = [ 1357 - "ppv-lite86", 1358 - "rand_core 0.9.3", 1171 + "rand_core", 1359 1172 ] 1360 1173 1361 1174 [[package]] ··· 1364 1177 source = "registry+https://github.com/rust-lang/crates.io-index" 1365 1178 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1366 1179 dependencies = [ 1367 - "getrandom 0.2.16", 1368 - ] 1369 - 1370 - [[package]] 1371 - name = "rand_core" 1372 - version = "0.9.3" 1373 - source = "registry+https://github.com/rust-lang/crates.io-index" 1374 - checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1375 - dependencies = [ 1376 - "getrandom 0.3.3", 1180 + "getrandom", 1377 1181 ] 1378 1182 1379 1183 [[package]] 1380 1184 name = "redox_syscall" 1381 - version = "0.5.12" 1185 + version = "0.4.1" 1382 1186 source = "registry+https://github.com/rust-lang/crates.io-index" 1383 - checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 1187 + checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1384 1188 dependencies = [ 1385 - "bitflags", 1189 + "bitflags 1.3.2", 1386 1190 ] 1387 1191 1388 1192 [[package]] 1389 1193 name = "regex" 1390 - version = "1.11.1" 1194 + version = "1.10.3" 1391 1195 source = "registry+https://github.com/rust-lang/crates.io-index" 1392 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1196 + checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" 1393 1197 dependencies = [ 1394 1198 "aho-corasick", 1395 1199 "memchr", ··· 1399 1203 1400 1204 [[package]] 1401 1205 name = "regex-automata" 1402 - version = "0.4.9" 1206 + version = "0.4.6" 1403 1207 source = "registry+https://github.com/rust-lang/crates.io-index" 1404 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1208 + checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 1405 1209 dependencies = [ 1406 1210 "aho-corasick", 1407 1211 "memchr", ··· 1410 1214 1411 1215 [[package]] 1412 1216 name = "regex-syntax" 1413 - version = "0.8.5" 1217 + version = "0.8.2" 1218 + source = "registry+https://github.com/rust-lang/crates.io-index" 1219 + checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 1220 + 1221 + [[package]] 1222 + name = "rpassword" 1223 + version = "7.3.1" 1224 + source = "registry+https://github.com/rust-lang/crates.io-index" 1225 + checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" 1226 + dependencies = [ 1227 + "libc", 1228 + "rtoolbox", 1229 + "windows-sys 0.48.0", 1230 + ] 1231 + 1232 + [[package]] 1233 + name = "rtoolbox" 1234 + version = "0.0.2" 1414 1235 source = "registry+https://github.com/rust-lang/crates.io-index" 1415 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1236 + checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" 1237 + dependencies = [ 1238 + "libc", 1239 + "windows-sys 0.48.0", 1240 + ] 1416 1241 1417 1242 [[package]] 1418 1243 name = "rustc-demangle" 1419 - version = "0.1.24" 1244 + version = "0.1.23" 1420 1245 source = "registry+https://github.com/rust-lang/crates.io-index" 1421 - checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1246 + checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1422 1247 1423 1248 [[package]] 1424 1249 name = "rustix" 1425 - version = "1.0.7" 1250 + version = "0.38.32" 1426 1251 source = "registry+https://github.com/rust-lang/crates.io-index" 1427 - checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" 1252 + checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" 1428 1253 dependencies = [ 1429 - "bitflags", 1254 + "bitflags 2.5.0", 1430 1255 "errno", 1431 1256 "libc", 1432 1257 "linux-raw-sys", 1433 - "windows-sys 0.59.0", 1258 + "windows-sys 0.52.0", 1259 + ] 1260 + 1261 + [[package]] 1262 + name = "rustls-pemfile" 1263 + version = "1.0.4" 1264 + source = "registry+https://github.com/rust-lang/crates.io-index" 1265 + checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1266 + dependencies = [ 1267 + "base64", 1434 1268 ] 1435 1269 1436 1270 [[package]] 1437 1271 name = "ryu" 1438 - version = "1.0.20" 1272 + version = "1.0.17" 1439 1273 source = "registry+https://github.com/rust-lang/crates.io-index" 1440 - checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1274 + checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 1441 1275 1442 1276 [[package]] 1443 1277 name = "schannel" 1444 - version = "0.1.27" 1278 + version = "0.1.23" 1445 1279 source = "registry+https://github.com/rust-lang/crates.io-index" 1446 - checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1280 + checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1447 1281 dependencies = [ 1448 - "windows-sys 0.59.0", 1282 + "windows-sys 0.52.0", 1449 1283 ] 1450 1284 1451 1285 [[package]] 1452 1286 name = "scoped-futures" 1453 - version = "0.1.4" 1287 + version = "0.1.3" 1454 1288 source = "registry+https://github.com/rust-lang/crates.io-index" 1455 - checksum = "1b24aae2d0636530f359e9d5ef0c04669d11c5e756699b27a6a6d845d8329091" 1289 + checksum = "b1473e24c637950c9bd38763220bea91ec3e095a89f672bbd7a10d03e77ba467" 1456 1290 dependencies = [ 1457 - "pin-project-lite", 1291 + "cfg-if", 1292 + "pin-utils", 1458 1293 ] 1459 1294 1460 1295 [[package]] ··· 1471 1306 1472 1307 [[package]] 1473 1308 name = "security-framework" 1474 - version = "2.11.1" 1309 + version = "2.9.2" 1475 1310 source = "registry+https://github.com/rust-lang/crates.io-index" 1476 - checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1311 + checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" 1477 1312 dependencies = [ 1478 - "bitflags", 1313 + "bitflags 1.3.2", 1479 1314 "core-foundation", 1480 1315 "core-foundation-sys", 1481 1316 "libc", ··· 1484 1319 1485 1320 [[package]] 1486 1321 name = "security-framework-sys" 1487 - version = "2.14.0" 1322 + version = "2.9.1" 1488 1323 source = "registry+https://github.com/rust-lang/crates.io-index" 1489 - checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1324 + checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" 1490 1325 dependencies = [ 1491 1326 "core-foundation-sys", 1492 1327 "libc", ··· 1494 1329 1495 1330 [[package]] 1496 1331 name = "serde" 1497 - version = "1.0.219" 1332 + version = "1.0.197" 1498 1333 source = "registry+https://github.com/rust-lang/crates.io-index" 1499 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1334 + checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" 1500 1335 dependencies = [ 1501 1336 "serde_derive", 1502 1337 ] 1503 1338 1504 1339 [[package]] 1505 1340 name = "serde_derive" 1506 - version = "1.0.219" 1341 + version = "1.0.197" 1507 1342 source = "registry+https://github.com/rust-lang/crates.io-index" 1508 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1343 + checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" 1509 1344 dependencies = [ 1510 1345 "proc-macro2", 1511 1346 "quote", ··· 1514 1349 1515 1350 [[package]] 1516 1351 name = "serde_json" 1517 - version = "1.0.140" 1352 + version = "1.0.114" 1518 1353 source = "registry+https://github.com/rust-lang/crates.io-index" 1519 - checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1354 + checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" 1520 1355 dependencies = [ 1521 1356 "itoa", 1522 - "memchr", 1523 1357 "ryu", 1524 1358 "serde", 1525 1359 ] 1526 1360 1527 1361 [[package]] 1528 1362 name = "serde_spanned" 1529 - version = "0.6.9" 1363 + version = "0.6.5" 1530 1364 source = "registry+https://github.com/rust-lang/crates.io-index" 1531 - checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" 1365 + checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" 1532 1366 dependencies = [ 1533 1367 "serde", 1534 1368 ] ··· 1558 1392 1559 1393 [[package]] 1560 1394 name = "sha2" 1561 - version = "0.10.9" 1395 + version = "0.10.8" 1562 1396 source = "registry+https://github.com/rust-lang/crates.io-index" 1563 - checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 1397 + checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1564 1398 dependencies = [ 1565 1399 "cfg-if", 1566 1400 "cpufeatures", ··· 1568 1402 ] 1569 1403 1570 1404 [[package]] 1571 - name = "shlex" 1572 - version = "1.3.0" 1573 - source = "registry+https://github.com/rust-lang/crates.io-index" 1574 - checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1575 - 1576 - [[package]] 1577 1405 name = "signal-hook-registry" 1578 - version = "1.4.5" 1406 + version = "1.4.1" 1579 1407 source = "registry+https://github.com/rust-lang/crates.io-index" 1580 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 1408 + checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 1581 1409 dependencies = [ 1582 1410 "libc", 1583 1411 ] 1584 1412 1585 1413 [[package]] 1586 1414 name = "siphasher" 1587 - version = "1.0.1" 1415 + version = "0.3.11" 1588 1416 source = "registry+https://github.com/rust-lang/crates.io-index" 1589 - checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 1417 + checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 1590 1418 1591 1419 [[package]] 1592 1420 name = "slab" ··· 1599 1427 1600 1428 [[package]] 1601 1429 name = "smallvec" 1602 - version = "1.15.1" 1430 + version = "1.13.2" 1603 1431 source = "registry+https://github.com/rust-lang/crates.io-index" 1604 - checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1432 + checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1605 1433 1606 1434 [[package]] 1607 1435 name = "socket2" 1608 - version = "0.5.10" 1436 + version = "0.5.6" 1609 1437 source = "registry+https://github.com/rust-lang/crates.io-index" 1610 - checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 1438 + checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" 1611 1439 dependencies = [ 1612 1440 "libc", 1613 1441 "windows-sys 0.52.0", ··· 1620 1448 checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1621 1449 1622 1450 [[package]] 1623 - name = "stable_deref_trait" 1624 - version = "1.2.0" 1625 - source = "registry+https://github.com/rust-lang/crates.io-index" 1626 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1627 - 1628 - [[package]] 1629 1451 name = "stringprep" 1630 - version = "0.1.5" 1452 + version = "0.1.4" 1631 1453 source = "registry+https://github.com/rust-lang/crates.io-index" 1632 - checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 1454 + checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" 1633 1455 dependencies = [ 1456 + "finl_unicode", 1634 1457 "unicode-bidi", 1635 1458 "unicode-normalization", 1636 - "unicode-properties", 1637 1459 ] 1638 1460 1639 1461 [[package]] 1640 1462 name = "strsim" 1641 - version = "0.11.1" 1463 + version = "0.11.0" 1642 1464 source = "registry+https://github.com/rust-lang/crates.io-index" 1643 - checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1465 + checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" 1644 1466 1645 1467 [[package]] 1646 1468 name = "subtle" 1647 - version = "2.6.1" 1469 + version = "2.5.0" 1648 1470 source = "registry+https://github.com/rust-lang/crates.io-index" 1649 - checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1471 + checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 1650 1472 1651 1473 [[package]] 1652 1474 name = "syn" 1653 - version = "2.0.101" 1475 + version = "2.0.53" 1654 1476 source = "registry+https://github.com/rust-lang/crates.io-index" 1655 - checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 1477 + checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" 1656 1478 dependencies = [ 1657 1479 "proc-macro2", 1658 1480 "quote", ··· 1660 1482 ] 1661 1483 1662 1484 [[package]] 1663 - name = "synstructure" 1664 - version = "0.13.2" 1665 - source = "registry+https://github.com/rust-lang/crates.io-index" 1666 - checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1667 - dependencies = [ 1668 - "proc-macro2", 1669 - "quote", 1670 - "syn", 1671 - ] 1672 - 1673 - [[package]] 1674 1485 name = "tempfile" 1675 - version = "3.20.0" 1486 + version = "3.10.1" 1676 1487 source = "registry+https://github.com/rust-lang/crates.io-index" 1677 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 1488 + checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" 1678 1489 dependencies = [ 1490 + "cfg-if", 1679 1491 "fastrand", 1680 - "getrandom 0.3.3", 1681 - "once_cell", 1682 1492 "rustix", 1683 - "windows-sys 0.59.0", 1493 + "windows-sys 0.52.0", 1684 1494 ] 1685 1495 1686 1496 [[package]] ··· 1694 1504 1695 1505 [[package]] 1696 1506 name = "thiserror" 1697 - version = "1.0.69" 1507 + version = "1.0.58" 1698 1508 source = "registry+https://github.com/rust-lang/crates.io-index" 1699 - checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1509 + checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" 1700 1510 dependencies = [ 1701 1511 "thiserror-impl", 1702 1512 ] 1703 1513 1704 1514 [[package]] 1705 1515 name = "thiserror-impl" 1706 - version = "1.0.69" 1516 + version = "1.0.58" 1707 1517 source = "registry+https://github.com/rust-lang/crates.io-index" 1708 - checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1518 + checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" 1709 1519 dependencies = [ 1710 1520 "proc-macro2", 1711 1521 "quote", ··· 1714 1524 1715 1525 [[package]] 1716 1526 name = "time" 1717 - version = "0.3.41" 1527 + version = "0.3.34" 1718 1528 source = "registry+https://github.com/rust-lang/crates.io-index" 1719 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 1529 + checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" 1720 1530 dependencies = [ 1721 1531 "deranged", 1722 1532 "num-conv", ··· 1728 1538 1729 1539 [[package]] 1730 1540 name = "time-core" 1731 - version = "0.1.4" 1541 + version = "0.1.2" 1732 1542 source = "registry+https://github.com/rust-lang/crates.io-index" 1733 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 1543 + checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1734 1544 1735 1545 [[package]] 1736 1546 name = "time-macros" 1737 - version = "0.2.22" 1547 + version = "0.2.17" 1738 1548 source = "registry+https://github.com/rust-lang/crates.io-index" 1739 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 1549 + checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" 1740 1550 dependencies = [ 1741 1551 "num-conv", 1742 1552 "time-core", 1743 1553 ] 1744 1554 1745 1555 [[package]] 1746 - name = "tinystr" 1747 - version = "0.8.1" 1748 - source = "registry+https://github.com/rust-lang/crates.io-index" 1749 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 1750 - dependencies = [ 1751 - "displaydoc", 1752 - "zerovec", 1753 - ] 1754 - 1755 - [[package]] 1756 1556 name = "tinyvec" 1757 - version = "1.9.0" 1557 + version = "1.6.0" 1758 1558 source = "registry+https://github.com/rust-lang/crates.io-index" 1759 - checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 1559 + checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1760 1560 dependencies = [ 1761 1561 "tinyvec_macros", 1762 1562 ] ··· 1769 1569 1770 1570 [[package]] 1771 1571 name = "tokio" 1772 - version = "1.45.1" 1572 + version = "1.36.0" 1773 1573 source = "registry+https://github.com/rust-lang/crates.io-index" 1774 - checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" 1574 + checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" 1775 1575 dependencies = [ 1776 1576 "backtrace", 1777 1577 "bytes", 1778 1578 "libc", 1779 1579 "mio", 1580 + "num_cpus", 1780 1581 "parking_lot", 1781 1582 "pin-project-lite", 1782 1583 "signal-hook-registry", 1783 1584 "socket2", 1784 1585 "tokio-macros", 1785 - "windows-sys 0.52.0", 1586 + "windows-sys 0.48.0", 1786 1587 ] 1787 1588 1788 1589 [[package]] 1789 1590 name = "tokio-macros" 1790 - version = "2.5.0" 1591 + version = "2.2.0" 1791 1592 source = "registry+https://github.com/rust-lang/crates.io-index" 1792 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1593 + checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 1793 1594 dependencies = [ 1794 1595 "proc-macro2", 1795 1596 "quote", ··· 1808 1609 1809 1610 [[package]] 1810 1611 name = "tokio-postgres" 1811 - version = "0.7.13" 1612 + version = "0.7.10" 1812 1613 source = "registry+https://github.com/rust-lang/crates.io-index" 1813 - checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" 1614 + checksum = "d340244b32d920260ae7448cb72b6e238bddc3d4f7603394e7dd46ed8e48f5b8" 1814 1615 dependencies = [ 1815 1616 "async-trait", 1816 1617 "byteorder", ··· 1825 1626 "pin-project-lite", 1826 1627 "postgres-protocol", 1827 1628 "postgres-types", 1828 - "rand 0.9.1", 1629 + "rand", 1829 1630 "socket2", 1830 1631 "tokio", 1831 1632 "tokio-util", 1832 1633 "whoami", 1634 + ] 1635 + 1636 + [[package]] 1637 + name = "tokio-stream" 1638 + version = "0.1.15" 1639 + source = "registry+https://github.com/rust-lang/crates.io-index" 1640 + checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" 1641 + dependencies = [ 1642 + "futures-core", 1643 + "pin-project-lite", 1644 + "tokio", 1833 1645 ] 1834 1646 1835 1647 [[package]] 1836 1648 name = "tokio-tungstenite" 1837 - version = "0.21.0" 1649 + version = "0.20.1" 1838 1650 source = "registry+https://github.com/rust-lang/crates.io-index" 1839 - checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" 1651 + checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" 1840 1652 dependencies = [ 1841 1653 "futures-util", 1842 1654 "log", ··· 1846 1658 1847 1659 [[package]] 1848 1660 name = "tokio-util" 1849 - version = "0.7.15" 1661 + version = "0.7.10" 1850 1662 source = "registry+https://github.com/rust-lang/crates.io-index" 1851 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 1663 + checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 1852 1664 dependencies = [ 1853 1665 "bytes", 1854 1666 "futures-core", 1855 1667 "futures-sink", 1856 1668 "pin-project-lite", 1857 1669 "tokio", 1670 + "tracing", 1858 1671 ] 1859 1672 1860 1673 [[package]] 1861 1674 name = "toml" 1862 - version = "0.8.23" 1675 + version = "0.8.12" 1863 1676 source = "registry+https://github.com/rust-lang/crates.io-index" 1864 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 1677 + checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" 1865 1678 dependencies = [ 1866 1679 "serde", 1867 1680 "serde_spanned", ··· 1871 1684 1872 1685 [[package]] 1873 1686 name = "toml_datetime" 1874 - version = "0.6.11" 1687 + version = "0.6.5" 1875 1688 source = "registry+https://github.com/rust-lang/crates.io-index" 1876 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 1689 + checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 1877 1690 dependencies = [ 1878 1691 "serde", 1879 1692 ] 1880 1693 1881 1694 [[package]] 1882 1695 name = "toml_edit" 1883 - version = "0.22.27" 1696 + version = "0.22.9" 1884 1697 source = "registry+https://github.com/rust-lang/crates.io-index" 1885 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 1698 + checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" 1886 1699 dependencies = [ 1887 1700 "indexmap", 1888 1701 "serde", 1889 1702 "serde_spanned", 1890 1703 "toml_datetime", 1891 - "toml_write", 1892 1704 "winnow", 1893 1705 ] 1894 1706 1895 1707 [[package]] 1896 - name = "toml_write" 1897 - version = "0.1.2" 1898 - source = "registry+https://github.com/rust-lang/crates.io-index" 1899 - checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 1900 - 1901 - [[package]] 1902 1708 name = "tower-service" 1903 - version = "0.3.3" 1709 + version = "0.3.2" 1904 1710 source = "registry+https://github.com/rust-lang/crates.io-index" 1905 - checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1711 + checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1906 1712 1907 1713 [[package]] 1908 1714 name = "tracing" 1909 - version = "0.1.41" 1715 + version = "0.1.40" 1910 1716 source = "registry+https://github.com/rust-lang/crates.io-index" 1911 - checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1717 + checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1912 1718 dependencies = [ 1913 1719 "log", 1914 1720 "pin-project-lite", ··· 1917 1723 1918 1724 [[package]] 1919 1725 name = "tracing-core" 1920 - version = "0.1.34" 1726 + version = "0.1.32" 1921 1727 source = "registry+https://github.com/rust-lang/crates.io-index" 1922 - checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 1728 + checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1923 1729 dependencies = [ 1924 1730 "once_cell", 1925 1731 ] ··· 1932 1738 1933 1739 [[package]] 1934 1740 name = "tungstenite" 1935 - version = "0.21.0" 1741 + version = "0.20.1" 1936 1742 source = "registry+https://github.com/rust-lang/crates.io-index" 1937 - checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" 1743 + checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" 1938 1744 dependencies = [ 1939 1745 "byteorder", 1940 1746 "bytes", 1941 1747 "data-encoding", 1942 - "http 1.3.1", 1748 + "http", 1943 1749 "httparse", 1944 1750 "log", 1945 - "rand 0.8.5", 1751 + "rand", 1946 1752 "sha1", 1947 1753 "thiserror", 1948 1754 "url", ··· 1951 1757 1952 1758 [[package]] 1953 1759 name = "typenum" 1954 - version = "1.18.0" 1760 + version = "1.17.0" 1955 1761 source = "registry+https://github.com/rust-lang/crates.io-index" 1956 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 1762 + checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1957 1763 1958 1764 [[package]] 1959 1765 name = "unicase" 1960 - version = "2.8.1" 1766 + version = "2.7.0" 1961 1767 source = "registry+https://github.com/rust-lang/crates.io-index" 1962 - checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 1768 + checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" 1769 + dependencies = [ 1770 + "version_check", 1771 + ] 1963 1772 1964 1773 [[package]] 1965 1774 name = "unicode-bidi" 1966 - version = "0.3.18" 1775 + version = "0.3.15" 1967 1776 source = "registry+https://github.com/rust-lang/crates.io-index" 1968 - checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 1777 + checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 1969 1778 1970 1779 [[package]] 1971 1780 name = "unicode-ident" 1972 - version = "1.0.18" 1781 + version = "1.0.12" 1973 1782 source = "registry+https://github.com/rust-lang/crates.io-index" 1974 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1783 + checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1975 1784 1976 1785 [[package]] 1977 1786 name = "unicode-normalization" 1978 - version = "0.1.24" 1787 + version = "0.1.23" 1979 1788 source = "registry+https://github.com/rust-lang/crates.io-index" 1980 - checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 1789 + checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 1981 1790 dependencies = [ 1982 1791 "tinyvec", 1983 1792 ] 1984 1793 1985 1794 [[package]] 1986 - name = "unicode-properties" 1987 - version = "0.1.3" 1988 - source = "registry+https://github.com/rust-lang/crates.io-index" 1989 - checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 1990 - 1991 - [[package]] 1992 1795 name = "url" 1993 - version = "2.5.4" 1796 + version = "2.5.0" 1994 1797 source = "registry+https://github.com/rust-lang/crates.io-index" 1995 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1798 + checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 1996 1799 dependencies = [ 1997 1800 "form_urlencoded", 1998 1801 "idna", ··· 2006 1809 checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2007 1810 2008 1811 [[package]] 2009 - name = "utf8_iter" 2010 - version = "1.0.4" 2011 - source = "registry+https://github.com/rust-lang/crates.io-index" 2012 - checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2013 - 2014 - [[package]] 2015 1812 name = "utf8parse" 2016 - version = "0.2.2" 1813 + version = "0.2.1" 2017 1814 source = "registry+https://github.com/rust-lang/crates.io-index" 2018 - checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1815 + checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 2019 1816 2020 1817 [[package]] 2021 1818 name = "vcpkg" ··· 2025 1822 2026 1823 [[package]] 2027 1824 name = "version_check" 2028 - version = "0.9.5" 1825 + version = "0.9.4" 2029 1826 source = "registry+https://github.com/rust-lang/crates.io-index" 2030 - checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1827 + checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2031 1828 2032 1829 [[package]] 2033 1830 name = "want" ··· 2040 1837 2041 1838 [[package]] 2042 1839 name = "warp" 2043 - version = "0.3.7" 1840 + version = "0.3.6" 2044 1841 source = "registry+https://github.com/rust-lang/crates.io-index" 2045 - checksum = "4378d202ff965b011c64817db11d5829506d3404edeadb61f190d111da3f231c" 1842 + checksum = "c1e92e22e03ff1230c03a1a8ee37d2f89cd489e2e541b7550d6afad96faed169" 2046 1843 dependencies = [ 2047 1844 "bytes", 2048 1845 "futures-channel", 2049 1846 "futures-util", 2050 1847 "headers", 2051 - "http 0.2.12", 1848 + "http", 2052 1849 "hyper", 2053 1850 "log", 2054 1851 "mime", ··· 2056 1853 "multer", 2057 1854 "percent-encoding", 2058 1855 "pin-project", 1856 + "rustls-pemfile", 2059 1857 "scoped-tls", 2060 1858 "serde", 2061 1859 "serde_json", 2062 1860 "serde_urlencoded", 2063 1861 "tokio", 1862 + "tokio-stream", 2064 1863 "tokio-tungstenite", 2065 1864 "tokio-util", 2066 1865 "tower-service", ··· 2074 1873 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2075 1874 2076 1875 [[package]] 2077 - name = "wasi" 2078 - version = "0.14.2+wasi-0.2.4" 2079 - source = "registry+https://github.com/rust-lang/crates.io-index" 2080 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 2081 - dependencies = [ 2082 - "wit-bindgen-rt", 2083 - ] 2084 - 2085 - [[package]] 2086 1876 name = "wasite" 2087 1877 version = "0.1.0" 2088 1878 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2090 1880 2091 1881 [[package]] 2092 1882 name = "wasm-bindgen" 2093 - version = "0.2.100" 1883 + version = "0.2.92" 2094 1884 source = "registry+https://github.com/rust-lang/crates.io-index" 2095 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1885 + checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 2096 1886 dependencies = [ 2097 1887 "cfg-if", 2098 - "once_cell", 2099 1888 "wasm-bindgen-macro", 2100 1889 ] 2101 1890 2102 1891 [[package]] 2103 1892 name = "wasm-bindgen-backend" 2104 - version = "0.2.100" 1893 + version = "0.2.92" 2105 1894 source = "registry+https://github.com/rust-lang/crates.io-index" 2106 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1895 + checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 2107 1896 dependencies = [ 2108 1897 "bumpalo", 2109 1898 "log", 1899 + "once_cell", 2110 1900 "proc-macro2", 2111 1901 "quote", 2112 1902 "syn", ··· 2115 1905 2116 1906 [[package]] 2117 1907 name = "wasm-bindgen-macro" 2118 - version = "0.2.100" 1908 + version = "0.2.92" 2119 1909 source = "registry+https://github.com/rust-lang/crates.io-index" 2120 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1910 + checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 2121 1911 dependencies = [ 2122 1912 "quote", 2123 1913 "wasm-bindgen-macro-support", ··· 2125 1915 2126 1916 [[package]] 2127 1917 name = "wasm-bindgen-macro-support" 2128 - version = "0.2.100" 1918 + version = "0.2.92" 2129 1919 source = "registry+https://github.com/rust-lang/crates.io-index" 2130 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1920 + checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 2131 1921 dependencies = [ 2132 1922 "proc-macro2", 2133 1923 "quote", ··· 2138 1928 2139 1929 [[package]] 2140 1930 name = "wasm-bindgen-shared" 2141 - version = "0.2.100" 1931 + version = "0.2.92" 2142 1932 source = "registry+https://github.com/rust-lang/crates.io-index" 2143 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2144 - dependencies = [ 2145 - "unicode-ident", 2146 - ] 1933 + checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 2147 1934 2148 1935 [[package]] 2149 1936 name = "web-sys" 2150 - version = "0.3.77" 1937 + version = "0.3.69" 2151 1938 source = "registry+https://github.com/rust-lang/crates.io-index" 2152 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1939 + checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 2153 1940 dependencies = [ 2154 1941 "js-sys", 2155 1942 "wasm-bindgen", ··· 2157 1944 2158 1945 [[package]] 2159 1946 name = "whoami" 2160 - version = "1.6.0" 1947 + version = "1.5.1" 2161 1948 source = "registry+https://github.com/rust-lang/crates.io-index" 2162 - checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" 1949 + checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" 2163 1950 dependencies = [ 2164 1951 "redox_syscall", 2165 1952 "wasite", ··· 2167 1954 ] 2168 1955 2169 1956 [[package]] 2170 - name = "winapi-util" 2171 - version = "0.1.9" 2172 - source = "registry+https://github.com/rust-lang/crates.io-index" 2173 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 2174 - dependencies = [ 2175 - "windows-sys 0.59.0", 2176 - ] 2177 - 2178 - [[package]] 2179 - name = "windows-sys" 2180 - version = "0.52.0" 1957 + name = "winapi" 1958 + version = "0.3.9" 2181 1959 source = "registry+https://github.com/rust-lang/crates.io-index" 2182 - checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1960 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2183 1961 dependencies = [ 2184 - "windows-targets", 1962 + "winapi-i686-pc-windows-gnu", 1963 + "winapi-x86_64-pc-windows-gnu", 2185 1964 ] 2186 1965 2187 1966 [[package]] 2188 - name = "windows-sys" 2189 - version = "0.59.0" 1967 + name = "winapi-i686-pc-windows-gnu" 1968 + version = "0.4.0" 2190 1969 source = "registry+https://github.com/rust-lang/crates.io-index" 2191 - checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2192 - dependencies = [ 2193 - "windows-targets", 2194 - ] 1970 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2195 1971 2196 1972 [[package]] 2197 - name = "windows-targets" 2198 - version = "0.52.6" 1973 + name = "winapi-util" 1974 + version = "0.1.6" 2199 1975 source = "registry+https://github.com/rust-lang/crates.io-index" 2200 - checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1976 + checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" 2201 1977 dependencies = [ 2202 - "windows_aarch64_gnullvm", 2203 - "windows_aarch64_msvc", 2204 - "windows_i686_gnu", 2205 - "windows_i686_gnullvm", 2206 - "windows_i686_msvc", 2207 - "windows_x86_64_gnu", 2208 - "windows_x86_64_gnullvm", 2209 - "windows_x86_64_msvc", 1978 + "winapi", 2210 1979 ] 2211 1980 2212 1981 [[package]] 2213 - name = "windows_aarch64_gnullvm" 2214 - version = "0.52.6" 1982 + name = "winapi-x86_64-pc-windows-gnu" 1983 + version = "0.4.0" 2215 1984 source = "registry+https://github.com/rust-lang/crates.io-index" 2216 - checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1985 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2217 1986 2218 1987 [[package]] 2219 - name = "windows_aarch64_msvc" 2220 - version = "0.52.6" 1988 + name = "windows-sys" 1989 + version = "0.48.0" 2221 1990 source = "registry+https://github.com/rust-lang/crates.io-index" 2222 - checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1991 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1992 + dependencies = [ 1993 + "windows-targets 0.48.5", 1994 + ] 2223 1995 2224 1996 [[package]] 2225 - name = "windows_i686_gnu" 2226 - version = "0.52.6" 1997 + name = "windows-sys" 1998 + version = "0.52.0" 2227 1999 source = "registry+https://github.com/rust-lang/crates.io-index" 2228 - checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2000 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2001 + dependencies = [ 2002 + "windows-targets 0.52.4", 2003 + ] 2229 2004 2230 2005 [[package]] 2231 - name = "windows_i686_gnullvm" 2232 - version = "0.52.6" 2006 + name = "windows-targets" 2007 + version = "0.48.5" 2233 2008 source = "registry+https://github.com/rust-lang/crates.io-index" 2234 - checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2009 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2010 + dependencies = [ 2011 + "windows_aarch64_gnullvm 0.48.5", 2012 + "windows_aarch64_msvc 0.48.5", 2013 + "windows_i686_gnu 0.48.5", 2014 + "windows_i686_msvc 0.48.5", 2015 + "windows_x86_64_gnu 0.48.5", 2016 + "windows_x86_64_gnullvm 0.48.5", 2017 + "windows_x86_64_msvc 0.48.5", 2018 + ] 2235 2019 2236 2020 [[package]] 2237 - name = "windows_i686_msvc" 2238 - version = "0.52.6" 2021 + name = "windows-targets" 2022 + version = "0.52.4" 2239 2023 source = "registry+https://github.com/rust-lang/crates.io-index" 2240 - checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2024 + checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" 2025 + dependencies = [ 2026 + "windows_aarch64_gnullvm 0.52.4", 2027 + "windows_aarch64_msvc 0.52.4", 2028 + "windows_i686_gnu 0.52.4", 2029 + "windows_i686_msvc 0.52.4", 2030 + "windows_x86_64_gnu 0.52.4", 2031 + "windows_x86_64_gnullvm 0.52.4", 2032 + "windows_x86_64_msvc 0.52.4", 2033 + ] 2241 2034 2242 2035 [[package]] 2243 - name = "windows_x86_64_gnu" 2244 - version = "0.52.6" 2036 + name = "windows_aarch64_gnullvm" 2037 + version = "0.48.5" 2245 2038 source = "registry+https://github.com/rust-lang/crates.io-index" 2246 - checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2039 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2247 2040 2248 2041 [[package]] 2249 - name = "windows_x86_64_gnullvm" 2250 - version = "0.52.6" 2042 + name = "windows_aarch64_gnullvm" 2043 + version = "0.52.4" 2251 2044 source = "registry+https://github.com/rust-lang/crates.io-index" 2252 - checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2045 + checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" 2253 2046 2254 2047 [[package]] 2255 - name = "windows_x86_64_msvc" 2256 - version = "0.52.6" 2048 + name = "windows_aarch64_msvc" 2049 + version = "0.48.5" 2257 2050 source = "registry+https://github.com/rust-lang/crates.io-index" 2258 - checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2051 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2259 2052 2260 2053 [[package]] 2261 - name = "winnow" 2262 - version = "0.7.10" 2054 + name = "windows_aarch64_msvc" 2055 + version = "0.52.4" 2263 2056 source = "registry+https://github.com/rust-lang/crates.io-index" 2264 - checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" 2265 - dependencies = [ 2266 - "memchr", 2267 - ] 2057 + checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" 2268 2058 2269 2059 [[package]] 2270 - name = "wit-bindgen-rt" 2271 - version = "0.39.0" 2060 + name = "windows_i686_gnu" 2061 + version = "0.48.5" 2272 2062 source = "registry+https://github.com/rust-lang/crates.io-index" 2273 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 2274 - dependencies = [ 2275 - "bitflags", 2276 - ] 2063 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2277 2064 2278 2065 [[package]] 2279 - name = "writeable" 2280 - version = "0.6.1" 2066 + name = "windows_i686_gnu" 2067 + version = "0.52.4" 2281 2068 source = "registry+https://github.com/rust-lang/crates.io-index" 2282 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 2069 + checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" 2283 2070 2284 2071 [[package]] 2285 - name = "yoke" 2286 - version = "0.8.0" 2072 + name = "windows_i686_msvc" 2073 + version = "0.48.5" 2287 2074 source = "registry+https://github.com/rust-lang/crates.io-index" 2288 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 2289 - dependencies = [ 2290 - "serde", 2291 - "stable_deref_trait", 2292 - "yoke-derive", 2293 - "zerofrom", 2294 - ] 2075 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2295 2076 2296 2077 [[package]] 2297 - name = "yoke-derive" 2298 - version = "0.8.0" 2078 + name = "windows_i686_msvc" 2079 + version = "0.52.4" 2299 2080 source = "registry+https://github.com/rust-lang/crates.io-index" 2300 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 2301 - dependencies = [ 2302 - "proc-macro2", 2303 - "quote", 2304 - "syn", 2305 - "synstructure", 2306 - ] 2081 + checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" 2307 2082 2308 2083 [[package]] 2309 - name = "zerocopy" 2310 - version = "0.8.25" 2084 + name = "windows_x86_64_gnu" 2085 + version = "0.48.5" 2311 2086 source = "registry+https://github.com/rust-lang/crates.io-index" 2312 - checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" 2313 - dependencies = [ 2314 - "zerocopy-derive", 2315 - ] 2087 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2316 2088 2317 2089 [[package]] 2318 - name = "zerocopy-derive" 2319 - version = "0.8.25" 2090 + name = "windows_x86_64_gnu" 2091 + version = "0.52.4" 2320 2092 source = "registry+https://github.com/rust-lang/crates.io-index" 2321 - checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" 2322 - dependencies = [ 2323 - "proc-macro2", 2324 - "quote", 2325 - "syn", 2326 - ] 2093 + checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" 2327 2094 2328 2095 [[package]] 2329 - name = "zerofrom" 2330 - version = "0.1.6" 2096 + name = "windows_x86_64_gnullvm" 2097 + version = "0.48.5" 2331 2098 source = "registry+https://github.com/rust-lang/crates.io-index" 2332 - checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2333 - dependencies = [ 2334 - "zerofrom-derive", 2335 - ] 2099 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2336 2100 2337 2101 [[package]] 2338 - name = "zerofrom-derive" 2339 - version = "0.1.6" 2102 + name = "windows_x86_64_gnullvm" 2103 + version = "0.52.4" 2340 2104 source = "registry+https://github.com/rust-lang/crates.io-index" 2341 - checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2342 - dependencies = [ 2343 - "proc-macro2", 2344 - "quote", 2345 - "syn", 2346 - "synstructure", 2347 - ] 2105 + checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" 2348 2106 2349 2107 [[package]] 2350 - name = "zerotrie" 2351 - version = "0.2.2" 2108 + name = "windows_x86_64_msvc" 2109 + version = "0.48.5" 2352 2110 source = "registry+https://github.com/rust-lang/crates.io-index" 2353 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 2354 - dependencies = [ 2355 - "displaydoc", 2356 - "yoke", 2357 - "zerofrom", 2358 - ] 2111 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2359 2112 2360 2113 [[package]] 2361 - name = "zerovec" 2362 - version = "0.11.2" 2114 + name = "windows_x86_64_msvc" 2115 + version = "0.52.4" 2363 2116 source = "registry+https://github.com/rust-lang/crates.io-index" 2364 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 2365 - dependencies = [ 2366 - "yoke", 2367 - "zerofrom", 2368 - "zerovec-derive", 2369 - ] 2117 + checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" 2370 2118 2371 2119 [[package]] 2372 - name = "zerovec-derive" 2373 - version = "0.11.1" 2120 + name = "winnow" 2121 + version = "0.6.5" 2374 2122 source = "registry+https://github.com/rust-lang/crates.io-index" 2375 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 2123 + checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" 2376 2124 dependencies = [ 2377 - "proc-macro2", 2378 - "quote", 2379 - "syn", 2125 + "memchr", 2380 2126 ]
+6 -5
Dockerfile
··· 1 - FROM rust:1.87.0-slim-bookworm 1 + FROM rust:1.74.1-slim-buster 2 2 ARG DEBIAN_FRONTEND=noninteractive 3 3 RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests ca-certificates pkg-config libssl-dev libpq-dev 4 4 ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse 5 5 6 6 RUN --mount=type=cache,target=$CARGO_HOME/registry \ 7 - cargo install diesel_cli --version 2.2.10 --no-default-features --features postgres 7 + cargo install diesel_cli --version 2.1.1 --no-default-features --features postgres 8 8 9 9 COPY common /lumen/common 10 10 COPY lumen /lumen/lumen 11 11 COPY Cargo.toml /lumen/ 12 12 RUN --mount=type=cache,target=$CARGO_HOME/registry,target=/lumen/target \ 13 - cd /lumen && cargo build --release && cp /lumen/target/release/lumen /root/ 13 + cd /lumen && cargo build --release && cp /lumen/target/release/lumen /root/ 14 14 15 - FROM debian:bookworm-slim 15 + FROM debian:buster-slim 16 16 ARG DEBIAN_FRONTEND=noninteractive 17 17 RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests openssl libpq5 && \ 18 - sed -i -e 's,\[ v3_req \],\[ v3_req \]\nextendedKeyUsage = serverAuth,' /etc/ssl/openssl.cnf 18 + sed -i -e 's,\[ v3_req \],\[ v3_req \]\nextendedKeyUsage = serverAuth,' /etc/ssl/openssl.cnf 19 19 RUN mkdir /usr/lib/lumen/ 20 20 21 21 COPY --from=0 /usr/local/cargo/bin/diesel /usr/bin/diesel ··· 26 26 COPY config-example.toml docker-init.sh /lumen/ 27 27 RUN chmod a+x /lumen/docker-init.sh && chmod a+x /usr/bin/lumen 28 28 WORKDIR /lumen 29 + STOPSIGNAL SIGINT 29 30 CMD /lumen/docker-init.sh
+15 -26
common/Cargo.toml
··· 7 7 publish = false 8 8 9 9 [dependencies] 10 - tokio = { version = "1.39", features = ["full"], optional = true } 11 - log = { version = "0.4", features = ["release_max_level_debug"] } 12 - serde = { version = "1.0", features = ["derive"] } 13 - postgres-native-tls = { version = "0.5", optional = true } 14 - native-tls = { version = "0.2", optional = true } 10 + tokio = {version = "1.32", features = ["full"], optional = true} 11 + log = {version = "0.4", features = ["release_max_level_debug"]} 12 + serde = {version = "1.0", features = ["derive"]} 13 + postgres-native-tls = {version = "0.5", optional = true} 14 + native-tls = {version = "0.2", optional = true} 15 15 futures-util = "0.3" 16 16 toml = "0.8" 17 - warp = { version = "0.3", optional = true } 17 + warp = {version = "0.3", optional = true} 18 18 binascii = "0.1" 19 19 20 - tokio-postgres = { version = "0.7", default-features = false, optional = true } 21 - diesel = { version = "2.2", optional = true, default-features = false, features = [ 22 - "postgres_backend", 23 - "time", 24 - ] } 25 - time = { version = "0.3.36", optional = true } 26 - diesel-async = { version = "0.5", optional = true, features = [ 27 - "postgres", 28 - "bb8", 29 - ] } 20 + tokio-postgres = {version = "0.7", default-features = false, optional = true} 21 + diesel = {version = "2.1", optional = true, default-features = false, features = ["postgres_backend", "time"]} 22 + time = {version = "0.3.31", optional = true} 23 + diesel-async = {version = "0.4.1", optional = true, features = ["postgres", "bb8"]} 30 24 anyhow = "1.0" 31 - prometheus-client = "0.22" 25 + prometheus-client = "0.22.0" 26 + pbkdf2 = { version = "0.12.2" } 27 + sha2 = "0.10.8" 28 + rand = "0.8.5" 32 29 33 30 [features] 34 31 default = ["web", "db"] 35 32 web = ["warp"] 36 - db = [ 37 - "tokio", 38 - "postgres-native-tls", 39 - "native-tls", 40 - "diesel", 41 - "diesel-async", 42 - "tokio-postgres", 43 - "time", 44 - ] 33 + db = ["tokio", "postgres-native-tls", "native-tls", "diesel", "diesel-async", "tokio-postgres", "time"]
+21
common/migrations/2024-01-20-215809_users/down.sql
··· 1 + -- don't allow table to be modified until we're done... 2 + LOCK TABLE users; 3 + 4 + -- delete funcs that belong to users 5 + DELETE FROM funcs USING dbs, users 6 + WHERE dbs.id=funcs.db_id 7 + AND users.id=dbs.user_id 8 + AND users.cred_id IS NOT NULL; 9 + 10 + -- delete dbs that belong to users 11 + DELETE FROM dbs USING users WHERE dbs.user_id=users.id AND users.cred_id IS NOT NULL; 12 + 13 + -- delete all users with creds... 14 + DELETE FROM users WHERE cred_id is NOT NULL; 15 + DROP TABLE creds CASCADE; 16 + 17 + CREATE UNIQUE INDEX IF NOT EXISTS user_rec ON users(lic_id,lic_data,hostname); 18 + CREATE UNIQUE INDEX IF NOT EXISTS user_hn_null ON users (lic_id,lic_data, (hostname IS NULL)) WHERE hostname is NULL; 19 + DROP INDEX user_cred_idx; 20 + 21 + ALTER TABLE users DROP COLUMN cred_id;
+22
common/migrations/2024-01-20-215809_users/up.sql
··· 1 + CREATE TABLE creds ( 2 + id SERIAL PRIMARY KEY, 3 + 4 + username VARCHAR(256) UNIQUE NOT NULL, 5 + email VARCHAR(256) UNIQUE NOT NULL, 6 + 7 + passwd_salt bytea, 8 + passwd_iters INTEGER NOT NULL DEFAULT 10000, 9 + passwd_hash bytea, 10 + 11 + last_active TIMESTAMPTZ, 12 + creation_dt TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL, 13 + 14 + is_admin BOOLEAN NOT NULL DEFAULT FALSE, 15 + is_enabled BOOLEAN NOT NULL DEFAULT TRUE 16 + ); 17 + 18 + ALTER TABLE users ADD COLUMN cred_id INTEGER REFERENCES creds(id) ON DELETE CASCADE; 19 + 20 + CREATE UNIQUE INDEX user_cred_idx ON users(lic_id,lic_data,hostname,cred_id) NULLS NOT DISTINCT; 21 + DROP INDEX user_hn_null; 22 + DROP INDEX user_rec;
+36 -3
common/src/config.rs
··· 1 1 use serde::Deserialize; 2 + use std::num::NonZeroU32; 2 3 use std::time::Duration; 3 4 use std::{net::SocketAddr, path::PathBuf}; 4 5 use toml::from_str; ··· 9 10 } 10 11 11 12 #[derive(Deserialize)] 13 + #[serde(default)] 12 14 pub struct LuminaServer { 13 15 pub bind_addr: SocketAddr, 14 - pub use_tls: Option<bool>, 16 + pub use_tls: bool, 15 17 pub tls: Option<TlsIdentity>, 16 18 pub server_name: Option<String>, 17 - pub allow_deletes: Option<bool>, 19 + pub allow_deletes: bool, 18 20 19 21 /// limit of function histories to return per function. 20 22 /// `None`, or `Some(0)` will disable the feature on the server. 21 - pub get_history_limit: Option<u32>, 23 + pub get_history_limit: NonZeroU32, 24 + } 25 + impl Default for LuminaServer { 26 + fn default() -> Self { 27 + Self { 28 + bind_addr: "0.0.0.0:1234".parse().unwrap(), 29 + use_tls: false, 30 + tls: None, 31 + server_name: None, 32 + allow_deletes: false, 33 + get_history_limit: NonZeroU32::new(50).unwrap(), 34 + } 35 + } 22 36 } 23 37 24 38 #[derive(Deserialize)] ··· 63 77 } 64 78 65 79 #[derive(Deserialize)] 80 + #[serde(default)] 81 + pub struct Users { 82 + /// Sets if guests are allowed to login. required for IDA<8.1 83 + pub allow_guests: bool, 84 + 85 + /// PBKDF2 iterations for newly set passwords. 86 + pub pbkdf2_iterations: NonZeroU32, 87 + } 88 + 89 + impl Default for Users { 90 + fn default() -> Self { 91 + Self { allow_guests: true, pbkdf2_iterations: NonZeroU32::new(120_000).unwrap() } 92 + } 93 + } 94 + 95 + #[derive(Deserialize)] 66 96 pub struct Config { 67 97 pub lumina: LuminaServer, 68 98 pub api_server: Option<WebServer>, ··· 70 100 71 101 #[serde(default)] 72 102 pub limits: Limits, 103 + 104 + #[serde(default)] 105 + pub users: Users, 73 106 } 74 107 75 108 pub trait HasConfig {
+131 -17
common/src/db/mod.rs
··· 1 - use crate::async_drop::{AsyncDropGuard, AsyncDropper}; 1 + use crate::{ 2 + async_drop::{AsyncDropGuard, AsyncDropper}, 3 + db::schema::Creds, 4 + }; 2 5 use log::*; 3 6 use postgres_native_tls::MakeTlsConnector; 4 7 use serde::Serialize; ··· 12 15 query_builder::{Query, QueryFragment}, 13 16 sql_types::{Array, Binary, Integer, VarChar}, 14 17 upsert::excluded, 15 - ExpressionMethods, NullableExpressionMethods, QueryDsl, 18 + ExpressionMethods, NullableExpressionMethods, QueryDsl, SelectableHelper, 16 19 }; 17 20 use diesel_async::{pooled_connection::ManagerConfig, RunQueryDsl}; 21 + 22 + use self::schema::creds; 18 23 19 24 pub type DynConfig = dyn crate::config::HasConfig + Send + Sync; 20 25 ··· 135 140 } 136 141 137 142 pub async fn get_funcs( 138 - &self, funcs: &[crate::rpc::PullMetadataFunc<'_>], 143 + &self, funcs: &[crate::rpc::PatternId<'_>], 139 144 ) -> Result<Vec<Option<FunctionInfo>>, anyhow::Error> { 140 - let chksums: Vec<&[u8]> = funcs.iter().map(|v| v.mb_hash).collect(); 145 + let chksums: Vec<&[u8]> = funcs.iter().map(|v| v.data).collect(); 141 146 142 147 let rows: Vec<(String, i32, Vec<u8>, Vec<u8>)> = { 143 148 let conn = &mut self.diesel.get().await?; ··· 169 174 } 170 175 171 176 pub async fn get_or_create_user<'a>( 172 - &self, user: &'a crate::rpc::RpcHello<'a>, hostname: &str, 177 + &self, user: &'a crate::rpc::RpcHello<'a>, cred_id: Option<i32>, hostname: &str, 173 178 ) -> Result<i32, anyhow::Error> { 174 179 use schema::users; 175 180 ··· 179 184 let lic_data = user.license_data; 180 185 181 186 let get_user = || { 182 - users::table 187 + let query = users::table 188 + .into_boxed() 183 189 .select(users::id) 184 190 .filter(users::lic_data.eq(lic_data)) 185 191 .filter(users::lic_id.eq(lic_id)) 186 - .filter(users::hostname.eq(hostname)) 192 + .filter(users::hostname.eq(hostname)); 193 + 194 + if let Some(cred_id) = cred_id { 195 + query.filter(users::cred_id.eq(cred_id)) 196 + } else { 197 + query.filter(users::cred_id.is_null()) 198 + } 187 199 }; 188 200 189 201 match get_user().get_result::<i32>(conn).await { ··· 197 209 users::lic_id.eq(lic_id), 198 210 users::lic_data.eq(lic_data), 199 211 users::hostname.eq(hostname), 212 + users::cred_id.eq(cred_id), 200 213 )]) 201 214 .returning(users::id) // xmax = 0 if the row is new 202 215 .get_result::<i32>(conn) ··· 218 231 ) -> Result<i32, anyhow::Error> { 219 232 use schema::files::{chksum, id, table as files}; 220 233 221 - let hash = &funcs.md5[..]; 234 + let hash = &funcs.input_md5[..]; 222 235 223 236 let conn = &mut self.diesel.get().await?; 224 237 ··· 247 260 } 248 261 249 262 async fn get_or_create_db<'a>( 250 - &self, user: &'a crate::rpc::RpcHello<'a>, funcs: &'a crate::rpc::PushMetadata<'a>, 263 + &self, user: &'a crate::rpc::RpcHello<'a>, cred_id: Option<i32>, 264 + funcs: &'a crate::rpc::PushMetadata<'a>, 251 265 ) -> Result<i32, anyhow::Error> { 252 266 use schema::dbs::{ 253 267 file_id as db_file_id, file_path, id as db_id, idb_path, table as dbs, ··· 255 269 }; 256 270 257 271 let file_id = self.get_or_create_file(funcs); 258 - let user_id = self.get_or_create_user(user, funcs.hostname); 272 + let user_id = self.get_or_create_user(user, cred_id, funcs.hostname); 259 273 260 274 let (file_id, user_id): (i32, i32) = futures_util::try_join!(file_id, user_id)?; 261 275 ··· 265 279 dbs.select(db_id) 266 280 .filter(db_user.eq(user_id)) 267 281 .filter(db_file_id.eq(file_id)) 268 - .filter(file_path.eq(funcs.file_path)) 282 + .filter(file_path.eq(funcs.input_path)) 269 283 .filter(idb_path.eq(funcs.idb_path)) 270 284 }; 271 285 ··· 279 293 .values(vec![( 280 294 db_user.eq(user_id), 281 295 db_file_id.eq(file_id), 282 - file_path.eq(funcs.file_path), 296 + file_path.eq(funcs.input_path), 283 297 idb_path.eq(funcs.idb_path), 284 298 )]) 285 299 .returning(db_id) ··· 297 311 } 298 312 299 313 pub async fn push_funcs<'a, 'b>( 300 - &'b self, user: &'a crate::rpc::RpcHello<'a>, funcs: &'a crate::rpc::PushMetadata<'a>, 301 - scores: &[u32], 314 + &'b self, user: &'a crate::rpc::RpcHello<'a>, cred_id: Option<i32>, 315 + funcs: &'a crate::rpc::PushMetadata<'a>, scores: &[u32], 302 316 ) -> Result<Vec<bool>, anyhow::Error> { 303 317 use futures_util::TryStreamExt; 304 318 305 319 // postgres has a limitation of binding per statement (i16::MAX). Split large push requests into smaller chunks. 306 320 const PUSH_FUNC_CHUNK_SIZE: usize = 3000; 307 321 308 - let db_id = self.get_or_create_db(user, funcs).await?; 322 + let db_id = self.get_or_create_db(user, cred_id, funcs).await?; 309 323 310 324 let mut rows = Vec::with_capacity(funcs.funcs.len().min(PUSH_FUNC_CHUNK_SIZE)); 311 325 let mut is_new = Vec::with_capacity(funcs.funcs.len()); ··· 315 329 for (idx, (func, &score)) in funcs.funcs.iter().zip(scores.iter()).enumerate() { 316 330 let name = func.name; 317 331 let len = func.func_len as i32; 318 - let chksum = func.hash; 332 + let chksum = func.pattern_id.data; 319 333 let md = func.func_data; 320 334 let score = score as i32; 321 335 ··· 418 432 ) -> Result<(), anyhow::Error> { 419 433 use schema::funcs::{chksum, table as funcs}; 420 434 421 - let chksums = req.funcs.iter().map(|v| v.as_slice()).collect::<Vec<_>>(); 435 + let chksums = req.calcrel_hashes.iter().map(|v| v.as_slice()).collect::<Vec<_>>(); 422 436 423 437 let conn = &mut self.diesel.get().await?; 424 438 let rows_modified = ··· 445 459 .get_results::<(time::OffsetDateTime, String, Vec<u8>)>(conn) 446 460 .await?; 447 461 Ok(rows) 462 + } 463 + 464 + pub async fn get_users(&self) -> Result<Vec<(i32, String, String, bool, bool)>, anyhow::Error> { 465 + let db = &mut self.diesel.get().await?; 466 + 467 + creds::table 468 + .select(( 469 + creds::id, 470 + creds::username, 471 + creds::email, 472 + creds::is_admin, 473 + creds::passwd_hash.is_not_null(), 474 + )) 475 + .get_results::<(i32, String, String, bool, bool)>(db) 476 + .await 477 + .map_err(|v| v.into()) 478 + } 479 + 480 + pub async fn delete_user(&self, username: &str) -> Result<(), anyhow::Error> { 481 + let db = &mut self.diesel.get().await?; 482 + 483 + let changes = 484 + diesel::delete(creds::table.filter(creds::username.eq(username))).execute(db).await?; 485 + if changes != 1 { 486 + return Err(anyhow::anyhow!("expected a single row deletion, got {changes}")); 487 + } 488 + Ok(()) 489 + } 490 + 491 + pub async fn set_password( 492 + &self, username: &str, password: String, iters: u32, 493 + ) -> Result<(), anyhow::Error> { 494 + let (salt, hash) = 495 + tokio::task::spawn_blocking(move || Creds::generate_creds(&password, iters)).await?; 496 + 497 + let db = &mut self.diesel.get().await?; 498 + let rows = diesel::update(creds::table) 499 + .filter(creds::username.eq(username)) 500 + .set(( 501 + creds::passwd_iters.eq(iters as i32), 502 + creds::passwd_salt.eq(&salt[..]), 503 + creds::passwd_hash.eq(&hash[..]), 504 + )) 505 + .execute(db) 506 + .await?; 507 + if rows != 1 { 508 + return Err(anyhow::anyhow!("updated {rows} rows, expected to update 1")); 509 + } 510 + Ok(()) 511 + } 512 + 513 + pub async fn add_user( 514 + &self, username: &str, email: &str, is_admin: bool, 515 + ) -> Result<u32, anyhow::Error> { 516 + let db = &mut self.diesel.get().await?; 517 + 518 + diesel::insert_into(creds::table) 519 + .values(&Creds { 520 + username: username.into(), 521 + email: email.into(), 522 + passwd_salt: None, 523 + passwd_iters: 10_000, 524 + passwd_hash: None, 525 + last_active: None, 526 + is_enabled: true, 527 + is_admin, 528 + }) 529 + .returning(creds::id) 530 + .get_result::<i32>(db) 531 + .await 532 + .map_err(|v| v.into()) 533 + .map(|v| v as u32) 534 + } 535 + 536 + pub async fn get_user_by_username( 537 + &self, username: &str, 538 + ) -> Result<(i32, Creds), anyhow::Error> { 539 + let db = &mut self.diesel.get().await?; 540 + 541 + Ok(creds::table 542 + .select((creds::id, Creds::as_select())) 543 + .filter(creds::username.eq(username)) 544 + .get_result::<(i32, Creds)>(db) 545 + .await?) 546 + } 547 + 548 + pub async fn get_user_by_id(&self, id: i32) -> Result<Creds, anyhow::Error> { 549 + let db = &mut self.diesel.get().await?; 550 + 551 + Ok(creds::table.select(Creds::as_select()).filter(creds::id.eq(id)).get_result(db).await?) 552 + } 553 + 554 + pub async fn update_last_active(&self, user_id: i32) -> Result<(), anyhow::Error> { 555 + let mut db = self.diesel.get().await?; 556 + diesel::update(schema::creds::table) 557 + .filter(schema::creds::id.eq(user_id)) 558 + .set((schema::creds::last_active.eq(time::OffsetDateTime::now_utc()),)) 559 + .execute(&mut db) 560 + .await?; 561 + Ok(()) 448 562 } 449 563 } 450 564
+78
common/src/db/schema.rs
··· 1 + use std::borrow::Cow; 2 + 3 + use diesel::{Insertable, Queryable, Selectable}; 4 + use log::error; 5 + use pbkdf2::{hmac::Hmac, pbkdf2}; 6 + use sha2::Sha256; 7 + 1 8 pub use super::schema_auto::*; 2 9 3 10 diesel::table! { ··· 15 22 } 16 23 17 24 diesel::joinable!(func_ranks -> dbs (id)); 25 + 26 + #[derive(Insertable, Queryable, Selectable, Default)] 27 + #[diesel(table_name = creds)] 28 + pub struct Creds<'a> { 29 + pub username: Cow<'a, str>, 30 + pub email: Cow<'a, str>, 31 + 32 + pub passwd_salt: Option<Cow<'a, [u8]>>, 33 + pub passwd_iters: i32, 34 + pub passwd_hash: Option<Cow<'a, [u8]>>, 35 + 36 + pub last_active: Option<time::OffsetDateTime>, 37 + 38 + pub is_admin: bool, 39 + pub is_enabled: bool, 40 + } 41 + 42 + impl<'a> Creds<'a> { 43 + pub fn verify_password(&self, password: &str) -> bool { 44 + let salt = if let Some(v) = self.passwd_salt.as_ref() { 45 + v 46 + } else { 47 + return false; 48 + }; 49 + let current_hash = if let Some(v) = self.passwd_hash.as_ref() { 50 + v 51 + } else { 52 + return false; 53 + }; 54 + if self.passwd_iters <= 0 { 55 + return false; 56 + } 57 + 58 + let mut hash = vec![0u8; 32]; 59 + if pbkdf2::<Hmac<Sha256>>(password.as_bytes(), salt, self.passwd_iters as u32, &mut hash) 60 + .is_err() 61 + { 62 + error!("invalid output digest length"); 63 + return false; 64 + } 65 + 66 + hash == current_hash.as_ref() 67 + } 68 + 69 + pub(crate) fn generate_creds(password: &str, iters: u32) -> ([u8; 4], [u8; 32]) { 70 + let salt: [u8; 4] = rand::random(); 71 + let mut res = [0u8; 32]; 72 + pbkdf2::pbkdf2::<Hmac<Sha256>>(password.as_bytes(), &salt, iters, &mut res) 73 + .expect("failed to perform pbkdf2_hmac_sha256"); 74 + (salt, res) 75 + } 76 + } 77 + 78 + #[cfg(test)] 79 + mod tests { 80 + use super::*; 81 + 82 + #[test] 83 + fn generate_and_verify_password() { 84 + let password = "MyPassword1$"; 85 + let iters = 10_000; 86 + let (salt, hash) = Creds::generate_creds(password, iters); 87 + let creds = Creds { 88 + passwd_hash: Some((&hash[..]).into()), 89 + passwd_salt: Some((&salt[..]).into()), 90 + passwd_iters: iters as i32, 91 + ..Default::default() 92 + }; 93 + assert!(creds.verify_password(password), "failed to verify password"); 94 + } 95 + }
+29 -1
common/src/db/schema_auto.rs
··· 1 1 // @generated automatically by Diesel CLI. 2 2 3 3 diesel::table! { 4 + creds (id) { 5 + id -> Int4, 6 + #[max_length = 256] 7 + username -> Varchar, 8 + #[max_length = 256] 9 + email -> Varchar, 10 + passwd_salt -> Nullable<Bytea>, 11 + passwd_iters -> Int4, 12 + passwd_hash -> Nullable<Bytea>, 13 + last_active -> Nullable<Timestamptz>, 14 + creation_dt -> Timestamptz, 15 + is_admin -> Bool, 16 + is_enabled -> Bool, 17 + } 18 + } 19 + 20 + diesel::table! { 4 21 dbs (id) { 5 22 id -> Int4, 23 + #[max_length = 260] 6 24 file_path -> Nullable<Varchar>, 25 + #[max_length = 260] 7 26 idb_path -> Nullable<Varchar>, 8 27 file_id -> Nullable<Int4>, 9 28 user_id -> Nullable<Int4>, ··· 36 55 id -> Int4, 37 56 lic_id -> Nullable<Bytea>, 38 57 lic_data -> Nullable<Bytea>, 58 + #[max_length = 260] 39 59 hostname -> Nullable<Varchar>, 40 60 first_seen -> Nullable<Timestamptz>, 61 + cred_id -> Nullable<Int4>, 41 62 } 42 63 } 43 64 44 65 diesel::joinable!(dbs -> files (file_id)); 45 66 diesel::joinable!(dbs -> users (user_id)); 46 67 diesel::joinable!(funcs -> dbs (db_id)); 68 + diesel::joinable!(users -> creds (cred_id)); 47 69 48 - diesel::allow_tables_to_appear_in_same_query!(dbs, files, funcs, users,); 70 + diesel::allow_tables_to_appear_in_same_query!( 71 + creds, 72 + dbs, 73 + files, 74 + funcs, 75 + users, 76 + );
+35 -38
common/src/rpc/messages.rs
··· 3 3 4 4 #[derive(Deserialize, Serialize)] 5 5 pub struct RpcFail<'a> { 6 - pub code: u32, 7 - pub message: &'a str, 6 + pub result: u32, 7 + pub error: &'a str, 8 8 } 9 9 10 10 #[derive(Serialize, Deserialize)] 11 11 pub struct RpcNotify<'a> { 12 - pub code: u32, 13 - pub msg: &'a str, 12 + pub ty: u32, 13 + pub text: &'a str, 14 14 } 15 15 16 16 #[derive(Serialize, Deserialize, Debug)] ··· 21 21 22 22 #[derive(Serialize, Deserialize)] 23 23 pub struct RpcHello<'a> { 24 - pub protocol_version: u32, 24 + pub client_version: u32, 25 25 pub license_data: &'a [u8], 26 26 pub lic_number: [u8; 6], 27 - pub unk2: u32, 27 + pub record_conv: u32, 28 28 } 29 29 30 30 #[derive(Debug, Deserialize, Serialize, Clone)] 31 - pub struct PullMetadataFunc<'a> { 32 - pub unk0: u32, 33 - pub mb_hash: &'a [u8], 31 + pub struct PatternId<'a> { 32 + pub ty: u32, 33 + pub data: &'a [u8], 34 34 } 35 35 36 36 #[derive(Deserialize, Serialize)] 37 37 pub struct PullMetadata<'a> { 38 - pub unk0: u32, 39 - pub unk1: Cow<'a, [u32]>, 38 + pub flags: u32, 39 + pub keys: Cow<'a, [u32]>, 40 40 41 41 #[serde(borrow)] 42 - pub funcs: Cow<'a, [PullMetadataFunc<'a>]>, 42 + pub pattern_ids: Cow<'a, [PatternId<'a>]>, 43 43 } 44 44 45 45 #[derive(Deserialize, Serialize, Clone)] ··· 52 52 53 53 #[derive(Deserialize, Serialize)] 54 54 pub struct PullMetadataResult<'a> { 55 - pub unk0: Cow<'a, [u32]>, 55 + pub codes: Cow<'a, [u32]>, 56 56 #[serde(borrow)] 57 57 pub funcs: Cow<'a, [PullMetadataResultFunc<'a>]>, 58 58 } ··· 62 62 pub name: &'a str, 63 63 pub func_len: u32, 64 64 pub func_data: &'a [u8], 65 - 66 - // PullMetadata's fields (tuple 'unk2') are similar to these two 67 - pub unk2: u32, 68 - pub hash: &'a [u8], 65 + pub pattern_id: PatternId<'a>, 69 66 } 70 67 71 68 #[derive(Deserialize, Serialize)] 72 69 pub struct PushMetadata<'a> { 73 - pub unk0: u32, 70 + pub flags: u32, 74 71 pub idb_path: &'a str, 75 - pub file_path: &'a str, 76 - pub md5: [u8; 16], 72 + pub input_path: &'a str, 73 + pub input_md5: [u8; 16], 77 74 pub hostname: &'a str, 78 75 pub funcs: Cow<'a, [PushMetadataFunc<'a>]>, 79 - pub unk1: Cow<'a, [u64]>, 76 + pub ea64s: Cow<'a, [u64]>, 80 77 } 81 78 82 79 #[derive(Deserialize, Serialize)] ··· 87 84 88 85 #[derive(Debug, Deserialize, Serialize)] 89 86 pub struct DelHistory<'a> { 90 - pub unk0: u32, // =0x08 91 - pub unk1: Cow<'a, [Cow<'a, str>]>, 92 - pub unk2: Cow<'a, [[u64; 2]]>, 93 - pub unk3: Cow<'a, [[u64; 2]]>, 94 - pub unk4: Cow<'a, [Cow<'a, str>]>, 95 - pub unk5: Cow<'a, [Cow<'a, str>]>, 96 - pub unk6: Cow<'a, [Cow<'a, str>]>, 97 - pub unk7: Cow<'a, [Cow<'a, str>]>, 98 - pub unk8: Cow<'a, [Cow<'a, [u8; 16]>]>, 99 - pub funcs: Cow<'a, [Cow<'a, [u8; 16]>]>, 100 - pub unk10: Cow<'a, [[u64; 2]]>, 101 - pub unk11: u64, 87 + pub flags: u32, // =0x08 88 + pub license_ids: Cow<'a, [Cow<'a, str>]>, 89 + pub time_ranges: Cow<'a, [[u64; 2]]>, 90 + pub history_id_ranges: Cow<'a, [[u64; 2]]>, 91 + pub idbs: Cow<'a, [Cow<'a, str>]>, 92 + pub inputs: Cow<'a, [Cow<'a, str>]>, 93 + pub funcs: Cow<'a, [Cow<'a, str>]>, // funcs 94 + pub usernames: Cow<'a, [Cow<'a, str>]>, 95 + pub input_hashes: Cow<'a, [Cow<'a, [u8; 16]>]>, 96 + pub calcrel_hashes: Cow<'a, [Cow<'a, [u8; 16]>]>, 97 + pub push_id_ranges: Cow<'a, [[u64; 2]]>, 98 + pub max_entries: u64, 102 99 } 103 100 104 101 #[derive(Deserialize, Serialize)] 105 102 pub struct DelHistoryResult { 106 - pub deleted_mds: u32, 103 + pub ndeleted: u32, 107 104 } 108 105 109 106 #[derive(Debug, Deserialize, Serialize, Default)] ··· 125 122 #[derive(Debug, Deserialize, Serialize)] 126 123 pub struct GetFuncHistories<'a> { 127 124 #[serde(borrow)] 128 - pub funcs: Cow<'a, [PullMetadataFunc<'a>]>, 129 - pub unk0: u32, 125 + pub funcs: Cow<'a, [PatternId<'a>]>, 126 + pub flags: u32, 130 127 } 131 128 132 129 #[derive(Debug, Deserialize, Serialize, Clone)] ··· 151 148 pub status: Cow<'a, [u32]>, 152 149 #[serde(borrow)] 153 150 pub funcs: Cow<'a, [FunctionHistories<'a>]>, 154 - pub users: Cow<'a, [Cow<'a, str>]>, 155 - pub dbs: Cow<'a, [Cow<'a, str>]>, 151 + pub authors: Cow<'a, [Cow<'a, str>]>, 152 + pub idb_paths: Cow<'a, [Cow<'a, str>]>, 156 153 }
+45 -21
common/src/rpc/mod.rs
··· 63 63 } 64 64 } 65 65 66 - pub async fn read_packet<R: AsyncRead + Unpin>(mut reader: R) -> Result<Vec<u8>, Error> { 66 + pub struct PacketHeader { 67 + code: u8, 68 + size: usize, 69 + } 70 + 71 + pub async fn read_packet_header<R: AsyncRead + Unpin>( 72 + mut reader: R, 73 + ) -> Result<PacketHeader, Error> { 67 74 let mut head = [0u8; 5]; 68 75 match reader.read_exact(&mut head).await { 69 76 Ok(_) => {}, ··· 83 90 .into()); 84 91 } 85 92 86 - let max_len = get_code_maxlen(code); 93 + Ok(PacketHeader { code, size: buf_len }) 94 + } 87 95 88 - if buf_len > max_len { 89 - info!("maxium size exceeded: code={}: max={}; req={}", code, max_len, buf_len); 90 - return Err(std::io::Error::new( 91 - std::io::ErrorKind::InvalidData, 92 - "request length exceeded maximum limit", 93 - ) 94 - .into()); 95 - } 96 + impl PacketHeader { 97 + pub async fn read<R: AsyncRead + Unpin>(self, mut reader: R) -> Result<Vec<u8>, Error> { 98 + trace!("expecting {} bytes...", self.size); 99 + let buf_len = self.size + 1; 96 100 97 - // the additional byte is for the RPC code 98 - trace!("expecting {} bytes...", buf_len); 99 - let buf_len = buf_len + 1; 101 + let max_len = get_code_maxlen(self.code); 102 + if self.size > max_len { 103 + info!("maxium size exceeded: code={}: max={}; req={}", self.code, max_len, self.size); 104 + return Err(std::io::Error::new( 105 + std::io::ErrorKind::InvalidData, 106 + "request length exceeded maximum limit", 107 + ) 108 + .into()); 109 + } 100 110 101 - let mut data = Vec::new(); 102 - data.try_reserve_exact(buf_len)?; 103 - data.resize(buf_len, 0); 104 - data[0] = code; 105 - reader.read_exact(&mut data[1..]).await?; 111 + let mut data = Vec::new(); 112 + data.try_reserve_exact(buf_len)?; 113 + data.resize(buf_len, 0); 114 + data[0] = self.code; 115 + reader.read_exact(&mut data[1..]).await?; 116 + 117 + Ok(data) 118 + } 119 + 120 + // returns true if this could be an http request. 121 + pub fn is_http(&self) -> bool { 122 + let mut sz = (self.size as u32).to_be_bytes(); 123 + sz.make_ascii_uppercase(); 124 + let sz = &sz[..]; 106 125 107 - Ok(data) 126 + match sz { 127 + b"GET " | b"PUT " if self.code == b'/' => true, 128 + b"POST" | b"HEAD" if self.code == b' ' => true, 129 + _ => false, 130 + } 131 + } 108 132 } 109 133 110 134 async fn write_packet<W: AsyncWrite + Unpin>(mut w: W, data: &[u8]) -> Result<(), std::io::Error> { ··· 193 217 0x0c => RpcMessage::Notify(Self::deserialize_check(payload)?), 194 218 0x0d => { 195 219 let (hello, consumed) = de::from_slice::<messages::RpcHello>(payload)?; 196 - let creds = if payload.len() > consumed && hello.protocol_version > 2 { 220 + let creds = if payload.len() > consumed && hello.client_version > 2 { 197 221 let payload = &payload[consumed..]; 198 222 let (creds, consumed) = de::from_slice::<Creds>(payload)?; 199 223 if payload.len() != consumed { ··· 201 225 } 202 226 Some(creds) 203 227 } else { 204 - if hello.protocol_version > 2 || payload.len() != consumed { 228 + if hello.client_version > 2 || payload.len() != consumed { 205 229 trace!("Unexpected Hello msg: {payload:02x?}"); 206 230 } 207 231 None
+1 -1
common/src/web/api.rs
··· 111 111 in_files: &'a [Md5], 112 112 } 113 113 114 - let funcs = [crate::rpc::PullMetadataFunc { unk0: 1, mb_hash: &md5.0 }]; 114 + let funcs = [crate::rpc::PatternId { ty: 1, data: &md5.0 }]; 115 115 116 116 let files_with = state.db.get_files_with_func(&md5.0[..]); 117 117 let files_info = state.db.get_funcs(&funcs);
+8 -2
config-example.toml
··· 7 7 server_name = "lumen" 8 8 9 9 # Allow clients to delete metadata from the database? 10 - allow_deletes = false 10 + allow_deletes = true 11 11 # How many function histories should we return? 0=Disabled. 12 12 get_history_limit = 50 13 13 14 + [users] 15 + # Enable guest accounts? disabling this will only allow IDA 8.1+ to connect. 16 + allow_guests = true 17 + # sets the amount of PBKDF2 iterations for storing passwords. 18 + pbkdf2_iterations = 120000 19 + 14 20 # only required when `use_tls` is set to true. 15 21 [lumina.tls] 16 - # Specify the server's certificate. 22 + # Specify the server's certificate. 17 23 # Clients connecting to the server must match this certificate. 18 24 # If the certificate is password protected, the password can be specified in the `PKCSPASSWD` environment variable. 19 25 server_cert = "path/to/server_crt"
+4 -3
lumen/Cargo.toml
··· 8 8 9 9 [dependencies] 10 10 common = { path = "../common" } 11 - tokio = { version = "1.39", features = ["full"] } 11 + tokio = { version = "1.32", features = ["full"] } 12 12 log = { version = "0.4", features = ["release_max_level_debug"] } 13 13 pretty_env_logger = "0.5" 14 - clap = "4.5" 14 + clap = "4.3" 15 15 tokio-native-tls = "0.3" 16 16 native-tls = { version = "0.2" } 17 17 warp = "0.3" 18 - prometheus-client = "0.22" 18 + prometheus-client = "0.22.0" 19 + rpassword = "7.3.1"
+62 -6
lumen/src/main.rs
··· 4 4 #![warn(unused_crate_dependencies)] 5 5 #![deny(clippy::all)] 6 6 7 - use clap::Arg; 7 + use clap::{builder::BoolishValueParser, Arg, Command}; 8 8 use log::*; 9 9 use server::do_lumen; 10 10 use std::sync::Arc; 11 + use users::UserMgmt; 11 12 12 13 mod server; 14 + mod users; 13 15 mod web; 14 16 15 - use common::config; 16 - 17 17 fn setup_logger() { 18 18 if std::env::var("RUST_LOG").is_err() { 19 19 std::env::set_var("RUST_LOG", concat!(env!("CARGO_PKG_NAME"), "=info")); ··· 23 23 24 24 #[tokio::main] 25 25 async fn main() { 26 - setup_logger(); 27 26 let matches = clap::Command::new("lumen") 28 27 .version(env!("CARGO_PKG_VERSION")) 29 28 .about("lumen is a private Lumina server for IDA.\nVisit https://github.com/naim94a/lumen/ for updates.") ··· 34 33 .default_value("config.toml") 35 34 .help("Configuration file path") 36 35 ) 36 + .subcommand( 37 + Command::new("users") 38 + .about("User Management") 39 + .subcommand( 40 + Command::new("add") 41 + .about("Adds a user") 42 + .arg( 43 + Arg::new("username") 44 + .required(true) 45 + ) 46 + .arg( 47 + Arg::new("email") 48 + .required(true) 49 + ) 50 + .arg( 51 + Arg::new("is_admin") 52 + .required(false) 53 + .default_value("no") 54 + .value_parser(BoolishValueParser::new()) 55 + ) 56 + ) 57 + .subcommand( 58 + Command::new("del") 59 + .about("Deletes a user") 60 + .arg(Arg::new("username")) 61 + ) 62 + ) 63 + .subcommand(Command::new("passwd").about("Set user password").arg(Arg::new("username").required(true))) 37 64 .get_matches(); 38 65 39 66 let config = { 40 - config::load_config( 67 + common::config::load_config( 41 68 std::fs::File::open(matches.get_one::<String>("config").unwrap()) 42 69 .expect("failed to read config"), 43 70 ) 44 71 }; 45 72 let config = Arc::new(config); 46 73 47 - do_lumen(config).await; 74 + match matches.subcommand() { 75 + Some(("users", m)) => { 76 + let users = UserMgmt::new(&config).await; 77 + match m.subcommand() { 78 + None => users.list_users().await, 79 + Some(("add", m)) => { 80 + let username = m.get_one::<String>("username").unwrap(); 81 + let email = m.get_one::<String>("email").unwrap(); 82 + let is_admin = *m.get_one::<bool>("is_admin").unwrap_or(&false); 83 + users.add_user(username, email, is_admin).await; 84 + }, 85 + Some(("del", m)) => { 86 + let username = m.get_one::<String>("username").unwrap(); 87 + users.delete_user(username).await; 88 + }, 89 + _ => unreachable!(), 90 + }; 91 + }, 92 + Some(("passwd", m)) => { 93 + let username = m.get_one::<String>("username").unwrap(); 94 + let password = rpassword::prompt_password("New Password: ").unwrap(); 95 + let users = UserMgmt::new(&config).await; 96 + users.set_password(username, &password).await; 97 + }, 98 + Some(_) => unreachable!(), 99 + None => { 100 + setup_logger(); 101 + do_lumen(config).await 102 + }, 103 + }; 48 104 }
+240 -102
lumen/src/server.rs
··· 1 1 use std::{ 2 - borrow::Cow, collections::HashMap, mem::discriminant, process::exit, sync::Arc, time::Instant, 2 + borrow::Cow, 3 + collections::HashMap, 4 + mem::discriminant, 5 + process::exit, 6 + sync::Arc, 7 + time::{Duration, Instant}, 3 8 }; 4 9 5 10 use common::{ 6 11 async_drop::AsyncDropper, 7 12 config::Config, 8 - db::Database, 13 + db::{self, Database}, 9 14 make_pretty_hex, md, 10 15 metrics::LuminaVersion, 11 - rpc::{self, Error, HelloResult, RpcFail, RpcHello, RpcMessage}, 16 + rpc::{self, Creds, Error, HelloResult, RpcFail, RpcHello, RpcMessage}, 12 17 SharedState, SharedState_, 13 18 }; 14 19 use log::{debug, error, info, trace, warn}; ··· 21 26 22 27 use crate::web; 23 28 29 + struct Session<'a> { 30 + state: &'a SharedState_, 31 + hello_msg: RpcHello<'a>, 32 + _creds: db::schema::Creds<'a>, 33 + creds_id: Option<i32>, 34 + last_cred_check: Instant, 35 + } 36 + impl<'a> Session<'a> { 37 + /// Check if the user changed in the database. 38 + pub async fn is_valid(&mut self) -> bool { 39 + let db = &self.state.db; 40 + if let Some(cred_id) = self.creds_id { 41 + if self.last_cred_check.elapsed() > Duration::from_secs(60 * 5) { 42 + match db.get_user_by_id(cred_id).await { 43 + Ok(v) => { 44 + if !v.is_enabled 45 + || v.is_admin != self._creds.is_admin 46 + || v.passwd_salt != self._creds.passwd_salt 47 + { 48 + // user changed, force them to login again. 49 + return false; 50 + } 51 + self.last_cred_check = Instant::now(); 52 + return true; 53 + }, 54 + Err(err) => { 55 + error!("db error: {err}"); 56 + return false; 57 + }, 58 + } 59 + } 60 + } 61 + true 62 + } 63 + } 64 + 24 65 async fn handle_transaction<'a, S: AsyncRead + AsyncWrite + Unpin>( 25 - state: &SharedState, user: &'a RpcHello<'a>, mut stream: S, 66 + session: &mut Session<'a>, mut stream: S, 26 67 ) -> Result<(), Error> { 68 + let state = session.state; 27 69 let db = &state.db; 28 70 let server_name = state.server_name.as_str(); 29 71 30 72 trace!("waiting for command.."); 31 - let req = 32 - match timeout(state.config.limits.command_timeout, rpc::read_packet(&mut stream)).await { 33 - Ok(res) => match res { 34 - Ok(v) => v, 35 - Err(e) => return Err(e), 36 - }, 37 - Err(_) => { 38 - _ = RpcMessage::Fail(RpcFail { 39 - code: 0, 40 - message: &format!("{server_name} client idle for too long.\n"), 41 - }) 42 - .async_write(&mut stream) 43 - .await; 44 - return Err(Error::Timeout); 45 - }, 46 - }; 73 + let rpkt = async { 74 + let hdr = rpc::read_packet_header(&mut stream).await?; 75 + // we don't want to read a whole request just to find out the user was revoked... 76 + if !session.is_valid().await { 77 + return Err(Error::Timeout); 78 + } 79 + hdr.read(&mut stream).await 80 + }; 81 + let req = match timeout(Duration::from_secs(3600), rpkt).await { 82 + Ok(res) => match res { 83 + Ok(v) => v, 84 + Err(e) => return Err(e), 85 + }, 86 + Err(_) => { 87 + _ = RpcMessage::Fail(RpcFail { 88 + result: 0, 89 + error: &format!("{server_name} client idle for too long.\n"), 90 + }) 91 + .async_write(&mut stream) 92 + .await; 93 + return Err(Error::Timeout); 94 + }, 95 + }; 47 96 trace!("got command!"); 97 + 98 + if !session.is_valid().await { 99 + return Err(Error::Timeout); 100 + } 101 + 48 102 let req = match RpcMessage::deserialize(&req) { 49 103 Ok(v) => v, 50 104 Err(err) => { 51 105 warn!("bad message: \n{}\n", make_pretty_hex(&req)); 52 106 error!("failed to process rpc message: {}", err); 53 107 let resp = rpc::RpcFail { 54 - code: 0, 55 - message: &format!("{server_name}: error: invalid data.\n"), 108 + result: 0, 109 + error: &format!("{server_name}: error: invalid data.\n"), 56 110 }; 57 111 let resp = RpcMessage::Fail(resp); 58 112 resp.async_write(&mut stream).await?; ··· 63 117 match req { 64 118 RpcMessage::PullMetadata(md) => { 65 119 let start = Instant::now(); 66 - let funcs = 67 - match timeout(state.config.limits.pull_md_timeout, db.get_funcs(&md.funcs)).await { 68 - Ok(r) => match r { 69 - Ok(v) => v, 70 - Err(e) => { 71 - error!("pull failed, db: {}", e); 72 - rpc::RpcMessage::Fail(rpc::RpcFail { 73 - code: 0, 74 - message: &format!( 75 - "{server_name}: db error; please try again later..\n" 76 - ), 77 - }) 78 - .async_write(&mut stream) 79 - .await?; 80 - return Ok(()); 81 - }, 82 - }, 83 - Err(_) => { 84 - RpcMessage::Fail(RpcFail { 85 - code: 0, 86 - message: &format!("{server_name}: query took too long to execute.\n"), 120 + let funcs = match timeout(Duration::from_secs(4 * 60), db.get_funcs(&md.pattern_ids)) 121 + .await 122 + { 123 + Ok(r) => match r { 124 + Ok(v) => v, 125 + Err(e) => { 126 + error!("pull failed, db: {}", e); 127 + rpc::RpcMessage::Fail(rpc::RpcFail { 128 + result: 0, 129 + error: &format!("{server_name}: db error; please try again later..\n"), 87 130 }) 88 131 .async_write(&mut stream) 89 132 .await?; 90 - debug!("pull query timeout"); 91 - return Err(Error::Timeout); 133 + return Ok(()); 92 134 }, 93 - }; 135 + }, 136 + Err(_) => { 137 + RpcMessage::Fail(RpcFail { 138 + result: 0, 139 + error: &format!("{server_name}: query took too long to execute.\n"), 140 + }) 141 + .async_write(&mut stream) 142 + .await?; 143 + debug!("pull query timeout"); 144 + return Err(Error::Timeout); 145 + }, 146 + }; 94 147 let pulled_funcs = funcs.iter().filter(|v| v.is_some()).count(); 95 148 state.metrics.pulls.inc_by(pulled_funcs as _); 96 - state.metrics.queried_funcs.inc_by(md.funcs.len() as _); 149 + state.metrics.queried_funcs.inc_by(md.pattern_ids.len() as _); 97 150 debug!( 98 151 "pull {pulled_funcs}/{} funcs ended after {:?}", 99 - md.funcs.len(), 152 + md.pattern_ids.len(), 100 153 start.elapsed() 101 154 ); 102 155 ··· 113 166 .collect(); 114 167 115 168 RpcMessage::PullMetadataResult(rpc::PullMetadataResult { 116 - unk0: Cow::Owned(statuses), 169 + codes: Cow::Owned(statuses), 117 170 funcs: Cow::Owned(found), 118 171 }) 119 172 .async_write(&mut stream) ··· 124 177 let start = Instant::now(); 125 178 let scores: Vec<u32> = mds.funcs.iter().map(md::get_score).collect(); 126 179 127 - let status = match db.push_funcs(user, &mds, &scores).await { 128 - Ok(v) => v.into_iter().map(u32::from).collect::<Vec<u32>>(), 129 - Err(err) => { 130 - log::error!("push failed, db: {}", err); 131 - rpc::RpcMessage::Fail(rpc::RpcFail { 132 - code: 0, 133 - message: &format!("{server_name}: db error; please try again later.\n"), 134 - }) 135 - .async_write(&mut stream) 136 - .await?; 137 - return Ok(()); 138 - }, 139 - }; 180 + let status = 181 + match db.push_funcs(&session.hello_msg, session.creds_id, &mds, &scores).await { 182 + Ok(v) => v.into_iter().map(u32::from).collect::<Vec<u32>>(), 183 + Err(err) => { 184 + log::error!("push failed, db: {}", err); 185 + rpc::RpcMessage::Fail(rpc::RpcFail { 186 + result: 0, 187 + error: &format!("{server_name}: db error; please try again later.\n"), 188 + }) 189 + .async_write(&mut stream) 190 + .await?; 191 + return Ok(()); 192 + }, 193 + }; 140 194 state.metrics.pushes.inc_by(status.len() as _); 141 195 let new_funcs = 142 196 status.iter().fold(0u64, |counter, &v| if v > 0 { counter + 1 } else { counter }); ··· 155 209 let is_delete_allowed = state.config.lumina.allow_deletes.unwrap_or(false); 156 210 if !is_delete_allowed { 157 211 RpcMessage::Fail(rpc::RpcFail { 158 - code: 2, 159 - message: &format!("{server_name}: Delete command is disabled on this server."), 212 + result: 2, 213 + error: &format!("{server_name}: Delete command is disabled on this server."), 160 214 }) 161 215 .async_write(&mut stream) 162 216 .await?; ··· 164 218 if let Err(err) = db.delete_metadata(&req).await { 165 219 error!("delete failed. db: {err}"); 166 220 RpcMessage::Fail(rpc::RpcFail { 167 - code: 3, 168 - message: &format!("{server_name}: db error, please try again later."), 221 + result: 3, 222 + error: &format!("{server_name}: db error, please try again later."), 169 223 }) 170 224 .async_write(&mut stream) 171 225 .await?; 172 226 return Ok(()); 173 227 } 174 228 RpcMessage::DelHistoryResult(rpc::DelHistoryResult { 175 - deleted_mds: req.funcs.len() as u32, 229 + ndeleted: req.calcrel_hashes.len() as u32, 176 230 }) 177 231 .async_write(&mut stream) 178 232 .await?; ··· 183 237 184 238 if limit == 0 { 185 239 RpcMessage::Fail(rpc::RpcFail { 186 - code: 4, 187 - message: &format!( 240 + result: 4, 241 + error: &format!( 188 242 "{server_name}: function histories are disabled on this server." 189 243 ), 190 244 }) ··· 195 249 196 250 let mut statuses = vec![]; 197 251 let mut res = vec![]; 198 - for chksum in req.funcs.iter().map(|v| v.mb_hash) { 252 + for chksum in req.funcs.iter().map(|v| v.data) { 199 253 let history = match db.get_func_histories(chksum, limit).await { 200 254 Ok(v) => v, 201 255 Err(err) => { 202 256 error!("failed to get function histories: {err:?}"); 203 257 RpcMessage::Fail(rpc::RpcFail { 204 - code: 3, 205 - message: &format!("{server_name}: db error, please try again later."), 258 + result: 3, 259 + error: &format!("{server_name}: db error, please try again later."), 206 260 }) 207 261 .async_write(&mut stream) 208 262 .await?; ··· 234 288 RpcMessage::GetFuncHistoriesResult(rpc::GetFuncHistoriesResult { 235 289 status: statuses.into(), 236 290 funcs: Cow::Owned(res), 237 - users: vec![].into(), 238 - dbs: vec![].into(), 291 + authors: vec![].into(), 292 + idb_paths: vec![].into(), 239 293 }) 240 294 .async_write(&mut stream) 241 295 .await?; 242 296 }, 243 297 _ => { 244 298 RpcMessage::Fail(rpc::RpcFail { 245 - code: 0, 246 - message: &format!("{server_name}: invalid data.\n"), 299 + result: 0, 300 + error: &format!("{server_name}: invalid data.\n"), 247 301 }) 248 302 .async_write(&mut stream) 249 303 .await?; ··· 252 306 Ok(()) 253 307 } 254 308 309 + async fn http_reply<W: AsyncRead + AsyncWrite + Unpin>(mut stream: W) { 310 + use tokio::io::AsyncWriteExt; 311 + 312 + const HTTP_REPLY: &str = concat!( 313 + "HTTP/1.1 400 bad request\r\n", 314 + "Refresh: 2; URL=https://github.com/naim94a/lumen\r\n", 315 + "Server: lumen\r\n", 316 + "Connection: close\r\n", 317 + "Content-Type: text/html\r\n", 318 + "", 319 + "\r\n", 320 + "<pre>This is not an HTTP server. <br />Redirecting to <a href=\"https://github.com/naim94a/lumen\">lumen</a> ...</pre>\n", 321 + ); 322 + 323 + let _ = stream.write_all(HTTP_REPLY.as_bytes()).await; 324 + } 325 + 255 326 async fn handle_client<S: AsyncRead + AsyncWrite + Unpin>( 256 327 state: &SharedState, mut stream: S, 257 328 ) -> Result<(), rpc::Error> { 258 329 let server_name = &state.server_name; 259 - let hello = 260 - match timeout(state.config.limits.hello_timeout, rpc::read_packet(&mut stream)).await { 261 - Ok(v) => v?, 262 - Err(_) => { 263 - debug!("didn't get hello in time."); 264 - return Ok(()); 265 - }, 266 - }; 330 + let rpkt = async { 331 + let hdr = rpc::read_packet_header(&mut stream).await?; 332 + if hdr.is_http() { 333 + // looks like someone is using a browser instead of IDA, what a fool. 334 + debug!("ignoring http request..."); 335 + http_reply(&mut stream).await; 336 + return Err(Error::Eof); 337 + } 338 + hdr.read(&mut stream).await 339 + }; 340 + let hello = match timeout(Duration::from_secs(15), rpkt).await { 341 + Ok(v) => v?, 342 + Err(_) => { 343 + debug!("didn't get hello in time."); 344 + return Ok(()); 345 + }, 346 + }; 267 347 268 348 let (hello, creds) = match RpcMessage::deserialize(&hello) { 269 349 Ok(RpcMessage::Hello(v, creds)) => { 270 - debug!("hello protocol={}, login creds: {creds:?}", v.protocol_version); 350 + debug!("hello protocol={}, login creds: {creds:?}", v.client_version); 271 351 (v, creds) 272 352 }, 273 353 _ => { 274 354 // send error 275 355 error!("got bad hello message"); 276 356 277 - let resp = rpc::RpcFail { code: 0, message: &format!("{server_name}: bad sequence.") }; 357 + let resp = rpc::RpcFail { result: 0, error: &format!("{server_name}: bad sequence.") }; 278 358 let resp = rpc::RpcMessage::Fail(resp); 279 359 resp.async_write(&mut stream).await?; 280 360 ··· 284 364 state 285 365 .metrics 286 366 .lumina_version 287 - .get_or_create(&LuminaVersion { protocol_version: hello.protocol_version }) 367 + .get_or_create(&LuminaVersion { protocol_version: hello.client_version }) 288 368 .inc(); 289 369 290 - if let Some(ref creds) = creds { 291 - if creds.username != "guest" { 292 - // Only allow "guest" to connect for now. 293 - rpc::RpcMessage::Fail(rpc::RpcFail { 294 - code: 1, 295 - message: &format!("{server_name}: invalid username or password. Try logging in with `guest` instead."), 296 - }).async_write(&mut stream).await?; 297 - return Ok(()); 370 + let creds = creds.unwrap_or(Creds { username: "guest", password: "guest" }); 371 + 372 + let user = if creds.username != "guest" { 373 + match state.db.get_user_by_username(creds.username).await { 374 + Ok((user_id, db_creds)) if db_creds.verify_password(creds.password) => { 375 + let _ = state.db.update_last_active(user_id).await; 376 + info!("{} logged in successfully.", db_creds.username); 377 + (user_id, db_creds) 378 + }, 379 + Ok(_) => { 380 + rpc::RpcMessage::Fail(rpc::RpcFail { 381 + result: 1, 382 + error: &format!("{server_name}: invalid username or password."), 383 + }) 384 + .async_write(&mut stream) 385 + .await?; 386 + return Ok(()); 387 + }, 388 + Err(err) => { 389 + error!("error while fetching user information: {err}"); 390 + rpc::RpcMessage::Fail(rpc::RpcFail { 391 + result: 1, 392 + error: &format!("{server_name}: internal error, please try again later."), 393 + }) 394 + .async_write(&mut stream) 395 + .await?; 396 + return Ok(()); 397 + }, 298 398 } 399 + } else { 400 + ( 401 + -1, 402 + db::schema::Creds { 403 + username: creds.username.into(), 404 + is_enabled: state.config.users.allow_guests, 405 + ..Default::default() 406 + }, 407 + ) 408 + }; 409 + 410 + if !user.1.is_enabled { 411 + info!("attempt to login to disabled account [{}].", user.1.username); 412 + rpc::RpcMessage::Fail(rpc::RpcFail { 413 + result: 1, 414 + error: &format!("{server_name}: account disabled."), 415 + }) 416 + .async_write(&mut stream) 417 + .await?; 418 + return Ok(()); 299 419 } 300 420 301 - let resp = match hello.protocol_version { 421 + let resp = match hello.client_version { 302 422 0..=4 => rpc::RpcMessage::Ok(()), 303 423 304 424 // starting IDA 8.3 305 425 5.. => { 306 426 let mut features = 0; 307 427 308 - if state.config.lumina.allow_deletes.unwrap_or(false) { 428 + if user.1.is_admin { 429 + features |= 0x01; 430 + } 431 + 432 + if user.0 != -1 && state.config.lumina.allow_deletes.unwrap_or(false) { 309 433 features |= 0x02; 310 434 } 311 435 312 - rpc::RpcMessage::HelloResult(HelloResult { features, ..Default::default() }) 436 + let last_active = user.1.last_active.map_or(0, |v| v.unix_timestamp() as u64); 437 + 438 + rpc::RpcMessage::HelloResult(HelloResult { 439 + username: Cow::Borrowed(&user.1.username), 440 + last_active, 441 + features, 442 + ..Default::default() 443 + }) 313 444 }, 314 445 }; 315 446 resp.async_write(&mut stream).await?; 316 447 448 + let creds_id = if user.0 == -1 { None } else { Some(user.0) }; 449 + let mut session = Session { 450 + state, 451 + hello_msg: hello, 452 + _creds: user.1, 453 + creds_id, 454 + last_cred_check: Instant::now(), 455 + }; 456 + 317 457 loop { 318 - handle_transaction(state, &hello, &mut stream).await?; 458 + handle_transaction(&mut session, &mut stream).await?; 319 459 } 320 460 } 321 461 ··· 392 532 debug!("Connection from {:?}{}: {} active connections", &addr, protocol, count); 393 533 match accpt { 394 534 Some(accpt) => { 395 - match timeout(state.config.limits.tls_handshake_timeout, accpt.accept(client)) 396 - .await 397 - { 535 + match timeout(Duration::from_secs(10), accpt.accept(client)).await { 398 536 Ok(r) => match r { 399 537 Ok(s) => { 400 538 handle_connection(&state, s).await;
+43
lumen/src/users.rs
··· 1 + use std::process::exit; 2 + 3 + use common::{config::Config, db::Database}; 4 + 5 + pub struct UserMgmt { 6 + db: Database, 7 + pbkd2_iters: u32, 8 + } 9 + 10 + impl UserMgmt { 11 + pub async fn new(cfg: &Config) -> Self { 12 + let db = match Database::open(&cfg.database).await { 13 + Ok(v) => v, 14 + Err(err) => { 15 + eprintln!("failed to open database: {}", err); 16 + exit(1); 17 + }, 18 + }; 19 + 20 + Self { db, pbkd2_iters: cfg.users.pbkdf2_iterations.get() } 21 + } 22 + 23 + pub async fn list_users(&self) { 24 + let users = self.db.get_users().await.expect("failed to retreive users from database"); 25 + println!("{users:?}"); 26 + } 27 + 28 + pub async fn set_password(&self, username: &str, password: &str) { 29 + self.db 30 + .set_password(username, password.to_owned(), self.pbkd2_iters) 31 + .await 32 + .expect("failed to set user's password") 33 + } 34 + 35 + pub async fn add_user(&self, username: &str, email: &str, is_admin: bool) { 36 + let id = self.db.add_user(username, email, is_admin).await.expect("failed to add user"); 37 + println!("{username}'s id is {id}.") 38 + } 39 + 40 + pub async fn delete_user(&self, username: &str) { 41 + self.db.delete_user(username).await.expect("failed to delete user"); 42 + } 43 + }