eBay for krypto. https://kryptori.lu1.sh

Rewrote in rust.

+1 -2
.gitignore
··· 1 1 kryptori.db 2 - venv 3 - __pycache__ 2 + target 4 3
+2434
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "addr2line" 7 + version = "0.24.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 + dependencies = [ 11 + "gimli", 12 + ] 13 + 14 + [[package]] 15 + name = "adler2" 16 + version = "2.0.0" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 + 20 + [[package]] 21 + name = "ahash" 22 + version = "0.8.11" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 25 + dependencies = [ 26 + "cfg-if", 27 + "once_cell", 28 + "version_check", 29 + "zerocopy 0.7.35", 30 + ] 31 + 32 + [[package]] 33 + name = "allocator-api2" 34 + version = "0.2.21" 35 + source = "registry+https://github.com/rust-lang/crates.io-index" 36 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 37 + 38 + [[package]] 39 + name = "askama" 40 + version = "0.13.1" 41 + source = "registry+https://github.com/rust-lang/crates.io-index" 42 + checksum = "5d4744ed2eef2645831b441d8f5459689ade2ab27c854488fbab1fbe94fce1a7" 43 + dependencies = [ 44 + "askama_derive", 45 + "itoa", 46 + "percent-encoding", 47 + "serde", 48 + "serde_json", 49 + ] 50 + 51 + [[package]] 52 + name = "askama_derive" 53 + version = "0.13.1" 54 + source = "registry+https://github.com/rust-lang/crates.io-index" 55 + checksum = "d661e0f57be36a5c14c48f78d09011e67e0cb618f269cca9f2fd8d15b68c46ac" 56 + dependencies = [ 57 + "askama_parser", 58 + "basic-toml", 59 + "memchr", 60 + "proc-macro2", 61 + "quote", 62 + "rustc-hash", 63 + "serde", 64 + "serde_derive", 65 + "syn", 66 + ] 67 + 68 + [[package]] 69 + name = "askama_parser" 70 + version = "0.13.0" 71 + source = "registry+https://github.com/rust-lang/crates.io-index" 72 + checksum = "cf315ce6524c857bb129ff794935cf6d42c82a6cff60526fe2a63593de4d0d4f" 73 + dependencies = [ 74 + "memchr", 75 + "serde", 76 + "serde_derive", 77 + "winnow", 78 + ] 79 + 80 + [[package]] 81 + name = "async-trait" 82 + version = "0.1.88" 83 + source = "registry+https://github.com/rust-lang/crates.io-index" 84 + checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 85 + dependencies = [ 86 + "proc-macro2", 87 + "quote", 88 + "syn", 89 + ] 90 + 91 + [[package]] 92 + name = "atoi" 93 + version = "2.0.0" 94 + source = "registry+https://github.com/rust-lang/crates.io-index" 95 + checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 96 + dependencies = [ 97 + "num-traits", 98 + ] 99 + 100 + [[package]] 101 + name = "autocfg" 102 + version = "1.4.0" 103 + source = "registry+https://github.com/rust-lang/crates.io-index" 104 + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 105 + 106 + [[package]] 107 + name = "axum" 108 + version = "0.8.3" 109 + source = "registry+https://github.com/rust-lang/crates.io-index" 110 + checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" 111 + dependencies = [ 112 + "axum-core", 113 + "bytes", 114 + "form_urlencoded", 115 + "futures-util", 116 + "http", 117 + "http-body", 118 + "http-body-util", 119 + "hyper", 120 + "hyper-util", 121 + "itoa", 122 + "matchit", 123 + "memchr", 124 + "mime", 125 + "percent-encoding", 126 + "pin-project-lite", 127 + "rustversion", 128 + "serde", 129 + "serde_json", 130 + "serde_path_to_error", 131 + "serde_urlencoded", 132 + "sync_wrapper", 133 + "tokio", 134 + "tower", 135 + "tower-layer", 136 + "tower-service", 137 + "tracing", 138 + ] 139 + 140 + [[package]] 141 + name = "axum-core" 142 + version = "0.5.2" 143 + source = "registry+https://github.com/rust-lang/crates.io-index" 144 + checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" 145 + dependencies = [ 146 + "bytes", 147 + "futures-core", 148 + "http", 149 + "http-body", 150 + "http-body-util", 151 + "mime", 152 + "pin-project-lite", 153 + "rustversion", 154 + "sync_wrapper", 155 + "tower-layer", 156 + "tower-service", 157 + "tracing", 158 + ] 159 + 160 + [[package]] 161 + name = "backtrace" 162 + version = "0.3.74" 163 + source = "registry+https://github.com/rust-lang/crates.io-index" 164 + checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 165 + dependencies = [ 166 + "addr2line", 167 + "cfg-if", 168 + "libc", 169 + "miniz_oxide", 170 + "object", 171 + "rustc-demangle", 172 + "windows-targets 0.52.6", 173 + ] 174 + 175 + [[package]] 176 + name = "base64" 177 + version = "0.22.1" 178 + source = "registry+https://github.com/rust-lang/crates.io-index" 179 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 180 + 181 + [[package]] 182 + name = "base64ct" 183 + version = "1.7.3" 184 + source = "registry+https://github.com/rust-lang/crates.io-index" 185 + checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" 186 + 187 + [[package]] 188 + name = "basic-toml" 189 + version = "0.1.10" 190 + source = "registry+https://github.com/rust-lang/crates.io-index" 191 + checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" 192 + dependencies = [ 193 + "serde", 194 + ] 195 + 196 + [[package]] 197 + name = "bitflags" 198 + version = "2.9.0" 199 + source = "registry+https://github.com/rust-lang/crates.io-index" 200 + checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 201 + dependencies = [ 202 + "serde", 203 + ] 204 + 205 + [[package]] 206 + name = "block-buffer" 207 + version = "0.10.4" 208 + source = "registry+https://github.com/rust-lang/crates.io-index" 209 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 210 + dependencies = [ 211 + "generic-array", 212 + ] 213 + 214 + [[package]] 215 + name = "byteorder" 216 + version = "1.5.0" 217 + source = "registry+https://github.com/rust-lang/crates.io-index" 218 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 219 + 220 + [[package]] 221 + name = "bytes" 222 + version = "1.10.1" 223 + source = "registry+https://github.com/rust-lang/crates.io-index" 224 + checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 225 + 226 + [[package]] 227 + name = "cc" 228 + version = "1.2.19" 229 + source = "registry+https://github.com/rust-lang/crates.io-index" 230 + checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" 231 + dependencies = [ 232 + "shlex", 233 + ] 234 + 235 + [[package]] 236 + name = "cfg-if" 237 + version = "1.0.0" 238 + source = "registry+https://github.com/rust-lang/crates.io-index" 239 + checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 240 + 241 + [[package]] 242 + name = "chumsky" 243 + version = "0.9.3" 244 + source = "registry+https://github.com/rust-lang/crates.io-index" 245 + checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9" 246 + dependencies = [ 247 + "hashbrown 0.14.5", 248 + "stacker", 249 + ] 250 + 251 + [[package]] 252 + name = "concurrent-queue" 253 + version = "2.5.0" 254 + source = "registry+https://github.com/rust-lang/crates.io-index" 255 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 256 + dependencies = [ 257 + "crossbeam-utils", 258 + ] 259 + 260 + [[package]] 261 + name = "const-oid" 262 + version = "0.9.6" 263 + source = "registry+https://github.com/rust-lang/crates.io-index" 264 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 265 + 266 + [[package]] 267 + name = "core-foundation" 268 + version = "0.9.4" 269 + source = "registry+https://github.com/rust-lang/crates.io-index" 270 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 271 + dependencies = [ 272 + "core-foundation-sys", 273 + "libc", 274 + ] 275 + 276 + [[package]] 277 + name = "core-foundation-sys" 278 + version = "0.8.7" 279 + source = "registry+https://github.com/rust-lang/crates.io-index" 280 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 281 + 282 + [[package]] 283 + name = "cpufeatures" 284 + version = "0.2.17" 285 + source = "registry+https://github.com/rust-lang/crates.io-index" 286 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 287 + dependencies = [ 288 + "libc", 289 + ] 290 + 291 + [[package]] 292 + name = "crc" 293 + version = "3.2.1" 294 + source = "registry+https://github.com/rust-lang/crates.io-index" 295 + checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" 296 + dependencies = [ 297 + "crc-catalog", 298 + ] 299 + 300 + [[package]] 301 + name = "crc-catalog" 302 + version = "2.4.0" 303 + source = "registry+https://github.com/rust-lang/crates.io-index" 304 + checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 305 + 306 + [[package]] 307 + name = "crossbeam-queue" 308 + version = "0.3.12" 309 + source = "registry+https://github.com/rust-lang/crates.io-index" 310 + checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 311 + dependencies = [ 312 + "crossbeam-utils", 313 + ] 314 + 315 + [[package]] 316 + name = "crossbeam-utils" 317 + version = "0.8.21" 318 + source = "registry+https://github.com/rust-lang/crates.io-index" 319 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 320 + 321 + [[package]] 322 + name = "crypto-common" 323 + version = "0.1.6" 324 + source = "registry+https://github.com/rust-lang/crates.io-index" 325 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 326 + dependencies = [ 327 + "generic-array", 328 + "typenum", 329 + ] 330 + 331 + [[package]] 332 + name = "der" 333 + version = "0.7.10" 334 + source = "registry+https://github.com/rust-lang/crates.io-index" 335 + checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 336 + dependencies = [ 337 + "const-oid", 338 + "pem-rfc7468", 339 + "zeroize", 340 + ] 341 + 342 + [[package]] 343 + name = "digest" 344 + version = "0.10.7" 345 + source = "registry+https://github.com/rust-lang/crates.io-index" 346 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 347 + dependencies = [ 348 + "block-buffer", 349 + "const-oid", 350 + "crypto-common", 351 + "subtle", 352 + ] 353 + 354 + [[package]] 355 + name = "displaydoc" 356 + version = "0.2.5" 357 + source = "registry+https://github.com/rust-lang/crates.io-index" 358 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 359 + dependencies = [ 360 + "proc-macro2", 361 + "quote", 362 + "syn", 363 + ] 364 + 365 + [[package]] 366 + name = "dotenvy" 367 + version = "0.15.7" 368 + source = "registry+https://github.com/rust-lang/crates.io-index" 369 + checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 370 + 371 + [[package]] 372 + name = "either" 373 + version = "1.15.0" 374 + source = "registry+https://github.com/rust-lang/crates.io-index" 375 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 376 + dependencies = [ 377 + "serde", 378 + ] 379 + 380 + [[package]] 381 + name = "email-encoding" 382 + version = "0.4.1" 383 + source = "registry+https://github.com/rust-lang/crates.io-index" 384 + checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6" 385 + dependencies = [ 386 + "base64", 387 + "memchr", 388 + ] 389 + 390 + [[package]] 391 + name = "email_address" 392 + version = "0.2.9" 393 + source = "registry+https://github.com/rust-lang/crates.io-index" 394 + checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" 395 + 396 + [[package]] 397 + name = "equivalent" 398 + version = "1.0.2" 399 + source = "registry+https://github.com/rust-lang/crates.io-index" 400 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 401 + 402 + [[package]] 403 + name = "errno" 404 + version = "0.3.11" 405 + source = "registry+https://github.com/rust-lang/crates.io-index" 406 + checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" 407 + dependencies = [ 408 + "libc", 409 + "windows-sys 0.59.0", 410 + ] 411 + 412 + [[package]] 413 + name = "etcetera" 414 + version = "0.8.0" 415 + source = "registry+https://github.com/rust-lang/crates.io-index" 416 + checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 417 + dependencies = [ 418 + "cfg-if", 419 + "home", 420 + "windows-sys 0.48.0", 421 + ] 422 + 423 + [[package]] 424 + name = "event-listener" 425 + version = "5.4.0" 426 + source = "registry+https://github.com/rust-lang/crates.io-index" 427 + checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 428 + dependencies = [ 429 + "concurrent-queue", 430 + "parking", 431 + "pin-project-lite", 432 + ] 433 + 434 + [[package]] 435 + name = "fastrand" 436 + version = "2.3.0" 437 + source = "registry+https://github.com/rust-lang/crates.io-index" 438 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 439 + 440 + [[package]] 441 + name = "flume" 442 + version = "0.11.1" 443 + source = "registry+https://github.com/rust-lang/crates.io-index" 444 + checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 445 + dependencies = [ 446 + "futures-core", 447 + "futures-sink", 448 + "spin", 449 + ] 450 + 451 + [[package]] 452 + name = "fnv" 453 + version = "1.0.7" 454 + source = "registry+https://github.com/rust-lang/crates.io-index" 455 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 456 + 457 + [[package]] 458 + name = "foldhash" 459 + version = "0.1.5" 460 + source = "registry+https://github.com/rust-lang/crates.io-index" 461 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 462 + 463 + [[package]] 464 + name = "foreign-types" 465 + version = "0.3.2" 466 + source = "registry+https://github.com/rust-lang/crates.io-index" 467 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 468 + dependencies = [ 469 + "foreign-types-shared", 470 + ] 471 + 472 + [[package]] 473 + name = "foreign-types-shared" 474 + version = "0.1.1" 475 + source = "registry+https://github.com/rust-lang/crates.io-index" 476 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 477 + 478 + [[package]] 479 + name = "form_urlencoded" 480 + version = "1.2.1" 481 + source = "registry+https://github.com/rust-lang/crates.io-index" 482 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 483 + dependencies = [ 484 + "percent-encoding", 485 + ] 486 + 487 + [[package]] 488 + name = "futures-channel" 489 + version = "0.3.31" 490 + source = "registry+https://github.com/rust-lang/crates.io-index" 491 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 492 + dependencies = [ 493 + "futures-core", 494 + "futures-sink", 495 + ] 496 + 497 + [[package]] 498 + name = "futures-core" 499 + version = "0.3.31" 500 + source = "registry+https://github.com/rust-lang/crates.io-index" 501 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 502 + 503 + [[package]] 504 + name = "futures-executor" 505 + version = "0.3.31" 506 + source = "registry+https://github.com/rust-lang/crates.io-index" 507 + checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 508 + dependencies = [ 509 + "futures-core", 510 + "futures-task", 511 + "futures-util", 512 + ] 513 + 514 + [[package]] 515 + name = "futures-intrusive" 516 + version = "0.5.0" 517 + source = "registry+https://github.com/rust-lang/crates.io-index" 518 + checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 519 + dependencies = [ 520 + "futures-core", 521 + "lock_api", 522 + "parking_lot", 523 + ] 524 + 525 + [[package]] 526 + name = "futures-io" 527 + version = "0.3.31" 528 + source = "registry+https://github.com/rust-lang/crates.io-index" 529 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 530 + 531 + [[package]] 532 + name = "futures-sink" 533 + version = "0.3.31" 534 + source = "registry+https://github.com/rust-lang/crates.io-index" 535 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 536 + 537 + [[package]] 538 + name = "futures-task" 539 + version = "0.3.31" 540 + source = "registry+https://github.com/rust-lang/crates.io-index" 541 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 542 + 543 + [[package]] 544 + name = "futures-util" 545 + version = "0.3.31" 546 + source = "registry+https://github.com/rust-lang/crates.io-index" 547 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 548 + dependencies = [ 549 + "futures-core", 550 + "futures-io", 551 + "futures-sink", 552 + "futures-task", 553 + "memchr", 554 + "pin-project-lite", 555 + "pin-utils", 556 + "slab", 557 + ] 558 + 559 + [[package]] 560 + name = "generic-array" 561 + version = "0.14.7" 562 + source = "registry+https://github.com/rust-lang/crates.io-index" 563 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 564 + dependencies = [ 565 + "typenum", 566 + "version_check", 567 + ] 568 + 569 + [[package]] 570 + name = "getrandom" 571 + version = "0.2.15" 572 + source = "registry+https://github.com/rust-lang/crates.io-index" 573 + checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 574 + dependencies = [ 575 + "cfg-if", 576 + "libc", 577 + "wasi 0.11.0+wasi-snapshot-preview1", 578 + ] 579 + 580 + [[package]] 581 + name = "getrandom" 582 + version = "0.3.2" 583 + source = "registry+https://github.com/rust-lang/crates.io-index" 584 + checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 585 + dependencies = [ 586 + "cfg-if", 587 + "libc", 588 + "r-efi", 589 + "wasi 0.14.2+wasi-0.2.4", 590 + ] 591 + 592 + [[package]] 593 + name = "gimli" 594 + version = "0.31.1" 595 + source = "registry+https://github.com/rust-lang/crates.io-index" 596 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 597 + 598 + [[package]] 599 + name = "hashbrown" 600 + version = "0.14.5" 601 + source = "registry+https://github.com/rust-lang/crates.io-index" 602 + checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 603 + dependencies = [ 604 + "ahash", 605 + "allocator-api2", 606 + ] 607 + 608 + [[package]] 609 + name = "hashbrown" 610 + version = "0.15.2" 611 + source = "registry+https://github.com/rust-lang/crates.io-index" 612 + checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 613 + dependencies = [ 614 + "allocator-api2", 615 + "equivalent", 616 + "foldhash", 617 + ] 618 + 619 + [[package]] 620 + name = "hashlink" 621 + version = "0.10.0" 622 + source = "registry+https://github.com/rust-lang/crates.io-index" 623 + checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 624 + dependencies = [ 625 + "hashbrown 0.15.2", 626 + ] 627 + 628 + [[package]] 629 + name = "heck" 630 + version = "0.5.0" 631 + source = "registry+https://github.com/rust-lang/crates.io-index" 632 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 633 + 634 + [[package]] 635 + name = "hex" 636 + version = "0.4.3" 637 + source = "registry+https://github.com/rust-lang/crates.io-index" 638 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 639 + 640 + [[package]] 641 + name = "hkdf" 642 + version = "0.12.4" 643 + source = "registry+https://github.com/rust-lang/crates.io-index" 644 + checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 645 + dependencies = [ 646 + "hmac", 647 + ] 648 + 649 + [[package]] 650 + name = "hmac" 651 + version = "0.12.1" 652 + source = "registry+https://github.com/rust-lang/crates.io-index" 653 + checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 654 + dependencies = [ 655 + "digest", 656 + ] 657 + 658 + [[package]] 659 + name = "home" 660 + version = "0.5.11" 661 + source = "registry+https://github.com/rust-lang/crates.io-index" 662 + checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 663 + dependencies = [ 664 + "windows-sys 0.59.0", 665 + ] 666 + 667 + [[package]] 668 + name = "hostname" 669 + version = "0.4.1" 670 + source = "registry+https://github.com/rust-lang/crates.io-index" 671 + checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" 672 + dependencies = [ 673 + "cfg-if", 674 + "libc", 675 + "windows-link", 676 + ] 677 + 678 + [[package]] 679 + name = "http" 680 + version = "1.3.1" 681 + source = "registry+https://github.com/rust-lang/crates.io-index" 682 + checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 683 + dependencies = [ 684 + "bytes", 685 + "fnv", 686 + "itoa", 687 + ] 688 + 689 + [[package]] 690 + name = "http-body" 691 + version = "1.0.1" 692 + source = "registry+https://github.com/rust-lang/crates.io-index" 693 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 694 + dependencies = [ 695 + "bytes", 696 + "http", 697 + ] 698 + 699 + [[package]] 700 + name = "http-body-util" 701 + version = "0.1.3" 702 + source = "registry+https://github.com/rust-lang/crates.io-index" 703 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 704 + dependencies = [ 705 + "bytes", 706 + "futures-core", 707 + "http", 708 + "http-body", 709 + "pin-project-lite", 710 + ] 711 + 712 + [[package]] 713 + name = "httparse" 714 + version = "1.10.1" 715 + source = "registry+https://github.com/rust-lang/crates.io-index" 716 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 717 + 718 + [[package]] 719 + name = "httpdate" 720 + version = "1.0.3" 721 + source = "registry+https://github.com/rust-lang/crates.io-index" 722 + checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 723 + 724 + [[package]] 725 + name = "hyper" 726 + version = "1.6.0" 727 + source = "registry+https://github.com/rust-lang/crates.io-index" 728 + checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 729 + dependencies = [ 730 + "bytes", 731 + "futures-channel", 732 + "futures-util", 733 + "http", 734 + "http-body", 735 + "httparse", 736 + "httpdate", 737 + "itoa", 738 + "pin-project-lite", 739 + "smallvec", 740 + "tokio", 741 + ] 742 + 743 + [[package]] 744 + name = "hyper-util" 745 + version = "0.1.11" 746 + source = "registry+https://github.com/rust-lang/crates.io-index" 747 + checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 748 + dependencies = [ 749 + "bytes", 750 + "futures-util", 751 + "http", 752 + "http-body", 753 + "hyper", 754 + "pin-project-lite", 755 + "tokio", 756 + "tower-service", 757 + ] 758 + 759 + [[package]] 760 + name = "icu_collections" 761 + version = "1.5.0" 762 + source = "registry+https://github.com/rust-lang/crates.io-index" 763 + checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 764 + dependencies = [ 765 + "displaydoc", 766 + "yoke", 767 + "zerofrom", 768 + "zerovec", 769 + ] 770 + 771 + [[package]] 772 + name = "icu_locid" 773 + version = "1.5.0" 774 + source = "registry+https://github.com/rust-lang/crates.io-index" 775 + checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 776 + dependencies = [ 777 + "displaydoc", 778 + "litemap", 779 + "tinystr", 780 + "writeable", 781 + "zerovec", 782 + ] 783 + 784 + [[package]] 785 + name = "icu_locid_transform" 786 + version = "1.5.0" 787 + source = "registry+https://github.com/rust-lang/crates.io-index" 788 + checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 789 + dependencies = [ 790 + "displaydoc", 791 + "icu_locid", 792 + "icu_locid_transform_data", 793 + "icu_provider", 794 + "tinystr", 795 + "zerovec", 796 + ] 797 + 798 + [[package]] 799 + name = "icu_locid_transform_data" 800 + version = "1.5.1" 801 + source = "registry+https://github.com/rust-lang/crates.io-index" 802 + checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" 803 + 804 + [[package]] 805 + name = "icu_normalizer" 806 + version = "1.5.0" 807 + source = "registry+https://github.com/rust-lang/crates.io-index" 808 + checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 809 + dependencies = [ 810 + "displaydoc", 811 + "icu_collections", 812 + "icu_normalizer_data", 813 + "icu_properties", 814 + "icu_provider", 815 + "smallvec", 816 + "utf16_iter", 817 + "utf8_iter", 818 + "write16", 819 + "zerovec", 820 + ] 821 + 822 + [[package]] 823 + name = "icu_normalizer_data" 824 + version = "1.5.1" 825 + source = "registry+https://github.com/rust-lang/crates.io-index" 826 + checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" 827 + 828 + [[package]] 829 + name = "icu_properties" 830 + version = "1.5.1" 831 + source = "registry+https://github.com/rust-lang/crates.io-index" 832 + checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 833 + dependencies = [ 834 + "displaydoc", 835 + "icu_collections", 836 + "icu_locid_transform", 837 + "icu_properties_data", 838 + "icu_provider", 839 + "tinystr", 840 + "zerovec", 841 + ] 842 + 843 + [[package]] 844 + name = "icu_properties_data" 845 + version = "1.5.1" 846 + source = "registry+https://github.com/rust-lang/crates.io-index" 847 + checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" 848 + 849 + [[package]] 850 + name = "icu_provider" 851 + version = "1.5.0" 852 + source = "registry+https://github.com/rust-lang/crates.io-index" 853 + checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 854 + dependencies = [ 855 + "displaydoc", 856 + "icu_locid", 857 + "icu_provider_macros", 858 + "stable_deref_trait", 859 + "tinystr", 860 + "writeable", 861 + "yoke", 862 + "zerofrom", 863 + "zerovec", 864 + ] 865 + 866 + [[package]] 867 + name = "icu_provider_macros" 868 + version = "1.5.0" 869 + source = "registry+https://github.com/rust-lang/crates.io-index" 870 + checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 871 + dependencies = [ 872 + "proc-macro2", 873 + "quote", 874 + "syn", 875 + ] 876 + 877 + [[package]] 878 + name = "idna" 879 + version = "1.0.3" 880 + source = "registry+https://github.com/rust-lang/crates.io-index" 881 + checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 882 + dependencies = [ 883 + "idna_adapter", 884 + "smallvec", 885 + "utf8_iter", 886 + ] 887 + 888 + [[package]] 889 + name = "idna_adapter" 890 + version = "1.2.0" 891 + source = "registry+https://github.com/rust-lang/crates.io-index" 892 + checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 893 + dependencies = [ 894 + "icu_normalizer", 895 + "icu_properties", 896 + ] 897 + 898 + [[package]] 899 + name = "indexmap" 900 + version = "2.9.0" 901 + source = "registry+https://github.com/rust-lang/crates.io-index" 902 + checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 903 + dependencies = [ 904 + "equivalent", 905 + "hashbrown 0.15.2", 906 + ] 907 + 908 + [[package]] 909 + name = "itoa" 910 + version = "1.0.15" 911 + source = "registry+https://github.com/rust-lang/crates.io-index" 912 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 913 + 914 + [[package]] 915 + name = "kryptori" 916 + version = "0.1.0" 917 + dependencies = [ 918 + "askama", 919 + "axum", 920 + "dotenvy", 921 + "lettre", 922 + "serde", 923 + "sqlx", 924 + "tokio", 925 + "uuid", 926 + ] 927 + 928 + [[package]] 929 + name = "lazy_static" 930 + version = "1.5.0" 931 + source = "registry+https://github.com/rust-lang/crates.io-index" 932 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 933 + dependencies = [ 934 + "spin", 935 + ] 936 + 937 + [[package]] 938 + name = "lettre" 939 + version = "0.11.15" 940 + source = "registry+https://github.com/rust-lang/crates.io-index" 941 + checksum = "759bc2b8eabb6a30b235d6f716f7f36479f4b38cbe65b8747aefee51f89e8437" 942 + dependencies = [ 943 + "async-trait", 944 + "base64", 945 + "chumsky", 946 + "email-encoding", 947 + "email_address", 948 + "fastrand", 949 + "futures-io", 950 + "futures-util", 951 + "hostname", 952 + "httpdate", 953 + "idna", 954 + "mime", 955 + "native-tls", 956 + "nom", 957 + "percent-encoding", 958 + "quoted_printable", 959 + "socket2", 960 + "tokio", 961 + "tokio-native-tls", 962 + "url", 963 + ] 964 + 965 + [[package]] 966 + name = "libc" 967 + version = "0.2.172" 968 + source = "registry+https://github.com/rust-lang/crates.io-index" 969 + checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 970 + 971 + [[package]] 972 + name = "libm" 973 + version = "0.2.11" 974 + source = "registry+https://github.com/rust-lang/crates.io-index" 975 + checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 976 + 977 + [[package]] 978 + name = "libsqlite3-sys" 979 + version = "0.30.1" 980 + source = "registry+https://github.com/rust-lang/crates.io-index" 981 + checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 982 + dependencies = [ 983 + "cc", 984 + "pkg-config", 985 + "vcpkg", 986 + ] 987 + 988 + [[package]] 989 + name = "linux-raw-sys" 990 + version = "0.9.4" 991 + source = "registry+https://github.com/rust-lang/crates.io-index" 992 + checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 993 + 994 + [[package]] 995 + name = "litemap" 996 + version = "0.7.5" 997 + source = "registry+https://github.com/rust-lang/crates.io-index" 998 + checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 999 + 1000 + [[package]] 1001 + name = "lock_api" 1002 + version = "0.4.12" 1003 + source = "registry+https://github.com/rust-lang/crates.io-index" 1004 + checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1005 + dependencies = [ 1006 + "autocfg", 1007 + "scopeguard", 1008 + ] 1009 + 1010 + [[package]] 1011 + name = "log" 1012 + version = "0.4.27" 1013 + source = "registry+https://github.com/rust-lang/crates.io-index" 1014 + checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1015 + 1016 + [[package]] 1017 + name = "matchit" 1018 + version = "0.8.4" 1019 + source = "registry+https://github.com/rust-lang/crates.io-index" 1020 + checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 1021 + 1022 + [[package]] 1023 + name = "md-5" 1024 + version = "0.10.6" 1025 + source = "registry+https://github.com/rust-lang/crates.io-index" 1026 + checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1027 + dependencies = [ 1028 + "cfg-if", 1029 + "digest", 1030 + ] 1031 + 1032 + [[package]] 1033 + name = "memchr" 1034 + version = "2.7.4" 1035 + source = "registry+https://github.com/rust-lang/crates.io-index" 1036 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1037 + 1038 + [[package]] 1039 + name = "mime" 1040 + version = "0.3.17" 1041 + source = "registry+https://github.com/rust-lang/crates.io-index" 1042 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1043 + 1044 + [[package]] 1045 + name = "miniz_oxide" 1046 + version = "0.8.8" 1047 + source = "registry+https://github.com/rust-lang/crates.io-index" 1048 + checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 1049 + dependencies = [ 1050 + "adler2", 1051 + ] 1052 + 1053 + [[package]] 1054 + name = "mio" 1055 + version = "1.0.3" 1056 + source = "registry+https://github.com/rust-lang/crates.io-index" 1057 + checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1058 + dependencies = [ 1059 + "libc", 1060 + "wasi 0.11.0+wasi-snapshot-preview1", 1061 + "windows-sys 0.52.0", 1062 + ] 1063 + 1064 + [[package]] 1065 + name = "native-tls" 1066 + version = "0.2.14" 1067 + source = "registry+https://github.com/rust-lang/crates.io-index" 1068 + checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 1069 + dependencies = [ 1070 + "libc", 1071 + "log", 1072 + "openssl", 1073 + "openssl-probe", 1074 + "openssl-sys", 1075 + "schannel", 1076 + "security-framework", 1077 + "security-framework-sys", 1078 + "tempfile", 1079 + ] 1080 + 1081 + [[package]] 1082 + name = "nom" 1083 + version = "8.0.0" 1084 + source = "registry+https://github.com/rust-lang/crates.io-index" 1085 + checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" 1086 + dependencies = [ 1087 + "memchr", 1088 + ] 1089 + 1090 + [[package]] 1091 + name = "num-bigint-dig" 1092 + version = "0.8.4" 1093 + source = "registry+https://github.com/rust-lang/crates.io-index" 1094 + checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1095 + dependencies = [ 1096 + "byteorder", 1097 + "lazy_static", 1098 + "libm", 1099 + "num-integer", 1100 + "num-iter", 1101 + "num-traits", 1102 + "rand", 1103 + "smallvec", 1104 + "zeroize", 1105 + ] 1106 + 1107 + [[package]] 1108 + name = "num-integer" 1109 + version = "0.1.46" 1110 + source = "registry+https://github.com/rust-lang/crates.io-index" 1111 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1112 + dependencies = [ 1113 + "num-traits", 1114 + ] 1115 + 1116 + [[package]] 1117 + name = "num-iter" 1118 + version = "0.1.45" 1119 + source = "registry+https://github.com/rust-lang/crates.io-index" 1120 + checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1121 + dependencies = [ 1122 + "autocfg", 1123 + "num-integer", 1124 + "num-traits", 1125 + ] 1126 + 1127 + [[package]] 1128 + name = "num-traits" 1129 + version = "0.2.19" 1130 + source = "registry+https://github.com/rust-lang/crates.io-index" 1131 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1132 + dependencies = [ 1133 + "autocfg", 1134 + "libm", 1135 + ] 1136 + 1137 + [[package]] 1138 + name = "object" 1139 + version = "0.36.7" 1140 + source = "registry+https://github.com/rust-lang/crates.io-index" 1141 + checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1142 + dependencies = [ 1143 + "memchr", 1144 + ] 1145 + 1146 + [[package]] 1147 + name = "once_cell" 1148 + version = "1.21.3" 1149 + source = "registry+https://github.com/rust-lang/crates.io-index" 1150 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1151 + 1152 + [[package]] 1153 + name = "openssl" 1154 + version = "0.10.72" 1155 + source = "registry+https://github.com/rust-lang/crates.io-index" 1156 + checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" 1157 + dependencies = [ 1158 + "bitflags", 1159 + "cfg-if", 1160 + "foreign-types", 1161 + "libc", 1162 + "once_cell", 1163 + "openssl-macros", 1164 + "openssl-sys", 1165 + ] 1166 + 1167 + [[package]] 1168 + name = "openssl-macros" 1169 + version = "0.1.1" 1170 + source = "registry+https://github.com/rust-lang/crates.io-index" 1171 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1172 + dependencies = [ 1173 + "proc-macro2", 1174 + "quote", 1175 + "syn", 1176 + ] 1177 + 1178 + [[package]] 1179 + name = "openssl-probe" 1180 + version = "0.1.6" 1181 + source = "registry+https://github.com/rust-lang/crates.io-index" 1182 + checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1183 + 1184 + [[package]] 1185 + name = "openssl-sys" 1186 + version = "0.9.107" 1187 + source = "registry+https://github.com/rust-lang/crates.io-index" 1188 + checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" 1189 + dependencies = [ 1190 + "cc", 1191 + "libc", 1192 + "pkg-config", 1193 + "vcpkg", 1194 + ] 1195 + 1196 + [[package]] 1197 + name = "parking" 1198 + version = "2.2.1" 1199 + source = "registry+https://github.com/rust-lang/crates.io-index" 1200 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 1201 + 1202 + [[package]] 1203 + name = "parking_lot" 1204 + version = "0.12.3" 1205 + source = "registry+https://github.com/rust-lang/crates.io-index" 1206 + checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1207 + dependencies = [ 1208 + "lock_api", 1209 + "parking_lot_core", 1210 + ] 1211 + 1212 + [[package]] 1213 + name = "parking_lot_core" 1214 + version = "0.9.10" 1215 + source = "registry+https://github.com/rust-lang/crates.io-index" 1216 + checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1217 + dependencies = [ 1218 + "cfg-if", 1219 + "libc", 1220 + "redox_syscall", 1221 + "smallvec", 1222 + "windows-targets 0.52.6", 1223 + ] 1224 + 1225 + [[package]] 1226 + name = "pem-rfc7468" 1227 + version = "0.7.0" 1228 + source = "registry+https://github.com/rust-lang/crates.io-index" 1229 + checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1230 + dependencies = [ 1231 + "base64ct", 1232 + ] 1233 + 1234 + [[package]] 1235 + name = "percent-encoding" 1236 + version = "2.3.1" 1237 + source = "registry+https://github.com/rust-lang/crates.io-index" 1238 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1239 + 1240 + [[package]] 1241 + name = "pin-project-lite" 1242 + version = "0.2.16" 1243 + source = "registry+https://github.com/rust-lang/crates.io-index" 1244 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1245 + 1246 + [[package]] 1247 + name = "pin-utils" 1248 + version = "0.1.0" 1249 + source = "registry+https://github.com/rust-lang/crates.io-index" 1250 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1251 + 1252 + [[package]] 1253 + name = "pkcs1" 1254 + version = "0.7.5" 1255 + source = "registry+https://github.com/rust-lang/crates.io-index" 1256 + checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1257 + dependencies = [ 1258 + "der", 1259 + "pkcs8", 1260 + "spki", 1261 + ] 1262 + 1263 + [[package]] 1264 + name = "pkcs8" 1265 + version = "0.10.2" 1266 + source = "registry+https://github.com/rust-lang/crates.io-index" 1267 + checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1268 + dependencies = [ 1269 + "der", 1270 + "spki", 1271 + ] 1272 + 1273 + [[package]] 1274 + name = "pkg-config" 1275 + version = "0.3.32" 1276 + source = "registry+https://github.com/rust-lang/crates.io-index" 1277 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1278 + 1279 + [[package]] 1280 + name = "ppv-lite86" 1281 + version = "0.2.21" 1282 + source = "registry+https://github.com/rust-lang/crates.io-index" 1283 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1284 + dependencies = [ 1285 + "zerocopy 0.8.24", 1286 + ] 1287 + 1288 + [[package]] 1289 + name = "proc-macro2" 1290 + version = "1.0.95" 1291 + source = "registry+https://github.com/rust-lang/crates.io-index" 1292 + checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1293 + dependencies = [ 1294 + "unicode-ident", 1295 + ] 1296 + 1297 + [[package]] 1298 + name = "psm" 1299 + version = "0.1.25" 1300 + source = "registry+https://github.com/rust-lang/crates.io-index" 1301 + checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88" 1302 + dependencies = [ 1303 + "cc", 1304 + ] 1305 + 1306 + [[package]] 1307 + name = "quote" 1308 + version = "1.0.40" 1309 + source = "registry+https://github.com/rust-lang/crates.io-index" 1310 + checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1311 + dependencies = [ 1312 + "proc-macro2", 1313 + ] 1314 + 1315 + [[package]] 1316 + name = "quoted_printable" 1317 + version = "0.5.1" 1318 + source = "registry+https://github.com/rust-lang/crates.io-index" 1319 + checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73" 1320 + 1321 + [[package]] 1322 + name = "r-efi" 1323 + version = "5.2.0" 1324 + source = "registry+https://github.com/rust-lang/crates.io-index" 1325 + checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1326 + 1327 + [[package]] 1328 + name = "rand" 1329 + version = "0.8.5" 1330 + source = "registry+https://github.com/rust-lang/crates.io-index" 1331 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1332 + dependencies = [ 1333 + "libc", 1334 + "rand_chacha", 1335 + "rand_core", 1336 + ] 1337 + 1338 + [[package]] 1339 + name = "rand_chacha" 1340 + version = "0.3.1" 1341 + source = "registry+https://github.com/rust-lang/crates.io-index" 1342 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1343 + dependencies = [ 1344 + "ppv-lite86", 1345 + "rand_core", 1346 + ] 1347 + 1348 + [[package]] 1349 + name = "rand_core" 1350 + version = "0.6.4" 1351 + source = "registry+https://github.com/rust-lang/crates.io-index" 1352 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1353 + dependencies = [ 1354 + "getrandom 0.2.15", 1355 + ] 1356 + 1357 + [[package]] 1358 + name = "redox_syscall" 1359 + version = "0.5.11" 1360 + source = "registry+https://github.com/rust-lang/crates.io-index" 1361 + checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" 1362 + dependencies = [ 1363 + "bitflags", 1364 + ] 1365 + 1366 + [[package]] 1367 + name = "rsa" 1368 + version = "0.9.8" 1369 + source = "registry+https://github.com/rust-lang/crates.io-index" 1370 + checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" 1371 + dependencies = [ 1372 + "const-oid", 1373 + "digest", 1374 + "num-bigint-dig", 1375 + "num-integer", 1376 + "num-traits", 1377 + "pkcs1", 1378 + "pkcs8", 1379 + "rand_core", 1380 + "signature", 1381 + "spki", 1382 + "subtle", 1383 + "zeroize", 1384 + ] 1385 + 1386 + [[package]] 1387 + name = "rustc-demangle" 1388 + version = "0.1.24" 1389 + source = "registry+https://github.com/rust-lang/crates.io-index" 1390 + checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1391 + 1392 + [[package]] 1393 + name = "rustc-hash" 1394 + version = "2.1.1" 1395 + source = "registry+https://github.com/rust-lang/crates.io-index" 1396 + checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1397 + 1398 + [[package]] 1399 + name = "rustix" 1400 + version = "1.0.5" 1401 + source = "registry+https://github.com/rust-lang/crates.io-index" 1402 + checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" 1403 + dependencies = [ 1404 + "bitflags", 1405 + "errno", 1406 + "libc", 1407 + "linux-raw-sys", 1408 + "windows-sys 0.59.0", 1409 + ] 1410 + 1411 + [[package]] 1412 + name = "rustversion" 1413 + version = "1.0.20" 1414 + source = "registry+https://github.com/rust-lang/crates.io-index" 1415 + checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 1416 + 1417 + [[package]] 1418 + name = "ryu" 1419 + version = "1.0.20" 1420 + source = "registry+https://github.com/rust-lang/crates.io-index" 1421 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1422 + 1423 + [[package]] 1424 + name = "schannel" 1425 + version = "0.1.27" 1426 + source = "registry+https://github.com/rust-lang/crates.io-index" 1427 + checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1428 + dependencies = [ 1429 + "windows-sys 0.59.0", 1430 + ] 1431 + 1432 + [[package]] 1433 + name = "scopeguard" 1434 + version = "1.2.0" 1435 + source = "registry+https://github.com/rust-lang/crates.io-index" 1436 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1437 + 1438 + [[package]] 1439 + name = "security-framework" 1440 + version = "2.11.1" 1441 + source = "registry+https://github.com/rust-lang/crates.io-index" 1442 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1443 + dependencies = [ 1444 + "bitflags", 1445 + "core-foundation", 1446 + "core-foundation-sys", 1447 + "libc", 1448 + "security-framework-sys", 1449 + ] 1450 + 1451 + [[package]] 1452 + name = "security-framework-sys" 1453 + version = "2.14.0" 1454 + source = "registry+https://github.com/rust-lang/crates.io-index" 1455 + checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1456 + dependencies = [ 1457 + "core-foundation-sys", 1458 + "libc", 1459 + ] 1460 + 1461 + [[package]] 1462 + name = "serde" 1463 + version = "1.0.219" 1464 + source = "registry+https://github.com/rust-lang/crates.io-index" 1465 + checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1466 + dependencies = [ 1467 + "serde_derive", 1468 + ] 1469 + 1470 + [[package]] 1471 + name = "serde_derive" 1472 + version = "1.0.219" 1473 + source = "registry+https://github.com/rust-lang/crates.io-index" 1474 + checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1475 + dependencies = [ 1476 + "proc-macro2", 1477 + "quote", 1478 + "syn", 1479 + ] 1480 + 1481 + [[package]] 1482 + name = "serde_json" 1483 + version = "1.0.140" 1484 + source = "registry+https://github.com/rust-lang/crates.io-index" 1485 + checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1486 + dependencies = [ 1487 + "itoa", 1488 + "memchr", 1489 + "ryu", 1490 + "serde", 1491 + ] 1492 + 1493 + [[package]] 1494 + name = "serde_path_to_error" 1495 + version = "0.1.17" 1496 + source = "registry+https://github.com/rust-lang/crates.io-index" 1497 + checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" 1498 + dependencies = [ 1499 + "itoa", 1500 + "serde", 1501 + ] 1502 + 1503 + [[package]] 1504 + name = "serde_urlencoded" 1505 + version = "0.7.1" 1506 + source = "registry+https://github.com/rust-lang/crates.io-index" 1507 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1508 + dependencies = [ 1509 + "form_urlencoded", 1510 + "itoa", 1511 + "ryu", 1512 + "serde", 1513 + ] 1514 + 1515 + [[package]] 1516 + name = "sha1" 1517 + version = "0.10.6" 1518 + source = "registry+https://github.com/rust-lang/crates.io-index" 1519 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1520 + dependencies = [ 1521 + "cfg-if", 1522 + "cpufeatures", 1523 + "digest", 1524 + ] 1525 + 1526 + [[package]] 1527 + name = "sha2" 1528 + version = "0.10.8" 1529 + source = "registry+https://github.com/rust-lang/crates.io-index" 1530 + checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1531 + dependencies = [ 1532 + "cfg-if", 1533 + "cpufeatures", 1534 + "digest", 1535 + ] 1536 + 1537 + [[package]] 1538 + name = "shlex" 1539 + version = "1.3.0" 1540 + source = "registry+https://github.com/rust-lang/crates.io-index" 1541 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1542 + 1543 + [[package]] 1544 + name = "signal-hook-registry" 1545 + version = "1.4.4" 1546 + source = "registry+https://github.com/rust-lang/crates.io-index" 1547 + checksum = "a1ee1aca2bc74ef9589efa7ccaa0f3752751399940356209b3fd80c078149b5e" 1548 + dependencies = [ 1549 + "libc", 1550 + ] 1551 + 1552 + [[package]] 1553 + name = "signature" 1554 + version = "2.2.0" 1555 + source = "registry+https://github.com/rust-lang/crates.io-index" 1556 + checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1557 + dependencies = [ 1558 + "digest", 1559 + "rand_core", 1560 + ] 1561 + 1562 + [[package]] 1563 + name = "slab" 1564 + version = "0.4.9" 1565 + source = "registry+https://github.com/rust-lang/crates.io-index" 1566 + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1567 + dependencies = [ 1568 + "autocfg", 1569 + ] 1570 + 1571 + [[package]] 1572 + name = "smallvec" 1573 + version = "1.15.0" 1574 + source = "registry+https://github.com/rust-lang/crates.io-index" 1575 + checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 1576 + dependencies = [ 1577 + "serde", 1578 + ] 1579 + 1580 + [[package]] 1581 + name = "socket2" 1582 + version = "0.5.9" 1583 + source = "registry+https://github.com/rust-lang/crates.io-index" 1584 + checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 1585 + dependencies = [ 1586 + "libc", 1587 + "windows-sys 0.52.0", 1588 + ] 1589 + 1590 + [[package]] 1591 + name = "spin" 1592 + version = "0.9.8" 1593 + source = "registry+https://github.com/rust-lang/crates.io-index" 1594 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1595 + dependencies = [ 1596 + "lock_api", 1597 + ] 1598 + 1599 + [[package]] 1600 + name = "spki" 1601 + version = "0.7.3" 1602 + source = "registry+https://github.com/rust-lang/crates.io-index" 1603 + checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1604 + dependencies = [ 1605 + "base64ct", 1606 + "der", 1607 + ] 1608 + 1609 + [[package]] 1610 + name = "sqlx" 1611 + version = "0.8.5" 1612 + source = "registry+https://github.com/rust-lang/crates.io-index" 1613 + checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" 1614 + dependencies = [ 1615 + "sqlx-core", 1616 + "sqlx-macros", 1617 + "sqlx-mysql", 1618 + "sqlx-postgres", 1619 + "sqlx-sqlite", 1620 + ] 1621 + 1622 + [[package]] 1623 + name = "sqlx-core" 1624 + version = "0.8.5" 1625 + source = "registry+https://github.com/rust-lang/crates.io-index" 1626 + checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" 1627 + dependencies = [ 1628 + "base64", 1629 + "bytes", 1630 + "crc", 1631 + "crossbeam-queue", 1632 + "either", 1633 + "event-listener", 1634 + "futures-core", 1635 + "futures-intrusive", 1636 + "futures-io", 1637 + "futures-util", 1638 + "hashbrown 0.15.2", 1639 + "hashlink", 1640 + "indexmap", 1641 + "log", 1642 + "memchr", 1643 + "native-tls", 1644 + "once_cell", 1645 + "percent-encoding", 1646 + "serde", 1647 + "serde_json", 1648 + "sha2", 1649 + "smallvec", 1650 + "thiserror", 1651 + "tokio", 1652 + "tokio-stream", 1653 + "tracing", 1654 + "url", 1655 + ] 1656 + 1657 + [[package]] 1658 + name = "sqlx-macros" 1659 + version = "0.8.5" 1660 + source = "registry+https://github.com/rust-lang/crates.io-index" 1661 + checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" 1662 + dependencies = [ 1663 + "proc-macro2", 1664 + "quote", 1665 + "sqlx-core", 1666 + "sqlx-macros-core", 1667 + "syn", 1668 + ] 1669 + 1670 + [[package]] 1671 + name = "sqlx-macros-core" 1672 + version = "0.8.5" 1673 + source = "registry+https://github.com/rust-lang/crates.io-index" 1674 + checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" 1675 + dependencies = [ 1676 + "dotenvy", 1677 + "either", 1678 + "heck", 1679 + "hex", 1680 + "once_cell", 1681 + "proc-macro2", 1682 + "quote", 1683 + "serde", 1684 + "serde_json", 1685 + "sha2", 1686 + "sqlx-core", 1687 + "sqlx-mysql", 1688 + "sqlx-postgres", 1689 + "sqlx-sqlite", 1690 + "syn", 1691 + "tempfile", 1692 + "tokio", 1693 + "url", 1694 + ] 1695 + 1696 + [[package]] 1697 + name = "sqlx-mysql" 1698 + version = "0.8.5" 1699 + source = "registry+https://github.com/rust-lang/crates.io-index" 1700 + checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7" 1701 + dependencies = [ 1702 + "atoi", 1703 + "base64", 1704 + "bitflags", 1705 + "byteorder", 1706 + "bytes", 1707 + "crc", 1708 + "digest", 1709 + "dotenvy", 1710 + "either", 1711 + "futures-channel", 1712 + "futures-core", 1713 + "futures-io", 1714 + "futures-util", 1715 + "generic-array", 1716 + "hex", 1717 + "hkdf", 1718 + "hmac", 1719 + "itoa", 1720 + "log", 1721 + "md-5", 1722 + "memchr", 1723 + "once_cell", 1724 + "percent-encoding", 1725 + "rand", 1726 + "rsa", 1727 + "serde", 1728 + "sha1", 1729 + "sha2", 1730 + "smallvec", 1731 + "sqlx-core", 1732 + "stringprep", 1733 + "thiserror", 1734 + "tracing", 1735 + "whoami", 1736 + ] 1737 + 1738 + [[package]] 1739 + name = "sqlx-postgres" 1740 + version = "0.8.5" 1741 + source = "registry+https://github.com/rust-lang/crates.io-index" 1742 + checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" 1743 + dependencies = [ 1744 + "atoi", 1745 + "base64", 1746 + "bitflags", 1747 + "byteorder", 1748 + "crc", 1749 + "dotenvy", 1750 + "etcetera", 1751 + "futures-channel", 1752 + "futures-core", 1753 + "futures-util", 1754 + "hex", 1755 + "hkdf", 1756 + "hmac", 1757 + "home", 1758 + "itoa", 1759 + "log", 1760 + "md-5", 1761 + "memchr", 1762 + "once_cell", 1763 + "rand", 1764 + "serde", 1765 + "serde_json", 1766 + "sha2", 1767 + "smallvec", 1768 + "sqlx-core", 1769 + "stringprep", 1770 + "thiserror", 1771 + "tracing", 1772 + "whoami", 1773 + ] 1774 + 1775 + [[package]] 1776 + name = "sqlx-sqlite" 1777 + version = "0.8.5" 1778 + source = "registry+https://github.com/rust-lang/crates.io-index" 1779 + checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" 1780 + dependencies = [ 1781 + "atoi", 1782 + "flume", 1783 + "futures-channel", 1784 + "futures-core", 1785 + "futures-executor", 1786 + "futures-intrusive", 1787 + "futures-util", 1788 + "libsqlite3-sys", 1789 + "log", 1790 + "percent-encoding", 1791 + "serde", 1792 + "serde_urlencoded", 1793 + "sqlx-core", 1794 + "thiserror", 1795 + "tracing", 1796 + "url", 1797 + ] 1798 + 1799 + [[package]] 1800 + name = "stable_deref_trait" 1801 + version = "1.2.0" 1802 + source = "registry+https://github.com/rust-lang/crates.io-index" 1803 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1804 + 1805 + [[package]] 1806 + name = "stacker" 1807 + version = "0.1.20" 1808 + source = "registry+https://github.com/rust-lang/crates.io-index" 1809 + checksum = "601f9201feb9b09c00266478bf459952b9ef9a6b94edb2f21eba14ab681a60a9" 1810 + dependencies = [ 1811 + "cc", 1812 + "cfg-if", 1813 + "libc", 1814 + "psm", 1815 + "windows-sys 0.59.0", 1816 + ] 1817 + 1818 + [[package]] 1819 + name = "stringprep" 1820 + version = "0.1.5" 1821 + source = "registry+https://github.com/rust-lang/crates.io-index" 1822 + checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 1823 + dependencies = [ 1824 + "unicode-bidi", 1825 + "unicode-normalization", 1826 + "unicode-properties", 1827 + ] 1828 + 1829 + [[package]] 1830 + name = "subtle" 1831 + version = "2.6.1" 1832 + source = "registry+https://github.com/rust-lang/crates.io-index" 1833 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1834 + 1835 + [[package]] 1836 + name = "syn" 1837 + version = "2.0.100" 1838 + source = "registry+https://github.com/rust-lang/crates.io-index" 1839 + checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 1840 + dependencies = [ 1841 + "proc-macro2", 1842 + "quote", 1843 + "unicode-ident", 1844 + ] 1845 + 1846 + [[package]] 1847 + name = "sync_wrapper" 1848 + version = "1.0.2" 1849 + source = "registry+https://github.com/rust-lang/crates.io-index" 1850 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1851 + 1852 + [[package]] 1853 + name = "synstructure" 1854 + version = "0.13.1" 1855 + source = "registry+https://github.com/rust-lang/crates.io-index" 1856 + checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1857 + dependencies = [ 1858 + "proc-macro2", 1859 + "quote", 1860 + "syn", 1861 + ] 1862 + 1863 + [[package]] 1864 + name = "tempfile" 1865 + version = "3.19.1" 1866 + source = "registry+https://github.com/rust-lang/crates.io-index" 1867 + checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" 1868 + dependencies = [ 1869 + "fastrand", 1870 + "getrandom 0.3.2", 1871 + "once_cell", 1872 + "rustix", 1873 + "windows-sys 0.59.0", 1874 + ] 1875 + 1876 + [[package]] 1877 + name = "thiserror" 1878 + version = "2.0.12" 1879 + source = "registry+https://github.com/rust-lang/crates.io-index" 1880 + checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 1881 + dependencies = [ 1882 + "thiserror-impl", 1883 + ] 1884 + 1885 + [[package]] 1886 + name = "thiserror-impl" 1887 + version = "2.0.12" 1888 + source = "registry+https://github.com/rust-lang/crates.io-index" 1889 + checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 1890 + dependencies = [ 1891 + "proc-macro2", 1892 + "quote", 1893 + "syn", 1894 + ] 1895 + 1896 + [[package]] 1897 + name = "tinystr" 1898 + version = "0.7.6" 1899 + source = "registry+https://github.com/rust-lang/crates.io-index" 1900 + checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1901 + dependencies = [ 1902 + "displaydoc", 1903 + "zerovec", 1904 + ] 1905 + 1906 + [[package]] 1907 + name = "tinyvec" 1908 + version = "1.9.0" 1909 + source = "registry+https://github.com/rust-lang/crates.io-index" 1910 + checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 1911 + dependencies = [ 1912 + "tinyvec_macros", 1913 + ] 1914 + 1915 + [[package]] 1916 + name = "tinyvec_macros" 1917 + version = "0.1.1" 1918 + source = "registry+https://github.com/rust-lang/crates.io-index" 1919 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1920 + 1921 + [[package]] 1922 + name = "tokio" 1923 + version = "1.44.2" 1924 + source = "registry+https://github.com/rust-lang/crates.io-index" 1925 + checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" 1926 + dependencies = [ 1927 + "backtrace", 1928 + "bytes", 1929 + "libc", 1930 + "mio", 1931 + "parking_lot", 1932 + "pin-project-lite", 1933 + "signal-hook-registry", 1934 + "socket2", 1935 + "tokio-macros", 1936 + "windows-sys 0.52.0", 1937 + ] 1938 + 1939 + [[package]] 1940 + name = "tokio-macros" 1941 + version = "2.5.0" 1942 + source = "registry+https://github.com/rust-lang/crates.io-index" 1943 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1944 + dependencies = [ 1945 + "proc-macro2", 1946 + "quote", 1947 + "syn", 1948 + ] 1949 + 1950 + [[package]] 1951 + name = "tokio-native-tls" 1952 + version = "0.3.1" 1953 + source = "registry+https://github.com/rust-lang/crates.io-index" 1954 + checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1955 + dependencies = [ 1956 + "native-tls", 1957 + "tokio", 1958 + ] 1959 + 1960 + [[package]] 1961 + name = "tokio-stream" 1962 + version = "0.1.17" 1963 + source = "registry+https://github.com/rust-lang/crates.io-index" 1964 + checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 1965 + dependencies = [ 1966 + "futures-core", 1967 + "pin-project-lite", 1968 + "tokio", 1969 + ] 1970 + 1971 + [[package]] 1972 + name = "tower" 1973 + version = "0.5.2" 1974 + source = "registry+https://github.com/rust-lang/crates.io-index" 1975 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1976 + dependencies = [ 1977 + "futures-core", 1978 + "futures-util", 1979 + "pin-project-lite", 1980 + "sync_wrapper", 1981 + "tokio", 1982 + "tower-layer", 1983 + "tower-service", 1984 + "tracing", 1985 + ] 1986 + 1987 + [[package]] 1988 + name = "tower-layer" 1989 + version = "0.3.3" 1990 + source = "registry+https://github.com/rust-lang/crates.io-index" 1991 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1992 + 1993 + [[package]] 1994 + name = "tower-service" 1995 + version = "0.3.3" 1996 + source = "registry+https://github.com/rust-lang/crates.io-index" 1997 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1998 + 1999 + [[package]] 2000 + name = "tracing" 2001 + version = "0.1.41" 2002 + source = "registry+https://github.com/rust-lang/crates.io-index" 2003 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2004 + dependencies = [ 2005 + "log", 2006 + "pin-project-lite", 2007 + "tracing-attributes", 2008 + "tracing-core", 2009 + ] 2010 + 2011 + [[package]] 2012 + name = "tracing-attributes" 2013 + version = "0.1.28" 2014 + source = "registry+https://github.com/rust-lang/crates.io-index" 2015 + checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2016 + dependencies = [ 2017 + "proc-macro2", 2018 + "quote", 2019 + "syn", 2020 + ] 2021 + 2022 + [[package]] 2023 + name = "tracing-core" 2024 + version = "0.1.33" 2025 + source = "registry+https://github.com/rust-lang/crates.io-index" 2026 + checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2027 + dependencies = [ 2028 + "once_cell", 2029 + ] 2030 + 2031 + [[package]] 2032 + name = "typenum" 2033 + version = "1.18.0" 2034 + source = "registry+https://github.com/rust-lang/crates.io-index" 2035 + checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 2036 + 2037 + [[package]] 2038 + name = "unicode-bidi" 2039 + version = "0.3.18" 2040 + source = "registry+https://github.com/rust-lang/crates.io-index" 2041 + checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 2042 + 2043 + [[package]] 2044 + name = "unicode-ident" 2045 + version = "1.0.18" 2046 + source = "registry+https://github.com/rust-lang/crates.io-index" 2047 + checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 2048 + 2049 + [[package]] 2050 + name = "unicode-normalization" 2051 + version = "0.1.24" 2052 + source = "registry+https://github.com/rust-lang/crates.io-index" 2053 + checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2054 + dependencies = [ 2055 + "tinyvec", 2056 + ] 2057 + 2058 + [[package]] 2059 + name = "unicode-properties" 2060 + version = "0.1.3" 2061 + source = "registry+https://github.com/rust-lang/crates.io-index" 2062 + checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 2063 + 2064 + [[package]] 2065 + name = "url" 2066 + version = "2.5.4" 2067 + source = "registry+https://github.com/rust-lang/crates.io-index" 2068 + checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2069 + dependencies = [ 2070 + "form_urlencoded", 2071 + "idna", 2072 + "percent-encoding", 2073 + ] 2074 + 2075 + [[package]] 2076 + name = "utf16_iter" 2077 + version = "1.0.5" 2078 + source = "registry+https://github.com/rust-lang/crates.io-index" 2079 + checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 2080 + 2081 + [[package]] 2082 + name = "utf8_iter" 2083 + version = "1.0.4" 2084 + source = "registry+https://github.com/rust-lang/crates.io-index" 2085 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2086 + 2087 + [[package]] 2088 + name = "uuid" 2089 + version = "1.16.0" 2090 + source = "registry+https://github.com/rust-lang/crates.io-index" 2091 + checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" 2092 + dependencies = [ 2093 + "getrandom 0.3.2", 2094 + ] 2095 + 2096 + [[package]] 2097 + name = "vcpkg" 2098 + version = "0.2.15" 2099 + source = "registry+https://github.com/rust-lang/crates.io-index" 2100 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2101 + 2102 + [[package]] 2103 + name = "version_check" 2104 + version = "0.9.5" 2105 + source = "registry+https://github.com/rust-lang/crates.io-index" 2106 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2107 + 2108 + [[package]] 2109 + name = "wasi" 2110 + version = "0.11.0+wasi-snapshot-preview1" 2111 + source = "registry+https://github.com/rust-lang/crates.io-index" 2112 + checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2113 + 2114 + [[package]] 2115 + name = "wasi" 2116 + version = "0.14.2+wasi-0.2.4" 2117 + source = "registry+https://github.com/rust-lang/crates.io-index" 2118 + checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 2119 + dependencies = [ 2120 + "wit-bindgen-rt", 2121 + ] 2122 + 2123 + [[package]] 2124 + name = "wasite" 2125 + version = "0.1.0" 2126 + source = "registry+https://github.com/rust-lang/crates.io-index" 2127 + checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 2128 + 2129 + [[package]] 2130 + name = "whoami" 2131 + version = "1.6.0" 2132 + source = "registry+https://github.com/rust-lang/crates.io-index" 2133 + checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" 2134 + dependencies = [ 2135 + "redox_syscall", 2136 + "wasite", 2137 + ] 2138 + 2139 + [[package]] 2140 + name = "windows-link" 2141 + version = "0.1.1" 2142 + source = "registry+https://github.com/rust-lang/crates.io-index" 2143 + checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 2144 + 2145 + [[package]] 2146 + name = "windows-sys" 2147 + version = "0.48.0" 2148 + source = "registry+https://github.com/rust-lang/crates.io-index" 2149 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2150 + dependencies = [ 2151 + "windows-targets 0.48.5", 2152 + ] 2153 + 2154 + [[package]] 2155 + name = "windows-sys" 2156 + version = "0.52.0" 2157 + source = "registry+https://github.com/rust-lang/crates.io-index" 2158 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2159 + dependencies = [ 2160 + "windows-targets 0.52.6", 2161 + ] 2162 + 2163 + [[package]] 2164 + name = "windows-sys" 2165 + version = "0.59.0" 2166 + source = "registry+https://github.com/rust-lang/crates.io-index" 2167 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2168 + dependencies = [ 2169 + "windows-targets 0.52.6", 2170 + ] 2171 + 2172 + [[package]] 2173 + name = "windows-targets" 2174 + version = "0.48.5" 2175 + source = "registry+https://github.com/rust-lang/crates.io-index" 2176 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2177 + dependencies = [ 2178 + "windows_aarch64_gnullvm 0.48.5", 2179 + "windows_aarch64_msvc 0.48.5", 2180 + "windows_i686_gnu 0.48.5", 2181 + "windows_i686_msvc 0.48.5", 2182 + "windows_x86_64_gnu 0.48.5", 2183 + "windows_x86_64_gnullvm 0.48.5", 2184 + "windows_x86_64_msvc 0.48.5", 2185 + ] 2186 + 2187 + [[package]] 2188 + name = "windows-targets" 2189 + version = "0.52.6" 2190 + source = "registry+https://github.com/rust-lang/crates.io-index" 2191 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2192 + dependencies = [ 2193 + "windows_aarch64_gnullvm 0.52.6", 2194 + "windows_aarch64_msvc 0.52.6", 2195 + "windows_i686_gnu 0.52.6", 2196 + "windows_i686_gnullvm", 2197 + "windows_i686_msvc 0.52.6", 2198 + "windows_x86_64_gnu 0.52.6", 2199 + "windows_x86_64_gnullvm 0.52.6", 2200 + "windows_x86_64_msvc 0.52.6", 2201 + ] 2202 + 2203 + [[package]] 2204 + name = "windows_aarch64_gnullvm" 2205 + version = "0.48.5" 2206 + source = "registry+https://github.com/rust-lang/crates.io-index" 2207 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2208 + 2209 + [[package]] 2210 + name = "windows_aarch64_gnullvm" 2211 + version = "0.52.6" 2212 + source = "registry+https://github.com/rust-lang/crates.io-index" 2213 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2214 + 2215 + [[package]] 2216 + name = "windows_aarch64_msvc" 2217 + version = "0.48.5" 2218 + source = "registry+https://github.com/rust-lang/crates.io-index" 2219 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2220 + 2221 + [[package]] 2222 + name = "windows_aarch64_msvc" 2223 + version = "0.52.6" 2224 + source = "registry+https://github.com/rust-lang/crates.io-index" 2225 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2226 + 2227 + [[package]] 2228 + name = "windows_i686_gnu" 2229 + version = "0.48.5" 2230 + source = "registry+https://github.com/rust-lang/crates.io-index" 2231 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2232 + 2233 + [[package]] 2234 + name = "windows_i686_gnu" 2235 + version = "0.52.6" 2236 + source = "registry+https://github.com/rust-lang/crates.io-index" 2237 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2238 + 2239 + [[package]] 2240 + name = "windows_i686_gnullvm" 2241 + version = "0.52.6" 2242 + source = "registry+https://github.com/rust-lang/crates.io-index" 2243 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2244 + 2245 + [[package]] 2246 + name = "windows_i686_msvc" 2247 + version = "0.48.5" 2248 + source = "registry+https://github.com/rust-lang/crates.io-index" 2249 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2250 + 2251 + [[package]] 2252 + name = "windows_i686_msvc" 2253 + version = "0.52.6" 2254 + source = "registry+https://github.com/rust-lang/crates.io-index" 2255 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2256 + 2257 + [[package]] 2258 + name = "windows_x86_64_gnu" 2259 + version = "0.48.5" 2260 + source = "registry+https://github.com/rust-lang/crates.io-index" 2261 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2262 + 2263 + [[package]] 2264 + name = "windows_x86_64_gnu" 2265 + version = "0.52.6" 2266 + source = "registry+https://github.com/rust-lang/crates.io-index" 2267 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2268 + 2269 + [[package]] 2270 + name = "windows_x86_64_gnullvm" 2271 + version = "0.48.5" 2272 + source = "registry+https://github.com/rust-lang/crates.io-index" 2273 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2274 + 2275 + [[package]] 2276 + name = "windows_x86_64_gnullvm" 2277 + version = "0.52.6" 2278 + source = "registry+https://github.com/rust-lang/crates.io-index" 2279 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2280 + 2281 + [[package]] 2282 + name = "windows_x86_64_msvc" 2283 + version = "0.48.5" 2284 + source = "registry+https://github.com/rust-lang/crates.io-index" 2285 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2286 + 2287 + [[package]] 2288 + name = "windows_x86_64_msvc" 2289 + version = "0.52.6" 2290 + source = "registry+https://github.com/rust-lang/crates.io-index" 2291 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2292 + 2293 + [[package]] 2294 + name = "winnow" 2295 + version = "0.7.6" 2296 + source = "registry+https://github.com/rust-lang/crates.io-index" 2297 + checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" 2298 + dependencies = [ 2299 + "memchr", 2300 + ] 2301 + 2302 + [[package]] 2303 + name = "wit-bindgen-rt" 2304 + version = "0.39.0" 2305 + source = "registry+https://github.com/rust-lang/crates.io-index" 2306 + checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 2307 + dependencies = [ 2308 + "bitflags", 2309 + ] 2310 + 2311 + [[package]] 2312 + name = "write16" 2313 + version = "1.0.0" 2314 + source = "registry+https://github.com/rust-lang/crates.io-index" 2315 + checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2316 + 2317 + [[package]] 2318 + name = "writeable" 2319 + version = "0.5.5" 2320 + source = "registry+https://github.com/rust-lang/crates.io-index" 2321 + checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2322 + 2323 + [[package]] 2324 + name = "yoke" 2325 + version = "0.7.5" 2326 + source = "registry+https://github.com/rust-lang/crates.io-index" 2327 + checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2328 + dependencies = [ 2329 + "serde", 2330 + "stable_deref_trait", 2331 + "yoke-derive", 2332 + "zerofrom", 2333 + ] 2334 + 2335 + [[package]] 2336 + name = "yoke-derive" 2337 + version = "0.7.5" 2338 + source = "registry+https://github.com/rust-lang/crates.io-index" 2339 + checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2340 + dependencies = [ 2341 + "proc-macro2", 2342 + "quote", 2343 + "syn", 2344 + "synstructure", 2345 + ] 2346 + 2347 + [[package]] 2348 + name = "zerocopy" 2349 + version = "0.7.35" 2350 + source = "registry+https://github.com/rust-lang/crates.io-index" 2351 + checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2352 + dependencies = [ 2353 + "zerocopy-derive 0.7.35", 2354 + ] 2355 + 2356 + [[package]] 2357 + name = "zerocopy" 2358 + version = "0.8.24" 2359 + source = "registry+https://github.com/rust-lang/crates.io-index" 2360 + checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" 2361 + dependencies = [ 2362 + "zerocopy-derive 0.8.24", 2363 + ] 2364 + 2365 + [[package]] 2366 + name = "zerocopy-derive" 2367 + version = "0.7.35" 2368 + source = "registry+https://github.com/rust-lang/crates.io-index" 2369 + checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2370 + dependencies = [ 2371 + "proc-macro2", 2372 + "quote", 2373 + "syn", 2374 + ] 2375 + 2376 + [[package]] 2377 + name = "zerocopy-derive" 2378 + version = "0.8.24" 2379 + source = "registry+https://github.com/rust-lang/crates.io-index" 2380 + checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" 2381 + dependencies = [ 2382 + "proc-macro2", 2383 + "quote", 2384 + "syn", 2385 + ] 2386 + 2387 + [[package]] 2388 + name = "zerofrom" 2389 + version = "0.1.6" 2390 + source = "registry+https://github.com/rust-lang/crates.io-index" 2391 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2392 + dependencies = [ 2393 + "zerofrom-derive", 2394 + ] 2395 + 2396 + [[package]] 2397 + name = "zerofrom-derive" 2398 + version = "0.1.6" 2399 + source = "registry+https://github.com/rust-lang/crates.io-index" 2400 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2401 + dependencies = [ 2402 + "proc-macro2", 2403 + "quote", 2404 + "syn", 2405 + "synstructure", 2406 + ] 2407 + 2408 + [[package]] 2409 + name = "zeroize" 2410 + version = "1.8.1" 2411 + source = "registry+https://github.com/rust-lang/crates.io-index" 2412 + checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2413 + 2414 + [[package]] 2415 + name = "zerovec" 2416 + version = "0.10.4" 2417 + source = "registry+https://github.com/rust-lang/crates.io-index" 2418 + checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2419 + dependencies = [ 2420 + "yoke", 2421 + "zerofrom", 2422 + "zerovec-derive", 2423 + ] 2424 + 2425 + [[package]] 2426 + name = "zerovec-derive" 2427 + version = "0.10.3" 2428 + source = "registry+https://github.com/rust-lang/crates.io-index" 2429 + checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2430 + dependencies = [ 2431 + "proc-macro2", 2432 + "quote", 2433 + "syn", 2434 + ]
+14
Cargo.toml
··· 1 + [package] 2 + name = "kryptori" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + axum = { version = "0.8" } 8 + tokio = { version = "1", features = ["full"] } 9 + sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio-native-tls"] } 10 + uuid = { version = "1", features = ["v4"] } 11 + lettre = { version = "0.11", features = ["tokio1", "tokio1-native-tls", "smtp-transport", "builder"] } 12 + dotenvy = "0.15" 13 + serde = { version = "1", features = ["derive"] } 14 + askama = "0.13.1"
-35
Makefile
··· 1 - VENV_DIR = venv 2 - 3 - .PHONY: default 4 - default: run 5 - 6 - .PHONY: install 7 - install: 8 - nix develop 9 - 10 - run: 11 - @echo "Starting FastAPI server..." 12 - $(VENV_DIR)/bin/uvicorn main:app --reload 13 - 14 - .PHONY: format 15 - format: 16 - ruff check --fix . 17 - ruff format . 18 - 19 - # Lint the Python code using ruff 20 - .PHONY: lint 21 - lint: 22 - ruff check . 23 - 24 - .PHONY: test 25 - test: 26 - pytest 27 - 28 - # Clean up virtual environment and cache 29 - .PHONY: clean 30 - clean: 31 - @echo "Cleaning up..." 32 - rm -rf $(VENV_DIR) 33 - rm -rf __pycache__ 34 - rm -rf .pytest_cache 35 -
-2
README.md
··· 1 - ## Note: Being ported to Rust rq 2 - 3 1 # Kryptori 4 2 5 3 tori.fi, ebay, etc., but for exchanging cryptocurrencies and fiat P2P.
-61
flake.lock
··· 1 - { 2 - "nodes": { 3 - "flake-utils": { 4 - "inputs": { 5 - "systems": "systems" 6 - }, 7 - "locked": { 8 - "lastModified": 1731533236, 9 - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 10 - "owner": "numtide", 11 - "repo": "flake-utils", 12 - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 13 - "type": "github" 14 - }, 15 - "original": { 16 - "owner": "numtide", 17 - "repo": "flake-utils", 18 - "type": "github" 19 - } 20 - }, 21 - "nixpkgs": { 22 - "locked": { 23 - "lastModified": 1737632463, 24 - "narHash": "sha256-38J9QfeGSej341ouwzqf77WIHAScihAKCt8PQJ+NH28=", 25 - "owner": "NixOS", 26 - "repo": "nixpkgs", 27 - "rev": "0aa475546ed21629c4f5bbf90e38c846a99ec9e9", 28 - "type": "github" 29 - }, 30 - "original": { 31 - "owner": "NixOS", 32 - "ref": "nixos-unstable", 33 - "repo": "nixpkgs", 34 - "type": "github" 35 - } 36 - }, 37 - "root": { 38 - "inputs": { 39 - "flake-utils": "flake-utils", 40 - "nixpkgs": "nixpkgs" 41 - } 42 - }, 43 - "systems": { 44 - "locked": { 45 - "lastModified": 1681028828, 46 - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 47 - "owner": "nix-systems", 48 - "repo": "default", 49 - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 50 - "type": "github" 51 - }, 52 - "original": { 53 - "owner": "nix-systems", 54 - "repo": "default", 55 - "type": "github" 56 - } 57 - } 58 - }, 59 - "root": "root", 60 - "version": 7 61 - }
-59
flake.nix
··· 1 - { 2 - description = "Kryptori environment"; 3 - 4 - inputs = { 5 - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; 6 - flake-utils.url = "github:numtide/flake-utils"; 7 - }; 8 - 9 - outputs = { self, nixpkgs, flake-utils }: 10 - flake-utils.lib.eachDefaultSystem (system: 11 - let 12 - pkgs = import nixpkgs { inherit system; }; 13 - python = pkgs.python312; 14 - in 15 - rec { 16 - devShell = pkgs.mkShell { 17 - buildInputs = [ 18 - python 19 - python.pkgs.setuptools 20 - python.pkgs.wheel 21 - python.pkgs.uv 22 - ]; 23 - 24 - shellHook = '' 25 - echo "Entering Python development environment..." 26 - export PYTHONPATH=$PWD 27 - # Create a virtualenv inside the shell if it doesn't exist 28 - if [ ! -d "venv" ]; then 29 - uv venv venv 30 - fi 31 - 32 - # Activate the virtual environment 33 - source venv/bin/activate 34 - 35 - # Install dependencies from requirements.txt 36 - if [ -f requirements.txt ]; then 37 - uv pip install -r requirements.txt 38 - fi 39 - 40 - echo "All dependencies installed via uv." 41 - ''; 42 - }; 43 - 44 - packages.default = python.pkgs.buildPythonPackage { 45 - pname = "kryptori"; 46 - version = "0.1.0"; 47 - 48 - src = ./.; 49 - 50 - propagatedBuildInputs = []; 51 - 52 - # Optional: If you need to run tests 53 - # checkPhase = '' 54 - # pytest tests/ 55 - # ''; 56 - }; 57 - }); 58 - } 59 -
-345
main.py
··· 1 - import os 2 - from fastapi import FastAPI, Request, Form, HTTPException 3 - from fastapi.responses import HTMLResponse, RedirectResponse 4 - from jinja2 import Template 5 - import sqlite3 6 - import uuid 7 - import smtplib 8 - 9 - from email.message import EmailMessage 10 - 11 - app = FastAPI() 12 - 13 - DATABASE = "kryptori.db" 14 - 15 - 16 - def create_tables_if_not_exist(): 17 - conn = sqlite3.connect(DATABASE) 18 - cursor = conn.cursor() 19 - 20 - create_advertisement_table_sql = """ 21 - CREATE TABLE IF NOT EXISTS Advertisement ( 22 - id INTEGER PRIMARY KEY AUTOINCREMENT, 23 - created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, 24 - updated_at TEXT, 25 - title TEXT NOT NULL, 26 - description TEXT NOT NULL, 27 - owner_email TEXT NOT NULL, 28 - active INT NOT NULL DEFAULT 0, 29 - owner_token TEXT NOT NULL UNIQUE 30 - ); 31 - """ 32 - cursor.execute(create_advertisement_table_sql) 33 - conn.commit() 34 - conn.close() 35 - 36 - 37 - def create_advertisement( 38 - title: str, 39 - description: str, 40 - owner_email: str, 41 - ): 42 - title = title.strip()[0:1000] 43 - description = description.strip()[0:1000] 44 - owner_email = owner_email.strip()[0:1000] 45 - owner_token = uuid.uuid4() 46 - conn = sqlite3.connect(DATABASE) 47 - cursor = conn.cursor() 48 - 49 - insert_sql = """ 50 - INSERT INTO Advertisement (title, description, owner_email, owner_token) 51 - VALUES (?, ?, ?, ?) 52 - """ 53 - 54 - cursor.execute( 55 - insert_sql, 56 - (title, description, owner_email, str(owner_token)), 57 - ) 58 - conn.commit() 59 - conn.close() 60 - 61 - msg = EmailMessage() 62 - msg["From"] = os.environ.get("EMAIL") 63 - msg["To"] = owner_email 64 - msg["Subject"] = f"New ad created: {title}" 65 - msg.set_content( 66 - ( 67 - f"Thanks for making a new ad!\n" 68 - f"Title: {title}\n" 69 - f"Description: {description}\n" 70 - "Before it goes live, you must go activate the ad by loading the webpage:\n" 71 - f"kryptori.lu1.sh/manage-ad?token={owner_token}\n\n " 72 - f"The token for this ad is: {owner_token}\n" 73 - "and that's what you can use to update and delete the ad." 74 - ) 75 - ) 76 - 77 - # TODO: send via own email server 78 - s = smtplib.SMTP('smtp.gmail.com', 587) 79 - s.ehlo() 80 - s.starttls() 81 - s.ehlo() 82 - s.login(os.environ.get("EMAIL", ""), os.environ.get("PASSWORD", "")) 83 - s.send_message(msg) 84 - s.quit() 85 - 86 - 87 - def fetch_advertisements_html(): 88 - conn = sqlite3.connect(DATABASE) 89 - cursor = conn.cursor() 90 - cursor.execute( 91 - "SELECT id, title, description, created_at, updated_at FROM Advertisement WHERE active = 1 ORDER BY created_at DESC;" 92 - ) 93 - ads = cursor.fetchall() 94 - conn.close() 95 - 96 - html = "<div>" 97 - for id, title, description, created_at, updated_at in ads: 98 - html += f"""<div class="ad-container"> 99 - <details> 100 - <summary>{title}</summary> 101 - <i>Created on {created_at}{f", updated on {updated_at}" if updated_at is not None else ""}</i> 102 - <p style="margin-left: 50px;">{description}</p> 103 - <form action="/send-message" method="post"> 104 - <span>Get in touch with the poster!</span> 105 - <input type="hidden" id="ad_id" name="ad_id" value="{id}" required> 106 - 107 - <div style="margin-top: 4px;"> 108 - <label for="user_email"> 109 - <b>Your email</b> 110 - <br /> 111 - This won't be stored at all, it's just to tell the poster who to reply to. 112 - <br /> 113 - Check the <a target="_blank" href="https://github.com/lu1a/kryptori">source code</a> if in doubt. 114 - <br /> 115 - I'm open to suggestions on how to more formally prove that it's not 116 - <br /> 117 - saved behind the scenes or anything. 118 - </label> 119 - <br /> 120 - <input type="email" id="user_email" name="user_email" placeholder="abc@xyz.com" required> 121 - </div> 122 - 123 - <div class="input-container"> 124 - <label for="message"> 125 - <b>Message</b> 126 - </label> 127 - <br /> 128 - <textarea id="message" name="message" style="width: 100%; height: 6rem;" required></textarea> 129 - </div> 130 - 131 - <p> 132 - Remember, this will just send an email to the poster. 133 - <br /> 134 - Then you two will hash it out over email. 135 - <br /> 136 - Don't come crying to me if the poster doesn't get back to you, 137 - <br /> 138 - or if the poster grifts you or if you grift the poster. 139 - </p> 140 - <div class="input-container"> 141 - <button type="submit">Send Message</button> 142 - </div> 143 - </form> 144 - </details> 145 - </div>""" 146 - html += "</div>" 147 - return html 148 - 149 - 150 - def fetch_advertisement_by_token(token): 151 - conn = sqlite3.connect(DATABASE) 152 - cursor = conn.cursor() 153 - cursor.execute( 154 - "SELECT title, description, created_at, updated_at, owner_email FROM Advertisement WHERE owner_token = ? LIMIT 1", 155 - (token,), 156 - ) 157 - ad = cursor.fetchone() 158 - 159 - cursor.execute( 160 - "UPDATE Advertisement SET active = 1 WHERE owner_token = ?", 161 - (token,), 162 - ) 163 - conn.commit() 164 - conn.close() 165 - 166 - return ad 167 - 168 - 169 - create_tables_if_not_exist() 170 - 171 - 172 - @app.get("/", response_class=HTMLResponse) 173 - async def index(): 174 - with open("pages/index.html", "r") as f: 175 - index_page = f.read() 176 - 177 - ads_html = fetch_advertisements_html() 178 - template = Template(index_page) 179 - rendered_page = template.render(ads=ads_html) 180 - 181 - return rendered_page 182 - 183 - 184 - @app.post("/send-message") 185 - async def send_message( 186 - ad_id: int = Form(...), user_email: str = Form(...), message: str = Form(...) 187 - ): 188 - if user_email == "" or message == "": 189 - raise HTTPException(status_code=400, detail="Play nice!") 190 - 191 - conn = sqlite3.connect(DATABASE) 192 - cursor = conn.cursor() 193 - 194 - cursor.execute( 195 - "SELECT owner_email, title FROM Advertisement WHERE id = ?", (ad_id,) 196 - ) 197 - owner_email, title = cursor.fetchone() 198 - 199 - if not owner_email: 200 - conn.close() 201 - raise HTTPException(status_code=404, detail="Advertisement not found") 202 - 203 - conn.commit() 204 - conn.close() 205 - 206 - # TODO: use own mail server 207 - s = smtplib.SMTP('smtp.gmail.com', 587) 208 - s.ehlo() 209 - s.starttls() 210 - s.ehlo() 211 - 212 - msg_to_owner = EmailMessage() 213 - msg_to_owner["From"] = os.environ.get("EMAIL") 214 - msg_to_owner["To"] = owner_email 215 - msg_to_owner["Subject"] = f"New message about your ad: {title}" 216 - msg_to_owner.set_content( 217 - ( 218 - f"Here's a message from an interested party about your ad {title}!\n" 219 - f"Message:\n{message.strip()[0:1000]}\n" 220 - f"User email: {user_email.strip()[0:1000]}\n" 221 - "Please reply to their email address." 222 - ) 223 - ) 224 - s.login(os.environ.get("EMAIL", ""), os.environ.get("PASSWORD", "")) 225 - s.send_message(msg_to_owner) 226 - 227 - confirmation_msg_to_user = EmailMessage() 228 - confirmation_msg_to_user["From"] = os.environ.get("EMAIL") 229 - confirmation_msg_to_user["To"] = user_email.strip()[0:1000] 230 - confirmation_msg_to_user["Subject"] = "Confirmation: you sent a msg about an ad" 231 - confirmation_msg_to_user.set_content( 232 - f"You just sent a message in reply to this ad: {title}\n" 233 - f"Your message was: {message.strip()[0:1000]}\n\n" 234 - "Now you will wait for the ad poster to reply to you via email.\n" 235 - "Thanks for using kryptori!" 236 - ) 237 - s.send_message(confirmation_msg_to_user) 238 - s.quit() 239 - 240 - return RedirectResponse(url="/?success=true", status_code=303) 241 - 242 - 243 - @app.post("/create-ad", response_class=HTMLResponse) 244 - async def create_ad( 245 - title: str = Form(...), 246 - description: str = Form(...), 247 - owner_email: str = Form(...), 248 - ): 249 - if title == "" or description == "" or owner_email == "": 250 - raise HTTPException(status_code=400, detail="Play nice!") 251 - 252 - create_advertisement( 253 - title, 254 - description, 255 - owner_email, 256 - ) 257 - 258 - return RedirectResponse(url="/", status_code=303) 259 - 260 - 261 - @app.post("/update-ad", response_class=HTMLResponse) 262 - async def update_ad( 263 - title: str = Form(...), 264 - description: str = Form(...), 265 - token: str = Form(...), 266 - ): 267 - if title == "" or description == "": 268 - raise HTTPException(status_code=400, detail="Play nice!") 269 - 270 - conn = sqlite3.connect(DATABASE) 271 - cursor = conn.cursor() 272 - 273 - cursor.execute("SELECT * FROM Advertisement WHERE owner_token = ?", (token,)) 274 - existing_ad = cursor.fetchone() 275 - 276 - if not existing_ad: 277 - conn.close() 278 - raise HTTPException(status_code=404, detail="Advertisement not found") 279 - 280 - cursor.execute( 281 - """ 282 - UPDATE Advertisement 283 - SET title = ?, description = ?, updated_at = CURRENT_TIMESTAMP 284 - WHERE owner_token = ? 285 - """, 286 - (title.strip()[0:1000], description.strip()[0:1000], token), 287 - ) 288 - 289 - conn.commit() 290 - conn.close() 291 - 292 - return RedirectResponse( 293 - url=f"/manage-ad?token={token}&success=true", status_code=303 294 - ) 295 - 296 - 297 - @app.post("/delete-ad", response_class=HTMLResponse) 298 - async def delete_at( 299 - token: str = Form(...), 300 - ): 301 - conn = sqlite3.connect(DATABASE) 302 - cursor = conn.cursor() 303 - 304 - cursor.execute("DELETE FROM Advertisement WHERE owner_token = ?", (token,)) 305 - conn.commit() 306 - conn.close() 307 - 308 - return RedirectResponse(url="/?delete-success=true", status_code=303) 309 - 310 - 311 - @app.get("/manage-ad", response_class=HTMLResponse) 312 - async def manage_ad(request: Request): 313 - token = request.query_params.get("token") 314 - if not token: 315 - raise HTTPException(status_code=400, detail="Token parameter is required") 316 - 317 - with open("pages/manage_ad.html", "r") as f: 318 - manage_ad_page = f.read() 319 - 320 - ad = fetch_advertisement_by_token(token) 321 - if not ad: 322 - return RedirectResponse(url="/", status_code=303) 323 - title, description, created_at, updated_at, owner_email = ad 324 - template = Template(manage_ad_page) 325 - rendered_page = template.render( 326 - title=title, 327 - description=description, 328 - created_at=created_at, 329 - updated_at=updated_at, 330 - owner_email=owner_email, 331 - token=token, 332 - ) 333 - 334 - return rendered_page 335 - 336 - 337 - @app.get("/{path:path}", response_class=HTMLResponse) 338 - async def catch_all(path: str): 339 - return HTMLResponse(content=f"<h1>Unsupported URI: {path}</h1>", status_code=404) 340 - 341 - 342 - if __name__ == "__main__": 343 - import uvicorn 344 - 345 - uvicorn.run(app, host="0.0.0.0", port=8000)
+1 -1
pages/index.html
··· 58 58 <br /> 59 59 <br /> 60 60 ...what, you don't like the UI?! 61 - Make a pull request to the source code then: <a href="https://github.com/lu1a/kryptori">github.com/lu1a/kryptori</a>. 61 + Make a pull request to the source code then: <a href="https://tangled.sh/@lu1.sh/kryptori">tangled.sh/@lu1.sh/kryptori</a>. 62 62 </p> 63 63 </details> 64 64 </div>
pages/manage_ad.html templates/manage_ad.html
-5
requirements.in
··· 1 - fastapi 2 - jinja2 3 - python-multipart 4 - ruff 5 - uvicorn
-38
requirements.txt
··· 1 - # This file was autogenerated by uv via the following command: 2 - # uv pip compile requirements.in -o requirements.txt 3 - annotated-types==0.7.0 4 - # via pydantic 5 - anyio==4.8.0 6 - # via starlette 7 - click==8.1.8 8 - # via uvicorn 9 - fastapi==0.115.7 10 - # via -r requirements.in 11 - h11==0.14.0 12 - # via uvicorn 13 - idna==3.10 14 - # via anyio 15 - jinja2==3.1.5 16 - # via -r requirements.in 17 - markupsafe==3.0.2 18 - # via jinja2 19 - pydantic==2.10.6 20 - # via fastapi 21 - pydantic-core==2.27.2 22 - # via pydantic 23 - python-multipart==0.0.20 24 - # via -r requirements.in 25 - ruff==0.9.3 26 - # via -r requirements.in 27 - sniffio==1.3.1 28 - # via anyio 29 - starlette==0.45.3 30 - # via fastapi 31 - typing-extensions==4.12.2 32 - # via 33 - # anyio 34 - # fastapi 35 - # pydantic 36 - # pydantic-core 37 - uvicorn==0.34.0 38 - # via -r requirements.in
+370
src/main.rs
··· 1 + use axum::{routing::get, response::Html, Form, response::Redirect, Router, extract::{Query, State}, http::StatusCode}; 2 + use sqlx::sqlite::SqlitePoolOptions; 3 + use sqlx::SqlitePool; 4 + use std::sync::Arc; 5 + use std::fs; 6 + use uuid::Uuid; 7 + use std::env; 8 + use lettre::{Message, SmtpTransport, Transport, transport::smtp::authentication::Credentials}; 9 + use serde::Deserialize; 10 + use askama::Template; 11 + 12 + #[derive(Clone)] 13 + struct AppState { 14 + db: SqlitePool, 15 + } 16 + 17 + pub async fn create_tables_if_not_exist(pool: &SqlitePool) -> Result<(), sqlx::Error> { 18 + let create_advertisement_table_sql = r#" 19 + CREATE TABLE IF NOT EXISTS Advertisement ( 20 + id INTEGER PRIMARY KEY AUTOINCREMENT, 21 + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, 22 + updated_at TEXT, 23 + title TEXT NOT NULL, 24 + description TEXT NOT NULL, 25 + owner_email TEXT NOT NULL, 26 + active INT NOT NULL DEFAULT 0, 27 + owner_token TEXT NOT NULL UNIQUE 28 + ); 29 + "#; 30 + 31 + sqlx::query(create_advertisement_table_sql) 32 + .execute(pool) 33 + .await?; 34 + 35 + Ok(()) 36 + } 37 + 38 + #[derive(Deserialize)] 39 + struct CreateAdForm { 40 + title: String, 41 + description: String, 42 + owner_email: String, 43 + } 44 + 45 + async fn create_ad( 46 + State(state): State<Arc<AppState>>, 47 + Form(input): Form<CreateAdForm>, 48 + ) -> Result<Redirect, (axum::http::StatusCode, String)> { 49 + let title = input.title.trim().chars().take(1000).collect::<String>(); 50 + let description = input.description.trim().chars().take(1000).collect::<String>(); 51 + let owner_email = input.owner_email.trim().chars().take(1000).collect::<String>(); 52 + 53 + if title.is_empty() || description.is_empty() || owner_email.is_empty() { 54 + return Err((axum::http::StatusCode::BAD_REQUEST, "Play nice!".into())); 55 + } 56 + 57 + let token = Uuid::new_v4().to_string(); 58 + 59 + let insert_result = sqlx::query!( 60 + r#" 61 + INSERT INTO Advertisement (title, description, owner_email, owner_token) 62 + VALUES (?, ?, ?, ?) 63 + "#, 64 + title, 65 + description, 66 + owner_email, 67 + token, 68 + ) 69 + .execute(&state.db) 70 + .await; 71 + 72 + if let Err(e) = insert_result { 73 + eprintln!("DB insert error: {e}"); 74 + return Err((axum::http::StatusCode::INTERNAL_SERVER_ERROR, "Could not insert ad.".into())); 75 + } 76 + 77 + if let Err(e) = send_email(&owner_email, &title, &description, &token).await { 78 + eprintln!("Email error: {e}"); 79 + } 80 + 81 + Ok(Redirect::to("/")) 82 + } 83 + 84 + async fn send_email( 85 + to: &str, 86 + title: &str, 87 + description: &str, 88 + token: &str, 89 + ) -> Result<(), Box<dyn std::error::Error>> { 90 + let email = env::var("EMAIL")?; 91 + let password = env::var("PASSWORD")?; 92 + 93 + let body = format!( 94 + "Thanks for making a new ad!\n\ 95 + Title: {title}\n\ 96 + Description: {description}\n\ 97 + Before it goes live, you must go activate the ad by loading the webpage:\n\ 98 + kryptori.lu1.sh/manage-ad?token={token}\n\n\ 99 + The token for this ad is: {token}\n\ 100 + and that's what you can use to update and delete the ad.", 101 + ); 102 + 103 + let msg = Message::builder() 104 + .from(email.parse()?) 105 + .to(to.parse()?) 106 + .subject(format!("New ad created: {title}")) 107 + .body(body)?; 108 + 109 + let creds = Credentials::new(email.clone(), password); 110 + 111 + let mailer = SmtpTransport::starttls_relay("smtp.gmail.com")? 112 + .credentials(creds) 113 + .build(); 114 + 115 + mailer.send(&msg)?; 116 + Ok(()) 117 + } 118 + 119 + async fn index(State(state): State<Arc<AppState>>) -> Html<String> { 120 + let template = fs::read_to_string("pages/index.html").expect("Failed to read template"); 121 + 122 + let ads_html = fetch_advertisements_html(&state.db).await.unwrap_or_else(|e| { 123 + eprintln!("DB error: {e}"); 124 + "<p>Could not load ads.</p>".to_string() 125 + }); 126 + 127 + let rendered = template.replace("{{ ads }}", &ads_html); 128 + 129 + Html(rendered) 130 + } 131 + 132 + async fn fetch_advertisements_html(pool: &SqlitePool) -> Result<String, sqlx::Error> { 133 + let ads = sqlx::query!( 134 + r#" 135 + SELECT id, title, description, created_at, updated_at 136 + FROM Advertisement 137 + WHERE active = 1 138 + ORDER BY created_at DESC 139 + "# 140 + ) 141 + .fetch_all(pool) 142 + .await?; 143 + 144 + let mut html = String::from("<div>"); 145 + 146 + for ad in ads { 147 + let created = &ad.created_at; 148 + let updated_str = match &ad.updated_at { 149 + Some(updated) => format!(", updated on {}", updated), 150 + None => "".to_string(), 151 + }; 152 + 153 + html.push_str(&format!( 154 + r#"<div class="ad-container"> 155 + <details> 156 + <summary>{title}</summary> 157 + <i>Created on {created}{updated}</i> 158 + <p style="margin-left: 50px;">{desc}</p> 159 + <form action="/send-message" method="post"> 160 + <span>Get in touch with the poster!</span> 161 + <input type="hidden" id="ad_id" name="ad_id" value="{id}" required> 162 + <div style="margin-top: 4px;"> 163 + <label for="user_email"> 164 + <b>Your email</b><br /> 165 + This won't be stored at all...<br /> 166 + Check the <a target="_blank" href="https://github.com/lu1a/kryptori">source code</a>... 167 + </label><br /> 168 + <input type="email" id="user_email" name="user_email" placeholder="abc@xyz.com" required> 169 + </div> 170 + <div class="input-container"> 171 + <label for="message"><b>Message</b></label><br /> 172 + <textarea id="message" name="message" style="width: 100%; height: 6rem;" required></textarea> 173 + </div> 174 + <p>Remember, this will just send an email to the poster... etc</p> 175 + <div class="input-container"> 176 + <button type="submit">Send Message</button> 177 + </div> 178 + </form> 179 + </details> 180 + </div>"#, 181 + title = ad.title, 182 + created = created, 183 + updated = updated_str, 184 + desc = ad.description, 185 + id = ad.id, 186 + )); 187 + } 188 + 189 + html.push_str("</div>"); 190 + Ok(html) 191 + } 192 + 193 + async fn fetch_advertisement_by_token( 194 + pool: &SqlitePool, 195 + token: &str 196 + ) -> Result<Option<(String, String, String, Option<String>, String)>, sqlx::Error> { 197 + let row = sqlx::query!( 198 + r#" 199 + SELECT title, description, created_at, updated_at, owner_email 200 + FROM Advertisement 201 + WHERE owner_token = ? 202 + LIMIT 1 203 + "#, 204 + token 205 + ) 206 + .fetch_optional(pool) 207 + .await?; 208 + 209 + if let Some(ad) = row { 210 + sqlx::query!( 211 + r#" 212 + UPDATE Advertisement 213 + SET active = 1 214 + WHERE owner_token = ? 215 + "#, 216 + token 217 + ) 218 + .execute(pool) 219 + .await?; 220 + 221 + Ok(Some(( 222 + ad.title, 223 + ad.description, 224 + ad.created_at, 225 + ad.updated_at, 226 + ad.owner_email, 227 + ))) 228 + } else { 229 + Ok(None) 230 + } 231 + } 232 + 233 + #[derive(Deserialize)] 234 + struct ManageAdQuery { 235 + token: String, 236 + } 237 + 238 + #[derive(Template)] 239 + #[template(path = "manage_ad.html")] 240 + struct ManageAdTemplate { 241 + title: String, 242 + description: String, 243 + created_at: String, 244 + updated_at: String, 245 + owner_email: String, 246 + token: String, 247 + } 248 + 249 + fn render_updated_at(updated_at: Option<String>) -> String { 250 + updated_at.unwrap_or_else(|| "".to_string()) 251 + } 252 + 253 + async fn manage_ad( 254 + State(state): State<Arc<AppState>>, 255 + Query(query): Query<ManageAdQuery>, 256 + ) -> Result<Html<String>, Redirect> { 257 + let token = &query.token; 258 + 259 + match fetch_advertisement_by_token(&state.db, token).await { 260 + Ok(Some((title, description, created_at, updated_at, owner_email))) => { 261 + let updated_at_str = render_updated_at(updated_at); 262 + let template = ManageAdTemplate { 263 + title, 264 + description, 265 + created_at, 266 + updated_at: updated_at_str, 267 + owner_email, 268 + token: token.to_string(), 269 + }; 270 + 271 + let rendered_page = template.render().unwrap(); 272 + 273 + Ok(Html(rendered_page)) 274 + } 275 + Ok(None) => { 276 + Err(Redirect::to("/")) 277 + } 278 + Err(_) => { 279 + Err(Redirect::to("/")) 280 + } 281 + } 282 + } 283 + 284 + #[derive(Deserialize)] 285 + struct UpdateAdForm { 286 + title: String, 287 + description: String, 288 + token: String, 289 + } 290 + 291 + #[derive(Deserialize)] 292 + struct DeleteAdForm { 293 + token: String, 294 + } 295 + 296 + async fn update_ad( 297 + State(state): State<Arc<AppState>>, 298 + Form(form): Form<UpdateAdForm>, 299 + ) -> Result<Redirect, StatusCode> { 300 + let title = form.title.trim().to_string(); 301 + let description = form.description.trim().to_string(); 302 + let token = form.token.trim(); 303 + 304 + if title.is_empty() || description.is_empty() { 305 + return Err(StatusCode::BAD_REQUEST); 306 + } 307 + 308 + let row = sqlx::query!("SELECT * FROM Advertisement WHERE owner_token = ?", token) 309 + .fetch_optional(&state.db) 310 + .await 311 + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; 312 + 313 + if row.is_none() { 314 + return Err(StatusCode::NOT_FOUND); 315 + } 316 + 317 + sqlx::query!( 318 + "UPDATE Advertisement SET title = ?, description = ?, updated_at = CURRENT_TIMESTAMP WHERE owner_token = ?", 319 + title, description, token 320 + ) 321 + .execute(&state.db) 322 + .await 323 + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; 324 + 325 + Ok(Redirect::to(format!("/manage-ad?token={}&success=true", token).as_str())) 326 + } 327 + 328 + async fn delete_ad( 329 + State(state): State<Arc<AppState>>, 330 + Form(form): Form<DeleteAdForm>, 331 + ) -> Result<Redirect, StatusCode> { 332 + let token = form.token.trim(); 333 + 334 + let rows_deleted = sqlx::query!("DELETE FROM Advertisement WHERE owner_token = ?", token) 335 + .execute(&state.db) 336 + .await 337 + .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; 338 + 339 + if rows_deleted.rows_affected() == 0 { 340 + return Err(StatusCode::NOT_FOUND); 341 + } 342 + 343 + Ok(Redirect::to("/?delete-success=true")) 344 + } 345 + 346 + #[tokio::main] 347 + async fn main() -> Result<(), sqlx::Error> { 348 + let database_url = env::var("DATABASE_URL").unwrap_or("sqlite://kryptori.db".to_string()); 349 + let pool = SqlitePoolOptions::new() 350 + .connect(&database_url) 351 + .await?; 352 + 353 + create_tables_if_not_exist(&pool).await?; 354 + 355 + let state = Arc::new(AppState { db: pool }); 356 + 357 + let app = Router::new() 358 + .route("/", get(index)) 359 + .route("/create-ad", axum::routing::post(create_ad)) 360 + .route("/manage-ad", axum::routing::get(manage_ad)) 361 + .route("/update-ad", axum::routing::post(update_ad)) 362 + .route("/delete-ad", axum::routing::post(delete_ad)) 363 + .with_state(state); 364 + 365 + let listener = tokio::net::TcpListener::bind("127.0.0.1:8000").await.unwrap(); 366 + println!("Listening on {}", listener.local_addr().unwrap()); 367 + axum::serve(listener, app).await.unwrap(); 368 + 369 + Ok(()) 370 + }