diff --git a/Cargo.lock b/Cargo.lock index 907412621..ff30573d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,121 +2,320 @@ # It is not intended for manual editing. [[package]] name = "actix" -version = "0.7.9" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "actix_derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-signal 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "trust-dns-proto 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-resolver 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "actix-net" -version = "0.2.6" +name = "actix-codec" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-connect" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-openssl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-resolver 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-files" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "v_htmlescape 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-http" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-connect 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-threadpool 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-router" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytestring 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-rt" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-threadpool 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-server" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-openssl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tower-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-service" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-session" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-testing" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-server 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-threadpool" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-openssl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-utils" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-web" -version = "0.7.19" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-net 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "cookie 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-router 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-server 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-testing 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-threadpool 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web-codegen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "awc 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-openssl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "v_htmlescape 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-web-codegen" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix_derive" -version = "0.3.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -126,17 +325,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "aho-corasick" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "anyhow" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "arc-swap" version = "0.4.4" @@ -160,6 +354,16 @@ name = "arrayvec" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "async-trait" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "atty" version = "0.2.14" @@ -181,11 +385,34 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "backtrace" -version = "0.3.44" +name = "awc" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "backtrace" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace-sys 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", @@ -193,7 +420,7 @@ dependencies = [ [[package]] name = "backtrace-sys" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", @@ -209,23 +436,6 @@ dependencies = [ "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "base64" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "base64" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "base64" version = "0.11.0" @@ -312,20 +522,19 @@ name = "byteorder" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bytes" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bytestring" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "c2-chacha" version = "0.2.3" @@ -401,10 +610,7 @@ name = "cookie" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -431,18 +637,23 @@ dependencies = [ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "copyless" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "core-foundation" -version = "0.6.4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "core-foundation-sys" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -488,10 +699,11 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.3.9" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -545,15 +757,6 @@ name = "crossbeam-utils" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "crossbeam-utils" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -601,7 +804,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -612,7 +815,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "darling_core 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -624,7 +827,7 @@ dependencies = [ "darling 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "derive_builder_core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -635,7 +838,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "darling 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "derive_more" +version = "0.99.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -677,63 +890,6 @@ name = "either" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "encoding" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "encoding-index-japanese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "encoding-index-korean" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "encoding-index-simpchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "encoding-index-singlebyte" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "encoding-index-tradchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "encoding_index_tests" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "encoding_rs" version = "0.8.22" @@ -742,6 +898,17 @@ dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "enum-as-inner" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "env_logger" version = "0.6.2" @@ -754,14 +921,6 @@ dependencies = [ "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "error-chain" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "error-chain" version = "0.12.2" @@ -772,20 +931,20 @@ dependencies = [ [[package]] name = "failure" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure_derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -807,7 +966,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fancy-regex" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -822,7 +981,6 @@ dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -863,11 +1021,6 @@ name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "futures" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "futures" version = "0.3.4" @@ -896,15 +1049,6 @@ name = "futures-core" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "futures-cpupool" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "futures-executor" version = "0.3.4" @@ -927,7 +1071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -959,6 +1103,14 @@ dependencies = [ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "generic-array" version = "0.8.3" @@ -980,24 +1132,7 @@ dependencies = [ [[package]] name = "h2" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "h2" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1009,13 +1144,13 @@ dependencies = [ "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "half" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1041,21 +1176,12 @@ dependencies = [ [[package]] name = "hostname" -version = "0.1.5" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "http" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "match_cfg 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1092,14 +1218,14 @@ dependencies = [ [[package]] name = "hyper" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1108,7 +1234,7 @@ dependencies = [ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1119,9 +1245,9 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1178,14 +1304,13 @@ dependencies = [ [[package]] name = "ipconfig" -version = "0.1.9" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", - "widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "widestring 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1203,25 +1328,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.35" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kanidm" version = "0.1.1" dependencies = [ - "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-web 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-files 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-session 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "concread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "cookie 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "idlset 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "kanidm_proto 0.1.1", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1242,7 +1368,7 @@ dependencies = [ "sshkeys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "zxcvbn 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1251,17 +1377,17 @@ dependencies = [ name = "kanidm_client" version = "0.1.1" dependencies = [ - "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "kanidm 0.1.1", "kanidm_proto 0.1.1", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "reqwest 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1269,7 +1395,6 @@ dependencies = [ name = "kanidm_proto" version = "0.1.1" dependencies = [ - "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1298,7 +1423,7 @@ dependencies = [ name = "kanidm_unix_int" version = "0.1.1" dependencies = [ - "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1309,14 +1434,14 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "r2d2 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)", "r2d2_sqlite 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "reqwest 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rusqlite 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_cbor 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1340,11 +1465,6 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" version = "0.2.67" @@ -1379,7 +1499,7 @@ name = "lock_api" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "owning_ref 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1415,6 +1535,11 @@ dependencies = [ "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "matches" version = "0.1.8" @@ -1450,22 +1575,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "mime_guess" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "miniz-sys" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "miniz_oxide" version = "0.3.6" @@ -1535,7 +1651,7 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1545,8 +1661,8 @@ dependencies = [ "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1701,7 +1817,7 @@ dependencies = [ [[package]] name = "owning_ref" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1714,7 +1830,7 @@ dependencies = [ "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "kanidm_unix_int 0.1.1", "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1726,25 +1842,6 @@ dependencies = [ "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parking_lot" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "parking_lot" version = "0.10.0" @@ -1766,32 +1863,6 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parking_lot_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot_core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "parking_lot_core" version = "0.7.0" @@ -1821,7 +1892,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1849,7 +1920,7 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1873,10 +1944,10 @@ name = "plotters" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1890,7 +1961,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1942,7 +2013,7 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2162,9 +2233,9 @@ name = "regex" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2178,7 +2249,7 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.14" +version = "0.6.16" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2191,7 +2262,7 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.10.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2203,47 +2274,50 @@ dependencies = [ "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-tls 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "resolv-conf" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ring" -version = "0.13.5" +version = "0.16.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2305,11 +2379,6 @@ name = "safemem" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "same-file" version = "1.0.6" @@ -2347,21 +2416,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "security-framework" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework-sys" -version = "0.3.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2391,7 +2461,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "half 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "half 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2401,7 +2471,7 @@ version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2415,17 +2485,6 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "serde_urlencoded" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "serde_urlencoded" version = "0.6.1" @@ -2501,8 +2560,8 @@ dependencies = [ ] [[package]] -name = "sourcefile" -version = "0.1.4" +name = "spin" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2520,14 +2579,6 @@ name = "stable_deref_trait" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "string" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "strsim" version = "0.9.3" @@ -2569,7 +2620,7 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2579,7 +2630,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2629,6 +2680,14 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "threadpool" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "time" version = "0.1.42" @@ -2650,30 +2709,7 @@ dependencies = [ [[package]] name = "tokio" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-fs 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-uds 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2690,159 +2726,27 @@ dependencies = [ "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tokio-codec" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-current-thread" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-executor" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-fs" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-io" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tokio-macros" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-openssl" -version = "0.2.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-reactor" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-signal" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-sync" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-threadpool" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-timer" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2850,39 +2754,8 @@ name = "tokio-tls" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-udp" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-uds" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2895,7 +2768,7 @@ dependencies = [ "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2906,14 +2779,6 @@ dependencies = [ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tower-service" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tower-service" version = "0.3.0" @@ -2921,66 +2786,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "trust-dns-proto" -version = "0.5.0" +version = "0.18.0-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "async-trait 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", + "enum-as-inner 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "trust-dns-proto" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trust-dns-resolver" -version = "0.10.3" +version = "0.18.0-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "ipconfig 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ipconfig 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "resolv-conf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "resolv-conf 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3039,7 +2877,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "untrusted" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3047,7 +2885,6 @@ name = "url" version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3087,7 +2924,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3141,104 +2978,78 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.58" +version = "0.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "wasm-bindgen-webidl" -version = "0.2.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "web-sys" -version = "0.3.35" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", - "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "weedle" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "widestring" -version = "0.2.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3278,14 +3089,6 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "winreg" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "winreg" version = "0.6.2" @@ -3294,14 +3097,6 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "winutil" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3318,7 +3113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "derive_builder 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "fancy-regex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "fancy-regex 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3328,26 +3123,39 @@ dependencies = [ ] [metadata] -"checksum actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6c616db5fa4b0c40702fb75201c2af7f8aa8f3a2e2c1dda3b0655772aa949666" -"checksum actix-net 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8bebfbe6629e0131730746718c9e032b58f02c6ce06ed7c982b9fef6c8545acd" -"checksum actix-web 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)" = "b0ac60f86c65a50b140139f499f4f7c6e49e4b5d88fbfba08e4e3975991f7bf4" -"checksum actix_derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4300e9431455322ae393d43a2ba1ef96b8080573c0fc23b196219efedfb6ba69" +"checksum actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4af87564ff659dee8f9981540cac9418c45e910c8072fdedd643a262a38fcaf" +"checksum actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09e55f0a5c2ca15795035d90c46bd0e73a5123b72f68f12596d6ba5282051380" +"checksum actix-connect 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c95cc9569221e9802bf4c377f6c18b90ef10227d787611decf79fd47d2a8e76c" +"checksum actix-files 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "301482841d3d74483a446ead63cb7d362e187d2c8b603f13d91995621ea53c46" +"checksum actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c16664cc4fdea8030837ad5a845eb231fb93fc3c5c171edfefb52fad92ce9019" +"checksum actix-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "21705adc76bbe4bc98434890e73a89cd00c6015e5704a60bb6eea6c3b72316b6" +"checksum actix-router 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9d7a10ca4d94e8c8e7a87c5173aba1b97ba9a6563ca02b0e1cd23531093d3ec8" +"checksum actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6a0a55507046441a496b2f0d26a84a65e67c8cafffe279072412f624b5fb6d" +"checksum actix-server 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "582a7173c281a4f46b5aa168a11e7f37183dcb71177a39312cc2264da7a632c9" +"checksum actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d3e4fc95dfa7e24171b2d0bb46b85f8ab0e8499e4e3caec691fc4ea65c287564" +"checksum actix-session 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca833a08799c95281204f9cc76223da4d12d2caa03de24362b3e268c60da328c" +"checksum actix-testing 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "48494745b72d0ea8ff0cf874aaf9b622a3ee03d7081ee0c04edea4f26d32c911" +"checksum actix-threadpool 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf4082192601de5f303013709ff84d81ca6a1bc4af7fb24f367a500a23c6e84e" +"checksum actix-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4e5b4faaf105e9a6d389c606c298dcdb033061b00d532af9df56ff3a54995a8" +"checksum actix-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fcf8f5631bf01adec2267808f00e228b761c60c0584cc9fa0b5364f41d147f4e" +"checksum actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3158e822461040822f0dbf1735b9c2ce1f95f93b651d7a7aded00b1efbb1f635" +"checksum actix-web-codegen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f00371942083469785f7e28c540164af1913ee7c96a4534acb9cea92c39f057" +"checksum actix_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b95aceadaf327f18f0df5962fedc1bde2f870566a0b9f65c89508a3b1f79334c" "checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" -"checksum aho-corasick 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)" = "743ad5a418686aad3b87fd14c43badd828cf26e214a00f92a384291cf22e1811" -"checksum anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" +"checksum aho-corasick 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d5e63fd144e18ba274ae7095c0197a870a7b9468abc801dd62f190d80817d2ec" "checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" "checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" "checksum arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" "checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" +"checksum async-trait 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "750b1c38a1dfadd108da0f01c08f4cdc7ff1bb39b325f9c82cc972361780a6e1" "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e4036b9bf40f3cf16aba72a3d65e8a520fc4bafcdc7079aea8f848c58c5b5536" -"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" -"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" +"checksum awc 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d7601d4d1d7ef2335d6597a41b5fe069f6ab799b85f53565ab390e7b7065aac5" +"checksum backtrace 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)" = "ad235dabf00f36301792cfe82499880ba54c6486be094d1047b02bacb67c14e8" +"checksum backtrace-sys 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "e17b52e737c40a7d75abca20b29a19a0eb7ba9fc72c5a72dd282a0a3c2c0dc35" "checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" "checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" -"checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" "checksum bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e84c238982c4b1e1ee668d136c510c67a13465279c0cb367ea6baf6310620a80" "checksum bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb" "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" @@ -3359,8 +3167,8 @@ dependencies = [ "checksum bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" -"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" +"checksum bytestring 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fc267467f58ef6cc8874064c62a0423eb0d099362c8a23edd1c6d044f46eead4" "checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" "checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" "checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" @@ -3373,18 +3181,18 @@ dependencies = [ "checksum cookie 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d9fac5e7bdefb6160fb181ee0eaa6f96704b625c70e6d61c465cb35750a4ea12" "checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" "checksum cookie_store 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3d3b52e7c82f1af00203337cd15c56be6fac37397a26439d03cedbbdbc487ef" -"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" -"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" +"checksum copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff9c56c9fb2a49c05ef0e431485a22400af20d33226dc0764d891d09e724127" +"checksum core-foundation 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +"checksum core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum criterion 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1fc755679c12bda8e5523a71e4d654b6bf2e14bd838dfc48cde6559a05caf7d1" "checksum criterion-plot 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a01e15e0ea58e8234f96146b1f91fa9d0e4dd7a38da93ff7a75d42c0b9d3a545" -"checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" +"checksum crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" "checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" "checksum crossbeam-epoch 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "30fecfcac6abfef8771151f8be4abc9e4edc112c2bcb233314cafde2680536e9" "checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" "checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" "checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015" -"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" "checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" "checksum csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" "checksum csv-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" @@ -3393,28 +3201,22 @@ dependencies = [ "checksum darling_macro 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" "checksum derive_builder 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" "checksum derive_builder_core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" +"checksum derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a806e96c59a76a5ba6e18735b6cf833344671e61e7863f2edb5c518ea2cac95c" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" "checksum dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" "checksum dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" "checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" -"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" -"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" -"checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" -"checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" -"checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" -"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" -"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" "checksum encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)" = "cd8d03faa7fe0c1431609dfad7bbe827af30f82e1e2ae6f7ee4fca6bd764bc28" +"checksum enum-as-inner 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4bfcfacb61d231109d1d55202c1f33263319668b168843e02ad4652725ec9c" "checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" "checksum error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" -"checksum error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6930e04918388a9a2e41d518c25cf679ccafe26733fb4127dbf21993f2575d46" -"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" -"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" +"checksum failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b8529c2421efa3066a5cbd8063d2244603824daccb6936b079010bb2aa89464b" +"checksum failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" "checksum fallible-streaming-iterator 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" -"checksum fancy-regex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5e0626a241d18e88e899f9f17e55825c7136c509b8ff7315b8e2aff28d4d98a3" +"checksum fancy-regex 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b0e2de1b89ad299d536b7cefc5d177f5c005957fa2266ce58eca4d189e74bff5" "checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" @@ -3422,32 +3224,29 @@ dependencies = [ "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" "checksum futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780" "checksum futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" "checksum futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" -"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" "checksum futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" "checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" "checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" "checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" "checksum futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" +"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" "checksum generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" "checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" -"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" -"checksum h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9433d71e471c1736fd5a61b671fc0b148d7a2992f666c958d03cd8feb3b88d1" -"checksum half 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20d6a47d6e4b8559729f58287efa8e6f767e603c068fea7a5e4d9f1cebe2bebb" +"checksum h2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9d5c295d1c0c68e4e42003d75f908f5e16a1edd1cbe0b0d02e4dc2006a384f47" +"checksum half 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f36b5f248235f45773d4944f555f83ea61fe07b18b561ccf99d7483d7381e54d" "checksum hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8" -"checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" -"checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" +"checksum hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" "checksum http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b708cc7f06493459026f53b9a61a7a121a5d1ec6238dee58ea4941132b30156b" "checksum http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -"checksum hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1c527bbc634be72aa7ba31e4e4def9bbb020f5416916279b7c705cd838893e" +"checksum hyper 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e7b15203263d1faa615f9337d79c1d37959439dc46c2b4faab33286fadc2a1c5" "checksum hyper-tls 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3adcd308402b9553630734e9c36b77a7e48b3821251ca2493e8cd596763aafaa" "checksum ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" "checksum idlset 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d59c025084ac7b4c3a3e9f915080ef650359319620bace08e3b2bc180c27f4d5" @@ -3455,14 +3254,13 @@ dependencies = [ "checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" "checksum indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -"checksum ipconfig 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "08f7eadeaf4b52700de180d147c4805f199854600b36faa963d91114827b2ffc" +"checksum ipconfig 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa79fa216fbe60834a9c0737d7fcd30425b32d1c58854663e24d4c4b328ed83f" "checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" "checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" -"checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" +"checksum js-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1cb931d43e71f560c81badb0191596562bafad2be06a3f9025b845c847c60df5" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)" = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018" "checksum libnss 0.2.0 (git+https://github.com/csnewman/libnss-rs.git?rev=eab2d93d2438652773699b0807d558ce75b1e748)" = "" "checksum libsqlite3-sys 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e5b95e89c330291768dc840238db7f9e204fd208511ab6319b56193a7f2ae25" @@ -3472,21 +3270,21 @@ dependencies = [ "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" "checksum lru 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "5d8f669d42c72d18514dfca8115689c5f6370a17d980cb5bd777a67f404594c8" "checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +"checksum match_cfg 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" "checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" "checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599" -"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" "checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" "checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" "checksum mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "396aa0f2003d7df8395cb93e09871561ccc3e785f0acb369170e8cc74ddf9226" -"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" +"checksum native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" @@ -3502,14 +3300,10 @@ dependencies = [ "checksum openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)" = "973293749822d7dd6370d6da1e523b0d1db19f06c459134c658b2a4261378b52" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" "checksum openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)" = "1024c0a59774200a555087a6da3f253a9095a5f344e353b212ac4c8b8e450986" -"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" +"checksum owning_ref 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" "checksum parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" -"checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" -"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" -"checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" "checksum parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1" "checksum paste 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "63e1afe738d71b1ebab5f1207c055054015427dbfc7bbe9ee1266894156ec046" "checksum paste-impl 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc4a7f6f743211c5aab239640a65091535d97d43d92a52bca435a640892bb" @@ -3529,7 +3323,7 @@ dependencies = [ "checksum publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" "checksum r2d2 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1497e40855348e4a8a40767d8e55174bce1e445a3ac9254ad44ad468ee0485af" "checksum r2d2_sqlite 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "806e268035ce9e5a604bf617ac8a073ef28b59ef2e48e8338db0baf530caef33" "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" @@ -3554,11 +3348,11 @@ dependencies = [ "checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" "checksum regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" "checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" -"checksum regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "b28dfe3fe9badec5dbf0a79a9cccad2cfc2ab5484bdb3e44cbd1ae8b3ba2be06" +"checksum regex-syntax 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "1132f845907680735a84409c3bebc64d1364a5683ffbce899550cd09d5eaefc1" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" -"checksum reqwest 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bae3fc32eacd4a5200c6b34bd6c057b07fb64f5a1e55bb67d624cc1393354621" -"checksum resolv-conf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b263b4aa1b5de9ffc0054a2386f96992058bb6870aab516f8cdeb8a667d56dcb" -"checksum ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2c4db68a2e35f3497146b7e4563df7d4773a2433230c5e4b448328e31740458a" +"checksum reqwest 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)" = "02b81e49ddec5109a9dcfc5f2a317ff53377c915e9ae9d4f2fb50914b85614e2" +"checksum resolv-conf 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "11834e137f3b14e309437a8276714eed3a80d1ef894869e510f2c0c0b98b9f4a" +"checksum ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)" = "741ba1704ae21999c00942f9f5944f801e977f54302af346b596287599ad1862" "checksum rpassword 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "177b45ffb3ad20daed91c936e4670f008a8bc4af771aa9103d73e784da733879" "checksum rusqlite 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2a194373ef527035645a1bc21b10dc2125f73497e6e155771233eb187aedd051" "checksum rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" @@ -3566,21 +3360,19 @@ dependencies = [ "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" -"checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" "checksum schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "507a9e6e8ffe0a4e0ebb9a10293e62fdf7657c06f1b8bb07a8fcf697d2abf295" "checksum scheduled-thread-pool 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f5de7bc31f28f8e6c28df5e1bf3d10610f5fdc14cc95f272853512c70a2bd779" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -"checksum security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df" -"checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895" +"checksum security-framework 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "97bbedbe81904398b6ebb054b3e912f99d55807125790f3198ac990d98def5b0" +"checksum security-framework-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "06fd2f23e31ef68dd2328cc383bd493142e46107a3a0e24f7d734e3f3b80fe4c" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" "checksum serde_cbor 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7081ed758ec726a6ed8ee7e92f5d3f6e6f8c3901b1f972e3a4a2f2599fad14f" "checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" "checksum serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" -"checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" "checksum serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" @@ -3590,10 +3382,9 @@ dependencies = [ "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" "checksum smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" "checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" -"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" +"checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" "checksum sshkeys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1b37f3de188a88f21cd5bd70072e85261e683850c749cd9f93b858e1cdac3a67" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" -"checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" "checksum strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" "checksum structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7" "checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107" @@ -3605,33 +3396,18 @@ dependencies = [ "checksum termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a" "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" "checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" "checksum tinytemplate 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "57a3c6667d3e65eb1bc3aed6fd14011c6cbc3a0665218ab7f5daf040b9ec371a" -"checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -"checksum tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8fdd17989496f49cdc57978c96f0c9fe5e4a58a8bddc6813c449a4624f6a030b" -"checksum tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" -"checksum tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" -"checksum tokio-executor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" -"checksum tokio-fs 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" -"checksum tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" -"checksum tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f4b1e7ed7d5d4c2af3d999904b0eebe76544897cdbfb2b9684bed2174ab20f7c" -"checksum tokio-openssl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4646ae1fd623393de3d796ea53af75acd02938dd5579544fbd6d236d041978a6" -"checksum tokio-reactor 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" -"checksum tokio-signal 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c34c6e548f101053321cba3da7cbb87a610b85555884c41b07da2eb91aff12" -"checksum tokio-sync 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" -"checksum tokio-tcp 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" -"checksum tokio-threadpool 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" -"checksum tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" +"checksum tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "0fa5e81d6bc4e67fe889d5783bd2a128ab2e0cfa487e0be16b6a8d177b101616" +"checksum tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" +"checksum tokio-openssl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c4b08c5f4208e699ede3df2520aca2e82401b2de33f45e96696a074480be594" "checksum tokio-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7bde02a3a5291395f59b06ec6945a3077602fac2b07eeeaf0dee2122f3619828" -"checksum tokio-udp 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" -"checksum tokio-uds 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "5076db410d6fdc6523df7595447629099a1fdc47b3d9f896220780fa48faf798" "checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" "checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" -"checksum tower-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b32f72af77f1bfe3d3d4da8516a238ebe7039b51dd8637a09841ac7f16d2c987" "checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" -"checksum trust-dns-proto 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0838272e89f1c693b4df38dc353412e389cf548ceed6f9fd1af5a8d6e0e7cf74" -"checksum trust-dns-proto 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "09144f0992b0870fa8d2972cc069cbf1e3c0fda64d1f3d45c4d68d0e0b52ad4e" -"checksum trust-dns-resolver 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8a9f877f7a1ad821ab350505e1f1b146a4960402991787191d6d8cab2ce2de2c" +"checksum trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2a7f3a2ab8a919f5eca52a468866a67ed7d3efa265d48a652a9a3452272b413f" +"checksum trust-dns-resolver 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6f90b1502b226f8b2514c6d5b37bafa8c200d7ca4102d57dc36ee0f3b7a04a2f" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" "checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" "checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" @@ -3641,7 +3417,7 @@ dependencies = [ "checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" +"checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" "checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" @@ -3654,24 +3430,20 @@ dependencies = [ "checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" "checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" "checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -"checksum wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" -"checksum wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" -"checksum wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8bbdd49e3e28b40dec6a9ba8d17798245ce32b019513a845369c641b275135d9" -"checksum wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "574094772ce6921576fb6f2e3f7497b8a76273b6db092be18fc48a082de09dc3" -"checksum wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "e85031354f25eaebe78bb7db1c3d86140312a911a106b2e29f9cc440ce3e7668" -"checksum wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e7e61fc929f4c0dddb748b102ebf9f632e2b8d739f2016542b4de2965a9601" -"checksum wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "ef012a0d93fc0432df126a8eaf547b2dce25a8ce9212e1d3cbeef5c11157975d" -"checksum web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" -"checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" -"checksum widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7157704c2e12e3d2189c507b7482c52820a16dfa4465ba91add92f266667cadb" +"checksum wasm-bindgen 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "3557c397ab5a8e347d434782bcd31fc1483d927a6826804cec05cc792ee2519d" +"checksum wasm-bindgen-backend 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "e0da9c9a19850d3af6df1cb9574970b566d617ecfaf36eb0b706b6f3ef9bd2f8" +"checksum wasm-bindgen-futures 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "457414a91863c0ec00090dba537f88ab955d93ca6555862c29b6d860990b8a8a" +"checksum wasm-bindgen-macro 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "0f6fde1d36e75a714b5fe0cffbb78978f222ea6baebb726af13c78869fdb4205" +"checksum wasm-bindgen-macro-support 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "25bda4168030a6412ea8a047e27238cadf56f0e53516e1e83fec0a8b7c786f6d" +"checksum wasm-bindgen-shared 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "fc9f36ad51f25b0219a3d4d13b90eb44cd075dff8b6280cca015775d7acaddd8" +"checksum web-sys 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)" = "721c6263e2c66fd44501cc5efbfa2b7dfa775d13e4ea38c46299646ed1f9c70a" +"checksum widestring 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effc0e4ff8085673ea7b9b2e3c73f6bd4d118810c9009ed8f1e16bd96c331db6" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a" "checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" -"checksum winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum zxcvbn 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a7b69cd8a6484379ef04457ba1c00aaadad166c693b1b6a625b01bcc694b212b" diff --git a/kanidm_client/Cargo.toml b/kanidm_client/Cargo.toml index 853776169..66c2dad77 100644 --- a/kanidm_client/Cargo.toml +++ b/kanidm_client/Cargo.toml @@ -20,7 +20,7 @@ serde_derive = "1.0" toml = "0.5" [dev-dependencies] -tokio = "0.1" -actix = "0.7" +tokio = "0.2" +actix = "0.9" kanidm = { path = "../kanidmd", version = "0.1" } -futures = "0.1" +futures = "0.3" diff --git a/kanidm_client/src/asynchronous.rs b/kanidm_client/src/asynchronous.rs index d47048b3f..7b14a6124 100644 --- a/kanidm_client/src/asynchronous.rs +++ b/kanidm_client/src/asynchronous.rs @@ -1,5 +1,6 @@ -use crate::{ClientError, KanidmClientBuilder}; +use crate::{ClientError, KanidmClientBuilder, APPLICATION_JSON}; use reqwest; +use reqwest::header::CONTENT_TYPE; use serde::de::DeserializeOwned; use serde::Serialize; @@ -29,6 +30,7 @@ impl KanidmAsyncClient { .client .post(dest.as_str()) .body(req_string) + .header(CONTENT_TYPE, APPLICATION_JSON) .send() .await .map_err(ClientError::Transport)?; @@ -59,6 +61,7 @@ impl KanidmAsyncClient { let response = self .client .put(dest.as_str()) + .header(CONTENT_TYPE, APPLICATION_JSON) .body(req_string) .send() .await diff --git a/kanidm_client/src/lib.rs b/kanidm_client/src/lib.rs index 2cf3915a7..bec6abf82 100644 --- a/kanidm_client/src/lib.rs +++ b/kanidm_client/src/lib.rs @@ -5,6 +5,7 @@ extern crate log; use reqwest; +use reqwest::header::CONTENT_TYPE; use serde::de::DeserializeOwned; use serde::Serialize; use serde_derive::Deserialize; @@ -28,6 +29,8 @@ pub mod asynchronous; use crate::asynchronous::KanidmAsyncClient; +pub static APPLICATION_JSON: &'static str = "application/json"; + #[derive(Debug)] pub enum ClientError { Unauthorized, @@ -295,6 +298,7 @@ impl KanidmClient { let response = self .client .post(dest.as_str()) + .header(CONTENT_TYPE, APPLICATION_JSON) .body(req_string) .send() .map_err(ClientError::Transport)?; @@ -322,6 +326,7 @@ impl KanidmClient { let response = self .client .put(dest.as_str()) + .header(CONTENT_TYPE, APPLICATION_JSON) .body(req_string) .send() .map_err(ClientError::Transport)?; @@ -550,6 +555,7 @@ impl KanidmClient { .attrs .insert("name".to_string(), vec![name.to_string()]); self.perform_post_request("/v1/group", new_group) + .map(|_: OperationResponse| ()) } // ==== accounts @@ -568,6 +574,7 @@ impl KanidmClient { .attrs .insert("displayname".to_string(), vec![dn.to_string()]); self.perform_post_request("/v1/account", new_acct) + .map(|_: OperationResponse| ()) } pub fn idm_account_set_displayname(&self, id: &str, dn: &str) -> Result<(), ClientError> { diff --git a/kanidm_client/tests/proto_v1_test.rs b/kanidm_client/tests/proto_v1_test.rs index 4508b6c3f..c83a7bb44 100644 --- a/kanidm_client/tests/proto_v1_test.rs +++ b/kanidm_client/tests/proto_v1_test.rs @@ -44,7 +44,8 @@ fn run_test(test_fn: fn(KanidmClient) -> ()) { // This appears to be bind random ... // let srv = srv.bind("127.0.0.1:0").unwrap(); let _ = tx.send(System::current()); - }); + }) + .expect("unable to start system"); }); let sys = rx.recv().unwrap(); System::set_current(sys.clone()); diff --git a/kanidm_proto/Cargo.toml b/kanidm_proto/Cargo.toml index 7788dc1e4..13990ccc5 100644 --- a/kanidm_proto/Cargo.toml +++ b/kanidm_proto/Cargo.toml @@ -13,7 +13,7 @@ repository = "https://github.com/kanidm/kanidm/" serde = "1.0" serde_derive = "1.0" uuid = { version = "0.7", features = ["serde", "v4"] } -actix = { version = "0.7", optional = true } +# actix = { version = "0.9", optional = true } zxcvbn = { version = "2.0", features = ["ser"] } [dev-dependencies] diff --git a/kanidm_unix_int/Cargo.toml b/kanidm_unix_int/Cargo.toml index 0048df3ec..3299da510 100644 --- a/kanidm_unix_int/Cargo.toml +++ b/kanidm_unix_int/Cargo.toml @@ -43,9 +43,6 @@ path = "src/test_auth.rs" kanidm_client = { path = "../kanidm_client", version = "0.1" } kanidm_proto = { path = "../kanidm_proto", version = "0.1" } kanidm = { path = "../kanidmd" } -# actix = { path = "../../actix", version = "0.9" } -actix = "0.7" -# actix-rt = "1.0" toml = "0.5" rpassword = "0.4" tokio = { version = "0.2", features=["full"] } @@ -69,3 +66,4 @@ reqwest = { version = "0.10" } [dev-dependencies] kanidm = { path = "../kanidmd", version = "0.1" } +actix = "0.9" diff --git a/kanidm_unix_int/tests/cache_layer_test.rs b/kanidm_unix_int/tests/cache_layer_test.rs index a069db653..85a870f47 100644 --- a/kanidm_unix_int/tests/cache_layer_test.rs +++ b/kanidm_unix_int/tests/cache_layer_test.rs @@ -40,7 +40,8 @@ fn run_test(fix_fn: fn(&KanidmClient) -> (), test_fn: fn(CacheLayer, KanidmAsync System::run(move || { create_server_core(config); let _ = tx.send(System::current()); - }); + }) + .expect("Failed to start system"); }); let sys = rx.recv().unwrap(); System::set_current(sys.clone()); diff --git a/kanidmd/Cargo.toml b/kanidmd/Cargo.toml index e56909786..125a3298e 100644 --- a/kanidmd/Cargo.toml +++ b/kanidmd/Cargo.toml @@ -28,10 +28,11 @@ path = "src/server/main.rs" [dependencies] kanidm_proto = { path = "../kanidm_proto", version = "0.1" } -actix = "0.7" -actix-web = { version = "0.7", features = ["ssl"] } +actix = "0.9" +actix-web = { version = "2.0", features = ["openssl"] } +actix-session = "0.3" +actix-files = "0.2" -bytes = "0.4" log = "0.4" env_logger = "0.6" rand = "0.6" @@ -42,8 +43,8 @@ regex = "1" lazy_static = "1.2.0" lru = "0.1" -tokio = "0.1" -futures = "0.1" +tokio = "0.2" +futures = "0.3" uuid = { version = "0.7", features = ["serde", "v4" ] } serde = "1.0" serde_cbor = "0.10" diff --git a/kanidmd/src/lib/core.rs b/kanidmd/src/lib/core.rs deleted file mode 100644 index c1f1449d6..000000000 --- a/kanidmd/src/lib/core.rs +++ /dev/null @@ -1,2077 +0,0 @@ -// use actix::SystemRunner; -use actix::Actor; -use actix_web::middleware::session::{self, RequestSession}; -use actix_web::Path; -use actix_web::{ - error, http, middleware, App, Error, HttpMessage, HttpRequest, HttpResponse, Result, State, -}; - -use bytes::BytesMut; -use futures::{future, Future, Stream}; -use std::sync::Arc; -use time::Duration; - -use crate::config::Configuration; - -// SearchResult -use crate::actors::v1_read::QueryServerReadV1; -use crate::actors::v1_read::{ - AuthMessage, IdmAccountUnixAuthMessage, InternalRadiusReadMessage, - InternalRadiusTokenReadMessage, InternalSearchMessage, InternalSshKeyReadMessage, - InternalSshKeyTagReadMessage, InternalUnixGroupTokenReadMessage, - InternalUnixUserTokenReadMessage, SearchMessage, WhoamiMessage, -}; -use crate::actors::v1_write::QueryServerWriteV1; -use crate::actors::v1_write::{ - AppendAttributeMessage, CreateMessage, DeleteMessage, IdmAccountSetPasswordMessage, - IdmAccountUnixExtendMessage, IdmAccountUnixSetCredMessage, IdmGroupUnixExtendMessage, - InternalCredentialSetMessage, InternalDeleteMessage, InternalRegenerateRadiusMessage, - InternalSshKeyCreateMessage, ModifyMessage, PurgeAttributeMessage, RemoveAttributeValueMessage, - SetAttributeMessage, -}; -use crate::async_log; -use crate::audit::AuditScope; -use crate::be::{Backend, BackendTransaction}; -use crate::crypto::setup_tls; -use crate::filter::{Filter, FilterInvalid}; -use crate::idm::server::IdmServer; -use crate::interval::IntervalActor; -use crate::schema::Schema; -use crate::schema::SchemaTransaction; -use crate::server::QueryServer; -use crate::utils::SID; -use crate::value::PartialValue; - -use kanidm_proto::v1::Entry as ProtoEntry; -use kanidm_proto::v1::OperationError; -use kanidm_proto::v1::{ - AccountUnixExtend, AuthRequest, AuthState, CreateRequest, DeleteRequest, GroupUnixExtend, - ModifyRequest, SearchRequest, SetAuthCredential, SingleStringRequest, UserAuthToken, -}; - -use uuid::Uuid; - -struct AppState { - qe_r: actix::Addr, - qe_w: actix::Addr, - max_size: usize, -} - -fn get_current_user(req: &HttpRequest) -> Option { - match req.session().get::("uat") { - Ok(maybe_uat) => maybe_uat, - Err(_) => { - // return Box::new(future::err(e)); - None - } - } -} - -fn operation_error_to_response(e: OperationError) -> HttpResponse { - match e { - OperationError::NotAuthenticated => HttpResponse::Unauthorized().json(e), - OperationError::AccessDenied | OperationError::SystemProtectedObject => { - HttpResponse::Forbidden().json(e) - } - OperationError::EmptyRequest - | OperationError::NoMatchingEntries - | OperationError::SchemaViolation(_) => HttpResponse::BadRequest().json(e), - _ => HttpResponse::InternalServerError().json(e), - } -} - -macro_rules! json_event_post { - ($req:expr, $state:expr, $message_type:ty, $request_type:ty, $dest:expr) => {{ - // This is copied every request. Is there a better way? - // The issue is the fold move takes ownership of state if - // we don't copy this here - let max_size = $state.max_size; - - // Get auth if any? - let uat = get_current_user(&$req); - - // HttpRequest::payload() is stream of Bytes objects - $req.payload() - // `Future::from_err` acts like `?` in that it coerces the error type from - // the future into the final error type - .from_err() - // `fold` will asynchronously read each chunk of the request body and - // call supplied closure, then it resolves to result of closure - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - // `Future::and_then` can be used to merge an asynchronous workflow with a - // synchronous workflow - .and_then( - move |body| -> Box> { - // body is loaded, now we can deserialize serde-json - let r_obj = serde_json::from_slice::<$request_type>(&body); - - // Send to the db for handling - match r_obj { - Ok(obj) => { - // combine request + uat -> message. - let m_obj = <$message_type>::new(uat, obj); - let res = $dest - .send(m_obj) - // What is from_err? - .from_err() - .and_then(|res| match res { - Ok(event_result) => Ok(HttpResponse::Ok().json(event_result)), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, // end closure - ) // end and_then - }}; -} - -macro_rules! json_event_get { - ($req:expr, $state:expr, $message_type:ty) => {{ - // Get current auth data - remember, the QS checks if the - // none/some is okay, because it's too hard to make it work here - // with all the async parts. - let uat = get_current_user(&$req); - - // New event, feed current auth data from the token to it. - let obj = <$message_type>::new(uat); - - let res = $state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(event_result) => Ok(HttpResponse::Ok().json(event_result)), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - }}; -} - -// Handle the various end points we need to expose - -fn create( - (req, state): (HttpRequest, State), -) -> impl Future { - json_event_post!(req, state, CreateMessage, CreateRequest, state.qe_w) -} - -fn modify( - (req, state): (HttpRequest, State), -) -> impl Future { - json_event_post!(req, state, ModifyMessage, ModifyRequest, state.qe_w) -} - -fn delete( - (req, state): (HttpRequest, State), -) -> impl Future { - json_event_post!(req, state, DeleteMessage, DeleteRequest, state.qe_w) -} - -fn search( - (req, state): (HttpRequest, State), -) -> impl Future { - json_event_post!(req, state, SearchMessage, SearchRequest, state.qe_r) -} - -fn whoami( - (req, state): (HttpRequest, State), -) -> impl Future { - json_event_get!(req, state, WhoamiMessage) -} - -// =============== REST generics ======================== - -fn json_rest_event_get( - req: HttpRequest, - state: State, - filter: Filter, - attrs: Option>, -) -> impl Future { - let uat = get_current_user(&req); - - // TODO: I think we'll need to change this to take an internal filter - // type that we send to the qs. - let obj = InternalSearchMessage { uat, filter, attrs }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(event_result) => Ok(HttpResponse::Ok().json(event_result)), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn json_rest_event_get_id( - path: Path, - req: HttpRequest, - state: State, - filter: Filter, - attrs: Option>, -) -> impl Future { - let uat = get_current_user(&req); - - let filter = Filter::join_parts_and(filter, filter_all!(f_id(path.as_str()))); - - let obj = InternalSearchMessage { uat, filter, attrs }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(mut event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result.pop())) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn json_rest_event_delete_id( - path: Path, - req: HttpRequest, - state: State, - filter: Filter, -) -> impl Future { - let uat = get_current_user(&req); - - let filter = Filter::join_parts_and(filter, filter_all!(f_id(path.as_str()))); - - let obj = InternalDeleteMessage { uat, filter }; - - let res = state.qe_w.send(obj).from_err().and_then(|res| match res { - Ok(_) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(())) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn json_rest_event_get_id_attr( - path: Path<(String, String)>, - req: HttpRequest, - state: State, - filter: Filter, -) -> impl Future { - let (id, attr) = path.into_inner(); - let uat = get_current_user(&req); - - let filter = Filter::join_parts_and(filter, filter_all!(f_id(id.as_str()))); - - let obj = InternalSearchMessage { - uat, - filter, - attrs: Some(vec![attr.clone()]), - }; - - let res = state - .qe_r - .send(obj) - .from_err() - .and_then(move |res| match res { - Ok(mut event_result) => { - // TODO: Check this only has len 1, even though that satte should be impossible. - // Only get one result - let r = event_result.pop().and_then(|mut e| { - // Only get the attribute as requested. - e.attrs.remove(&attr) - }); - debug!("final json result {:?}", r); - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(r)) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn json_rest_event_post( - req: HttpRequest, - state: State, - classes: Vec, -) -> impl Future { - // Read the json from the wire. - let max_size = state.max_size; - let uat = get_current_user(&req); - - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - // `Future::and_then` can be used to merge an asynchronous workflow with a - // synchronous workflow - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::(&body); - // Send a create message if deserialised. - match r_obj { - Ok(mut obj) => { - obj.attrs.insert("class".to_string(), classes); - let m_obj = CreateMessage::new_entry(uat, obj); - let res = state.qe_w.send(m_obj).from_err().and_then(|res| match res { - Ok(_) => Ok(HttpResponse::Ok().json(())), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, - ) // end and_then -} - -fn json_rest_event_post_id_attr( - path: Path<(String, String)>, - req: HttpRequest, - state: State, - filter: Filter, -) -> impl Future { - let max_size = state.max_size; - let uat = get_current_user(&req); - let (id, attr) = path.into_inner(); - - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::>(&body); - match r_obj { - Ok(obj) => { - let m_obj = AppendAttributeMessage { - uat, - uuid_or_name: id, - attr, - values: obj, - filter, - }; - // Add a msg here - let res = state.qe_w.send(m_obj).from_err().and_then(|res| match res { - Ok(_) => Ok(HttpResponse::Ok().json(())), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, - ) // end and_then -} - -fn json_rest_event_put_id_attr( - path: Path<(String, String)>, - req: HttpRequest, - state: State, - filter: Filter, -) -> impl Future { - let max_size = state.max_size; - let uat = get_current_user(&req); - let (id, attr) = path.into_inner(); - - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::>(&body); - match r_obj { - Ok(obj) => { - let m_obj = SetAttributeMessage { - uat, - uuid_or_name: id, - attr, - values: obj, - filter, - }; - let res = state.qe_w.send(m_obj).from_err().and_then(|res| match res { - Ok(_) => Ok(HttpResponse::Ok().json(())), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, - ) // end and_then -} - -fn json_rest_event_delete_id_attr( - path: Path<(String, String)>, - req: HttpRequest, - state: State, - filter: Filter, -) -> impl Future { - let uat = get_current_user(&req); - let (id, attr) = path.into_inner(); - - // TODO: Attempt to get an option Vec here? - - let obj = PurgeAttributeMessage { - uat, - uuid_or_name: id, - attr, - filter, - }; - - let res = state.qe_w.send(obj).from_err().and_then(|res| match res { - Ok(()) => Ok(HttpResponse::Ok().json(())), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn json_rest_event_credential_put( - id: String, - cred_id: Option, - req: HttpRequest, - state: State, -) -> impl Future { - // what do we need here? - // * a filter of the id to match + class - // * the id of the credential - // * The SetAuthCredential - // * turn into a modlist - - // Copy the max size since we move it. - let max_size = state.max_size; - let uat = get_current_user(&req); - - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - // `Future::and_then` can be used to merge an asynchronous workflow with a - // synchronous workflow - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::(&body); - - match r_obj { - Ok(obj) => { - let m_obj = InternalCredentialSetMessage::new(uat, id, cred_id, obj); - let res = state.qe_w.send(m_obj).from_err().and_then(|res| match res { - Ok(event_result) => Ok(HttpResponse::Ok().json(event_result)), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, - ) // end and_then -} - -// Okay, so a put normally needs -// * filter of what we are working on (id + class) -// * a BTreeMap> that we turn into a modlist. -// -// OR -// * filter of what we are working on (id + class) -// * a Vec that we are changing -// * the attr name (as a param to this in path) -// -// json_rest_event_put_id(path, req, state - -fn schema_get( - (req, state): (HttpRequest, State), -) -> impl Future { - // NOTE: This is filter_all, because from_internal_message will still do the alterations - // needed to make it safe. This is needed because there may be aci's that block access - // to the recycle/ts types in the filter, and we need the aci to only eval on this - // part of the filter! - let filter = filter_all!(f_or!([ - f_eq("class", PartialValue::new_class("attributetype")), - f_eq("class", PartialValue::new_class("classtype")) - ])); - json_rest_event_get(req, state, filter, None) -} - -fn schema_attributetype_get( - (req, state): (HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("attributetype"))); - json_rest_event_get(req, state, filter, None) -} - -fn schema_attributetype_get_id( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - // These can't use get_id because they attribute name and class name aren't ... well name. - let uat = get_current_user(&req); - - let filter = filter_all!(f_and!([ - f_eq("class", PartialValue::new_class("attributetype")), - f_eq("attributename", PartialValue::new_iutf8s(path.as_str())) - ])); - - let obj = InternalSearchMessage { - uat, - filter, - attrs: None, - }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(mut event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result.pop())) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn schema_classtype_get( - (req, state): (HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("classtype"))); - json_rest_event_get(req, state, filter, None) -} - -fn schema_classtype_get_id( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - // These can't use get_id because they attribute name and class name aren't ... well name. - let uat = get_current_user(&req); - - let filter = filter_all!(f_and!([ - f_eq("class", PartialValue::new_class("classtype")), - f_eq("classname", PartialValue::new_iutf8s(path.as_str())) - ])); - - let obj = InternalSearchMessage { - uat, - filter, - attrs: None, - }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(mut event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result.pop())) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn account_get( - (req, state): (HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); - json_rest_event_get(req, state, filter, None) -} - -fn account_post( - (req, state): (HttpRequest, State), -) -> impl Future { - let classes = vec!["account".to_string(), "object".to_string()]; - json_rest_event_post(req, state, classes) -} - -fn account_id_get( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); - json_rest_event_get_id(path, req, state, filter, None) -} - -fn account_id_get_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); - json_rest_event_get_id_attr(path, req, state, filter) -} - -fn account_id_post_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); - json_rest_event_post_id_attr(path, req, state, filter) -} - -fn account_id_delete_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); - json_rest_event_delete_id_attr(path, req, state, filter) -} - -fn account_id_put_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); - json_rest_event_put_id_attr(path, req, state, filter) -} - -fn account_id_delete( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); - json_rest_event_delete_id(path, req, state, filter) -} - -fn account_put_id_credential_primary( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let id = path.into_inner(); - json_rest_event_credential_put(id, None, req, state) -} - -// Return a vec of str -fn account_get_id_ssh_pubkeys( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let uat = get_current_user(&req); - let id = path.into_inner(); - - let obj = InternalSshKeyReadMessage { - uat, - uuid_or_name: id, - }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result)) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn account_post_id_ssh_pubkey( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let max_size = state.max_size; - let uat = get_current_user(&req); - let id = path.into_inner(); - - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::<(String, String)>(&body); - match r_obj { - Ok((tag, key)) => { - let m_obj = InternalSshKeyCreateMessage { - uat, - uuid_or_name: id, - tag, - key, - filter: filter_all!(f_eq("class", PartialValue::new_class("account"))), - }; - // Add a msg here - let res = state.qe_w.send(m_obj).from_err().and_then(|res| match res { - Ok(_) => Ok(HttpResponse::Ok().json(())), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, - ) // end and_then -} - -fn account_get_id_ssh_pubkey_tag( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let uat = get_current_user(&req); - let (id, tag) = path.into_inner(); - - let obj = InternalSshKeyTagReadMessage { - uat, - uuid_or_name: id, - tag, - }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result)) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn account_delete_id_ssh_pubkey_tag( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let uat = get_current_user(&req); - let (id, tag) = path.into_inner(); - - let obj = RemoveAttributeValueMessage { - uat, - uuid_or_name: id, - attr: "ssh_publickey".to_string(), - value: tag, - filter: filter_all!(f_eq("class", PartialValue::new_class("account"))), - }; - - let res = state.qe_w.send(obj).from_err().and_then(|res| match res { - Ok(()) => Ok(HttpResponse::Ok().json(())), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -// Get and return a single str -fn account_get_id_radius( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let uat = get_current_user(&req); - let id = path.into_inner(); - - let obj = InternalRadiusReadMessage { - uat, - uuid_or_name: id, - }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result)) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn account_post_id_radius_regenerate( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - // Need to to send the regen msg - let uat = get_current_user(&req); - let id = path.into_inner(); - - let obj = InternalRegenerateRadiusMessage::new(uat, id); - - let res = state.qe_w.send(obj).from_err().and_then(|res| match res { - Ok(event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result)) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn account_delete_id_radius( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - // We reconstruct path here to keep json_rest_event_delete_id_attr generic. - let p = Path::from((path.into_inner(), "radius_secret".to_string())); - let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); - json_rest_event_delete_id_attr(p, req, state, filter) -} - -fn account_get_id_radius_token( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let uat = get_current_user(&req); - let id = path.into_inner(); - - let obj = InternalRadiusTokenReadMessage { - uat, - uuid_or_name: id, - }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result)) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn account_post_id_unix( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let max_size = state.max_size; - let uat = get_current_user(&req); - let id = path.into_inner(); - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - // `Future::and_then` can be used to merge an asynchronous workflow with a - // synchronous workflow - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::(&body); - - match r_obj { - Ok(obj) => { - let m_obj = IdmAccountUnixExtendMessage::new(uat, id, obj); - let res = state.qe_w.send(m_obj).from_err().and_then(|res| match res { - Ok(event_result) => Ok(HttpResponse::Ok().json(event_result)), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, - ) // end and_then -} - -fn account_get_id_unix_token( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let uat = get_current_user(&req); - let id = path.into_inner(); - - let obj = InternalUnixUserTokenReadMessage { - uat, - uuid_or_name: id, - }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result)) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn account_post_id_unix_auth( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let max_size = state.max_size; - let uat = get_current_user(&req); - let id = path.into_inner(); - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - // `Future::and_then` can be used to merge an asynchronous workflow with a - // synchronous workflow - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::(&body); - - match r_obj { - Ok(obj) => { - let m_obj = IdmAccountUnixAuthMessage { - uat: uat, - uuid_or_name: id, - cred: obj.value, - }; - let res = state.qe_r.send(m_obj).from_err().and_then(|res| match res { - Ok(event_result) => Ok(HttpResponse::Ok().json(event_result)), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, - ) // end and_then -} - -fn account_put_id_unix_credential( - path: Path, - req: HttpRequest, - state: State, -) -> impl Future { - let max_size = state.max_size; - let uat = get_current_user(&req); - let id = path.into_inner(); - - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::(&body); - match r_obj { - Ok(obj) => { - let m_obj = IdmAccountUnixSetCredMessage { - uat, - uuid_or_name: id, - cred: obj.value, - }; - let res = state.qe_w.send(m_obj).from_err().and_then(|res| match res { - Ok(_) => Ok(HttpResponse::Ok().json(())), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, - ) // end and_then -} - -fn account_delete_id_unix_credential( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let uat = get_current_user(&req); - let id = path.into_inner(); - - let obj = PurgeAttributeMessage { - uat, - uuid_or_name: id, - attr: "unix_password".to_string(), - filter: filter_all!(f_eq("class", PartialValue::new_class("posixaccount"))), - }; - - let res = state.qe_w.send(obj).from_err().and_then(|res| match res { - Ok(()) => Ok(HttpResponse::Ok().json(())), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn group_get( - (req, state): (HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); - json_rest_event_get(req, state, filter, None) -} - -fn group_post( - (req, state): (HttpRequest, State), -) -> impl Future { - let classes = vec!["group".to_string(), "object".to_string()]; - json_rest_event_post(req, state, classes) -} - -fn group_id_get( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); - json_rest_event_get_id(path, req, state, filter, None) -} - -fn group_id_get_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); - json_rest_event_get_id_attr(path, req, state, filter) -} - -fn group_id_post_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); - json_rest_event_post_id_attr(path, req, state, filter) -} - -fn group_id_delete_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); - json_rest_event_delete_id_attr(path, req, state, filter) -} - -fn group_id_put_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); - json_rest_event_put_id_attr(path, req, state, filter) -} - -fn group_id_delete( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); - json_rest_event_delete_id(path, req, state, filter) -} - -fn group_post_id_unix( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let max_size = state.max_size; - let uat = get_current_user(&req); - let id = path.into_inner(); - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - // `Future::and_then` can be used to merge an asynchronous workflow with a - // synchronous workflow - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::(&body); - - match r_obj { - Ok(obj) => { - let m_obj = IdmGroupUnixExtendMessage::new(uat, id, obj); - let res = state.qe_w.send(m_obj).from_err().and_then(|res| match res { - Ok(event_result) => Ok(HttpResponse::Ok().json(event_result)), - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } // end match - }, - ) // end and_then -} - -fn group_get_id_unix_token( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let uat = get_current_user(&req); - let id = path.into_inner(); - - let obj = InternalUnixGroupTokenReadMessage { - uat, - uuid_or_name: id, - }; - - let res = state.qe_r.send(obj).from_err().and_then(|res| match res { - Ok(event_result) => { - // Only send back the first result, or None - Ok(HttpResponse::Ok().json(event_result)) - } - Err(e) => Ok(operation_error_to_response(e)), - }); - - Box::new(res) -} - -fn domain_get( - (req, state): (HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("domain_info"))); - json_rest_event_get(req, state, filter, None) -} - -fn domain_id_get( - (path, req, state): (Path, HttpRequest, State), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("domain_info"))); - json_rest_event_get_id(path, req, state, filter, None) -} - -fn domain_id_get_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("domain_info"))); - json_rest_event_get_id_attr(path, req, state, filter) -} - -fn domain_id_put_attr( - (path, req, state): ( - Path<(String, String)>, - HttpRequest, - State, - ), -) -> impl Future { - let filter = filter_all!(f_eq("class", PartialValue::new_class("domain_info"))); - json_rest_event_put_id_attr(path, req, state, filter) -} - -fn do_nothing((_req, _state): (HttpRequest, State)) -> String { - "did nothing".to_string() -} - -// We probably need an extract auth or similar to handle the different -// types (cookie, bearer), and to generic this over get/post. - -fn auth( - (req, state): (HttpRequest, State), -) -> impl Future { - let max_size = state.max_size; - - req.payload() - .from_err() - .fold(BytesMut::new(), move |mut body, chunk| { - // limit max size of in-memory payload - if (body.len() + chunk.len()) > max_size { - Err(error::ErrorBadRequest("overflow")) - } else { - body.extend_from_slice(&chunk); - Ok(body) - } - }) - .and_then( - move |body| -> Box> { - let r_obj = serde_json::from_slice::(&body); - - // Send to the db for action - match r_obj { - Ok(obj) => { - // First, deal with some state management. - // Do anything here first that's needed like getting the session details - // out of the req cookie. - - // From the actix source errors here - // seems to be related to the serde_json deserialise of the cookie - // content, and because we control it's get/set it SHOULD be fine - // provided we use secure cookies. But we can't always trust that ... - let maybe_sessionid = match req.session().get::("auth-session-id") { - Ok(c) => c, - Err(e) => { - return Box::new(future::err(e)); - } - }; - - let auth_msg = AuthMessage::new(obj, maybe_sessionid); - - // We probably need to know if we allocate the cookie, that this is a - // new session, and in that case, anything *except* authrequest init is - // invalid. - let res = state - // This may change in the future ... - .qe_r - .send(auth_msg) - .from_err() - .and_then(move |res| match res { - Ok(ar) => { - match &ar.state { - AuthState::Success(uat) => { - // Remove the auth-session-id - req.session().remove("auth-session-id"); - // Set the uat into the cookie - match req.session().set("uat", uat) { - Ok(_) => Ok(HttpResponse::Ok().json(ar)), - Err(_) => { - Ok(HttpResponse::InternalServerError().json(())) - } - } - } - AuthState::Denied(_) => { - // Remove the auth-session-id - req.session().remove("auth-session-id"); - Ok(HttpResponse::Unauthorized().json(ar)) - } - AuthState::Continue(_) => { - // Ensure the auth-session-id is set - match req.session().set("auth-session-id", ar.sessionid) - { - Ok(_) => Ok(HttpResponse::Ok().json(ar)), - Err(_) => { - Ok(HttpResponse::InternalServerError().json(())) - } - } - } - } - } - Err(e) => Ok(operation_error_to_response(e)), - }); - Box::new(res) - } - Err(e) => Box::new(future::err(error::ErrorBadRequest(format!( - "Json Decode Failed: {:?}", - e - )))), - } - }, - ) -} - -fn idm_account_set_password( - (req, state): (HttpRequest, State), -) -> impl Future { - json_event_post!( - req, - state, - IdmAccountSetPasswordMessage, - SingleStringRequest, - state.qe_w - ) -} - -// === internal setup helpers - -fn setup_backend(config: &Configuration) -> Result { - let mut audit_be = AuditScope::new("backend_setup"); - let pool_size: u32 = config.threads as u32; - let be = Backend::new(&mut audit_be, config.db_path.as_str(), pool_size); - // debug! - debug!("{}", audit_be); - be -} - -// TODO #54: We could move most of the be/schema/qs setup and startup -// outside of this call, then pass in "what we need" in a cloneable -// form, this way we could have seperate Idm vs Qs threads, and dedicated -// threads for write vs read -fn setup_qs_idms( - audit: &mut AuditScope, - be: Backend, - sid: SID, -) -> Result<(QueryServer, IdmServer), OperationError> { - // Create "just enough" schema for us to be able to load from - // disk ... Schema loading is one time where we validate the - // entries as we read them, so we need this here. - let schema = match Schema::new(audit) { - Ok(s) => s, - Err(e) => { - error!("Failed to setup in memory schema: {:?}", e); - return Err(e); - } - }; - - // Create a query_server implementation - let query_server = QueryServer::new(be, schema); - - // TODO #62: Should the IDM parts be broken out to the IdmServer? - // What's important about this initial setup here is that it also triggers - // the schema and acp reload, so they are now configured correctly! - // Initialise the schema core. - // - // Now search for the schema itself, and validate that the system - // in memory matches the BE on disk, and that it's syntactically correct. - // Write it out if changes are needed. - query_server.initialise_helper(audit)?; - - // We generate a SINGLE idms only! - - let idms = IdmServer::new(query_server.clone(), sid); - - Ok((query_server, idms)) -} - -pub fn backup_server_core(config: Configuration, dst_path: &str) { - let be = match setup_backend(&config) { - Ok(be) => be, - Err(e) => { - error!("Failed to setup BE: {:?}", e); - return; - } - }; - let mut audit = AuditScope::new("backend_backup"); - - let be_ro_txn = be.read(); - let r = be_ro_txn.backup(&mut audit, dst_path); - debug!("{}", audit); - match r { - Ok(_) => info!("Backup success!"), - Err(e) => { - error!("Backup failed: {:?}", e); - std::process::exit(1); - } - }; - // Let the txn abort, even on success. -} - -pub fn restore_server_core(config: Configuration, dst_path: &str) { - let be = match setup_backend(&config) { - Ok(be) => be, - Err(e) => { - error!("Failed to setup BE: {:?}", e); - return; - } - }; - let mut audit = AuditScope::new("backend_restore"); - - // First, we provide the in-memory schema so that core attrs are indexed correctly. - let schema = match Schema::new(&mut audit) { - Ok(s) => s, - Err(e) => { - error!("Failed to setup in memory schema: {:?}", e); - std::process::exit(1); - } - }; - - // Limit the scope of the schema txn. - let idxmeta = { schema.write().get_idxmeta_set() }; - - let mut be_wr_txn = be.write(idxmeta); - let r = be_wr_txn - .restore(&mut audit, dst_path) - .and_then(|_| be_wr_txn.commit(&mut audit)); - - if r.is_err() { - debug!("{}", audit); - error!("Failed to restore database: {:?}", r); - std::process::exit(1); - } - info!("Restore Success!"); - - info!("Attempting to init query server ..."); - let server_id = be.get_db_sid(); - - let (qs, _idms) = match setup_qs_idms(&mut audit, be, server_id) { - Ok(t) => t, - Err(e) => { - debug!("{}", audit); - error!("Unable to setup query server or idm server -> {:?}", e); - return; - } - }; - info!("Success!"); - - info!("Start reindex phase ..."); - - let qs_write = qs.write(); - let r = qs_write - .reindex(&mut audit) - .and_then(|_| qs_write.commit(&mut audit)); - - match r { - Ok(_) => info!("Reindex Success!"), - Err(e) => { - error!("Restore failed: {:?}", e); - std::process::exit(1); - } - }; -} - -pub fn reindex_server_core(config: Configuration) { - let be = match setup_backend(&config) { - Ok(be) => be, - Err(e) => { - error!("Failed to setup BE: {:?}", e); - return; - } - }; - let mut audit = AuditScope::new("server_reindex"); - - // First, we provide the in-memory schema so that core attrs are indexed correctly. - let schema = match Schema::new(&mut audit) { - Ok(s) => s, - Err(e) => { - error!("Failed to setup in memory schema: {:?}", e); - std::process::exit(1); - } - }; - - info!("Start Index Phase 1 ..."); - // Limit the scope of the schema txn. - let idxmeta = { schema.write().get_idxmeta_set() }; - - // Reindex only the core schema attributes to bootstrap the process. - let be_wr_txn = be.write(idxmeta); - let r = be_wr_txn - .reindex(&mut audit) - .and_then(|_| be_wr_txn.commit(&mut audit)); - - // Now that's done, setup a minimal qs and reindex from that. - if r.is_err() { - debug!("{}", audit); - error!("Failed to reindex database: {:?}", r); - std::process::exit(1); - } - info!("Index Phase 1 Success!"); - - info!("Attempting to init query server ..."); - let server_id = be.get_db_sid(); - - let (qs, _idms) = match setup_qs_idms(&mut audit, be, server_id) { - Ok(t) => t, - Err(e) => { - debug!("{}", audit); - error!("Unable to setup query server or idm server -> {:?}", e); - return; - } - }; - info!("Init Query Server Success!"); - - info!("Start Index Phase 2 ..."); - - let qs_write = qs.write(); - let r = qs_write - .reindex(&mut audit) - .and_then(|_| qs_write.commit(&mut audit)); - - match r { - Ok(_) => info!("Index Phase 2 Success!"), - Err(e) => { - error!("Reindex failed: {:?}", e); - std::process::exit(1); - } - }; -} - -pub fn domain_rename_core(config: Configuration, new_domain_name: String) { - let mut audit = AuditScope::new("domain_rename"); - - // Start the backend. - let be = match setup_backend(&config) { - Ok(be) => be, - Err(e) => { - error!("Failed to setup BE: {:?}", e); - return; - } - }; - let server_id = be.get_db_sid(); - // setup the qs - *with* init of the migrations and schema. - let (qs, _idms) = match setup_qs_idms(&mut audit, be, server_id) { - Ok(t) => t, - Err(e) => { - debug!("{}", audit); - error!("Unable to setup query server or idm server -> {:?}", e); - return; - } - }; - - let mut qs_write = qs.write(); - let r = qs_write - .domain_rename(&mut audit, new_domain_name.as_str()) - .and_then(|_| qs_write.commit(&mut audit)); - - match r { - Ok(_) => info!("Domain Rename Success!"), - Err(e) => { - error!("Domain Rename Failed - Rollback has occured: {:?}", e); - std::process::exit(1); - } - }; -} - -pub fn reset_sid_core(config: Configuration) { - let mut audit = AuditScope::new("reset_sid_core"); - // Setup the be - let be = match setup_backend(&config) { - Ok(be) => be, - Err(e) => { - error!("Failed to setup BE: {:?}", e); - return; - } - }; - let nsid = be.reset_db_sid(&mut audit); - debug!("{}", audit); - info!("New Server ID: {:?}", nsid); -} - -pub fn verify_server_core(config: Configuration) { - let mut audit = AuditScope::new("server_verify"); - // Setup the be - let be = match setup_backend(&config) { - Ok(be) => be, - Err(e) => { - error!("Failed to setup BE: {:?}", e); - return; - } - }; - // setup the qs - without initialise! - let schema_mem = match Schema::new(&mut audit) { - Ok(sc) => sc, - Err(e) => { - error!("Failed to setup in memory schema: {:?}", e); - return; - } - }; - let server = QueryServer::new(be, schema_mem); - - // Run verifications. - let r = server.verify(&mut audit); - - debug!("{}", audit); - - if r.is_empty() { - info!("Verification passed!"); - std::process::exit(0); - } else { - for er in r { - error!("{:?}", er); - } - std::process::exit(1); - } - - // Now add IDM server verifications? -} - -pub fn recover_account_core(config: Configuration, name: String, password: String) { - let mut audit = AuditScope::new("recover_account"); - - // Start the backend. - let be = match setup_backend(&config) { - Ok(be) => be, - Err(e) => { - error!("Failed to setup BE: {:?}", e); - return; - } - }; - let server_id = be.get_db_sid(); - // setup the qs - *with* init of the migrations and schema. - let (_qs, idms) = match setup_qs_idms(&mut audit, be, server_id) { - Ok(t) => t, - Err(e) => { - debug!("{}", audit); - error!("Unable to setup query server or idm server -> {:?}", e); - return; - } - }; - - // Run the password change. - let mut idms_prox_write = idms.proxy_write(); - match idms_prox_write.recover_account(&mut audit, name, password) { - Ok(_) => { - idms_prox_write - .commit(&mut audit) - .expect("A critical error during commit occured."); - debug!("{}", audit); - info!("Password reset!"); - } - Err(e) => { - error!("Error during password reset -> {:?}", e); - debug!("{}", audit); - // abort the txn - std::mem::drop(idms_prox_write); - std::process::exit(1); - } - }; -} - -pub fn create_server_core(config: Configuration) { - // Until this point, we probably want to write to the log macro fns. - - if config.integration_test_config.is_some() { - warn!("RUNNING IN INTEGRATION TEST MODE."); - warn!("IF YOU SEE THIS IN PRODUCTION YOU MUST CONTACT SUPPORT IMMEDIATELY."); - } - - info!("Starting kanidm with configuration: {}", config); - // The log server is started on it's own thread, and is contacted - // asynchronously. - let log_addr = async_log::start(); - - // Setup TLS (if any) - let opt_tls_params = match setup_tls(&config) { - Ok(opt_tls_params) => opt_tls_params, - Err(e) => { - error!("Failed to configure TLS parameters -> {:?}", e); - return; - } - }; - - // Similar, create a stats thread which aggregates statistics from the - // server as they come in. - - // Setup the be for the qs. - let be = match setup_backend(&config) { - Ok(be) => be, - Err(e) => { - error!("Failed to setup BE -> {:?}", e); - return; - } - }; - - let server_id = be.get_db_sid(); - info!("Server ID -> {:?}", server_id); - - let mut audit = AuditScope::new("setup_qs_idms"); - // Start the IDM server. - let (qs, idms) = match setup_qs_idms(&mut audit, be, server_id) { - Ok(t) => t, - Err(e) => { - debug!("{}", audit); - error!("Unable to setup query server or idm server -> {:?}", e); - return; - } - }; - // Any pre-start tasks here. - match &config.integration_test_config { - Some(itc) => { - let mut idms_prox_write = idms.proxy_write(); - match idms_prox_write.recover_account( - &mut audit, - "admin".to_string(), - itc.admin_password.clone(), - ) { - Ok(_) => {} - Err(e) => { - debug!("{}", audit); - error!( - "Unable to configure INTERGATION TEST admin account -> {:?}", - e - ); - return; - } - }; - match idms_prox_write.commit(&mut audit) { - Ok(_) => {} - Err(e) => { - debug!("{}", audit); - error!("Unable to commit INTERGATION TEST setup -> {:?}", e); - return; - } - } - } - None => {} - } - log_addr.do_send(audit); - - // Arc the idms. - let idms_arc = Arc::new(idms); - - // Pass it to the actor for threading. - // Start the read query server with the given be path: future config - let server_read_addr = QueryServerReadV1::start( - log_addr.clone(), - qs.clone(), - idms_arc.clone(), - config.threads, - ); - // Start the write thread - let server_write_addr = QueryServerWriteV1::start(log_addr, qs, idms_arc); - - // Setup timed events associated to the write thread - let _int_addr = IntervalActor::new(server_write_addr.clone()).start(); - - // Copy the max size - let max_size = config.maximum_request; - let secure_cookies = config.secure_cookies; - // domain will come from the qs now! - let cookie_key: [u8; 32] = config.cookie_key; - - // start the web server - let aws_builder = actix_web::server::new(move || { - App::with_state(AppState { - qe_r: server_read_addr.clone(), - qe_w: server_write_addr.clone(), - max_size, - }) - // Connect all our end points here. - .middleware(middleware::Logger::default()) - .middleware(session::SessionStorage::new( - // Signed prevents tampering. this 32 byte key MUST - // be generated (probably a cli option, and it's up to the - // server process to coordinate these on hosts). IE an RODC - // could have a different key than our write servers to prevent - // disclosure of a writeable token in case of compromise. It does - // mean that you can't load balance between the rodc and the write - // though, but that's tottaly reasonable. - session::CookieSessionBackend::signed(&cookie_key) - // Limit to path? - // .path("/") - // TODO #63: make this configurable! - .max_age(Duration::hours(1)) - // .domain(domain.as_str()) - .same_site(cookie::SameSite::Strict) // constrain to the domain - // Disallow from js and ...? - .http_only(false) - .name("kanidm-session") - // This forces https only if true - .secure(secure_cookies), - )) - .resource("/v1/raw/create", |r| { - r.method(http::Method::POST).with_async(create) - }) - .resource("/v1/raw/modify", |r| { - r.method(http::Method::POST).with_async(modify) - }) - .resource("/v1/raw/delete", |r| { - r.method(http::Method::POST).with_async(delete) - }) - .resource("/v1/raw/search", |r| { - r.method(http::Method::POST).with_async(search) - }) - .resource("/v1/auth", |r| { - r.method(http::Method::POST).with_async(auth) - }) - // QS rest resources - .resource("/v1/schema", |r| { - r.method(http::Method::GET).with_async(schema_get) - }) - // attributetype - .resource("/v1/schema/attributetype", |r| { - r.method(http::Method::GET) - .with_async(schema_attributetype_get) - }) - .resource("/v1/schema/attributetype", |r| { - r.method(http::Method::POST).with(do_nothing) - }) - // attributetype/{id} - .resource("/v1/schema/attributetype/{id}", |r| { - r.method(http::Method::GET) - .with_async(schema_attributetype_get_id) - }) - .resource("/v1/schema/attributetype/{id}", |r| { - r.method(http::Method::PUT).with(do_nothing) - }) - .resource("/v1/schema/attributetype/{id}", |r| { - r.method(http::Method::PATCH).with(do_nothing) - }) - // classtype - .resource("/v1/schema/classtype", |r| { - r.method(http::Method::GET).with_async(schema_classtype_get) - }) - .resource("/v1/schema/classtype", |r| { - r.method(http::Method::POST).with(do_nothing) - }) - // classtype/{id} - .resource("/v1/schema/classtype/{id}", |r| { - r.method(http::Method::GET) - .with_async(schema_classtype_get_id) - }) - .resource("/v1/schema/classtype/{id}", |r| { - r.method(http::Method::PUT).with(do_nothing) - }) - .resource("/v1/schema/classtype/{id}", |r| { - r.method(http::Method::PATCH).with(do_nothing) - }) - // Start IDM resources. We'll probably add more restful types later. - // Self (specialisation of account I guess) - .resource("/v1/self", |r| { - r.method(http::Method::GET).with_async(whoami) - }) - .resource("/v1/self/_attr/{attr}", |r| { - r.method(http::Method::GET).with(do_nothing) - // add put post delete - }) - .resource("/v1/self/_credential", |r| { - r.method(http::Method::GET).with(do_nothing) - }) - .resource("/v1/self/_credential/primary/set_password", |r| { - r.method(http::Method::POST) - .with_async(idm_account_set_password) - }) - .resource("/v1/self/_credential/{cid}/_lock", |r| { - r.method(http::Method::GET).with(do_nothing) - // Check if a cred is locked. - // Can we self lock? - }) - .resource("/v1/self/_radius", |r| { - // Get our radius secret for manual configuration - r.method(http::Method::GET).with(do_nothing) - }) - .resource("/v1/self/_radius", |r| { - // delete our radius secret - r.method(http::Method::DELETE).with(do_nothing) - }) - .resource("/v1/self/_radius", |r| { - // regenerate our radius secret - r.method(http::Method::POST).with(do_nothing) - }) - .resource("/v1/self/_radius/_config", |r| { - // Create new secret_otp for client configuration - r.method(http::Method::POST).with(do_nothing) - }) - .resource("/v1/self/_radius/_config/{secret_otp}", |r| { - // Get the params - r.method(http::Method::GET).with(do_nothing) - }) - .resource("/v1/self/_radius/_config/{secret_otp}/apple", |r| { - // Get an ios/macos configuration profile - r.method(http::Method::GET).with(do_nothing) - }) - // Accounts - .resource("/v1/account", |r| { - r.method(http::Method::GET).with_async(account_get); - r.method(http::Method::POST).with_async(account_post); - }) - .resource("/v1/account/{id}", |r| { - r.method(http::Method::GET).with_async(account_id_get); - r.method(http::Method::DELETE).with_async(account_id_delete); - // add put, patch, delete - }) - .resource("/v1/account/{id}/_attr/{attr}", |r| { - r.method(http::Method::GET).with_async(account_id_get_attr); - r.method(http::Method::POST) - .with_async(account_id_post_attr); - r.method(http::Method::PUT).with_async(account_id_put_attr); - r.method(http::Method::DELETE) - .with_async(account_id_delete_attr); - // add put post delete - }) - .resource("/v1/account/{id}/_lock", |r| { - r.method(http::Method::GET).with(do_nothing) - // add post, delete - }) - .resource("/v1/account/{id}/_credential", |r| { - r.method(http::Method::GET).with(do_nothing) - // add delete - }) - .resource("/v1/account/{id}/_credential/primary", |r| { - // Set a new primary credential value. - // in future this will tie in to claims. - r.method(http::Method::PUT) - .with_async(account_put_id_credential_primary) - }) - .resource("/v1/account/{id}/_credential/{cid}/_lock", |r| { - r.method(http::Method::GET).with(do_nothing) - // add post, delete - }) - .resource("/v1/account/{id}/_ssh_pubkeys", |r| { - r.method(http::Method::GET) - .with_async(account_get_id_ssh_pubkeys); - r.method(http::Method::POST) - .with_async(account_post_id_ssh_pubkey); - }) - .resource("/v1/account/{id}/_ssh_pubkeys/{tag}", |r| { - r.method(http::Method::GET) - .with_async(account_get_id_ssh_pubkey_tag); - r.method(http::Method::DELETE) - .with_async(account_delete_id_ssh_pubkey_tag); - }) - .resource("/v1/account/{id}/_radius", |r| { - r.method(http::Method::GET) - .with_async(account_get_id_radius); - r.method(http::Method::POST) - .with_async(account_post_id_radius_regenerate); - r.method(http::Method::DELETE) - .with_async(account_delete_id_radius); - }) - // This is how the radius server views a json blob about the ID and radius creds. - .resource("/v1/account/{id}/_radius/_token", |r| { - r.method(http::Method::GET) - .with_async(account_get_id_radius_token) - }) - // Get the accounts unix info token. - .resource("/v1/account/{id}/_unix", |r| { - r.method(http::Method::POST) - .with_async(account_post_id_unix); - }) - .resource("/v1/account/{id}/_unix/_token", |r| { - r.method(http::Method::GET) - .with_async(account_get_id_unix_token) - }) - .resource("/v1/account/{id}/_unix/_auth", |r| { - r.method(http::Method::POST) - .with_async(account_post_id_unix_auth) - }) - .resource("/v1/account/{id}/_unix/_credential", |r| { - r.method(http::Method::PUT) - .with_async(account_put_id_unix_credential); - r.method(http::Method::DELETE) - .with_async(account_delete_id_unix_credential); - }) - // People - // Groups - .resource("/v1/group", |r| { - r.method(http::Method::GET).with_async(group_get); - r.method(http::Method::POST).with_async(group_post); - }) - .resource("/v1/group/{id}", |r| { - r.method(http::Method::GET).with_async(group_id_get); - r.method(http::Method::DELETE).with_async(group_id_delete); - // add put, patch - }) - .resource("/v1/group/{id}/_attr/{attr}", |r| { - r.method(http::Method::GET).with_async(group_id_get_attr); - r.method(http::Method::POST).with_async(group_id_post_attr); - r.method(http::Method::PUT).with_async(group_id_put_attr); - r.method(http::Method::DELETE) - .with_async(group_id_delete_attr); - }) - .resource("/v1/group/{id}/_unix", |r| { - r.method(http::Method::POST).with_async(group_post_id_unix); - }) - .resource("/v1/group/{id}/_unix/_token", |r| { - r.method(http::Method::GET) - .with_async(group_get_id_unix_token) - }) - // Claims - // TBD - // Domain - .resource("/v1/domain", |r| { - r.method(http::Method::GET).with_async(domain_get); - }) - .resource("/v1/domain/{id}", |r| { - r.method(http::Method::GET).with_async(domain_id_get); - }) - .resource("/v1/domain/{id}/_attr/{attr}", |r| { - r.method(http::Method::GET).with_async(domain_id_get_attr); - r.method(http::Method::PUT).with_async(domain_id_put_attr); - }) - // Recycle Bin - .resource("/v1/recycle_bin", |r| { - r.method(http::Method::GET).with(do_nothing) - }) - .resource("/v1/recycle_bin/{id}", |r| { - r.method(http::Method::GET).with(do_nothing) - }) - .resource("/v1/recycle_bin/{id}/_restore", |r| { - r.method(http::Method::POST).with(do_nothing) - }) - // ACPs - .resource("/v1/access_profile", |r| { - r.method(http::Method::GET).with(do_nothing) - // Add post - }) - .resource("/v1/access_profile/{id}", |r| { - r.method(http::Method::GET).with(do_nothing) - // add put, patch, delete - }) - .resource("/v1/access_profile/{id}/_attr/{attr}", |r| { - r.method(http::Method::GET).with(do_nothing) - // add put post delete - }) - }); - - let tls_aws_builder = match opt_tls_params { - Some(tls_params) => aws_builder.bind_ssl(config.address, tls_params), - None => { - warn!("Starting WITHOUT TLS parameters. This may cause authentication to fail!"); - aws_builder.bind(config.address) - } - }; - - tls_aws_builder - .expect("Failed to initialise server!") - .start(); -} diff --git a/kanidmd/src/lib/core/mod.rs b/kanidmd/src/lib/core/mod.rs new file mode 100644 index 000000000..91c911def --- /dev/null +++ b/kanidmd/src/lib/core/mod.rs @@ -0,0 +1,1567 @@ +// use actix_files as fs; +use actix::prelude::*; +use actix_session::{CookieSession, Session}; +use actix_web::web::{self, Data, HttpResponse, Json, Path}; +use actix_web::{cookie, error, middleware, App, HttpServer}; + +use std::sync::Arc; +use time::Duration; + +use crate::config::Configuration; + +// SearchResult +use crate::actors::v1_read::QueryServerReadV1; +use crate::actors::v1_read::{ + AuthMessage, IdmAccountUnixAuthMessage, InternalRadiusReadMessage, + InternalRadiusTokenReadMessage, InternalSearchMessage, InternalSshKeyReadMessage, + InternalSshKeyTagReadMessage, InternalUnixGroupTokenReadMessage, + InternalUnixUserTokenReadMessage, SearchMessage, WhoamiMessage, +}; +use crate::actors::v1_write::QueryServerWriteV1; +use crate::actors::v1_write::{ + AppendAttributeMessage, CreateMessage, DeleteMessage, IdmAccountSetPasswordMessage, + IdmAccountUnixExtendMessage, IdmAccountUnixSetCredMessage, IdmGroupUnixExtendMessage, + InternalCredentialSetMessage, InternalDeleteMessage, InternalRegenerateRadiusMessage, + InternalSshKeyCreateMessage, ModifyMessage, PurgeAttributeMessage, RemoveAttributeValueMessage, + SetAttributeMessage, +}; +use crate::async_log; +use crate::audit::AuditScope; +use crate::be::{Backend, BackendTransaction}; +use crate::crypto::setup_tls; +use crate::filter::{Filter, FilterInvalid}; +use crate::idm::server::IdmServer; +use crate::interval::IntervalActor; +use crate::schema::Schema; +use crate::schema::SchemaTransaction; +use crate::server::QueryServer; +use crate::utils::SID; +use crate::value::PartialValue; + +use kanidm_proto::v1::Entry as ProtoEntry; +use kanidm_proto::v1::OperationError; +use kanidm_proto::v1::{ + AccountUnixExtend, AuthRequest, AuthState, CreateRequest, DeleteRequest, GroupUnixExtend, + ModifyRequest, SearchRequest, SetAuthCredential, SingleStringRequest, UserAuthToken, +}; + +use uuid::Uuid; + +struct AppState { + qe_r: Addr, + qe_w: Addr, +} + +fn get_current_user(session: &Session) -> Option { + match session.get::("uat") { + Ok(maybe_uat) => maybe_uat, + Err(_) => None, + } +} + +fn operation_error_to_response(e: OperationError) -> HttpResponse { + match e { + OperationError::NotAuthenticated => HttpResponse::Unauthorized().json(e), + OperationError::AccessDenied | OperationError::SystemProtectedObject => { + HttpResponse::Forbidden().json(e) + } + OperationError::EmptyRequest + | OperationError::NoMatchingEntries + | OperationError::SchemaViolation(_) => HttpResponse::BadRequest().json(e), + _ => HttpResponse::InternalServerError().json(e), + } +} + +macro_rules! json_event_post { + ($req:expr, $session:expr, $message_type:ty, $dest:expr) => {{ + // Get auth if any? + let uat = get_current_user(&$session); + // Send to the db for handling + // combine request + uat -> message. + let m_obj = <$message_type>::new(uat, $req); + match $dest.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } + }}; +} + +macro_rules! json_event_get { + ($session:expr, $state:expr, $message_type:ty) => {{ + // Get current auth data - remember, the QS checks if the + // none/some is okay, because it's too hard to make it work here + // with all the async parts. + let uat = get_current_user(&$session); + + // New event, feed current auth data from the token to it. + let obj = <$message_type>::new(uat); + + match $state.qe_r.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } + }}; +} + +// Handle the various end points we need to expose + +async fn create( + (req, session, state): (Json, Session, Data), +) -> HttpResponse { + json_event_post!(req.into_inner(), session, CreateMessage, state.qe_w) +} + +async fn modify( + (req, session, state): (Json, Session, Data), +) -> HttpResponse { + json_event_post!(req.into_inner(), session, ModifyMessage, state.qe_w) +} + +async fn delete( + (req, session, state): (Json, Session, Data), +) -> HttpResponse { + json_event_post!(req.into_inner(), session, DeleteMessage, state.qe_w) +} + +async fn search( + (req, session, state): (Json, Session, Data), +) -> HttpResponse { + json_event_post!(req.into_inner(), session, SearchMessage, state.qe_r) +} + +async fn whoami((session, state): (Session, Data)) -> HttpResponse { + json_event_get!(session, state, WhoamiMessage) +} + +// =============== REST generics ======================== + +async fn json_rest_event_get( + session: Session, + state: Data, + filter: Filter, + attrs: Option>, +) -> HttpResponse { + let uat = get_current_user(&session); + + let obj = InternalSearchMessage { uat, filter, attrs }; + + match state.qe_r.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn json_rest_event_get_id( + path: Path, + session: Session, + state: Data, + filter: Filter, + attrs: Option>, +) -> HttpResponse { + let uat = get_current_user(&session); + + let filter = Filter::join_parts_and(filter, filter_all!(f_id(path.as_str()))); + + let obj = InternalSearchMessage { uat, filter, attrs }; + + match state.qe_r.send(obj).await { + Ok(Ok(mut r)) => HttpResponse::Ok().json(r.pop()), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn json_rest_event_delete_id( + path: Path, + session: Session, + state: Data, + filter: Filter, +) -> HttpResponse { + let uat = get_current_user(&session); + + let filter = Filter::join_parts_and(filter, filter_all!(f_id(path.as_str()))); + + let obj = InternalDeleteMessage { uat, filter }; + + match state.qe_w.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn json_rest_event_get_id_attr( + path: Path<(String, String)>, + session: Session, + state: Data, + filter: Filter, +) -> HttpResponse { + let (id, attr) = path.into_inner(); + let uat = get_current_user(&session); + + let filter = Filter::join_parts_and(filter, filter_all!(f_id(id.as_str()))); + + let obj = InternalSearchMessage { + uat, + filter, + attrs: Some(vec![attr.clone()]), + }; + + match state.qe_r.send(obj).await { + Ok(Ok(mut event_result)) => { + // TODO: Check this only has len 1, even though that satte should be impossible. + // Only get one result + let r = event_result.pop().and_then(|mut e| { + // Only get the attribute as requested. + e.attrs.remove(&attr) + }); + debug!("final json result {:?}", r); + // Only send back the first result, or None + HttpResponse::Ok().json(r) + } + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn json_rest_event_post( + mut obj: ProtoEntry, + session: Session, + state: Data, + classes: Vec, +) -> HttpResponse { + // Read the json from the wire. + let uat = get_current_user(&session); + + obj.attrs.insert("class".to_string(), classes); + let m_obj = CreateMessage::new_entry(uat, obj); + match state.qe_w.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn json_rest_event_post_id_attr( + path: Path<(String, String)>, + session: Session, + state: Data, + filter: Filter, + values: Vec, +) -> HttpResponse { + let uat = get_current_user(&session); + let (id, attr) = path.into_inner(); + + let m_obj = AppendAttributeMessage { + uat, + uuid_or_name: id, + attr, + values, + filter, + }; + // Add a msg here + match state.qe_w.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn json_rest_event_put_id_attr( + path: Path<(String, String)>, + session: Session, + state: Data, + filter: Filter, + values: Vec, +) -> HttpResponse { + let uat = get_current_user(&session); + let (id, attr) = path.into_inner(); + + let m_obj = SetAttributeMessage { + uat, + uuid_or_name: id, + attr, + values, + filter, + }; + match state.qe_w.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn json_rest_event_delete_id_attr( + path: Path<(String, String)>, + session: Session, + state: Data, + filter: Filter, +) -> HttpResponse { + let uat = get_current_user(&session); + let (id, attr) = path.into_inner(); + + // TODO: Attempt to get an option Vec here? + let obj = PurgeAttributeMessage { + uat, + uuid_or_name: id, + attr, + filter, + }; + + match state.qe_w.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn json_rest_event_credential_put( + id: String, + cred_id: Option, + session: Session, + state: Data, + obj: SetAuthCredential, +) -> HttpResponse { + let uat = get_current_user(&session); + + let m_obj = InternalCredentialSetMessage::new(uat, id, cred_id, obj); + match state.qe_w.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +// Okay, so a put normally needs +// * filter of what we are working on (id + class) +// * a BTreeMap> that we turn into a modlist. +// +// OR +// * filter of what we are working on (id + class) +// * a Vec that we are changing +// * the attr name (as a param to this in path) +// +// json_rest_event_put_id(path, req, state + +async fn schema_get((session, state): (Session, Data)) -> HttpResponse { + // NOTE: This is filter_all, because from_internal_message will still do the alterations + // needed to make it safe. This is needed because there may be aci's that block access + // to the recycle/ts types in the filter, and we need the aci to only eval on this + // part of the filter! + let filter = filter_all!(f_or!([ + f_eq("class", PartialValue::new_class("attributetype")), + f_eq("class", PartialValue::new_class("classtype")) + ])); + json_rest_event_get(session, state, filter, None).await +} + +async fn schema_attributetype_get((session, state): (Session, Data)) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("attributetype"))); + json_rest_event_get(session, state, filter, None).await +} + +async fn schema_attributetype_get_id( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + // These can't use get_id because they attribute name and class name aren't ... well name. + let uat = get_current_user(&session); + + let filter = filter_all!(f_and!([ + f_eq("class", PartialValue::new_class("attributetype")), + f_eq("attributename", PartialValue::new_iutf8s(path.as_str())) + ])); + + let obj = InternalSearchMessage { + uat, + filter, + attrs: None, + }; + + match state.qe_r.send(obj).await { + Ok(Ok(mut r)) => HttpResponse::Ok().json(r.pop()), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn schema_classtype_get((session, state): (Session, Data)) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("classtype"))); + json_rest_event_get(session, state, filter, None).await +} + +async fn schema_classtype_get_id( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + // These can't use get_id because they attribute name and class name aren't ... well name. + let uat = get_current_user(&session); + + let filter = filter_all!(f_and!([ + f_eq("class", PartialValue::new_class("classtype")), + f_eq("classname", PartialValue::new_iutf8s(path.as_str())) + ])); + + let obj = InternalSearchMessage { + uat, + filter, + attrs: None, + }; + + match state.qe_r.send(obj).await { + Ok(Ok(mut r)) => HttpResponse::Ok().json(r.pop()), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_get((session, state): (Session, Data)) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); + json_rest_event_get(session, state, filter, None).await +} + +async fn account_post( + (obj, session, state): (Json, Session, Data), +) -> HttpResponse { + let classes = vec!["account".to_string(), "object".to_string()]; + json_rest_event_post(obj.into_inner(), session, state, classes).await +} + +async fn account_id_get( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); + json_rest_event_get_id(path, session, state, filter, None).await +} + +async fn account_id_get_attr( + (path, session, state): (Path<(String, String)>, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); + json_rest_event_get_id_attr(path, session, state, filter).await +} + +async fn account_id_post_attr( + (values, path, session, state): ( + Json>, + Path<(String, String)>, + Session, + Data, + ), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); + json_rest_event_post_id_attr(path, session, state, filter, values.into_inner()).await +} + +async fn account_id_delete_attr( + (path, session, state): (Path<(String, String)>, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); + json_rest_event_delete_id_attr(path, session, state, filter).await +} + +async fn account_id_put_attr( + (values, path, session, state): ( + Json>, + Path<(String, String)>, + Session, + Data, + ), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); + json_rest_event_put_id_attr(path, session, state, filter, values.into_inner()).await +} + +async fn account_id_delete( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); + json_rest_event_delete_id(path, session, state, filter).await +} + +async fn account_put_id_credential_primary( + (obj, path, session, state): ( + Json, + Path, + Session, + Data, + ), +) -> HttpResponse { + let id = path.into_inner(); + json_rest_event_credential_put(id, None, session, state, obj.into_inner()).await +} + +// Return a vec of str +async fn account_get_id_ssh_pubkeys( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + + let obj = InternalSshKeyReadMessage { + uat, + uuid_or_name: id, + }; + + match state.qe_r.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_post_id_ssh_pubkey( + (obj, path, session, state): ( + Json<(String, String)>, + Path, + Session, + Data, + ), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + let (tag, key) = obj.into_inner(); + + let m_obj = InternalSshKeyCreateMessage { + uat, + uuid_or_name: id, + tag, + key, + filter: filter_all!(f_eq("class", PartialValue::new_class("account"))), + }; + // Add a msg here + match state.qe_w.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_get_id_ssh_pubkey_tag( + (path, session, state): (Path<(String, String)>, Session, Data), +) -> HttpResponse { + let uat = get_current_user(&session); + let (id, tag) = path.into_inner(); + + let obj = InternalSshKeyTagReadMessage { + uat, + uuid_or_name: id, + tag, + }; + + match state.qe_r.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_delete_id_ssh_pubkey_tag( + (path, session, state): (Path<(String, String)>, Session, Data), +) -> HttpResponse { + let uat = get_current_user(&session); + let (id, tag) = path.into_inner(); + + let obj = RemoveAttributeValueMessage { + uat, + uuid_or_name: id, + attr: "ssh_publickey".to_string(), + value: tag, + filter: filter_all!(f_eq("class", PartialValue::new_class("account"))), + }; + + match state.qe_w.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +// Get and return a single str +async fn account_get_id_radius( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + + let obj = InternalRadiusReadMessage { + uat, + uuid_or_name: id, + }; + + match state.qe_r.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_post_id_radius_regenerate( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + // Need to to send the regen msg + let uat = get_current_user(&session); + let id = path.into_inner(); + + let obj = InternalRegenerateRadiusMessage::new(uat, id); + + match state.qe_w.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_delete_id_radius( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + // We reconstruct path here to keep json_rest_event_delete_id_attr generic. + let p = Path::from((path.into_inner(), "radius_secret".to_string())); + let filter = filter_all!(f_eq("class", PartialValue::new_class("account"))); + json_rest_event_delete_id_attr(p, session, state, filter).await +} + +async fn account_get_id_radius_token( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + + let obj = InternalRadiusTokenReadMessage { + uat, + uuid_or_name: id, + }; + + match state.qe_r.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_post_id_unix( + (obj, path, session, state): ( + Json, + Path, + Session, + Data, + ), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + let m_obj = IdmAccountUnixExtendMessage::new(uat, id, obj.into_inner()); + match state.qe_w.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_get_id_unix_token( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + + let obj = InternalUnixUserTokenReadMessage { + uat, + uuid_or_name: id, + }; + + match state.qe_r.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_post_id_unix_auth( + (obj, path, session, state): ( + Json, + Path, + Session, + Data, + ), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + let m_obj = IdmAccountUnixAuthMessage { + uat: uat, + uuid_or_name: id, + cred: obj.into_inner().value, + }; + match state.qe_r.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_put_id_unix_credential( + (obj, path, session, state): ( + Json, + Path, + Session, + Data, + ), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + let m_obj = IdmAccountUnixSetCredMessage { + uat, + uuid_or_name: id, + cred: obj.into_inner().value, + }; + match state.qe_w.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn account_delete_id_unix_credential( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + + let obj = PurgeAttributeMessage { + uat, + uuid_or_name: id, + attr: "unix_password".to_string(), + filter: filter_all!(f_eq("class", PartialValue::new_class("posixaccount"))), + }; + + match state.qe_w.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn group_get((session, state): (Session, Data)) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); + json_rest_event_get(session, state, filter, None).await +} + +async fn group_post( + (obj, session, state): (Json, Session, Data), +) -> HttpResponse { + let classes = vec!["group".to_string(), "object".to_string()]; + json_rest_event_post(obj.into_inner(), session, state, classes).await +} + +async fn group_id_get( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); + json_rest_event_get_id(path, session, state, filter, None).await +} + +async fn group_id_get_attr( + (path, session, state): (Path<(String, String)>, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); + json_rest_event_get_id_attr(path, session, state, filter).await +} + +async fn group_id_post_attr( + (values, path, session, state): ( + Json>, + Path<(String, String)>, + Session, + Data, + ), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); + json_rest_event_post_id_attr(path, session, state, filter, values.into_inner()).await +} + +async fn group_id_delete_attr( + (path, session, state): (Path<(String, String)>, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); + json_rest_event_delete_id_attr(path, session, state, filter).await +} + +async fn group_id_put_attr( + (values, path, session, state): ( + Json>, + Path<(String, String)>, + Session, + Data, + ), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); + json_rest_event_put_id_attr(path, session, state, filter, values.into_inner()).await +} + +async fn group_id_delete( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("group"))); + json_rest_event_delete_id(path, session, state, filter).await +} + +async fn group_post_id_unix( + (obj, path, session, state): (Json, Path, Session, Data), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + let m_obj = IdmGroupUnixExtendMessage::new(uat, id, obj.into_inner()); + match state.qe_w.send(m_obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn group_get_id_unix_token( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let uat = get_current_user(&session); + let id = path.into_inner(); + + let obj = InternalUnixGroupTokenReadMessage { + uat, + uuid_or_name: id, + }; + + match state.qe_r.send(obj).await { + Ok(Ok(r)) => HttpResponse::Ok().json(r), + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn domain_get((session, state): (Session, Data)) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("domain_info"))); + json_rest_event_get(session, state, filter, None).await +} + +async fn domain_id_get( + (path, session, state): (Path, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("domain_info"))); + json_rest_event_get_id(path, session, state, filter, None).await +} + +async fn domain_id_get_attr( + (path, session, state): (Path<(String, String)>, Session, Data), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("domain_info"))); + json_rest_event_get_id_attr(path, session, state, filter).await +} + +async fn domain_id_put_attr( + (values, path, session, state): ( + Json>, + Path<(String, String)>, + Session, + Data, + ), +) -> HttpResponse { + let filter = filter_all!(f_eq("class", PartialValue::new_class("domain_info"))); + json_rest_event_put_id_attr(path, session, state, filter, values.into_inner()).await +} + +async fn do_nothing(_session: Session) -> String { + "did nothing".to_string() +} + +// We probably need an extract auth or similar to handle the different +// types (cookie, bearer), and to generic this over get/post. + +async fn auth((obj, session, state): (Json, Session, Data)) -> HttpResponse { + // First, deal with some state management. + // Do anything here first that's needed like getting the session details + // out of the req cookie. + + // From the actix source errors here + // seems to be related to the serde_json deserialise of the cookie + // content, and because we control it's get/set it SHOULD be fine + // provided we use secure cookies. But we can't always trust that ... + let maybe_sessionid = match session.get::("auth-session-id") { + Ok(c) => c, + Err(_e) => return HttpResponse::InternalServerError().json(()), + }; + + let auth_msg = AuthMessage::new(obj.into_inner(), maybe_sessionid); + + // We probably need to know if we allocate the cookie, that this is a + // new session, and in that case, anything *except* authrequest init is + // invalid. + match state + // This may change in the future ... + .qe_r + .send(auth_msg) + .await + { + Ok(Ok(ar)) => { + match &ar.state { + AuthState::Success(uat) => { + // Remove the auth-session-id + session.remove("auth-session-id"); + // Set the uat into the cookie + match session.set("uat", uat) { + Ok(_) => HttpResponse::Ok().json(ar), + Err(_) => HttpResponse::InternalServerError().json(()), + } + } + AuthState::Denied(_) => { + // Remove the auth-session-id + session.remove("auth-session-id"); + HttpResponse::Unauthorized().json(ar) + } + AuthState::Continue(_) => { + // Ensure the auth-session-id is set + match session.set("auth-session-id", ar.sessionid) { + Ok(_) => HttpResponse::Ok().json(ar), + Err(_) => HttpResponse::InternalServerError().json(()), + } + } + } + } + Ok(Err(e)) => operation_error_to_response(e), + Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + } +} + +async fn idm_account_set_password( + (obj, session, state): (Json, Session, Data), +) -> HttpResponse { + json_event_post!( + obj.into_inner(), + session, + IdmAccountSetPasswordMessage, + state.qe_w + ) +} + +// === internal setup helpers + +fn setup_backend(config: &Configuration) -> Result { + let mut audit_be = AuditScope::new("backend_setup"); + let pool_size: u32 = config.threads as u32; + let be = Backend::new(&mut audit_be, config.db_path.as_str(), pool_size); + // debug! + debug!("{}", audit_be); + be +} + +// TODO #54: We could move most of the be/schema/qs setup and startup +// outside of this call, then pass in "what we need" in a cloneable +// form, this way we could have seperate Idm vs Qs threads, and dedicated +// threads for write vs read +fn setup_qs_idms( + audit: &mut AuditScope, + be: Backend, + sid: SID, +) -> Result<(QueryServer, IdmServer), OperationError> { + // Create "just enough" schema for us to be able to load from + // disk ... Schema loading is one time where we validate the + // entries as we read them, so we need this here. + let schema = match Schema::new(audit) { + Ok(s) => s, + Err(e) => { + error!("Failed to setup in memory schema: {:?}", e); + return Err(e); + } + }; + + // Create a query_server implementation + let query_server = QueryServer::new(be, schema); + + // TODO #62: Should the IDM parts be broken out to the IdmServer? + // What's important about this initial setup here is that it also triggers + // the schema and acp reload, so they are now configured correctly! + // Initialise the schema core. + // + // Now search for the schema itself, and validate that the system + // in memory matches the BE on disk, and that it's syntactically correct. + // Write it out if changes are needed. + query_server.initialise_helper(audit)?; + + // We generate a SINGLE idms only! + + let idms = IdmServer::new(query_server.clone(), sid); + + Ok((query_server, idms)) +} + +pub fn backup_server_core(config: Configuration, dst_path: &str) { + let be = match setup_backend(&config) { + Ok(be) => be, + Err(e) => { + error!("Failed to setup BE: {:?}", e); + return; + } + }; + let mut audit = AuditScope::new("backend_backup"); + + let be_ro_txn = be.read(); + let r = be_ro_txn.backup(&mut audit, dst_path); + debug!("{}", audit); + match r { + Ok(_) => info!("Backup success!"), + Err(e) => { + error!("Backup failed: {:?}", e); + std::process::exit(1); + } + }; + // Let the txn abort, even on success. +} + +pub fn restore_server_core(config: Configuration, dst_path: &str) { + let be = match setup_backend(&config) { + Ok(be) => be, + Err(e) => { + error!("Failed to setup BE: {:?}", e); + return; + } + }; + let mut audit = AuditScope::new("backend_restore"); + + // First, we provide the in-memory schema so that core attrs are indexed correctly. + let schema = match Schema::new(&mut audit) { + Ok(s) => s, + Err(e) => { + error!("Failed to setup in memory schema: {:?}", e); + std::process::exit(1); + } + }; + + // Limit the scope of the schema txn. + let idxmeta = { schema.write().get_idxmeta_set() }; + + let mut be_wr_txn = be.write(idxmeta); + let r = be_wr_txn + .restore(&mut audit, dst_path) + .and_then(|_| be_wr_txn.commit(&mut audit)); + + if r.is_err() { + debug!("{}", audit); + error!("Failed to restore database: {:?}", r); + std::process::exit(1); + } + info!("Restore Success!"); + + info!("Attempting to init query server ..."); + let server_id = be.get_db_sid(); + + let (qs, _idms) = match setup_qs_idms(&mut audit, be, server_id) { + Ok(t) => t, + Err(e) => { + debug!("{}", audit); + error!("Unable to setup query server or idm server -> {:?}", e); + return; + } + }; + info!("Success!"); + + info!("Start reindex phase ..."); + + let qs_write = qs.write(); + let r = qs_write + .reindex(&mut audit) + .and_then(|_| qs_write.commit(&mut audit)); + + match r { + Ok(_) => info!("Reindex Success!"), + Err(e) => { + error!("Restore failed: {:?}", e); + std::process::exit(1); + } + }; +} + +pub fn reindex_server_core(config: Configuration) { + let be = match setup_backend(&config) { + Ok(be) => be, + Err(e) => { + error!("Failed to setup BE: {:?}", e); + return; + } + }; + let mut audit = AuditScope::new("server_reindex"); + + // First, we provide the in-memory schema so that core attrs are indexed correctly. + let schema = match Schema::new(&mut audit) { + Ok(s) => s, + Err(e) => { + error!("Failed to setup in memory schema: {:?}", e); + std::process::exit(1); + } + }; + + info!("Start Index Phase 1 ..."); + // Limit the scope of the schema txn. + let idxmeta = { schema.write().get_idxmeta_set() }; + + // Reindex only the core schema attributes to bootstrap the process. + let be_wr_txn = be.write(idxmeta); + let r = be_wr_txn + .reindex(&mut audit) + .and_then(|_| be_wr_txn.commit(&mut audit)); + + // Now that's done, setup a minimal qs and reindex from that. + if r.is_err() { + debug!("{}", audit); + error!("Failed to reindex database: {:?}", r); + std::process::exit(1); + } + info!("Index Phase 1 Success!"); + + info!("Attempting to init query server ..."); + let server_id = be.get_db_sid(); + + let (qs, _idms) = match setup_qs_idms(&mut audit, be, server_id) { + Ok(t) => t, + Err(e) => { + debug!("{}", audit); + error!("Unable to setup query server or idm server -> {:?}", e); + return; + } + }; + info!("Init Query Server Success!"); + + info!("Start Index Phase 2 ..."); + + let qs_write = qs.write(); + let r = qs_write + .reindex(&mut audit) + .and_then(|_| qs_write.commit(&mut audit)); + + match r { + Ok(_) => info!("Index Phase 2 Success!"), + Err(e) => { + error!("Reindex failed: {:?}", e); + std::process::exit(1); + } + }; +} + +pub fn domain_rename_core(config: Configuration, new_domain_name: String) { + let mut audit = AuditScope::new("domain_rename"); + + // Start the backend. + let be = match setup_backend(&config) { + Ok(be) => be, + Err(e) => { + error!("Failed to setup BE: {:?}", e); + return; + } + }; + let server_id = be.get_db_sid(); + // setup the qs - *with* init of the migrations and schema. + let (qs, _idms) = match setup_qs_idms(&mut audit, be, server_id) { + Ok(t) => t, + Err(e) => { + debug!("{}", audit); + error!("Unable to setup query server or idm server -> {:?}", e); + return; + } + }; + + let mut qs_write = qs.write(); + let r = qs_write + .domain_rename(&mut audit, new_domain_name.as_str()) + .and_then(|_| qs_write.commit(&mut audit)); + + match r { + Ok(_) => info!("Domain Rename Success!"), + Err(e) => { + error!("Domain Rename Failed - Rollback has occured: {:?}", e); + std::process::exit(1); + } + }; +} + +pub fn reset_sid_core(config: Configuration) { + let mut audit = AuditScope::new("reset_sid_core"); + // Setup the be + let be = match setup_backend(&config) { + Ok(be) => be, + Err(e) => { + error!("Failed to setup BE: {:?}", e); + return; + } + }; + let nsid = be.reset_db_sid(&mut audit); + debug!("{}", audit); + info!("New Server ID: {:?}", nsid); +} + +pub fn verify_server_core(config: Configuration) { + let mut audit = AuditScope::new("server_verify"); + // Setup the be + let be = match setup_backend(&config) { + Ok(be) => be, + Err(e) => { + error!("Failed to setup BE: {:?}", e); + return; + } + }; + // setup the qs - without initialise! + let schema_mem = match Schema::new(&mut audit) { + Ok(sc) => sc, + Err(e) => { + error!("Failed to setup in memory schema: {:?}", e); + return; + } + }; + let server = QueryServer::new(be, schema_mem); + + // Run verifications. + let r = server.verify(&mut audit); + + debug!("{}", audit); + + if r.is_empty() { + info!("Verification passed!"); + std::process::exit(0); + } else { + for er in r { + error!("{:?}", er); + } + std::process::exit(1); + } + + // Now add IDM server verifications? +} + +pub fn recover_account_core(config: Configuration, name: String, password: String) { + let mut audit = AuditScope::new("recover_account"); + + // Start the backend. + let be = match setup_backend(&config) { + Ok(be) => be, + Err(e) => { + error!("Failed to setup BE: {:?}", e); + return; + } + }; + let server_id = be.get_db_sid(); + // setup the qs - *with* init of the migrations and schema. + let (_qs, idms) = match setup_qs_idms(&mut audit, be, server_id) { + Ok(t) => t, + Err(e) => { + debug!("{}", audit); + error!("Unable to setup query server or idm server -> {:?}", e); + return; + } + }; + + // Run the password change. + let mut idms_prox_write = idms.proxy_write(); + match idms_prox_write.recover_account(&mut audit, name, password) { + Ok(_) => { + idms_prox_write + .commit(&mut audit) + .expect("A critical error during commit occured."); + debug!("{}", audit); + info!("Password reset!"); + } + Err(e) => { + error!("Error during password reset -> {:?}", e); + debug!("{}", audit); + // abort the txn + std::mem::drop(idms_prox_write); + std::process::exit(1); + } + }; +} + +pub fn create_server_core(config: Configuration) { + // Until this point, we probably want to write to the log macro fns. + + if config.integration_test_config.is_some() { + warn!("RUNNING IN INTEGRATION TEST MODE."); + warn!("IF YOU SEE THIS IN PRODUCTION YOU MUST CONTACT SUPPORT IMMEDIATELY."); + } + + info!("Starting kanidm with configuration: {}", config); + // The log server is started on it's own thread, and is contacted + // asynchronously. + let log_addr = async_log::start(); + + // Setup TLS (if any) + let opt_tls_params = match setup_tls(&config) { + Ok(opt_tls_params) => opt_tls_params, + Err(e) => { + error!("Failed to configure TLS parameters -> {:?}", e); + return; + } + }; + + // Similar, create a stats thread which aggregates statistics from the + // server as they come in. + + // Setup the be for the qs. + let be = match setup_backend(&config) { + Ok(be) => be, + Err(e) => { + error!("Failed to setup BE -> {:?}", e); + return; + } + }; + + let server_id = be.get_db_sid(); + info!("Server ID -> {:?}", server_id); + + let mut audit = AuditScope::new("setup_qs_idms"); + // Start the IDM server. + let (qs, idms) = match setup_qs_idms(&mut audit, be, server_id) { + Ok(t) => t, + Err(e) => { + debug!("{}", audit); + error!("Unable to setup query server or idm server -> {:?}", e); + return; + } + }; + // Any pre-start tasks here. + match &config.integration_test_config { + Some(itc) => { + let mut idms_prox_write = idms.proxy_write(); + match idms_prox_write.recover_account( + &mut audit, + "admin".to_string(), + itc.admin_password.clone(), + ) { + Ok(_) => {} + Err(e) => { + debug!("{}", audit); + error!( + "Unable to configure INTERGATION TEST admin account -> {:?}", + e + ); + return; + } + }; + match idms_prox_write.commit(&mut audit) { + Ok(_) => {} + Err(e) => { + debug!("{}", audit); + error!("Unable to commit INTERGATION TEST setup -> {:?}", e); + return; + } + } + } + None => {} + } + log_addr.do_send(audit); + + // Arc the idms. + let idms_arc = Arc::new(idms); + + // Pass it to the actor for threading. + // Start the read query server with the given be path: future config + let server_read_addr = QueryServerReadV1::start( + log_addr.clone(), + qs.clone(), + idms_arc.clone(), + config.threads, + ); + // Start the write thread + let server_write_addr = QueryServerWriteV1::start(log_addr, qs, idms_arc); + + // Setup timed events associated to the write thread + let _int_addr = IntervalActor::new(server_write_addr.clone()).start(); + + // Copy the max size + let secure_cookies = config.secure_cookies; + // domain will come from the qs now! + let cookie_key: [u8; 32] = config.cookie_key; + + // start the web server + let server = HttpServer::new(move || { + App::new() + .data(AppState { + qe_r: server_read_addr.clone(), + qe_w: server_write_addr.clone(), + }) + .wrap(middleware::Logger::default()) + .wrap( + // Signed prevents tampering. this 32 byte key MUST + // be generated (probably a cli option, and it's up to the + // server process to coordinate these on hosts). IE an RODC + // could have a different key than our write servers to prevent + // disclosure of a writeable token in case of compromise. It does + // mean that you can't load balance between the rodc and the write + // though, but that's tottaly reasonable. + CookieSession::signed(&cookie_key) + // .path(prefix.as_str()) + // .domain(domain.as_str()) + .same_site(cookie::SameSite::Strict) + .name("kanidm-session") + // if true, only allow to https + .secure(secure_cookies) + // TODO #63: make this configurable! + .max_age_time(Duration::hours(1)), + ) + // .service(fs::Files::new("/static", "./static")) + // Even though this says "CreateRequest", it's actually configuring *ALL* json requests. + // .app_data(web::Json::::configure(|cfg| { cfg + .app_data( + web::JsonConfig::default() + .limit(4096) + .error_handler(|err, _req| { + let s = format!("{}", err); + error::InternalError::from_response(err, HttpResponse::BadRequest().json(s)) + .into() + }), + ) + .service( + web::scope("/v1/raw") + .route("/create", web::post().to(create)) + .route("/modify", web::post().to(modify)) + .route("/delete", web::post().to(delete)) + .route("/search", web::post().to(search)), + ) + .service(web::scope("/v1/auth").route("", web::post().to(auth))) + .service( + web::scope("/v1/schema") + .route("", web::get().to(schema_get)) + .route("/attributetype", web::get().to(schema_attributetype_get)) + .route("/attributetype", web::post().to(do_nothing)) + .route( + "/attributetype/{id}", + web::get().to(schema_attributetype_get_id), + ) + .route("/attributetype/{id}", web::put().to(do_nothing)) + .route("/attributetype/{id}", web::patch().to(do_nothing)) + .route("/classtype", web::get().to(schema_classtype_get)) + .route("/classtype", web::post().to(do_nothing)) + .route("/classtype/{id}", web::get().to(schema_classtype_get_id)) + .route("/classtype/{id}", web::put().to(do_nothing)) + .route("/classtype/{id}", web::patch().to(do_nothing)), + ) + .service( + web::scope("/v1/self") + .route("", web::get().to(whoami)) + .route("/_attr/{attr}", web::get().to(do_nothing)) + .route("/_credential", web::get().to(do_nothing)) + .route( + "/_credential/primary/set_password", + web::post().to(idm_account_set_password), + ) + .route("/_credential/{cid}/_lock", web::get().to(do_nothing)) + .route("/_radius", web::get().to(do_nothing)) + .route("/_radius", web::delete().to(do_nothing)) + .route("/_radius", web::post().to(do_nothing)) + .route("/_radius/_config", web::post().to(do_nothing)) + .route("/_radius/_config/{secret_otp}", web::get().to(do_nothing)) + .route( + "/_radius/_config/{secret_otp}/apple", + web::get().to(do_nothing), + ), + ) + .service( + web::scope("/v1/account") + .route("", web::get().to(account_get)) + .route("", web::post().to(account_post)) + .route("/{id}", web::get().to(account_id_get)) + .route("/{id}", web::delete().to(account_id_delete)) + .route("/{id}/_attr/{attr}", web::get().to(account_id_get_attr)) + .route("/{id}/_attr/{attr}", web::post().to(account_id_post_attr)) + .route("/{id}/_attr/{attr}", web::put().to(account_id_put_attr)) + .route( + "/{id}/_attr/{attr}", + web::delete().to(account_id_delete_attr), + ) + .route("/{id}/_lock", web::get().to(do_nothing)) + .route("/{id}/_credential", web::get().to(do_nothing)) + .route( + "/{id}/_credential/primary", + web::put().to(account_put_id_credential_primary), + ) + .route("/{id}/_credential/{cid}/_lock", web::get().to(do_nothing)) + .route( + "/{id}/_ssh_pubkeys", + web::get().to(account_get_id_ssh_pubkeys), + ) + .route( + "/{id}/_ssh_pubkeys", + web::post().to(account_post_id_ssh_pubkey), + ) + .route( + "/{id}/_ssh_pubkeys/{tag}", + web::get().to(account_get_id_ssh_pubkey_tag), + ) + .route( + "/{id}/_ssh_pubkeys/{tag}", + web::delete().to(account_delete_id_ssh_pubkey_tag), + ) + .route("/{id}/_radius", web::get().to(account_get_id_radius)) + .route( + "/{id}/_radius", + web::post().to(account_post_id_radius_regenerate), + ) + .route("/{id}/_radius", web::delete().to(account_delete_id_radius)) + .route( + "/{id}/_radius/_token", + web::get().to(account_get_id_radius_token), + ) + .route("/{id}/_unix", web::post().to(account_post_id_unix)) + .route( + "/{id}/_unix/_token", + web::get().to(account_get_id_unix_token), + ) + .route( + "/{id}/_unix/_auth", + web::post().to(account_post_id_unix_auth), + ) + .route( + "/{id}/_unix/_credential", + web::put().to(account_put_id_unix_credential), + ) + .route( + "/{id}/_unix/_credential", + web::delete().to(account_delete_id_unix_credential), + ), + ) + .service( + web::scope("/v1/group") + .route("", web::get().to(group_get)) + .route("", web::post().to(group_post)) + .route("/{id}", web::get().to(group_id_get)) + .route("/{id}", web::delete().to(group_id_delete)) + .route("/{id}/_attr/{attr}", web::get().to(group_id_get_attr)) + .route("/{id}/_attr/{attr}", web::post().to(group_id_post_attr)) + .route("/{id}/_attr/{attr}", web::put().to(group_id_put_attr)) + .route("/{id}/_attr/{attr}", web::delete().to(group_id_delete_attr)) + .route("/{id}/_unix", web::post().to(group_post_id_unix)) + .route("/{id}/_unix/_token", web::get().to(group_get_id_unix_token)), + ) + .service( + web::scope("/v1/domain") + .route("", web::get().to(domain_get)) + .route("/{id}", web::get().to(domain_id_get)) + .route("/{id}/_attr/{attr}", web::get().to(domain_id_get_attr)) + .route("/{id}/_attr/{attr}", web::put().to(domain_id_put_attr)), + ) + .service( + web::scope("/v1/recycle_bin") + .route("", web::get().to(do_nothing)) + .route("/{id}", web::get().to(do_nothing)) + .route("/{id}/_restore", web::get().to(do_nothing)), + ) + .service( + web::scope("/v1/access_profile") + .route("", web::get().to(do_nothing)) + .route("/{id}", web::get().to(do_nothing)) + .route("/{id}/_attr/{attr}", web::get().to(do_nothing)), + ) + }); + + let server = match opt_tls_params { + Some(tls_params) => server.bind_openssl(config.address, tls_params), + None => { + warn!("Starting WITHOUT TLS parameters. This may cause authentication to fail!"); + server.bind(config.address) + } + }; + + server.expect("Failed to initialise server!").run(); +}