diff --git a/.gitignore b/.gitignore index 71d315e..e6f2d77 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ # These are backup files generated by rustfmt **/*.rs.bk + +# Rocket +Rocket.toml diff --git a/Cargo.lock b/Cargo.lock index 9042e0b..0ae6e43 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,20 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" + [[package]] name = "aead" version = "0.2.0" @@ -55,6 +70,24 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "atty" version = "0.2.14" @@ -78,6 +111,26 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "backtrace" +version = "0.3.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707b586e0e2f247cbde68cdd2c3ce69ea7b7be43e1c5b426e37c9319c4b9838e" +dependencies = [ + "addr2line", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base-x" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b20b618342cf9891c292c4f5ac2cde7287cc5c87e87e9c769d617793607dec1" + [[package]] name = "base64" version = "0.9.3" @@ -100,6 +153,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + [[package]] name = "bitflags" version = "1.2.1" @@ -172,6 +231,25 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time 0.1.44", + "winapi 0.3.9", +] + +[[package]] +name = "chunked_transfer" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7477065d45a8fe57167bf3cf8bcd3729b54cfcb81cca49bda2d038ea89ae82ca" + [[package]] name = "cloudabi" version = "0.0.3" @@ -190,6 +268,38 @@ dependencies = [ "bitflags", ] +[[package]] +name = "color-eyre" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2a5123db5af8349c41c43ed0e5dca1cd56c911ea0c4ce6e6ff30f159fa5d27e" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a99aa4aa18448eef4c7d3f86d2720d2d8cad5c860fe9ff9b279293efdc8f5be" +dependencies = [ + "ansi_term 0.11.0", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "const_fn" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce90df4c658c62f12d78f7508cf92f9173e5184a539c10bfe54a3107b3ffd0f2" + [[package]] name = "cookie" version = "0.11.3" @@ -203,7 +313,34 @@ dependencies = [ "percent-encoding 2.1.0", "rand 0.7.3", "sha2", - "time", + "time 0.1.44", +] + +[[package]] +name = "cookie" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1373a16a4937bc34efec7b391f9c1500c30b8478a701a4f44c9165cc0475a6e0" +dependencies = [ + "percent-encoding 2.1.0", + "time 0.2.22", + "version_check 0.9.2", +] + +[[package]] +name = "cookie_store" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3818dfca4b0cb5211a659bbcbb94225b7127407b2b135e650d717bfb78ab10d3" +dependencies = [ + "cookie 0.14.2", + "idna 0.2.0", + "log 0.4.11", + "publicsuffix", + "serde", + "serde_json", + "time 0.2.22", + "url 2.1.1", ] [[package]] @@ -282,6 +419,95 @@ dependencies = [ "generic-array", ] +[[package]] +name = "discard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" + +[[package]] +name = "encoding" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +dependencies = [ + "encoding-index-japanese", + "encoding-index-korean", + "encoding-index-simpchinese", + "encoding-index-singlebyte", + "encoding-index-tradchinese", +] + +[[package]] +name = "encoding-index-japanese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-korean" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-simpchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-singlebyte" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-tradchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding_index_tests" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" + +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check 0.9.2", +] + +[[package]] +name = "eyre" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c5cb4dc433c59f09df4b4450f649cbfed61e8a3505abe32e4154066439157e" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fake-simd" version = "0.1.2" @@ -341,6 +567,19 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +[[package]] +name = "generator" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cdc09201b2e8ca1b19290cf7e65de2246b8e91fb6874279722189c4de7b94dc" +dependencies = [ + "cc", + "libc", + "log 0.4.11", + "rustc_version", + "winapi 0.3.9", +] + [[package]] name = "generic-array" version = "0.12.3" @@ -370,6 +609,12 @@ dependencies = [ "polyval", ] +[[package]] +name = "gimli" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" + [[package]] name = "glob" version = "0.3.0" @@ -429,7 +674,7 @@ dependencies = [ "log 0.3.9", "mime", "num_cpus", - "time", + "time 0.1.44", "traitobject", "typeable", "unicase", @@ -443,9 +688,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cb014c4ea00486e2b62860b5e15229d37516d4924177218beafbf46583de3ab" dependencies = [ "hyper", - "rustls", + "rustls 0.17.0", "webpki", - "webpki-roots", + "webpki-roots 0.19.0", ] [[package]] @@ -470,6 +715,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indenter" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0bd112d44d9d870a6819eb505d04dd92b5e4d94bb8c304924a0872ae7016fb5" + [[package]] name = "indexmap" version = "1.6.0" @@ -594,6 +845,28 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "loom" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0e8460f2f2121162705187214720353c517b97bdfb3494c0b1e33d83ebe4bed" +dependencies = [ + "cfg-if 0.1.10", + "generator", + "scoped-tls", + "serde", + "serde_json", +] + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + [[package]] name = "matches" version = "0.1.8" @@ -615,6 +888,16 @@ dependencies = [ "log 0.3.9", ] +[[package]] +name = "miniz_oxide" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +dependencies = [ + "adler", + "autocfg 1.0.1", +] + [[package]] name = "mio" version = "0.6.22" @@ -687,6 +970,25 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "num-integer" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" +dependencies = [ + "autocfg 1.0.1", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" +dependencies = [ + "autocfg 1.0.1", +] + [[package]] name = "num_cpus" version = "1.13.0" @@ -697,6 +999,12 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37fd5004feb2ce328a52b0b3d01dbf4ffff72583493900ed15f22d4111c51693" + [[package]] name = "once_cell" version = "1.4.1" @@ -709,6 +1017,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +[[package]] +name = "owo-colors" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a1250cdd103eef6bd542b5ae82989f931fc00a41a27f60377338241594410f3" + [[package]] name = "parking_lot" version = "0.11.0" @@ -769,6 +1083,12 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +[[package]] +name = "pin-project-lite" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" + [[package]] name = "polyval" version = "0.3.3" @@ -794,6 +1114,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "proc-macro-hack" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99c605b9a0adc77b7211c6b1f722dcb613d68d66859a44f3d485a6da332b0598" + [[package]] name = "proc-macro2" version = "0.4.30" @@ -812,6 +1138,28 @@ dependencies = [ "unicode-xid 0.2.1", ] +[[package]] +name = "publicsuffix" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" +dependencies = [ + "error-chain", + "idna 0.2.0", + "lazy_static", + "regex", + "url 2.1.1", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding 2.1.0", +] + [[package]] name = "quote" version = "0.6.13" @@ -1003,6 +1351,31 @@ version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +[[package]] +name = "regex" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8963b85b8ce3074fecffde43b4b0dded83ce2f367dc8d363afc56679f3ee820b" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cab7a364d15cde1e505267766a2d3c4e22a843e1a601f0fa7564c0f82ced11c" + [[package]] name = "ring" version = "0.16.15" @@ -1033,7 +1406,7 @@ dependencies = [ "rocket_codegen", "rocket_http", "state", - "time", + "time 0.1.44", "toml", "version_check 0.9.2", "yansi", @@ -1068,6 +1441,7 @@ dependencies = [ "rocket_contrib_codegen", "serde", "serde_json", + "time 0.1.44", "uuid", ] @@ -1089,14 +1463,14 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aff5a5480175f2f553a876b251e9350c74196128806d176da3a51c82aab5428" dependencies = [ - "cookie", + "cookie 0.11.3", "hyper", "indexmap", "pear", "percent-encoding 1.0.1", "smallvec", "state", - "time", + "time 0.1.44", "unicode-xid 0.1.0", ] @@ -1116,6 +1490,21 @@ dependencies = [ "url 2.1.1", ] +[[package]] +name = "rustc-demangle" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + [[package]] name = "rustls" version = "0.17.0" @@ -1129,6 +1518,19 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustls" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81" +dependencies = [ + "base64 0.12.3", + "log 0.4.11", + "ring", + "sct", + "webpki", +] + [[package]] name = "ryu" version = "1.0.5" @@ -1159,6 +1561,12 @@ dependencies = [ "parking_lot", ] +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + [[package]] name = "scopeguard" version = "1.1.0" @@ -1175,6 +1583,21 @@ dependencies = [ "untrusted", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "serde" version = "1.0.117" @@ -1206,6 +1629,12 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" + [[package]] name = "sha2" version = "0.8.2" @@ -1218,6 +1647,16 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "sharded-slab" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4921be914e16899a80adefb821f8ddb7974e3f1250223575a44ed994882127" +dependencies = [ + "lazy_static", + "loom", +] + [[package]] name = "slab" version = "0.4.2" @@ -1236,12 +1675,70 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "standback" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e0831040d2cf2bdfd51b844be71885783d489898a192f254ae25d57cce725c" +dependencies = [ + "version_check 0.9.2", +] + [[package]] name = "state" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7345c971d1ef21ffdbd103a75990a15eb03604fc8b8852ca8cb418ee1a099028" +[[package]] +name = "stdweb" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" +dependencies = [ + "discard", + "rustc_version", + "stdweb-derive", + "stdweb-internal-macros", + "stdweb-internal-runtime", + "wasm-bindgen", +] + +[[package]] +name = "stdweb-derive" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "serde", + "serde_derive", + "syn 1.0.48", +] + +[[package]] +name = "stdweb-internal-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" +dependencies = [ + "base-x", + "proc-macro2 1.0.24", + "quote 1.0.7", + "serde", + "serde_derive", + "serde_json", + "sha1", + "syn 1.0.48", +] + +[[package]] +name = "stdweb-internal-runtime" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" + [[package]] name = "subtle" version = "1.0.0" @@ -1276,6 +1773,15 @@ dependencies = [ "unicode-xid 0.2.1", ] +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + [[package]] name = "time" version = "0.1.44" @@ -1287,6 +1793,44 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "time" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b7151c9065e80917fbf285d9a5d1432f60db41d170ccafc749a136b41a93af" +dependencies = [ + "const_fn", + "libc", + "standback", + "stdweb", + "time-macros", + "version_check 0.9.2", + "winapi 0.3.9", +] + +[[package]] +name = "time-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" +dependencies = [ + "proc-macro-hack", + "time-macros-impl", +] + +[[package]] +name = "time-macros-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" +dependencies = [ + "proc-macro-hack", + "proc-macro2 1.0.24", + "quote 1.0.7", + "standback", + "syn 1.0.48", +] + [[package]] name = "tinyvec" version = "0.3.4" @@ -1302,6 +1846,91 @@ dependencies = [ "serde", ] +[[package]] +name = "tracing" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27" +dependencies = [ + "cfg-if 0.1.10", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.48", +] + +[[package]] +name = "tracing-core" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-error" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4d7c0b83d4a500748fa5879461652b361edf5c9d51ede2a2ac03875ca185e24" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-log" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9" +dependencies = [ + "lazy_static", + "log 0.4.11", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2810660b9d5b18895d140caba6401765749a6a162e5d0736cfc44ea50db9d79d" +dependencies = [ + "ansi_term 0.12.1", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + [[package]] name = "traitobject" version = "0.1.0" @@ -1375,6 +2004,28 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "ureq" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed21e32e4e3ff89891022affaa7091c3a164d5049cb3872f1cf0fd6ccd9fc8f7" +dependencies = [ + "base64 0.13.0", + "chunked_transfer", + "cookie 0.14.2", + "cookie_store", + "encoding", + "log 0.4.11", + "once_cell", + "qstring", + "rustls 0.18.1", + "serde", + "serde_json", + "url 2.1.1", + "webpki", + "webpki-roots 0.20.0", +] + [[package]] name = "url" version = "1.7.2" @@ -1506,6 +2157,7 @@ checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" name = "wasmcloud-api" version = "0.1.0" dependencies = [ + "color-eyre", "diesel", "log 0.4.11", "rocket", @@ -1513,6 +2165,10 @@ dependencies = [ "rocket_oauth2", "serde", "serde_json", + "tracing", + "tracing-log", + "tracing-subscriber", + "ureq", "uuid", ] @@ -1545,6 +2201,15 @@ dependencies = [ "webpki", ] +[[package]] +name = "webpki-roots" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f20dea7535251981a9670857150d571846545088359b28e4951d350bdaf179f" +dependencies = [ + "webpki", +] + [[package]] name = "winapi" version = "0.2.8" diff --git a/Cargo.toml b/Cargo.toml index 1c7fb02..ca42b9c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,15 +7,20 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +color-eyre = "0.5" diesel = { version = "1", features = ["postgres", "r2d2", "uuidv07"] } +log = "0" rocket = "0.4" +rocket_oauth2 = "0.4" serde = { version = "^1", features = ["derive"] } serde_json = "^1" -log = "0" +tracing = "0.1" +tracing-subscriber = "0.2" +tracing-log = "0.1" +ureq = { version = "1", features = ["json", "charset"] } uuid = { version = "0.7", features = ["serde", "v4"] } -rocket_oauth2 = "0.4" [dependencies.rocket_contrib] version = "0.4" default-features = false -features = ["json", "diesel_postgres_pool", "uuid"] +features = ["json", "diesel_postgres_pool", "uuid", "helmet"] diff --git a/Rocket.toml b/Rocket.toml.example similarity index 100% rename from Rocket.toml rename to Rocket.toml.example diff --git a/migrations/2020-10-26-163220_within_user_admin/down.sql b/migrations/2020-10-26-163220_within_user_admin/down.sql deleted file mode 100644 index dcac559..0000000 --- a/migrations/2020-10-26-163220_within_user_admin/down.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM users WHERE id = '5e4f5bf1-5e73-4a36-b58e-36b6a3509e26'; diff --git a/migrations/2020-10-26-163220_within_user_admin/up.sql b/migrations/2020-10-26-163220_within_user_admin/up.sql deleted file mode 100644 index cfc80f7..0000000 --- a/migrations/2020-10-26-163220_within_user_admin/up.sql +++ /dev/null @@ -1,7 +0,0 @@ -INSERT INTO users (id, email, salutation, is_admin, is_locked) VALUES - ( '5e4f5bf1-5e73-4a36-b58e-36b6a3509e26' - , 'me@christine.website' - , 'Within' - , true - , false - ); diff --git a/migrations/2020-10-26-202745_gitea_tokens/down.sql b/migrations/2020-10-26-202745_gitea_tokens/down.sql new file mode 100644 index 0000000..291a97c --- /dev/null +++ b/migrations/2020-10-26-202745_gitea_tokens/down.sql @@ -0,0 +1 @@ +-- This file should undo anything in `up.sql` \ No newline at end of file diff --git a/migrations/2020-10-26-202745_gitea_tokens/up.sql b/migrations/2020-10-26-202745_gitea_tokens/up.sql new file mode 100644 index 0000000..fafd8b3 --- /dev/null +++ b/migrations/2020-10-26-202745_gitea_tokens/up.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS gitea_tokens + ( id UUID DEFAULT uuid_generate_v4() NOT NULL + , user_id UUID + , access_token VARCHAR NOT NULL + , refresh_token VARCHAR NOT NULL + , PRIMARY KEY (id) + , CONSTRAINT fk_user_id + FOREIGN KEY (user_id) + REFERENCES users(id) + ); diff --git a/shell.nix b/shell.nix index a9e0e44..f2e1cd1 100644 --- a/shell.nix +++ b/shell.nix @@ -2,8 +2,10 @@ let sources = import ./nix/sources.nix; rust = import ./nix/rust.nix { inherit sources; }; pkgs = import sources.nixpkgs { }; -in pkgs.mkShell { +in pkgs.mkShell rec { buildInputs = with pkgs; [ rust diesel-cli postgresql pgcli ]; - ROCKET_DATABASES = ''{ main_data = { url = "postgresql://postgres:hunter2@localhost:5432/wasmcloud" } }''; + DATABASE_URL = "postgresql://postgres:hunter2@localhost:5432/wasmcloud"; + ROCKET_DATABASES = '' + { main_data = { url = "${DATABASE_URL}" } }''; } diff --git a/src/gitea.rs b/src/gitea.rs new file mode 100644 index 0000000..87702c5 --- /dev/null +++ b/src/gitea.rs @@ -0,0 +1,28 @@ +use serde::{Deserialize, Serialize}; + +/// A user. +/// https://try.gitea.io/api/swagger#model-User +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct User { + pub avatar_url: String, + pub created: String, + pub email: String, + pub full_name: String, + pub id: i64, + pub is_admin: bool, + pub language: String, + pub last_login: String, + pub login: String, +} + +pub fn user(token: String) -> std::io::Result { + let resp = + ureq::get("https://tulpa.dev/api/v1/user") + .set("Authorization", &format!("bearer {}", token)) + .call(); + if !resp.ok() { + todo!("error here"); + } + let user: User = resp.into_json_deserialize()?; + Ok(user) +} diff --git a/src/main.rs b/src/main.rs index 74b6f6c..e833d57 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,16 +7,26 @@ extern crate rocket; #[macro_use] extern crate rocket_contrib; +use color_eyre::eyre::Result; use diesel::pg::PgConnection; use diesel::prelude::*; -use rocket_contrib::{json::Json, uuid::Uuid}; +use rocket::{ + http::{Cookie, Cookies, SameSite}, + response::Redirect, +}; +use rocket_contrib::{helmet::SpaceHelmet, json::Json, uuid::Uuid}; +use rocket_oauth2::{OAuth2, TokenResponse}; +pub mod gitea; pub mod models; pub mod schema; #[database("main_data")] struct MainDatabase(PgConnection); +struct Gitea; + +#[tracing::instrument(skip(conn))] #[get("/user/")] fn get_user(conn: MainDatabase, uuid: Uuid) -> Json { use schema::users::dsl::users; @@ -28,8 +38,57 @@ fn get_user(conn: MainDatabase, uuid: Uuid) -> Json { Json(result) } -fn main() { - rocket::ignite() - .attach(MainDatabase::fairing()) - .mount("/api", routes![get_user]).launch(); +#[tracing::instrument(skip(oauth2, cookies))] +#[get("/login/gitea")] +fn gitea_login(oauth2: OAuth2, mut cookies: Cookies<'_>) -> Redirect { + oauth2.get_redirect(&mut cookies, &[""]).unwrap() +} + +#[tracing::instrument(skip(conn, token, cookies))] +#[get("/auth/gitea")] +fn gitea_callback( + conn: MainDatabase, + token: TokenResponse, + mut cookies: Cookies<'_>, +) -> Redirect { + let tok = token.access_token().to_string(); + let refresh = token.refresh_token().unwrap().to_string(); + + let gitea_user = gitea::user(tok.clone()).exepct("gitea api call to work"); + + use schema::users::dsl::{users, email}; + let user: models::User = match users.filter(email.eq(gitea_user.email)).limit(1).load::(&conn) { + Ok(u) => u, + Err(why) => { + let u = models::User { + salutation: gitea_user.full_name, + email: gitea_user.email, + is_admin: gitea_user.is_admin, + } + } + }; + + // Set a private cookie with the access token + cookies.add_private( + Cookie::build("token", token.access_token().to_string()) + .same_site(SameSite::Lax) + .finish(), + ); + + Redirect::to("/") +} + +fn main() -> Result<()> { + color_eyre::install()?; + tracing_subscriber::fmt::init(); + + rocket::ignite() + .attach(OAuth2::::fairing("gitea")) + .attach(MainDatabase::fairing()) + .attach(SpaceHelmet::default()) + .mount("/api", routes![get_user]) + .mount("/", routes![gitea_login, gitea_callback]) + .launch(); + + Ok(()) } diff --git a/src/schema.rs b/src/schema.rs index 46b9539..87ce4da 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -1,3 +1,12 @@ +table! { + gitea_tokens (id) { + id -> Uuid, + user_id -> Nullable, + access_token -> Varchar, + refresh_token -> Varchar, + } +} + table! { users (id) { id -> Uuid, @@ -8,3 +17,10 @@ table! { tier -> Int4, } } + +joinable!(gitea_tokens -> users (user_id)); + +allow_tables_to_appear_in_same_query!( + gitea_tokens, + users, +);