diff --git a/.github/workflows/tag_version.yml b/.github/workflows/tag_version.yml.disabled similarity index 100% rename from .github/workflows/tag_version.yml rename to .github/workflows/tag_version.yml.disabled diff --git a/Cargo.lock b/Cargo.lock index 4056bab79..559753f57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,3362 +4,3406 @@ name = "actix" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4af87564ff659dee8f9981540cac9418c45e910c8072fdedd643a262a38fcaf" dependencies = [ - "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-rt 1.1.1 (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.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.7 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.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)", - "parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (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)", + "actix-http", + "actix-rt", + "actix_derive", + "bitflags", + "bytes", + "crossbeam-channel", + "derive_more", + "futures", + "lazy_static", + "log", + "parking_lot", + "pin-project", + "smallvec", + "tokio", + "tokio-util 0.2.0", + "trust-dns-proto", + "trust-dns-resolver", ] [[package]] name = "actix-codec" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e55f0a5c2ca15795035d90c46bd0e73a5123b72f68f12596d6ba5282051380" dependencies = [ - "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.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.5 (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.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "log", + "tokio", + "tokio-util 0.2.0", ] [[package]] name = "actix-connect" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c95cc9569221e9802bf4c377f6c18b90ef10227d787611decf79fd47d2a8e76c" dependencies = [ - "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-rt 1.1.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-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.7 (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.5 (registry+https://github.com/rust-lang/crates.io-index)", - "http 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)", - "openssl 0.10.29 (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)", + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "derive_more", + "either", + "futures", + "http", + "log", + "openssl", + "tokio-openssl", + "trust-dns-proto", + "trust-dns-resolver", ] [[package]] name = "actix-files" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193b22cb1f7b4ff12a4eb2415d6d19e47e44ea93e05930b30d05375ea29d3529" 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.7 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.5 (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)", + "actix-http", + "actix-service", + "actix-web", + "bitflags", + "bytes", + "derive_more", + "futures-core", + "futures-util", + "log", + "mime", + "mime_guess", + "percent-encoding 2.1.0", + "v_htmlescape", ] [[package]] name = "actix-http" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c16664cc4fdea8030837ad5a845eb231fb93fc3c5c171edfefb52fad92ce9019" 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.1.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-threadpool 0.3.2 (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.11 (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.7 (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.23 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.5 (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.5 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.1 (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.17 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.16.13 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (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.43 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-codec", + "actix-connect", + "actix-rt", + "actix-service", + "actix-threadpool", + "actix-tls", + "actix-utils", + "base64 0.11.0", + "bitflags", + "brotli2", + "bytes", + "chrono", + "copyless", + "derive_more", + "either", + "encoding_rs", + "failure", + "flate2", + "futures-channel", + "futures-core", + "futures-util", + "fxhash", + "h2", + "http", + "httparse", + "indexmap", + "language-tags", + "lazy_static", + "log", + "mime", + "percent-encoding 2.1.0", + "pin-project", + "rand", + "regex", + "ring", + "serde", + "serde_json", + "serde_urlencoded", + "sha1", + "slab", + "time 0.1.43", ] [[package]] name = "actix-macros" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a60f9ba7c4e6df97f3aacb14bb5c0cd7d98a49dcbaed0d7f292912ad9a6a3ed2" dependencies = [ - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "quote", + "syn", ] [[package]] name = "actix-router" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d7a10ca4d94e8c8e7a87c5173aba1b97ba9a6563ca02b0e1cd23531093d3ec8" dependencies = [ - "bytestring 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "http 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)", - "regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "bytestring", + "http", + "log", + "regex", + "serde", ] [[package]] name = "actix-rt" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143fcc2912e0d1de2bcf4e2f720d2a60c28652ab4179685a1ee159e0fb3db227" dependencies = [ - "actix-macros 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-threadpool 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-macros", + "actix-threadpool", + "copyless", + "futures-channel", + "futures-util", + "smallvec", + "tokio", ] [[package]] name = "actix-server" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d74b464215a473c973a2d7d03a69cc10f4ce1f4b38a7659c5193dc5c675630" dependencies = [ - "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-rt 1.1.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-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.5 (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.22 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "socket2 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "futures-channel", + "futures-util", + "log", + "mio", + "mio-uds", + "num_cpus", + "slab", + "socket2", ] [[package]] name = "actix-service" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e4fc95dfa7e24171b2d0bb46b85f8ab0e8499e4e3caec691fc4ea65c287564" dependencies = [ - "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-util", + "pin-project", ] [[package]] name = "actix-session" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca833a08799c95281204f9cc76223da4d12d2caa03de24362b3e268c60da328c" 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.7 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-service", + "actix-web", + "bytes", + "derive_more", + "futures", + "serde", + "serde_json", + "time 0.1.43", ] [[package]] name = "actix-testing" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47239ca38799ab74ee6a8a94d1ce857014b2ac36f242f70f3f75a66f691e791c" dependencies = [ - "actix-macros 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-rt 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-server 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-service 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "socket2 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-macros", + "actix-rt", + "actix-server", + "actix-service", + "log", + "socket2", ] [[package]] name = "actix-threadpool" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91164716d956745c79dcea5e66d2aa04506549958accefcede5368c70f2fd4ff" dependencies = [ - "derive_more 0.99.7 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-channel 0.3.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)", - "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "threadpool 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more", + "futures-channel", + "lazy_static", + "log", + "num_cpus", + "parking_lot", + "threadpool", ] [[package]] name = "actix-tls" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e5b4faaf105e9a6d389c606c298dcdb033061b00d532af9df56ff3a54995a8" dependencies = [ - "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-rt 1.1.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-utils 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.7 (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.5 (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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-openssl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "derive_more", + "either", + "futures", + "log", + "openssl", + "tokio-openssl", ] [[package]] name = "actix-utils" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcf8f5631bf01adec2267808f00e228b761c60c0584cc9fa0b5364f41d147f4e" dependencies = [ - "actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-rt 1.1.1 (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.5 (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.17 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-codec", + "actix-rt", + "actix-service", + "bitflags", + "bytes", + "either", + "futures", + "log", + "pin-project", + "slab", ] [[package]] name = "actix-web" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3158e822461040822f0dbf1735b9c2ce1f95f93b651d7a7aded00b1efbb1f635" dependencies = [ - "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.2 (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.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-server 1.0.3 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-threadpool 0.3.2 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding_rs 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.5 (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)", - "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.29 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (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.43 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-testing", + "actix-threadpool", + "actix-tls", + "actix-utils", + "actix-web-codegen", + "awc", + "bytes", + "derive_more", + "encoding_rs", + "futures", + "fxhash", + "log", + "mime", + "net2", + "openssl", + "pin-project", + "regex", + "serde", + "serde_json", + "serde_urlencoded", + "time 0.1.43", + "url 2.1.1", ] [[package]] name = "actix-web-codegen" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a71bf475cbe07281d0b3696abb48212db118e7e23219f13596ce865235ff5766" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "actix_derive" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b95aceadaf327f18f0df5962fedc1bde2f870566a0b9f65c89508a3b1f79334c" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "addr2line" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a49806b9dadc843c61e7c97e72490ad7f7220ae249012fbda9ad0609457c0543" dependencies = [ - "gimli 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gimli", ] [[package]] name = "adler32" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" [[package]] name = "aho-corasick" version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" dependencies = [ - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", ] [[package]] name = "arc-swap" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b585a98a234c46fc563103e9278c9391fde1f4e6850334da895d27edb9580f62" [[package]] name = "arrayref" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" [[package]] name = "arrayvec" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" [[package]] name = "async-trait" version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c4f3195085c36ea8d24d32b2f828d23296a9370a28aa39d111f6f16bef9f3b" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", + "winapi 0.3.8", ] [[package]] name = "autocfg" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "awc" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7601d4d1d7ef2335d6597a41b5fe069f6ab799b85f53565ab390e7b7065aac5" dependencies = [ - "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.1.1 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (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.29 (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.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-codec", + "actix-http", + "actix-rt", + "actix-service", + "base64 0.11.0", + "bytes", + "derive_more", + "futures-core", + "log", + "mime", + "openssl", + "percent-encoding 2.1.0", + "rand", + "serde", + "serde_json", + "serde_urlencoded", ] [[package]] name = "backtrace" version = "0.3.48" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df2f85c8a2abbe3b7d7e748052fdd9b76a0458fdeb16ad4223f5eca78c7c130" dependencies = [ - "addr2line 0.12.1 (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.70 (registry+https://github.com/rust-lang/crates.io-index)", - "object 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "addr2line", + "cfg-if", + "libc", + "object", + "rustc-demangle", ] [[package]] name = "base-x" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b20b618342cf9891c292c4f5ac2cde7287cc5c87e87e9c769d617793607dec1" [[package]] name = "base32" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" [[package]] name = "base64" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", + "safemem", ] [[package]] name = "base64" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" [[package]] name = "base64" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42" [[package]] name = "bit-set" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" dependencies = [ - "bit-vec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bit-vec", ] [[package]] name = "bit-vec" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3" [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "blake2b_simd" version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" dependencies = [ - "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayref", + "arrayvec", + "constant_time_eq", ] [[package]] name = "block-buffer" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" dependencies = [ - "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools", + "generic-array", ] [[package]] name = "brotli-sys" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" dependencies = [ - "cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "libc", ] [[package]] name = "brotli2" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" dependencies = [ - "brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "brotli-sys", + "libc", ] [[package]] name = "bstr" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "memchr", + "regex-automata", + "serde", ] [[package]] name = "bumpalo" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5356f1d23ee24a1f785a56d1d1a5f0fd5b0f6a0c0fb2412ce11da71649ab78f6" [[package]] name = "byte-tools" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" [[package]] name = "byteorder" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" [[package]] name = "bytes" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" [[package]] name = "bytestring" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7c05fa5172da78a62d9949d662d2ac89d4cc7355d7b49adee5163f1fb3f363" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", ] [[package]] name = "cargo-husky" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad" [[package]] name = "cast" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version", ] [[package]] name = "cc" version = "1.0.54" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311" [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "chrono" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" dependencies = [ - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer", + "num-traits", + "time 0.1.43", ] [[package]] name = "clap" version = "2.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "textwrap", + "unicode-width", ] [[package]] name = "cloudabi" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", ] [[package]] name = "concread" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f9eb637262518ed76134ca6ce47088c60e514c330f89f32d88ac72b10458bb" dependencies = [ - "crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "num 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch", + "crossbeam-utils", + "num", + "parking_lot", + "smallvec", ] [[package]] name = "constant_time_eq" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "cookie" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" dependencies = [ - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.43", + "url 1.7.2", ] [[package]] name = "cookie" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c60ef6d0bbf56ad2674249b6bb74f2c6aeb98b98dd57b5d3e37cace33011d69" dependencies = [ - "time 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.2.16", ] [[package]] name = "cookie_store" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2a7e5bf5517bf3c3f4358f13d3ec2092419ac2332aa8593605c957da73d491" dependencies = [ - "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 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)", - "publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cookie 0.12.0", + "idna 0.2.0", + "log", + "publicsuffix", + "serde", + "serde_json", + "time 0.1.43", + "url 2.1.1", ] [[package]] name = "copyless" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff9c56c9fb2a49c05ef0e431485a22400af20d33226dc0764d891d09e724127" [[package]] name = "core-foundation" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" dependencies = [ - "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys", + "libc", ] [[package]] name = "core-foundation-sys" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" [[package]] name = "crc32fast" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "criterion" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63f696897c88b57f4ffe3c69d8e1a0613c7d0e6c4833363c8560fbde9c47b966" dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion-plot 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "oorandom 11.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "plotters 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "tinytemplate 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "cast", + "clap", + "criterion-plot", + "csv", + "itertools 0.9.0", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", ] [[package]] name = "criterion-plot" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddeaf7989f00f2e1d871a26a110f3ed713632feac17f65f03ca938c542618b60" dependencies = [ - "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cast", + "itertools 0.9.0", +] + +[[package]] +name = "crossbeam" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69323bff1fb41c635347b8ead484a5ca6c3f11914d784170b158d8449ab07f8e" +dependencies = [ + "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", ] [[package]] name = "crossbeam-channel" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" dependencies = [ - "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)", + "crossbeam-utils", + "maybe-uninit", ] [[package]] name = "crossbeam-deque" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" dependencies = [ - "crossbeam-epoch 0.8.2 (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)", + "crossbeam-epoch", + "crossbeam-utils", + "maybe-uninit", ] [[package]] name = "crossbeam-epoch" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "cfg-if", + "crossbeam-utils", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab6bffe714b6bb07e42f201352c34f51fefd355ace793f9e638ebd52d23f98d2" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "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)", + "autocfg", + "cfg-if", + "lazy_static", ] [[package]] name = "csv" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" dependencies = [ - "bstr 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "csv-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr", + "csv-core", + "itoa", + "ryu", + "serde", ] [[package]] name = "csv-core" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" dependencies = [ - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", ] [[package]] name = "darling" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ - "darling_core 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "darling_macro 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "darling_core", + "darling_macro", ] [[package]] name = "darling_core" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" dependencies = [ - "fnv 1.0.7 (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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (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.22 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", ] [[package]] name = "darling_macro" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ - "darling_core 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "darling_core", + "quote", + "syn", ] [[package]] name = "derive_builder" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" 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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "darling", + "derive_builder_core", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "derive_builder_core" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" dependencies = [ - "darling 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "darling", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "derive_more" version = "0.99.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2127768764f1556535c01b5326ef94bd60ff08dcfbdc544d53e69ed155610f5d" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "digest" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" dependencies = [ - "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array", ] [[package]] name = "dirs" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "dirs-sys", ] [[package]] name = "dirs-sys" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "redox_users", + "winapi 0.3.8", ] [[package]] name = "discard" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" [[package]] name = "dtoa" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" [[package]] name = "either" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" [[package]] name = "encoding_rs" version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8ac63f94732332f44fe654443c46f6375d1939684c17b0afb6cb56b0456e171" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "enum-as-inner" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc4bfcfacb61d231109d1d55202c1f33263319668b168843e02ad4652725ec9c" dependencies = [ - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "heck", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "env_logger" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "humantime 1.3.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.7 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "humantime", + "log", + "regex", + "termcolor", ] [[package]] name = "error-chain" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" dependencies = [ - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.2", ] [[package]] name = "failure" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" dependencies = [ - "backtrace 0.3.48 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace", + "failure_derive", ] [[package]] name = "failure_derive" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", + "synstructure", ] [[package]] name = "fake-simd" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "fallible-iterator" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fallible-streaming-iterator" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fancy-regex" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae91abf6555234338687bb47913978d275539235fcb77ba9863b779090b42b14" dependencies = [ - "bit-set 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "bit-set", + "regex", ] [[package]] name = "flate2" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" 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.70 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", ] [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types-shared", ] [[package]] name = "foreign-types-shared" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "fuchsia-zircon-sys", ] [[package]] name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futures" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" dependencies = [ - "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] name = "futures-channel" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" dependencies = [ - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core", + "futures-sink", ] [[package]] name = "futures-core" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" [[package]] name = "futures-executor" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" dependencies = [ - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core", + "futures-task", + "futures-util", ] [[package]] name = "futures-io" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" [[package]] name = "futures-macro" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" dependencies = [ - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "futures-sink" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" [[package]] name = "futures-task" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" dependencies = [ - "once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell", ] [[package]] name = "futures-util" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" dependencies = [ - "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", ] [[package]] name = "fxhash" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", ] [[package]] name = "generic-array" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fceb69994e330afed50c93524be68c42fa898c2d9fd4ee8da03bd7363acd26f2" dependencies = [ - "nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop", + "typenum", ] [[package]] name = "getrandom" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] [[package]] name = "gimli" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" [[package]] name = "h2" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.1 (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)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "log", + "slab", + "tokio", + "tokio-util 0.3.1", ] [[package]] name = "half" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" [[package]] name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" dependencies = [ - "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation", ] [[package]] name = "hermit-abi" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "hostname" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ - "libc 0.2.70 (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)", + "libc", + "match_cfg", + "winapi 0.3.8", ] [[package]] name = "http" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "fnv", + "itoa", ] [[package]] name = "http-body" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "http", ] [[package]] name = "httparse" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" [[package]] name = "humantime" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" dependencies = [ - "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error", ] [[package]] name = "hyper" -version = "0.13.5" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e7655b9594024ad0ee439f3b5a7299369dc2a3f459b47c696f9ff676f9aa1f" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.1 (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)", - "itoa 0.4.5 (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.34 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (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)", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "log", + "pin-project", + "socket2", + "time 0.1.43", + "tokio", + "tower-service", + "want", ] [[package]] name = "hyper-tls" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3adcd308402b9553630734e9c36b77a7e48b3821251ca2493e8cd596763aafaa" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.13.5 (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.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tls 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-tls", ] [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idlset" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a98b4868ca8a8a8bcf3943fe1cfd8b27c17d398d00c0b8aa78aee4c2b5131eb" dependencies = [ - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", + "serde_derive", + "smallvec", + "time 0.1.43", ] [[package]] name = "idna" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "idna" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "indexmap" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", ] [[package]] name = "iovec" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "ipconfig" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" dependencies = [ - "socket2 0.3.12 (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.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2", + "widestring", + "winapi 0.3.8", + "winreg 0.6.2", ] [[package]] name = "itertools" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" dependencies = [ - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either", ] [[package]] name = "itertools" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" dependencies = [ - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either", ] [[package]] name = "itoa" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" [[package]] name = "js-sys" -version = "0.3.39" +version = "0.3.40" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce10c23ad2ea25ceca0093bd3192229da4c5b3c0f2de499c1ecac0d98d452177" dependencies = [ - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen", ] [[package]] name = "kanidm" version = "0.1.2" dependencies = [ - "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)", - "base64 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cargo-husky 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "concread 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "cookie 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "idlset 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "kanidm_proto 0.1.2", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libsqlite3-sys 0.17.3 (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.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.29 (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.14.0 (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.7 (registry+https://github.com/rust-lang/crates.io-index)", - "rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rusqlite 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "sshkeys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zxcvbn 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix", + "actix-files", + "actix-rt", + "actix-session", + "actix-web", + "base64 0.12.1", + "cargo-husky", + "chrono", + "concread", + "cookie 0.13.3", + "criterion", + "crossbeam", + "env_logger", + "futures", + "idlset", + "kanidm_proto", + "lazy_static", + "libsqlite3-sys", + "log", + "num_cpus", + "openssl", + "r2d2", + "r2d2_sqlite", + "rand", + "regex", + "rpassword", + "rusqlite", + "serde", + "serde_cbor", + "serde_derive", + "serde_json", + "sshkeys", + "structopt", + "time 0.1.43", + "tokio", + "uuid", + "zxcvbn", ] [[package]] name = "kanidm_client" version = "0.1.2" dependencies = [ - "actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "kanidm 0.1.2", - "kanidm_proto 0.1.2", - "log 0.4.8 (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.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix", + "env_logger", + "futures", + "kanidm", + "kanidm_proto", + "log", + "reqwest", + "serde", + "serde_derive", + "serde_json", + "tokio", + "toml", + "uuid", ] [[package]] name = "kanidm_proto" version = "0.1.2" dependencies = [ - "base32 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zxcvbn 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "base32", + "serde", + "serde_derive", + "serde_json", + "thiserror", + "uuid", + "zxcvbn", ] [[package]] name = "kanidm_tools" version = "0.1.2" dependencies = [ - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "kanidm_client 0.1.2", - "kanidm_proto 0.1.2", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "shellexpand 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "zxcvbn 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger", + "kanidm_client", + "kanidm_proto", + "log", + "rayon", + "rpassword", + "serde", + "serde_json", + "shellexpand", + "structopt", + "zxcvbn", ] [[package]] name = "kanidm_unix_int" version = "0.1.2" dependencies = [ - "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.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "kanidm 0.1.2", - "kanidm_client 0.1.2", - "kanidm_proto 0.1.2", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "libsqlite3-sys 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)", - "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.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "reqwest 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rusqlite 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "actix", + "bytes", + "env_logger", + "futures", + "kanidm", + "kanidm_client", + "kanidm_proto", + "libc", + "libsqlite3-sys", + "log", + "r2d2", + "r2d2_sqlite", + "reqwest", + "rpassword", + "rusqlite", + "serde", + "serde_cbor", + "serde_derive", + "structopt", + "tokio", + "tokio-util 0.3.1", + "toml", ] [[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] [[package]] name = "language-tags" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.70" +version = "0.2.71" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" [[package]] name = "libnss" version = "0.2.0" source = "git+https://github.com/csnewman/libnss-rs.git?rev=eab2d93d2438652773699b0807d558ce75b1e748#eab2d93d2438652773699b0807d558ce75b1e748" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "libc", + "paste", ] [[package]] name = "libsqlite3-sys" version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d90181c2904c287e5390186be820e5ef311a3c62edebb7d6ca3d6a48ce041d" dependencies = [ - "cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "pkg-config", + "vcpkg", ] [[package]] name = "linked-hash-map" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" [[package]] name = "lock_api" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" dependencies = [ - "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard", ] [[package]] name = "log" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "lru-cache" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" dependencies = [ - "linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "linked-hash-map", ] [[package]] name = "match_cfg" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" [[package]] name = "maybe-uninit" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" [[package]] name = "memoffset" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", ] [[package]] name = "mime" version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "mime_guess" version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" 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)", + "mime", + "unicase", ] [[package]] name = "miniz_oxide" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" dependencies = [ - "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "adler32", ] [[package]] name = "mio" version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow 0.2.1", + "net2", + "slab", + "winapi 0.2.8", ] [[package]] name = "mio-named-pipes" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log", + "mio", + "miow 0.3.4", + "winapi 0.3.8", ] [[package]] name = "mio-uds" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" dependencies = [ - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec", + "libc", + "mio", ] [[package]] name = "miow" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", ] [[package]] name = "miow" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22dfdd1d51b2639a5abd17ed07005c3af05fb7a2a3b1a1d0d7af1000a520c1c7" dependencies = [ - "socket2 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2", + "winapi 0.3.8", ] [[package]] name = "native-tls" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (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.29 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.56 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", ] [[package]] name = "net2" version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "winapi 0.3.8", ] [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "nom" version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" dependencies = [ - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", + "version_check 0.1.5", ] [[package]] name = "nss_kanidm" version = "0.1.2" dependencies = [ - "kanidm_unix_int 0.1.2", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "libnss 0.2.0 (git+https://github.com/csnewman/libnss-rs.git?rev=eab2d93d2438652773699b0807d558ce75b1e748)", - "paste 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "kanidm_unix_int", + "lazy_static", + "libc", + "libnss", + "paste", ] [[package]] name = "num" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" dependencies = [ - "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", ] [[package]] name = "num-bigint" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "num-integer", + "num-traits", ] [[package]] name = "num-complex" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "num-traits", ] [[package]] name = "num-integer" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "num-traits", ] [[package]] name = "num-iter" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "num-integer", + "num-traits", ] [[package]] name = "num-rational" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "num-bigint", + "num-integer", + "num-traits", ] [[package]] name = "num-traits" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", ] [[package]] name = "num_cpus" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ - "hermit-abi 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", ] [[package]] name = "object" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" [[package]] name = "once_cell" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" [[package]] name = "oorandom" version = "11.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94af325bc33c7f60191be4e2c984d48aaa21e2854f473b85398344b60c9b6358" [[package]] name = "openssl" version = "0.10.29" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee6d85f4cb4c4f59a6a85d5b68a233d280c82e29e822913b9c8b129fbf20bdd" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (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.70 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.56 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "cfg-if", + "foreign-types", + "lazy_static", + "libc", + "openssl-sys", ] [[package]] name = "openssl-probe" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" [[package]] name = "openssl-src" version = "111.9.0+1.1.1g" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2dbe10ddd1eb335aba3780eb2eaa13e1b7b441d2562fd962398740927f39ec4" dependencies = [ - "cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", ] [[package]] name = "openssl-sys" -version = "0.9.56" +version = "0.9.57" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7410fef80af8ac071d4f63755c0ab89ac3df0fd1ea91f1d1f37cf5cec4395990" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-src 111.9.0+1.1.1g (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", ] [[package]] name = "pam_kanidm" version = "0.1.2" dependencies = [ - "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "kanidm_unix_int 0.1.2", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures", + "kanidm_unix_int", + "libc", + "tokio", ] [[package]] name = "parking_lot" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" dependencies = [ - "lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api", + "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" 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.70 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "cloudabi", + "libc", + "redox_syscall", + "smallvec", + "winapi 0.3.8", ] [[package]] name = "paste" -version = "0.1.12" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53181dcd37421c08d3b69f887784956674d09c3f9a47a04fece2b130a5b346b" dependencies = [ - "paste-impl 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl", + "proc-macro-hack", ] [[package]] name = "paste-impl" -version = "0.1.12" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ca490fa1c034a71412b4d1edcb904ec5a0981a4426c9eb2128c0fda7a68d17" dependencies = [ - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pin-project" version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791" dependencies = [ - "pin-project-internal 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-internal", ] [[package]] name = "pin-project-internal" version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "pin-project-lite" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df32da11d84f3a7d70205549562966279adb900e080fad3dccd8e64afccf0ad" [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" [[package]] name = "plotters" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" dependencies = [ - "js-sys 0.3.39 (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.62 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys", + "num-traits", + "wasm-bindgen", + "web-sys", ] [[package]] name = "ppv-lite86" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" [[package]] name = "proc-macro-error" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98e9e4b82e0ef281812565ea4751049f1bdcdfccda7d3f459f2e138a40c08678" dependencies = [ - "proc-macro-error-attr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check 0.9.2", ] [[package]] name = "proc-macro-error-attr" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5444ead4e9935abd7f27dc51f7e852a0569ac888096d5ec2499470794e2e53" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", - "syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", + "syn-mid", + "version_check 0.9.2", ] [[package]] name = "proc-macro-hack" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4" [[package]] name = "proc-macro-nested" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" [[package]] name = "proc-macro2" -version = "1.0.13" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid", ] [[package]] name = "publicsuffix" version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" dependencies = [ - "error-chain 0.12.2 (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)", - "regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain", + "idna 0.2.0", + "lazy_static", + "regex", + "url 2.1.1", ] [[package]] name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", ] [[package]] name = "r2d2" version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1497e40855348e4a8a40767d8e55174bce1e445a3ac9254ad44ad468ee0485af" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "scheduled-thread-pool 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log", + "parking_lot", + "scheduled-thread-pool", ] [[package]] name = "r2d2_sqlite" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c4689dcbe44341a3388a696a056cbb96124f7e70a1fbc9cd6a7bb6bab543e3b" dependencies = [ - "r2d2 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rusqlite 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", + "r2d2", + "rusqlite", ] [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] name = "rand_chacha" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ - "ppv-lite86 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", ] [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core", ] [[package]] name = "rayon" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" dependencies = [ - "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "either", + "rayon-core", ] [[package]] name = "rayon-core" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" 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)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "crossbeam-queue", + "crossbeam-utils", + "lazy_static", + "num_cpus", ] [[package]] name = "redox_syscall" version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" [[package]] name = "redox_users" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "redox_syscall", + "rust-argon2", ] [[package]] name = "regex" -version = "1.3.7" +version = "1.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" dependencies = [ - "aho-corasick 0.7.10 (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.17 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", ] [[package]] name = "regex-automata" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", ] [[package]] name = "regex-syntax" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" [[package]] name = "remove_dir_all" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "reqwest" -version = "0.10.4" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b82c9238b305f26f53443e3a4bc8528d64b8d0bee408ec949eb7bf5635ec680" dependencies = [ - "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)", - "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cookie_store 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding_rs 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.1 (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.5 (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.39 (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.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.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (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.43 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tls 0.3.1 (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.62 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", - "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.12.1", + "bytes", + "cookie 0.12.0", + "cookie_store", + "encoding_rs", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "hyper-tls", + "js-sys", + "lazy_static", + "log", + "mime", + "mime_guess", + "native-tls", + "percent-encoding 2.1.0", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "time 0.1.43", + "tokio", + "tokio-tls", + "url 2.1.1", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.7.0", ] [[package]] name = "resolv-conf" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11834e137f3b14e309437a8276714eed3a80d1ef894869e510f2c0c0b98b9f4a" dependencies = [ - "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)", + "hostname", + "quick-error", ] [[package]] name = "ring" -version = "0.16.13" +version = "0.16.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06b3fefa4f12272808f809a0af618501fdaba41a58963c5fb72238ab0be09603" dependencies = [ - "cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "once_cell 1.4.0 (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.1 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi 0.3.8", ] [[package]] name = "rpassword" version = "4.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "winapi 0.3.8", ] [[package]] name = "rusqlite" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a656821bb6317a84b257737b7934f79c0dbb7eb694710475908280ebad3e64" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "fallible-streaming-iterator 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "libsqlite3-sys 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)", - "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "fallible-iterator", + "fallible-streaming-iterator", + "libsqlite3-sys", + "lru-cache", + "memchr", + "time 0.1.43", ] [[package]] name = "rust-argon2" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", ] [[package]] name = "rustc-demangle" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" [[package]] name = "rustc_version" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver", ] [[package]] name = "ryu" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "safemem" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util", ] [[package]] name = "schannel" version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "winapi 0.3.8", ] [[package]] name = "scheduled-thread-pool" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0988d7fdf88d5e5fcf5923a0f1e8ab345f3e98ab4bc6bc45a2d5ff7f7458fbf6" dependencies = [ - "parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot", ] [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" dependencies = [ - "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)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] name = "security-framework-sys" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" dependencies = [ - "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys", + "libc", ] [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver-parser", ] [[package]] name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.110" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d" dependencies = [ - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive", ] [[package]] name = "serde_cbor" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622" dependencies = [ - "half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "half", + "serde", ] [[package]] name = "serde_derive" -version = "1.0.110" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "serde_json" version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" dependencies = [ - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa", + "ryu", + "serde", ] [[package]] name = "serde_urlencoded" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" 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.110 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "dtoa", + "itoa", + "serde", + "url 2.1.1", ] [[package]] name = "sha1" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" [[package]] name = "sha2" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" dependencies = [ - "block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer", + "byte-tools", + "digest", + "fake-simd", + "generic-array", ] [[package]] name = "shellexpand" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2b22262a9aaf9464d356f656fea420634f78c881c5eebd5ef5e66d8b9bc603" dependencies = [ - "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dirs", ] [[package]] name = "signal-hook-registry" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" dependencies = [ - "arc-swap 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "arc-swap", + "libc", ] [[package]] name = "slab" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" dependencies = [ - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "socket2" version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "redox_syscall", + "winapi 0.3.8", ] [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "sshkeys" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b37f3de188a88f21cd5bd70072e85261e683850c749cd9f93b858e1cdac3a67" dependencies = [ - "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.6.0", + "byteorder", + "sha2", ] [[package]] name = "standback" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4b8c631c998468961a9ea159f064c5c8499b95b5e4a34b77849d45949d540" [[package]] name = "stdweb" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "discard", + "rustc_version", + "stdweb-derive", + "stdweb-internal-macros", + "stdweb-internal-runtime", + "wasm-bindgen", ] [[package]] name = "stdweb-derive" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "syn", ] [[package]] name = "stdweb-internal-macros" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" dependencies = [ - "base-x 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "base-x", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "serde_json", + "sha1", + "syn", ] [[package]] name = "stdweb-internal-runtime" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" [[package]] name = "strsim" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "structopt" version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863246aaf5ddd0d6928dfeb1a9ca65f505599e4e1b399935ef7e75107516b4ef" dependencies = [ - "clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "clap", + "lazy_static", + "structopt-derive", ] [[package]] name = "structopt-derive" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d239ca4b13aee7a2142e6795cbd69e457665ff8037aed33b3effdc430d2f927a" dependencies = [ - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-error 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "syn" -version = "1.0.22" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] name = "syn-mid" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "synstructure" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", + "unicode-xid", ] [[package]] name = "tempfile" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi 0.3.8", ] [[package]] name = "termcolor" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" dependencies = [ - "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util", ] [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13f926965ad00595dd129fa12823b04bbf866e9085ab0a5f2b05b850fbfc344" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "893582086c2f98cde18f906265a65b5030a074b1046c674ae898be6519a7f479" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] name = "thread_local" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", ] [[package]] name = "threadpool" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" dependencies = [ - "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus", ] [[package]] name = "time" version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "winapi 0.3.8", ] [[package]] name = "time" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a51cadc5b1eec673a685ff7c33192ff7b7603d0b75446fb354939ee615acb15" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "standback 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", - "time-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "standback", + "stdweb", + "time-macros", + "version_check 0.9.2", + "winapi 0.3.8", ] [[package]] name = "time-macros" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9b6e9f095bc105e183e3cd493d72579be3181ad4004fceb01adbe9eecab2d" dependencies = [ - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", - "time-macros-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack", + "time-macros-impl", ] [[package]] name = "time-macros-impl" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" dependencies = [ - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "standback 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack", + "proc-macro2", + "quote", + "standback", + "syn", ] [[package]] name = "tinytemplate" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f" dependencies = [ - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", + "serde_json", ] [[package]] name = "tokio" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (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.70 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.5 (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.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "fnv", + "futures-core", + "iovec", + "lazy_static", + "libc", + "memchr", + "mio", + "mio-named-pipes", + "mio-uds", + "num_cpus", + "pin-project-lite", + "signal-hook-registry", + "slab", + "tokio-macros", + "winapi 0.3.8", ] [[package]] name = "tokio-macros" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "tokio-openssl" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c4b08c5f4208e699ede3df2520aca2e82401b2de33f45e96696a074480be594" dependencies = [ - "openssl 0.10.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl", + "tokio", ] [[package]] name = "tokio-tls" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" dependencies = [ - "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls", + "tokio", ] [[package]] name = "tokio-util" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.5 (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.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", ] [[package]] name = "tokio-util" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" dependencies = [ - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.5 (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.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", ] [[package]] name = "toml" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" dependencies = [ - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "tower-service" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" [[package]] name = "trust-dns-proto" version = "0.18.0-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a7f3a2ab8a919f5eca52a468866a67ed7d3efa265d48a652a9a3452272b413f" dependencies = [ - "async-trait 0.1.31 (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.8 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.5 (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.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "socket2 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "async-trait", + "enum-as-inner", + "failure", + "futures", + "idna 0.2.0", + "lazy_static", + "log", + "rand", + "smallvec", + "socket2", + "tokio", + "url 2.1.1", ] [[package]] name = "trust-dns-resolver" version = "0.18.0-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f90b1502b226f8b2514c6d5b37bafa8c200d7ca4102d57dc36ee0f3b7a04a2f" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ipconfig 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)", - "lru-cache 0.1.2 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.21 (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)", + "cfg-if", + "failure", + "futures", + "ipconfig", + "lazy_static", + "log", + "lru-cache", + "resolv-conf", + "smallvec", + "tokio", + "trust-dns-proto", ] [[package]] name = "try-lock" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" [[package]] name = "typenum" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" [[package]] name = "unicase" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.2", ] [[package]] name = "unicode-bidi" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", ] [[package]] name = "unicode-normalization" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" dependencies = [ - "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec", ] [[package]] name = "unicode-segmentation" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" [[package]] name = "unicode-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" [[package]] name = "unicode-xid" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" [[package]] name = "untrusted" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" dependencies = [ - "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)", + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", ] [[package]] name = "url" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" dependencies = [ - "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.2.0", + "matches", + "percent-encoding 2.1.0", ] [[package]] name = "uuid" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" dependencies = [ - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", + "serde", ] [[package]] name = "v_escape" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6" dependencies = [ - "v_escape_derive 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "v_escape_derive", ] [[package]] name = "v_escape_derive" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" dependencies = [ - "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "nom", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "v_htmlescape" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "v_escape 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "v_escape", ] [[package]] name = "vcpkg" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55d1e41d56121e07f1e223db0a4def204e45c85425f6a16d462fd07c8d10d74c" [[package]] name = "version_check" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" [[package]] name = "version_check" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" [[package]] name = "walkdir" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" dependencies = [ - "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "same-file", + "winapi 0.3.8", + "winapi-util", ] [[package]] name = "want" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log", + "try-lock", ] [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasm-bindgen" -version = "0.2.62" +version = "0.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2dc4aa152834bc334f506c1a06b866416a8b6697d5c9f75b9a689c8486def0" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "serde", + "serde_json", + "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.62" +version = "0.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded84f06e0ed21499f6184df0e0cb3494727b0c5da89534e0fcc55c51d812101" dependencies = [ - "bumpalo 3.3.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.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64487204d863f109eb77e8462189d111f27cb5712cc9fdb3461297a76963a2f6" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.62" +version = "0.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "838e423688dac18d73e31edce74ddfac468e37b1506ad163ffaf0a46f703ffe3" dependencies = [ - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "quote", + "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.62" +version = "0.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3156052d8ec77142051a533cdd686cba889537b213f948cd1d20869926e68e92" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.62" +version = "0.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9ba19973a58daf4db6f352eda73dc0e289493cd29fb2632eb172085b6521acd" [[package]] name = "web-sys" -version = "0.3.39" +version = "0.3.40" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b72fe77fd39e4bd3eaa4412fd299a0be6b3dfe9d2597e2f1c20beb968f41d17" dependencies = [ - "js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys", + "wasm-bindgen", ] [[package]] name = "widestring" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effc0e4ff8085673ea7b9b2e3c73f6bd4d118810c9009ed8f1e16bd96c331db6" [[package]] name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winreg" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", +] + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi 0.3.8", ] [[package]] name = "ws2_32-sys" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] [[package]] name = "zxcvbn" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7b69cd8a6484379ef04457ba1c00aaadad166c693b1b6a625b01bcc694b212b" dependencies = [ - "chrono 0.4.11 (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.5 (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)", - "regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono", + "derive_builder", + "fancy-regex", + "itertools 0.8.2", + "lazy_static", + "quick-error", + "regex", + "serde", + "serde_derive", ] - -[metadata] -"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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a60f9ba7c4e6df97f3aacb14bb5c0cd7d98a49dcbaed0d7f292912ad9a6a3ed2" -"checksum actix-router 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9d7a10ca4d94e8c8e7a87c5173aba1b97ba9a6563ca02b0e1cd23531093d3ec8" -"checksum actix-rt 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "143fcc2912e0d1de2bcf4e2f720d2a60c28652ab4179685a1ee159e0fb3db227" -"checksum actix-server 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6d74b464215a473c973a2d7d03a69cc10f4ce1f4b38a7659c5193dc5c675630" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "47239ca38799ab74ee6a8a94d1ce857014b2ac36f242f70f3f75a66f691e791c" -"checksum actix-threadpool 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "91164716d956745c79dcea5e66d2aa04506549958accefcede5368c70f2fd4ff" -"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 addr2line 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a49806b9dadc843c61e7c97e72490ad7f7220ae249012fbda9ad0609457c0543" -"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" -"checksum aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" -"checksum arc-swap 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b585a98a234c46fc563103e9278c9391fde1f4e6850334da895d27edb9580f62" -"checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" -"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" -"checksum async-trait 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "26c4f3195085c36ea8d24d32b2f828d23296a9370a28aa39d111f6f16bef9f3b" -"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum awc 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d7601d4d1d7ef2335d6597a41b5fe069f6ab799b85f53565ab390e7b7065aac5" -"checksum backtrace 0.3.48 (registry+https://github.com/rust-lang/crates.io-index)" = "0df2f85c8a2abbe3b7d7e748052fdd9b76a0458fdeb16ad4223f5eca78c7c130" -"checksum base-x 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b20b618342cf9891c292c4f5ac2cde7287cc5c87e87e9c769d617793607dec1" -"checksum base32 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" -"checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" -"checksum base64 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42" -"checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" -"checksum bit-set 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" -"checksum bit-vec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3" -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" -"checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" -"checksum brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" -"checksum bstr 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" -"checksum bumpalo 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5356f1d23ee24a1f785a56d1d1a5f0fd5b0f6a0c0fb2412ce11da71649ab78f6" -"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.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" -"checksum bytestring 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fc7c05fa5172da78a62d9949d662d2ac89d4cc7355d7b49adee5163f1fb3f363" -"checksum cargo-husky 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad" -"checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" -"checksum cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)" = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" -"checksum clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum concread 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "87f9eb637262518ed76134ca6ce47088c60e514c330f89f32d88ac72b10458bb" -"checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" -"checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" -"checksum cookie 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0c60ef6d0bbf56ad2674249b6bb74f2c6aeb98b98dd57b5d3e37cace33011d69" -"checksum cookie_store 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3d3b52e7c82f1af00203337cd15c56be6fac37397a26439d03cedbbdbc487ef" -"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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "63f696897c88b57f4ffe3c69d8e1a0613c7d0e6c4833363c8560fbde9c47b966" -"checksum criterion-plot 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ddeaf7989f00f2e1d871a26a110f3ed713632feac17f65f03ca938c542618b60" -"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.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.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" -"checksum darling 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" -"checksum darling_core 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" -"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.7 (registry+https://github.com/rust-lang/crates.io-index)" = "2127768764f1556535c01b5326ef94bd60ff08dcfbdc544d53e69ed155610f5d" -"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 discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" -"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_rs 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "e8ac63f94732332f44fe654443c46f6375d1939684c17b0afb6cb56b0456e171" -"checksum enum-as-inner 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4bfcfacb61d231109d1d55202c1f33263319668b168843e02ad4652725ec9c" -"checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -"checksum error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" -"checksum failure 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -"checksum failure_derive 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -"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.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91abf6555234338687bb47913978d275539235fcb77ba9863b779090b42b14" -"checksum flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" -"checksum fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -"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.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" -"checksum futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" -"checksum futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" -"checksum futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" -"checksum futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" -"checksum futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" -"checksum futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" -"checksum futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" -"checksum futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" -"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 gimli 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" -"checksum h2 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" -"checksum half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" -"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -"checksum hermit-abi 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71" -"checksum hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -"checksum http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" -"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.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96816e1d921eca64d208a85aab4f7798455a8e34229ee5a88c935bdee1b78b14" -"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.7 (registry+https://github.com/rust-lang/crates.io-index)" = "86371f94adfc421112d7626722822710a4b49290a10cecff274762a1eef8caf5" -"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -"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.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" -"checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" -"checksum js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5a448de267e7358beaf4a5d849518fe9a0c13fce7afd44b06e68550e5562a7" -"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 libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)" = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" -"checksum libnss 0.2.0 (git+https://github.com/csnewman/libnss-rs.git?rev=eab2d93d2438652773699b0807d558ce75b1e748)" = "" -"checksum libsqlite3-sys 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56d90181c2904c287e5390186be820e5ef311a3c62edebb7d6ca3d6a48ce041d" -"checksum linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" -"checksum lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" -"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" -"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.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" -"checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -"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.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" -"checksum mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" -"checksum mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" -"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum miow 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "22dfdd1d51b2639a5abd17ed07005c3af05fb7a2a3b1a1d0d7af1000a520c1c7" -"checksum native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" -"checksum net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" -"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" -"checksum num 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" -"checksum num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -"checksum num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" -"checksum num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00" -"checksum num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" -"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" -"checksum num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -"checksum object 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" -"checksum once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" -"checksum oorandom 11.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "94af325bc33c7f60191be4e2c984d48aaa21e2854f473b85398344b60c9b6358" -"checksum openssl 0.10.29 (registry+https://github.com/rust-lang/crates.io-index)" = "cee6d85f4cb4c4f59a6a85d5b68a233d280c82e29e822913b9c8b129fbf20bdd" -"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-src 111.9.0+1.1.1g (registry+https://github.com/rust-lang/crates.io-index)" = "a2dbe10ddd1eb335aba3780eb2eaa13e1b7b441d2562fd962398740927f39ec4" -"checksum openssl-sys 0.9.56 (registry+https://github.com/rust-lang/crates.io-index)" = "f02309a7f127000ed50594f0b50ecc69e7c654e16d41b4e8156d1b3df8e0b52e" -"checksum parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" -"checksum parking_lot_core 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" -"checksum paste 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "0a229b1c58c692edcaa5b9b0948084f130f55d2dcc15b02fcc5340b2b4521476" -"checksum paste-impl 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "2e0bf239e447e67ff6d16a8bb5e4d4bd2343acf5066061c0e8e06ac5ba8ca68c" -"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -"checksum pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)" = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791" -"checksum pin-project-internal 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)" = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" -"checksum pin-project-lite 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f7505eeebd78492e0f6108f7171c4948dbb120ee8119d9d77d0afa5469bef67f" -"checksum pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" -"checksum plotters 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "f9b1d9ca091d370ea3a78d5619145d1b59426ab0c9eedbad2514a4cee08bf389" -"checksum ppv-lite86 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" -"checksum proc-macro-error 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98e9e4b82e0ef281812565ea4751049f1bdcdfccda7d3f459f2e138a40c08678" -"checksum proc-macro-error-attr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4f5444ead4e9935abd7f27dc51f7e852a0569ac888096d5ec2499470794e2e53" -"checksum proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" -"checksum proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" -"checksum proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "53f5ffe53a6b28e37c9c1ce74893477864d64f74778a93a4beb43c8fa167f639" -"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 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" -"checksum r2d2 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1497e40855348e4a8a40767d8e55174bce1e445a3ac9254ad44ad468ee0485af" -"checksum r2d2_sqlite 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c4689dcbe44341a3388a696a056cbb96124f7e70a1fbc9cd6a7bb6bab543e3b" -"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" -"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" -"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" -"checksum regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" -"checksum regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" -"checksum regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" -"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" -"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.13 (registry+https://github.com/rust-lang/crates.io-index)" = "703516ae74571f24b465b4a1431e81e2ad51336cb0ded733a55a1aa3eccac196" -"checksum rpassword 4.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" -"checksum rusqlite 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "64a656821bb6317a84b257737b7934f79c0dbb7eb694710475908280ebad3e64" -"checksum rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" -"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1" -"checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" -"checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -"checksum schannel 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" -"checksum scheduled-thread-pool 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0988d7fdf88d5e5fcf5923a0f1e8ab345f3e98ab4bc6bc45a2d5ff7f7458fbf6" -"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -"checksum security-framework 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" -"checksum security-framework-sys 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" -"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.110 (registry+https://github.com/rust-lang/crates.io-index)" = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c" -"checksum serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622" -"checksum serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)" = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984" -"checksum serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)" = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" -"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" -"checksum shellexpand 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2b22262a9aaf9464d356f656fea420634f78c881c5eebd5ef5e66d8b9bc603" -"checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" -"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" -"checksum smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" -"checksum socket2 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918" -"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 standback 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "47e4b8c631c998468961a9ea159f064c5c8499b95b5e4a34b77849d45949d540" -"checksum stdweb 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -"checksum stdweb-derive 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -"checksum stdweb-internal-macros 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -"checksum stdweb-internal-runtime 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" -"checksum strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" -"checksum structopt 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "863246aaf5ddd0d6928dfeb1a9ca65f505599e4e1b399935ef7e75107516b4ef" -"checksum structopt-derive 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d239ca4b13aee7a2142e6795cbd69e457665ff8037aed33b3effdc430d2f927a" -"checksum syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "1425de3c33b0941002740a420b1a906a350b88d08b82b2c8a01035a3f9447bac" -"checksum syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" -"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" -"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" -"checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" -"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.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -"checksum time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" -"checksum time 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "3a51cadc5b1eec673a685ff7c33192ff7b7603d0b75446fb354939ee615acb15" -"checksum time-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9ae9b6e9f095bc105e183e3cd493d72579be3181ad4004fceb01adbe9eecab2d" -"checksum time-macros-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" -"checksum tinytemplate 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "45e4bc5ac99433e0dcb8b9f309dd271a165ae37dde129b9e0ce1bfdd8bfe4891" -"checksum tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58" -"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" -"checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" -"checksum tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" -"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" -"checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" -"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.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" -"checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" -"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" -"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum untrusted 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" -"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.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" -"checksum v_escape 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6" -"checksum v_escape_derive 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" -"checksum v_htmlescape 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41" -"checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" -"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" -"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.62 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c7d40d09cdbf0f4895ae58cf57d92e1e57a9dd8ed2e8390514b54a47cc5551" -"checksum wasm-bindgen-backend 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "c3972e137ebf830900db522d6c8fd74d1900dcfc733462e9a12e942b00b4ac94" -"checksum wasm-bindgen-futures 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "8a369c5e1dfb7569e14d62af4da642a3cbc2f9a3652fe586e26ac22222aa4b04" -"checksum wasm-bindgen-macro 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "2cd85aa2c579e8892442954685f0d801f9129de24fa2136b2c6a539c76b65776" -"checksum wasm-bindgen-macro-support 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "8eb197bd3a47553334907ffd2f16507b4f4f01bbec3ac921a7719e0decdfe72a" -"checksum wasm-bindgen-shared 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "a91c2916119c17a8e316507afaaa2dd94b47646048014bbdf6bef098c1bb58ad" -"checksum web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)" = "8bc359e5dd3b46cb9687a051d50a2fdd228e4ba7cf6fcf861a5365c3d671a642" -"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.5 (registry+https://github.com/rust-lang/crates.io-index)" = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" -"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/src/asynchronous.rs b/kanidm_client/src/asynchronous.rs index 59afc1d15..69e80f256 100644 --- a/kanidm_client/src/asynchronous.rs +++ b/kanidm_client/src/asynchronous.rs @@ -1,4 +1,4 @@ -use crate::{ClientError, KanidmClientBuilder, APPLICATION_JSON}; +use crate::{ClientError, KanidmClientBuilder, APPLICATION_JSON, KOPID}; use reqwest::header::CONTENT_TYPE; use serde::de::DeserializeOwned; use serde::Serialize; @@ -34,6 +34,12 @@ impl KanidmAsyncClient { .await .map_err(ClientError::Transport)?; + let opid = response.headers().get(KOPID); + debug!( + "opid -> {:?}", + opid.expect("Missing opid? Refusing to proceed ...") + ); + match response.status() { reqwest::StatusCode::OK => {} unexpect => return Err(ClientError::Http(unexpect, response.json().await.ok())), @@ -66,6 +72,12 @@ impl KanidmAsyncClient { .await .map_err(ClientError::Transport)?; + let opid = response.headers().get(KOPID); + debug!( + "opid -> {:?}", + opid.expect("Missing opid? Refusing to proceed ...") + ); + match response.status() { reqwest::StatusCode::OK => {} unexpect => return Err(ClientError::Http(unexpect, response.json().await.ok())), @@ -88,6 +100,12 @@ impl KanidmAsyncClient { .await .map_err(ClientError::Transport)?; + let opid = response.headers().get(KOPID); + debug!( + "opid -> {:?}", + opid.expect("Missing opid? Refusing to proceed ...") + ); + match response.status() { reqwest::StatusCode::OK => {} unexpect => return Err(ClientError::Http(unexpect, response.json().await.ok())), @@ -108,6 +126,12 @@ impl KanidmAsyncClient { .await .map_err(ClientError::Transport)?; + let opid = response.headers().get(KOPID); + debug!( + "opid -> {:?}", + opid.expect("Missing opid? Refusing to proceed ...") + ); + match response.status() { reqwest::StatusCode::OK => {} unexpect => return Err(ClientError::Http(unexpect, response.json().await.ok())), diff --git a/kanidm_client/src/lib.rs b/kanidm_client/src/lib.rs index 99e96d64a..a891ae92e 100644 --- a/kanidm_client/src/lib.rs +++ b/kanidm_client/src/lib.rs @@ -28,6 +28,7 @@ pub mod asynchronous; use crate::asynchronous::KanidmAsyncClient; pub const APPLICATION_JSON: &str = "application/json"; +pub const KOPID: &str = "X-KANIDM-OPID"; #[derive(Debug)] pub enum ClientError { @@ -302,6 +303,12 @@ impl KanidmClient { .send() .map_err(ClientError::Transport)?; + let opid = response.headers().get(KOPID); + debug!( + "opid -> {:?}", + opid.expect("Missing opid? Refusing to proceed ...") + ); + match response.status() { reqwest::StatusCode::OK => {} unexpect => return Err(ClientError::Http(unexpect, response.json().ok())), @@ -330,6 +337,12 @@ impl KanidmClient { .send() .map_err(ClientError::Transport)?; + let opid = response.headers().get(KOPID); + debug!( + "opid -> {:?}", + opid.expect("Missing opid? Refusing to proceed ...") + ); + match response.status() { reqwest::StatusCode::OK => {} unexpect => return Err(ClientError::Http(unexpect, response.json().ok())), @@ -349,6 +362,12 @@ impl KanidmClient { .send() .map_err(ClientError::Transport)?; + let opid = response.headers().get(KOPID); + debug!( + "opid -> {:?}", + opid.expect("Missing opid? Refusing to proceed ...") + ); + match response.status() { reqwest::StatusCode::OK => {} unexpect => return Err(ClientError::Http(unexpect, response.json().ok())), @@ -368,6 +387,12 @@ impl KanidmClient { .send() .map_err(ClientError::Transport)?; + let opid = response.headers().get(KOPID); + debug!( + "opid -> {:?}", + opid.expect("Missing opid? Refusing to proceed ...") + ); + match response.status() { reqwest::StatusCode::OK => {} unexpect => return Err(ClientError::Http(unexpect, response.json().ok())), diff --git a/kanidm_client/tests/common.rs b/kanidm_client/tests/common.rs index b6fdd6b01..05cd193f9 100644 --- a/kanidm_client/tests/common.rs +++ b/kanidm_client/tests/common.rs @@ -15,7 +15,12 @@ static PORT_ALLOC: AtomicUsize = AtomicUsize::new(8080); pub fn run_test(test_fn: fn(KanidmClient) -> ()) { // ::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug"); - let _ = env_logger::builder().is_test(true).try_init(); + let _ = env_logger::builder() + .format_timestamp(None) + .format_level(false) + .is_test(true) + .try_init(); + let (tx, rx) = mpsc::channel(); let port = PORT_ALLOC.fetch_add(1, Ordering::SeqCst); @@ -33,16 +38,16 @@ pub fn run_test(test_fn: fn(KanidmClient) -> ()) { // Spawn a thread for the test runner, this should have a unique // port.... System::run(move || { - create_server_core(config); + let sctx = create_server_core(config); // This appears to be bind random ... // let srv = srv.bind("127.0.0.1:0").unwrap(); - let _ = tx.send(System::current()); + let _ = tx.send(sctx); }) .expect("unable to start system"); }); - let sys = rx.recv().unwrap(); - System::set_current(sys.clone()); + let sctx = rx.recv().unwrap().expect("failed to start ctx"); + System::set_current(sctx.current()); // Do we need any fixtures? // Yes probably, but they'll need to be futures as well ... @@ -59,5 +64,5 @@ pub fn run_test(test_fn: fn(KanidmClient) -> ()) { // We DO NOT need teardown, as sqlite is in mem // let the tables hit the floor - sys.stop(); + sctx.stop(); } diff --git a/kanidm_client/tests/default_entries.rs b/kanidm_client/tests/default_entries.rs index ec152d0ff..094272387 100644 --- a/kanidm_client/tests/default_entries.rs +++ b/kanidm_client/tests/default_entries.rs @@ -98,8 +98,8 @@ fn is_attr_writable(rsclient: &KanidmClient, id: &str, attr: &str) -> Option { let new_value = match entry { - "acp_receiver" => "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000011\"]}".to_string(), - "acp_targetscope" => "{\"And\": [{\"Eq\": [\"class\",\"access_control_profile\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}".to_string(), + "acp_receiver" => "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000011\"]}".to_string(), + "acp_targetscope" => "{\"and\": [{\"eq\": [\"class\",\"access_control_profile\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}".to_string(), _ => id.to_string(), }; let m = ModifyList::new_list(vec![ diff --git a/kanidm_proto/Cargo.toml b/kanidm_proto/Cargo.toml index c70ffdc59..eedba8a02 100644 --- a/kanidm_proto/Cargo.toml +++ b/kanidm_proto/Cargo.toml @@ -16,6 +16,7 @@ uuid = { version = "0.8", features = ["serde", "v4"] } # actix = { version = "0.9", optional = true } zxcvbn = { version = "2.0", features = ["ser"] } base32 = "0.4" +thiserror = "1.0" [dev-dependencies] serde_json = "1.0" diff --git a/kanidm_proto/src/v1.rs b/kanidm_proto/src/v1.rs index c75f67b41..cc6b4ed27 100644 --- a/kanidm_proto/src/v1.rs +++ b/kanidm_proto/src/v1.rs @@ -7,19 +7,31 @@ use uuid::Uuid; /* ===== errors ===== */ -#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[derive(Serialize, Deserialize, Debug, PartialEq, thiserror::Error)] +#[serde(rename_all = "lowercase")] pub enum SchemaError { + #[error("Not Implemented")] NotImplemented, - InvalidClass, - MissingMustAttribute(String), - InvalidAttribute, + #[error("This entry does not have any classes, which means it can not have structure.")] + NoClassFound, + #[error("A class or classes are found that do not exist in schema.")] + InvalidClass(Vec), + #[error("")] + MissingMustAttribute(Vec), + #[error("")] + InvalidAttribute(String), + #[error("")] InvalidAttributeSyntax, + #[error("")] EmptyFilter, + #[error("The schema has become internally inconsistent. You must restart and investigate.")] Corrupted, - PhantomAttribute, + #[error("Phantom attribute types may not be persisted on an entry")] + PhantomAttribute(String), } #[derive(Serialize, Deserialize, Debug, PartialEq)] +#[serde(rename_all = "lowercase")] pub enum PluginError { AttrUnique(String), Base(String), @@ -28,6 +40,7 @@ pub enum PluginError { } #[derive(Serialize, Deserialize, Debug, PartialEq)] +#[serde(rename_all = "lowercase")] pub enum ConsistencyError { Unknown, // Class, Attribute @@ -46,6 +59,7 @@ pub enum ConsistencyError { } #[derive(Serialize, Deserialize, Debug)] +#[serde(rename_all = "lowercase")] pub enum OperationError { EmptyRequest, Backend, @@ -224,6 +238,7 @@ pub struct Entry { } #[derive(Debug, Serialize, Deserialize, Clone, Ord, PartialOrd, Eq, PartialEq)] +#[serde(rename_all = "lowercase")] pub enum Filter { // This is attr - value Eq(String, String), @@ -232,11 +247,12 @@ pub enum Filter { Or(Vec), And(Vec), AndNot(Box), - #[serde(rename = "Self")] + #[serde(rename = "self")] SelfUUID, } #[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(rename_all = "lowercase")] pub enum Modify { Present(String, String), Removed(String, String), @@ -350,6 +366,7 @@ impl fmt::Debug for AuthCredential { } #[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] pub enum AuthStep { // name, application id? Init(String, Option), @@ -372,6 +389,7 @@ pub struct AuthRequest { // Respond with the list of auth types and nonce, etc. // It can also contain a denied, or success. #[derive(Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] pub enum AuthAllowed { Anonymous, Password, @@ -380,6 +398,7 @@ pub enum AuthAllowed { } #[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] pub enum AuthState { // Everything is good, your cookie has been issued, and a token is set here // for the client to view. @@ -398,6 +417,7 @@ pub struct AuthResponse { // Types needed for setting credentials #[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] pub enum SetCredentialRequest { Password(String), GeneratePassword, @@ -408,6 +428,7 @@ pub enum SetCredentialRequest { } #[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] pub enum TOTPAlgo { Sha1, Sha256, @@ -460,6 +481,7 @@ impl TOTPSecret { } #[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] pub enum SetCredentialResponse { Success, Token(String), @@ -470,6 +492,7 @@ pub enum SetCredentialResponse { // Only two actions on recycled is possible. Search and Revive. +/* pub struct SearchRecycledRequest { pub filter: Filter, } @@ -479,9 +502,11 @@ impl SearchRecycledRequest { SearchRecycledRequest { filter } } } +*/ // Need a search response here later. +/* pub struct ReviveRecycledRequest { pub filter: Filter, } @@ -491,8 +516,10 @@ impl ReviveRecycledRequest { ReviveRecycledRequest { filter } } } +*/ // This doesn't need seralise because it's only accessed via a "get". +/* #[derive(Debug, Default)] pub struct WhoamiRequest {} @@ -501,6 +528,7 @@ impl WhoamiRequest { Default::default() } } +*/ #[derive(Debug, Serialize, Deserialize)] pub struct WhoamiResponse { diff --git a/kanidm_unix_int/tests/cache_layer_test.rs b/kanidm_unix_int/tests/cache_layer_test.rs index e080ec335..07f5251fd 100644 --- a/kanidm_unix_int/tests/cache_layer_test.rs +++ b/kanidm_unix_int/tests/cache_layer_test.rs @@ -38,13 +38,13 @@ fn run_test(fix_fn: fn(&KanidmClient) -> (), test_fn: fn(CacheLayer, KanidmAsync // Spawn a thread for the test runner, this should have a unique // port.... System::run(move || { - create_server_core(config); - let _ = tx.send(System::current()); + let sctx = create_server_core(config); + let _ = tx.send(sctx); }) .expect("Failed to start system"); }); - let sys = rx.recv().unwrap(); - System::set_current(sys.clone()); + let sctx = rx.recv().unwrap().expect("Failed to start server core"); + System::set_current(sctx.current()); // Setup the client, and the address we selected. let addr = format!("http://127.0.0.1:{}", port); @@ -78,7 +78,7 @@ fn run_test(fix_fn: fn(&KanidmClient) -> (), test_fn: fn(CacheLayer, KanidmAsync // We DO NOT need teardown, as sqlite is in mem // let the tables hit the floor - sys.stop(); + sctx.stop(); } fn test_fixture(rsclient: &KanidmClient) -> () { diff --git a/kanidmd/Cargo.toml b/kanidmd/Cargo.toml index 9a48b0811..0230ad59f 100644 --- a/kanidmd/Cargo.toml +++ b/kanidmd/Cargo.toml @@ -29,6 +29,9 @@ path = "src/server/main.rs" kanidm_proto = { path = "../kanidm_proto", version = "0.1" } actix = "0.9" +# actix = { version = "0.9", path = "../../actix" } + +actix-rt = "1.1" actix-web = { version = "2.0", features = ["openssl"] } actix-session = "0.3" actix-files = "0.2" @@ -60,6 +63,7 @@ time = "0.1" concread = "0.1" # concread = { path = "../../concread" } +crossbeam = "0.7" openssl = "0.10" sshkeys = "0.1" diff --git a/kanidmd/src/lib/access.rs b/kanidmd/src/lib/access.rs index 55a4011a0..0dd09d272 100644 --- a/kanidmd/src/lib/access.rs +++ b/kanidmd/src/lib/access.rs @@ -482,6 +482,12 @@ pub trait AccessControlsTransaction { }) .collect(); + if allowed_entries.len() > 0 { + lsecurity_access!(audit, "allowed {} entries ✅", allowed_entries.len()); + } else { + lsecurity_access!(audit, "denied ❌"); + } + Ok(allowed_entries) } @@ -639,6 +645,12 @@ pub trait AccessControlsTransaction { e.reduce_attributes(f_allowed_attrs) }) .collect(); + + lsecurity_access!( + audit, + "attribute set reduced on {} entries", + allowed_entries.len() + ); Ok(allowed_entries) } @@ -652,6 +664,7 @@ pub trait AccessControlsTransaction { let rec_entry: &Entry = match &me.event.origin { EventOrigin::Internal => { + lsecurity_access!(audit, "Internal operation, bypassing access check"); // No need to check ACS return Ok(true); } @@ -833,6 +846,11 @@ pub trait AccessControlsTransaction { result } // if acc == false }); + if r { + lsecurity_access!(audit, "allowed ✅"); + } else { + lsecurity_access!(audit, "denied ❌"); + } Ok(r) } @@ -846,6 +864,7 @@ pub trait AccessControlsTransaction { let rec_entry: &Entry = match &ce.event.origin { EventOrigin::Internal => { + lsecurity_access!(audit, "Internal operation, bypassing access check"); // No need to check ACS return Ok(true); } @@ -998,6 +1017,12 @@ pub trait AccessControlsTransaction { // if no acp allows, fail operation. }); + if r { + lsecurity_access!(audit, "allowed ✅"); + } else { + lsecurity_access!(audit, "denied ❌"); + } + Ok(r) } @@ -1011,6 +1036,7 @@ pub trait AccessControlsTransaction { let rec_entry: &Entry = match &de.event.origin { EventOrigin::Internal => { + lsecurity_access!(audit, "Internal operation, bypassing access check"); // No need to check ACS return Ok(true); } @@ -1098,6 +1124,11 @@ pub trait AccessControlsTransaction { }) // fold related_acp } // if/else }); + if r { + lsecurity_access!(audit, "allowed ✅"); + } else { + lsecurity_access!(audit, "denied ❌"); + } Ok(r) } } @@ -1377,10 +1408,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ] } }"#, @@ -1405,10 +1436,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ] } }"#, @@ -1426,10 +1457,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ] } }"#, @@ -1456,10 +1487,10 @@ mod tests { "name": ["acp_invalid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_search_attr": ["name", "class"] } @@ -1479,10 +1510,10 @@ mod tests { "name": ["acp_invalid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_search_attr": ["name", "class"] } @@ -1502,10 +1533,10 @@ mod tests { "name": ["acp_invalid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ] } }"#, @@ -1524,10 +1555,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_search_attr": ["name", "class"] } @@ -1554,10 +1585,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_modify_removedattr": ["name"], "acp_modify_presentattr": ["name"], @@ -1578,10 +1609,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ] } }"#, @@ -1599,10 +1630,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_modify_removedattr": ["name"], "acp_modify_presentattr": ["name"], @@ -1631,10 +1662,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_create_class": ["object"], "acp_create_attr": ["name"] @@ -1654,10 +1685,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ] } }"#, @@ -1675,10 +1706,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_create_class": ["object"], "acp_create_attr": ["name"] @@ -1713,10 +1744,10 @@ mod tests { "name": ["acp_valid"], "uuid": ["cc8e95b4-c24f-4d68-ba54-8bed76f63930"], "acp_receiver": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"name\",\"a\"]}" + "{\"eq\":[\"name\",\"a\"]}" ], "acp_search_attr": ["name"], "acp_create_class": ["object"], @@ -1746,12 +1777,12 @@ mod tests { acw.update_search($controls).expect("Failed to update"); let acw = acw; - let mut audit = AuditScope::new("test_acp_search"); + let mut audit = AuditScope::new("test_acp_search", uuid::Uuid::new_v4()); let res = acw .search_filter_entries(&mut audit, $se, $entries) .expect("op failed"); - println!("result --> {:?}", res); - println!("expect --> {:?}", $expect); + debug!("result --> {:?}", res); + debug!("expect --> {:?}", $expect); // should be ok, and same as expect. assert!(res == $expect); }}; @@ -1849,7 +1880,7 @@ mod tests { acw.update_search($controls).expect("Failed to update"); let acw = acw; - let mut audit = AuditScope::new("test_acp_search_reduce"); + let mut audit = AuditScope::new("test_acp_search_reduce", uuid::Uuid::new_v4()); // We still have to reduce the entries to be sure that we are good. let res = acw .search_filter_entries(&mut audit, $se, $entries) @@ -1865,8 +1896,8 @@ mod tests { .map(|e| unsafe { e.into_reduced() }) .collect(); - println!("expect --> {:?}", expect_set); - println!("result --> {:?}", reduced); + debug!("expect --> {:?}", expect_set); + debug!("result --> {:?}", reduced); // should be ok, and same as expect. assert!(reduced == expect_set); }}; @@ -1972,12 +2003,12 @@ mod tests { acw.update_modify($controls).expect("Failed to update"); let acw = acw; - let mut audit = AuditScope::new("test_acp_modify"); + let mut audit = AuditScope::new("test_acp_modify", uuid::Uuid::new_v4()); let res = acw .modify_allow_operation(&mut audit, $me, $entries) .expect("op failed"); - println!("result --> {:?}", res); - println!("expect --> {:?}", $expect); + debug!("result --> {:?}", res); + debug!("expect --> {:?}", $expect); // should be ok, and same as expect. assert!(res == $expect); }}; @@ -2134,12 +2165,12 @@ mod tests { acw.update_create($controls).expect("Failed to update"); let acw = acw; - let mut audit = AuditScope::new("test_acp_create"); + let mut audit = AuditScope::new("test_acp_create", uuid::Uuid::new_v4()); let res = acw .create_allow_operation(&mut audit, $ce, $entries) .expect("op failed"); - println!("result --> {:?}", res); - println!("expect --> {:?}", $expect); + debug!("result --> {:?}", res); + debug!("expect --> {:?}", $expect); // should be ok, and same as expect. assert!(res == $expect); }}; @@ -2260,12 +2291,12 @@ mod tests { acw.update_delete($controls).expect("Failed to update"); let acw = acw; - let mut audit = AuditScope::new("test_acp_delete"); + let mut audit = AuditScope::new("test_acp_delete", uuid::Uuid::new_v4()); let res = acw .delete_allow_operation(&mut audit, $de, $entries) .expect("op failed"); - println!("result --> {:?}", res); - println!("expect --> {:?}", $expect); + debug!("result --> {:?}", res); + debug!("expect --> {:?}", $expect); // should be ok, and same as expect. assert!(res == $expect); }}; diff --git a/kanidmd/src/lib/actors/v1_read.rs b/kanidmd/src/lib/actors/v1_read.rs index ba9b61e88..a33c565f1 100644 --- a/kanidmd/src/lib/actors/v1_read.rs +++ b/kanidmd/src/lib/actors/v1_read.rs @@ -1,8 +1,8 @@ +use crossbeam::channel::Sender; use std::sync::Arc; use crate::audit::AuditScope; -use crate::async_log::EventLog; use crate::event::{AuthEvent, SearchEvent, SearchResult, WhoamiResult}; use crate::idm::event::{ RadiusAuthTokenEvent, UnixGroupTokenEvent, UnixUserAuthEvent, UnixUserTokenEvent, @@ -33,11 +33,12 @@ use uuid::Uuid; pub struct WhoamiMessage { pub uat: Option, + pub eventid: Uuid, } impl WhoamiMessage { - pub fn new(uat: Option) -> Self { - WhoamiMessage { uat } + pub fn new(uat: Option, eventid: Uuid) -> Self { + WhoamiMessage { uat, eventid } } } @@ -49,11 +50,16 @@ impl Message for WhoamiMessage { pub struct AuthMessage { pub sessionid: Option, pub req: AuthRequest, + pub eventid: Uuid, } impl AuthMessage { - pub fn new(req: AuthRequest, sessionid: Option) -> Self { - AuthMessage { sessionid, req } + pub fn new(req: AuthRequest, sessionid: Option, eventid: Uuid) -> Self { + AuthMessage { + sessionid, + req, + eventid, + } } } @@ -64,11 +70,12 @@ impl Message for AuthMessage { pub struct SearchMessage { pub uat: Option, pub req: SearchRequest, + pub eventid: Uuid, } impl SearchMessage { - pub fn new(uat: Option, req: SearchRequest) -> Self { - SearchMessage { uat, req } + pub fn new(uat: Option, req: SearchRequest, eventid: Uuid) -> Self { + SearchMessage { uat, req, eventid } } } @@ -80,6 +87,7 @@ pub struct InternalSearchMessage { pub uat: Option, pub filter: Filter, pub attrs: Option>, + pub eventid: Uuid, } impl Message for InternalSearchMessage { @@ -90,6 +98,7 @@ pub struct InternalSearchRecycledMessage { pub uat: Option, pub filter: Filter, pub attrs: Option>, + pub eventid: Uuid, } impl Message for InternalSearchRecycledMessage { @@ -99,6 +108,7 @@ impl Message for InternalSearchRecycledMessage { pub struct InternalRadiusReadMessage { pub uat: Option, pub uuid_or_name: String, + pub eventid: Uuid, } impl Message for InternalRadiusReadMessage { @@ -108,6 +118,7 @@ impl Message for InternalRadiusReadMessage { pub struct InternalRadiusTokenReadMessage { pub uat: Option, pub uuid_or_name: String, + pub eventid: Uuid, } impl Message for InternalRadiusTokenReadMessage { @@ -117,6 +128,7 @@ impl Message for InternalRadiusTokenReadMessage { pub struct InternalUnixUserTokenReadMessage { pub uat: Option, pub uuid_or_name: String, + pub eventid: Uuid, } impl Message for InternalUnixUserTokenReadMessage { @@ -126,6 +138,7 @@ impl Message for InternalUnixUserTokenReadMessage { pub struct InternalUnixGroupTokenReadMessage { pub uat: Option, pub uuid_or_name: String, + pub eventid: Uuid, } impl Message for InternalUnixGroupTokenReadMessage { @@ -135,6 +148,7 @@ impl Message for InternalUnixGroupTokenReadMessage { pub struct InternalSshKeyReadMessage { pub uat: Option, pub uuid_or_name: String, + pub eventid: Uuid, } impl Message for InternalSshKeyReadMessage { @@ -145,6 +159,7 @@ pub struct InternalSshKeyTagReadMessage { pub uat: Option, pub uuid_or_name: String, pub tag: String, + pub eventid: Uuid, } impl Message for InternalSshKeyTagReadMessage { @@ -155,6 +170,7 @@ pub struct IdmAccountUnixAuthMessage { pub uat: Option, pub uuid_or_name: String, pub cred: String, + pub eventid: Uuid, } impl Message for IdmAccountUnixAuthMessage { @@ -164,7 +180,7 @@ impl Message for IdmAccountUnixAuthMessage { // =========================================================== pub struct QueryServerReadV1 { - log: actix::Addr, + log: Sender>, qs: QueryServer, idms: Arc, } @@ -178,13 +194,13 @@ impl Actor for QueryServerReadV1 { } impl QueryServerReadV1 { - pub fn new(log: actix::Addr, qs: QueryServer, idms: Arc) -> Self { - log_event!(log, "Starting query server v1 worker ..."); + pub fn new(log: Sender>, qs: QueryServer, idms: Arc) -> Self { + info!("Starting query server v1 worker ..."); QueryServerReadV1 { log, qs, idms } } pub fn start( - log: actix::Addr, + log: Sender>, query_server: QueryServer, idms: Arc, threads: usize, @@ -204,7 +220,7 @@ impl Handler for QueryServerReadV1 { type Result = Result; fn handle(&mut self, msg: SearchMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("search"); + let mut audit = AuditScope::new("search", msg.eventid.clone()); let res = lperf_segment!(&mut audit, "actors::v1_read::handle", || { // Begin a read let mut qs_read = self.qs.read(); @@ -227,7 +243,10 @@ impl Handler for QueryServerReadV1 { } }); // At the end of the event we send it for logging. - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -240,7 +259,7 @@ impl Handler for QueryServerReadV1 { // "on top" of the db server concept. In this case we check if // the credentials provided is sufficient to say if someone is // "authenticated" or not. - let mut audit = AuditScope::new("auth"); + let mut audit = AuditScope::new("auth", msg.eventid.clone()); let res = lperf_segment!(&mut audit, "actors::v1_read::handle", || { lsecurity!(audit, "Begin auth event {:?}", msg); @@ -259,20 +278,27 @@ impl Handler for QueryServerReadV1 { // Trigger a session clean *before* we take any auth steps. // It's important to do this before to ensure that timeouts on // the session are enforced. - idm_write.expire_auth_sessions(ct); + lperf_segment!( + audit, + "actors::v1_read::handle -> expire_auth_sessions", + || { idm_write.expire_auth_sessions(ct) } + ); // Generally things like auth denied are in Ok() msgs // so true errors should always trigger a rollback. let r = idm_write .auth(&mut audit, &ae, ct) - .and_then(|r| idm_write.commit().map(|_| r)); + .and_then(|r| idm_write.commit(&mut audit).map(|_| r)); - lsecurity!(audit, "Sending result -> {:?}", r); + lsecurity!(audit, "Sending auth result -> {:?}", r); // Build the result. r.map(|r| r.response()) }); // At the end of the event we send it for logging. - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -281,7 +307,7 @@ impl Handler for QueryServerReadV1 { type Result = Result; fn handle(&mut self, msg: WhoamiMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("whoami"); + let mut audit = AuditScope::new("whoami", msg.eventid.clone()); let res = lperf_segment!(&mut audit, "actors::v1_read::handle", || { // TODO #62: Move this to IdmServer!!! // Begin a read @@ -327,7 +353,10 @@ impl Handler for QueryServerReadV1 { }); // Should we log the final result? // At the end of the event we send it for logging. - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -336,7 +365,7 @@ impl Handler for QueryServerReadV1 { type Result = Result, OperationError>; fn handle(&mut self, msg: InternalSearchMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("internal_search_message"); + let mut audit = AuditScope::new("internal_search_message", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_read::handle", @@ -361,7 +390,10 @@ impl Handler for QueryServerReadV1 { } } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -374,7 +406,7 @@ impl Handler for QueryServerReadV1 { msg: InternalSearchRecycledMessage, _: &mut Self::Context, ) -> Self::Result { - let mut audit = AuditScope::new("internal_search_recycle_message"); + let mut audit = AuditScope::new("internal_search_recycle_message", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_read::handle", @@ -401,7 +433,10 @@ impl Handler for QueryServerReadV1 { } } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -410,7 +445,7 @@ impl Handler for QueryServerReadV1 { type Result = Result, OperationError>; fn handle(&mut self, msg: InternalRadiusReadMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("internal_radius_read_message"); + let mut audit = AuditScope::new("internal_radius_read_message", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_read::handle", @@ -459,7 +494,10 @@ impl Handler for QueryServerReadV1 { } } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -472,7 +510,7 @@ impl Handler for QueryServerReadV1 { msg: InternalRadiusTokenReadMessage, _: &mut Self::Context, ) -> Self::Result { - let mut audit = AuditScope::new("internal_radius_token_read_message"); + let mut audit = AuditScope::new("internal_radius_token_read_message", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_read::handle", @@ -509,7 +547,10 @@ impl Handler for QueryServerReadV1 { idm_read.get_radiusauthtoken(&mut audit, &rate) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -522,7 +563,7 @@ impl Handler for QueryServerReadV1 { msg: InternalUnixUserTokenReadMessage, _: &mut Self::Context, ) -> Self::Result { - let mut audit = AuditScope::new("internal_unix_token_read_message"); + let mut audit = AuditScope::new("internal_unix_token_read_message", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_read::handle", @@ -558,7 +599,10 @@ impl Handler for QueryServerReadV1 { idm_read.get_unixusertoken(&mut audit, &rate) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -571,7 +615,8 @@ impl Handler for QueryServerReadV1 { msg: InternalUnixGroupTokenReadMessage, _: &mut Self::Context, ) -> Self::Result { - let mut audit = AuditScope::new("internal_unixgroup_token_read_message"); + let mut audit = + AuditScope::new("internal_unixgroup_token_read_message", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_read::handle", @@ -607,7 +652,10 @@ impl Handler for QueryServerReadV1 { idm_read.get_unixgrouptoken(&mut audit, &rate) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -616,7 +664,7 @@ impl Handler for QueryServerReadV1 { type Result = Result, OperationError>; fn handle(&mut self, msg: InternalSshKeyReadMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("internal_sshkey_read_message"); + let mut audit = AuditScope::new("internal_sshkey_read_message", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_read::handle", @@ -668,7 +716,10 @@ impl Handler for QueryServerReadV1 { } } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -677,19 +728,19 @@ impl Handler for QueryServerReadV1 { type Result = Result, OperationError>; fn handle(&mut self, msg: InternalSshKeyTagReadMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("internal_sshkey_tag_read_message"); + let InternalSshKeyTagReadMessage { + uat, + uuid_or_name, + tag, + eventid, + } = msg; + let mut audit = AuditScope::new("internal_sshkey_tag_read_message", eventid); let res = lperf_segment!( &mut audit, "actors::v1_read::handle", || { let mut qs_read = self.qs.read(); - let InternalSshKeyTagReadMessage { - uat, - uuid_or_name, - tag, - } = msg; - let target_uuid = match Uuid::parse_str(uuid_or_name.as_str()) { Ok(u) => u, Err(_) => qs_read @@ -741,7 +792,10 @@ impl Handler for QueryServerReadV1 { } } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -750,7 +804,7 @@ impl Handler for QueryServerReadV1 { type Result = Result, OperationError>; fn handle(&mut self, msg: IdmAccountUnixAuthMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("idm_account_unix_auth"); + let mut audit = AuditScope::new("idm_account_unix_auth", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_read::handle", @@ -790,13 +844,16 @@ impl Handler for QueryServerReadV1 { let r = idm_write .auth_unix(&mut audit, &uuae, ct) - .and_then(|r| idm_write.commit().map(|_| r)); + .and_then(|r| idm_write.commit(&mut audit).map(|_| r)); lsecurity!(audit, "Sending result -> {:?}", r); r } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } diff --git a/kanidmd/src/lib/actors/v1_write.rs b/kanidmd/src/lib/actors/v1_write.rs index 22973347a..2bcc4f270 100644 --- a/kanidmd/src/lib/actors/v1_write.rs +++ b/kanidmd/src/lib/actors/v1_write.rs @@ -1,7 +1,7 @@ use crate::audit::AuditScope; +use crossbeam::channel::Sender; use std::sync::Arc; -use crate::async_log::EventLog; use crate::event::{ CreateEvent, DeleteEvent, ModifyEvent, PurgeRecycledEvent, PurgeTombstoneEvent, ReviveRecycledEvent, @@ -34,17 +34,19 @@ use uuid::Uuid; pub struct CreateMessage { pub uat: Option, pub req: CreateRequest, + pub eventid: Uuid, } impl CreateMessage { - pub fn new(uat: Option, req: CreateRequest) -> Self { - CreateMessage { uat, req } + pub fn new(uat: Option, req: CreateRequest, eventid: Uuid) -> Self { + CreateMessage { uat, req, eventid } } - pub fn new_entry(uat: Option, req: ProtoEntry) -> Self { + pub fn new_entry(uat: Option, req: ProtoEntry, eventid: Uuid) -> Self { CreateMessage { uat, req: CreateRequest { entries: vec![req] }, + eventid, } } } @@ -56,11 +58,12 @@ impl Message for CreateMessage { pub struct DeleteMessage { pub uat: Option, pub req: DeleteRequest, + pub eventid: Uuid, } impl DeleteMessage { - pub fn new(uat: Option, req: DeleteRequest) -> Self { - DeleteMessage { uat, req } + pub fn new(uat: Option, req: DeleteRequest, eventid: Uuid) -> Self { + DeleteMessage { uat, req, eventid } } } @@ -71,6 +74,7 @@ impl Message for DeleteMessage { pub struct InternalDeleteMessage { pub uat: Option, pub filter: Filter, + pub eventid: Uuid, } impl Message for InternalDeleteMessage { @@ -80,11 +84,12 @@ impl Message for InternalDeleteMessage { pub struct ModifyMessage { pub uat: Option, pub req: ModifyRequest, + pub eventid: Uuid, } impl ModifyMessage { - pub fn new(uat: Option, req: ModifyRequest) -> Self { - ModifyMessage { uat, req } + pub fn new(uat: Option, req: ModifyRequest, eventid: Uuid) -> Self { + ModifyMessage { uat, req, eventid } } } @@ -95,6 +100,7 @@ impl Message for ModifyMessage { pub struct ReviveRecycledMessage { pub uat: Option, pub filter: Filter, + pub eventid: Uuid, } impl Message for ReviveRecycledMessage { @@ -104,13 +110,15 @@ impl Message for ReviveRecycledMessage { pub struct IdmAccountSetPasswordMessage { pub uat: Option, pub cleartext: String, + pub eventid: Uuid, } impl IdmAccountSetPasswordMessage { - pub fn new(uat: Option, req: SingleStringRequest) -> Self { + pub fn new(uat: Option, req: SingleStringRequest, eventid: Uuid) -> Self { IdmAccountSetPasswordMessage { uat, cleartext: req.value, + eventid, } } } @@ -122,6 +130,7 @@ impl Message for IdmAccountSetPasswordMessage { pub struct IdmAccountPersonExtendMessage { pub uat: Option, pub uuid_or_name: String, + pub eventid: Uuid, } impl Message for IdmAccountPersonExtendMessage { @@ -133,16 +142,23 @@ pub struct IdmAccountUnixExtendMessage { pub uuid_or_name: String, pub gidnumber: Option, pub shell: Option, + pub eventid: Uuid, } impl IdmAccountUnixExtendMessage { - pub fn new(uat: Option, uuid_or_name: String, ux: AccountUnixExtend) -> Self { + pub fn new( + uat: Option, + uuid_or_name: String, + ux: AccountUnixExtend, + eventid: Uuid, + ) -> Self { let AccountUnixExtend { gidnumber, shell } = ux; IdmAccountUnixExtendMessage { uat, uuid_or_name, gidnumber, shell, + eventid, } } } @@ -155,15 +171,22 @@ pub struct IdmGroupUnixExtendMessage { pub uat: Option, pub uuid_or_name: String, pub gidnumber: Option, + pub eventid: Uuid, } impl IdmGroupUnixExtendMessage { - pub fn new(uat: Option, uuid_or_name: String, gx: GroupUnixExtend) -> Self { + pub fn new( + uat: Option, + uuid_or_name: String, + gx: GroupUnixExtend, + eventid: Uuid, + ) -> Self { let GroupUnixExtend { gidnumber } = gx; IdmGroupUnixExtendMessage { uat, uuid_or_name, gidnumber, + eventid, } } } @@ -176,6 +199,7 @@ pub struct IdmAccountUnixSetCredMessage { pub uat: Option, pub uuid_or_name: String, pub cred: String, + pub eventid: Uuid, } impl Message for IdmAccountUnixSetCredMessage { @@ -187,6 +211,7 @@ pub struct InternalCredentialSetMessage { pub uuid_or_name: String, pub appid: Option, pub sac: SetCredentialRequest, + pub eventid: Uuid, } impl Message for InternalCredentialSetMessage { @@ -196,11 +221,16 @@ impl Message for InternalCredentialSetMessage { pub struct InternalRegenerateRadiusMessage { pub uat: Option, pub uuid_or_name: String, + pub eventid: Uuid, } impl InternalRegenerateRadiusMessage { - pub fn new(uat: Option, uuid_or_name: String) -> Self { - InternalRegenerateRadiusMessage { uat, uuid_or_name } + pub fn new(uat: Option, uuid_or_name: String, eventid: Uuid) -> Self { + InternalRegenerateRadiusMessage { + uat, + uuid_or_name, + eventid, + } } } @@ -214,6 +244,7 @@ pub struct InternalSshKeyCreateMessage { pub tag: String, pub key: String, pub filter: Filter, + pub eventid: Uuid, } impl Message for InternalSshKeyCreateMessage { @@ -227,6 +258,7 @@ pub struct PurgeAttributeMessage { pub uuid_or_name: String, pub attr: String, pub filter: Filter, + pub eventid: Uuid, } impl Message for PurgeAttributeMessage { @@ -240,6 +272,7 @@ pub struct RemoveAttributeValueMessage { pub attr: String, pub value: String, pub filter: Filter, + pub eventid: Uuid, } impl Message for RemoveAttributeValueMessage { @@ -252,6 +285,7 @@ pub struct AppendAttributeMessage { pub attr: String, pub values: Vec, pub filter: Filter, + pub eventid: Uuid, } impl Message for AppendAttributeMessage { @@ -264,6 +298,7 @@ pub struct SetAttributeMessage { pub attr: String, pub values: Vec, pub filter: Filter, + pub eventid: Uuid, } impl Message for SetAttributeMessage { @@ -271,7 +306,7 @@ impl Message for SetAttributeMessage { } pub struct QueryServerWriteV1 { - log: actix::Addr, + log: Sender>, qs: QueryServer, idms: Arc, } @@ -287,13 +322,13 @@ impl Actor for QueryServerWriteV1 { } impl QueryServerWriteV1 { - pub fn new(log: actix::Addr, qs: QueryServer, idms: Arc) -> Self { - log_event!(log, "Starting query server v1 worker ..."); + pub fn new(log: Sender>, qs: QueryServer, idms: Arc) -> Self { + info!("Starting query server v1 worker ..."); QueryServerWriteV1 { log, qs, idms } } pub fn start( - log: actix::Addr, + log: Sender>, query_server: QueryServer, idms: Arc, ) -> actix::Addr { @@ -386,7 +421,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result; fn handle(&mut self, msg: CreateMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("create"); + let mut audit = AuditScope::new("create", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -396,7 +431,7 @@ impl Handler for QueryServerWriteV1 { let crt = match CreateEvent::from_message(&mut audit, msg, &mut qs_write) { Ok(c) => c, Err(e) => { - ladmin_error!(audit, "Failed to begin create: {:?}", e); + ladmin_warning!(audit, "Failed to begin create: {:?}", e); return Err(e); } }; @@ -409,7 +444,10 @@ impl Handler for QueryServerWriteV1 { } ); // At the end of the event we send it for logging. - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -418,7 +456,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result; fn handle(&mut self, msg: ModifyMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("modify"); + let mut audit = AuditScope::new("modify", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -439,7 +477,10 @@ impl Handler for QueryServerWriteV1 { .and_then(|_| qs_write.commit(&mut audit).map(|_| OperationResponse {})) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -448,7 +489,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result; fn handle(&mut self, msg: DeleteMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("delete"); + let mut audit = AuditScope::new("delete", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -470,7 +511,10 @@ impl Handler for QueryServerWriteV1 { .and_then(|_| qs_write.commit(&mut audit).map(|_| OperationResponse {})) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -479,7 +523,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: InternalDeleteMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("delete"); + let mut audit = AuditScope::new("delete", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -502,7 +546,10 @@ impl Handler for QueryServerWriteV1 { .and_then(|_| qs_write.commit(&mut audit).map(|_| ())) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -511,7 +558,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: ReviveRecycledMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("revive"); + let mut audit = AuditScope::new("revive", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -538,7 +585,10 @@ impl Handler for QueryServerWriteV1 { .and_then(|_| qs_write.commit(&mut audit).map(|_| ())) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -548,7 +598,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result; fn handle(&mut self, msg: InternalCredentialSetMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("internal_credential_set_message"); + let mut audit = AuditScope::new("internal_credential_set_message", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -665,7 +715,10 @@ impl Handler for QueryServerWriteV1 { } } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -674,7 +727,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result; fn handle(&mut self, msg: IdmAccountSetPasswordMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("idm_account_set_password"); + let mut audit = AuditScope::new("idm_account_set_password", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -699,7 +752,10 @@ impl Handler for QueryServerWriteV1 { .map(|_| OperationResponse::new(())) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -712,7 +768,7 @@ impl Handler for QueryServerWriteV1 { msg: InternalRegenerateRadiusMessage, _: &mut Self::Context, ) -> Self::Result { - let mut audit = AuditScope::new("idm_account_regenerate_radius"); + let mut audit = AuditScope::new("idm_account_regenerate_radius", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -752,7 +808,10 @@ impl Handler for QueryServerWriteV1 { .and_then(|r| idms_prox_write.commit(&mut audit).map(|_| r)) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -761,7 +820,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: PurgeAttributeMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("purge_attribute"); + let mut audit = AuditScope::new("purge_attribute", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -792,14 +851,17 @@ impl Handler for QueryServerWriteV1 { } }; - ladmin_error!(audit, "Begin modify event {:?}", mdf); + ltrace!(audit, "Begin modify event {:?}", mdf); qs_write .modify(&mut audit, &mdf) .and_then(|_| qs_write.commit(&mut audit).map(|_| ())) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -808,7 +870,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: RemoveAttributeValueMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("remove_attribute_value"); + let mut audit = AuditScope::new("remove_attribute_value", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -849,7 +911,10 @@ impl Handler for QueryServerWriteV1 { .and_then(|_| qs_write.commit(&mut audit).map(|_| ())) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -858,18 +923,19 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: AppendAttributeMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("append_attribute"); + let AppendAttributeMessage { + uat, + uuid_or_name, + attr, + values, + filter, + eventid, + } = msg; + let mut audit = AuditScope::new("append_attribute", eventid); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", || { - let AppendAttributeMessage { - uat, - uuid_or_name, - attr, - values, - filter, - } = msg; // We need to turn these into proto modlists so they can be converted // and validated. let proto_ml = ProtoModifyList::new_list( @@ -881,7 +947,10 @@ impl Handler for QueryServerWriteV1 { self.modify_from_parts(&mut audit, uat, uuid_or_name, proto_ml, filter) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -890,18 +959,19 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: SetAttributeMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("set_attribute"); + let SetAttributeMessage { + uat, + uuid_or_name, + attr, + values, + filter, + eventid, + } = msg; + let mut audit = AuditScope::new("set_attribute", eventid); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", || { - let SetAttributeMessage { - uat, - uuid_or_name, - attr, - values, - filter, - } = msg; // We need to turn these into proto modlists so they can be converted // and validated. let proto_ml = ProtoModifyList::new_list( @@ -916,7 +986,10 @@ impl Handler for QueryServerWriteV1 { self.modify_from_parts(&mut audit, uat, uuid_or_name, proto_ml, filter) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -925,19 +998,19 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: InternalSshKeyCreateMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("internal_sshkey_create"); + let InternalSshKeyCreateMessage { + uat, + uuid_or_name, + tag, + key, + filter, + eventid, + } = msg; + let mut audit = AuditScope::new("internal_sshkey_create", eventid); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", || { - let InternalSshKeyCreateMessage { - uat, - uuid_or_name, - tag, - key, - filter, - } = msg; - // Because this is from internal, we can generate a real modlist, rather // than relying on the proto ones. let ml = ModifyList::new_append("ssh_publickey", Value::new_sshkey(tag, key)); @@ -945,7 +1018,10 @@ impl Handler for QueryServerWriteV1 { self.modify_from_internal_parts(&mut audit, uat, uuid_or_name, ml, filter) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -958,13 +1034,16 @@ impl Handler for QueryServerWriteV1 { msg: IdmAccountPersonExtendMessage, _: &mut Self::Context, ) -> Self::Result { - let mut audit = AuditScope::new("idm_account_person_extend"); + let IdmAccountPersonExtendMessage { + uat, + uuid_or_name, + eventid, + } = msg; + let mut audit = AuditScope::new("idm_account_person_extend", eventid); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", || { - let IdmAccountPersonExtendMessage { uat, uuid_or_name } = msg; - // The filter_map here means we only create the mods if the gidnumber or shell are set // in the actual request. let mods: Vec<_> = vec![Some(Modify::Present( @@ -982,7 +1061,10 @@ impl Handler for QueryServerWriteV1 { self.modify_from_internal_parts(&mut audit, uat, uuid_or_name, ml, filter) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -991,18 +1073,18 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: IdmAccountUnixExtendMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("idm_account_unix_extend"); + let IdmAccountUnixExtendMessage { + uat, + uuid_or_name, + gidnumber, + shell, + eventid, + } = msg; + let mut audit = AuditScope::new("idm_account_unix_extend", eventid); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", || { - let IdmAccountUnixExtendMessage { - uat, - uuid_or_name, - gidnumber, - shell, - } = msg; - // The filter_map here means we only create the mods if the gidnumber or shell are set // in the actual request. let mods: Vec<_> = vec![ @@ -1025,7 +1107,10 @@ impl Handler for QueryServerWriteV1 { self.modify_from_internal_parts(&mut audit, uat, uuid_or_name, ml, filter) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -1034,17 +1119,17 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: IdmGroupUnixExtendMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("idm_group_unix_extend"); + let IdmGroupUnixExtendMessage { + uat, + uuid_or_name, + gidnumber, + eventid, + } = msg; + let mut audit = AuditScope::new("idm_group_unix_extend", eventid); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", || { - let IdmGroupUnixExtendMessage { - uat, - uuid_or_name, - gidnumber, - } = msg; - // The filter_map here means we only create the mods if the gidnumber or shell are set // in the actual request. let mods: Vec<_> = vec![ @@ -1066,7 +1151,10 @@ impl Handler for QueryServerWriteV1 { self.modify_from_internal_parts(&mut audit, uat, uuid_or_name, ml, filter) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -1075,7 +1163,7 @@ impl Handler for QueryServerWriteV1 { type Result = Result<(), OperationError>; fn handle(&mut self, msg: IdmAccountUnixSetCredMessage, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("idm_account_unix_set_cred"); + let mut audit = AuditScope::new("idm_account_unix_set_cred", msg.eventid.clone()); let res = lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -1111,7 +1199,10 @@ impl Handler for QueryServerWriteV1 { .map(|_| ()) } ); - self.log.do_send(audit); + self.log.send(Some(audit)).map_err(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + OperationError::InvalidState + })?; res } } @@ -1122,7 +1213,7 @@ impl Handler for QueryServerWriteV1 { type Result = (); fn handle(&mut self, msg: PurgeTombstoneEvent, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("purge tombstones"); + let mut audit = AuditScope::new("purge tombstones", msg.eventid.clone()); lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -1138,7 +1229,9 @@ impl Handler for QueryServerWriteV1 { } ); // At the end of the event we send it for logging. - self.log.do_send(audit); + self.log.send(Some(audit)).unwrap_or_else(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + }); } } @@ -1146,7 +1239,7 @@ impl Handler for QueryServerWriteV1 { type Result = (); fn handle(&mut self, msg: PurgeRecycledEvent, _: &mut Self::Context) -> Self::Result { - let mut audit = AuditScope::new("purge recycled"); + let mut audit = AuditScope::new("purge recycled", msg.eventid.clone()); lperf_segment!( &mut audit, "actors::v1_write::handle", @@ -1162,6 +1255,8 @@ impl Handler for QueryServerWriteV1 { } ); // At the end of the event we send it for logging. - self.log.do_send(audit); + self.log.send(Some(audit)).unwrap_or_else(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + }); } } diff --git a/kanidmd/src/lib/async_log.rs b/kanidmd/src/lib/async_log.rs index a35947700..a55e595bf 100644 --- a/kanidmd/src/lib/async_log.rs +++ b/kanidmd/src/lib/async_log.rs @@ -1,81 +1,37 @@ -use actix::prelude::*; - use crate::audit::AuditScope; +use crossbeam::channel::Receiver; -// Helper for internal logging. -// Should only be used at startup/shutdown -#[macro_export] -macro_rules! log_event { - ($log_addr:expr, $($arg:tt)*) => ({ - use crate::async_log::LogEvent; - use std::fmt; - $log_addr.do_send( - LogEvent { - msg: fmt::format( - format_args!($($arg)*) - ) +pub fn run(rx: Receiver>) { + info!("Log thread started ..."); + loop { + match rx.recv() { + Ok(Some(al)) => { + al.write_log(); } - ) - }) -} - -// We need to pass in config for this later -// Or we need to pass in the settings for it IE level and dest? -// Is there an efficent way to set a log level filter in the macros -// so that we don't msg unless it's the correct level? -// Do we need config in the log macro? - -pub fn start() -> actix::Addr { - SyncArbiter::start(1, move || EventLog {}) -} - -pub struct EventLog {} - -impl Actor for EventLog { - type Context = SyncContext; - - /* - fn started(&mut self, ctx: &mut Self::Context) { - ctx.set_mailbox_capacity(1 << 31); + Ok(None) => { + // Prep to shutdown, finish draining. + break; + } + Err(_) => { + // we're cooked. + error!("CRITICAL: log thread is cooked."); + } + } } - */ -} -// What messages can we be sent. Basically this is all the possible -// inputs we *could* recieve. - -// Add a macro for easy msg write - -pub struct LogEvent { - pub msg: String, -} - -impl Message for LogEvent { - type Result = (); -} - -impl Handler for EventLog { - type Result = (); - - fn handle(&mut self, event: LogEvent, _: &mut SyncContext) -> Self::Result { - info!("logevent: {}", event.msg); + loop { + match rx.try_recv() { + Ok(Some(al)) => { + al.write_log(); + } + Ok(None) => { + // Skip this, it's a shutdown msg. + } + Err(_) => { + // we've drained. + break; + } + } } + info!("Log thread shutdown complete."); } - -impl Handler for EventLog { - type Result = (); - - fn handle(&mut self, event: AuditScope, _: &mut SyncContext) -> Self::Result { - info!("{}", event); - } -} - -/* -impl Handler for EventLog { - type Result = (); - - fn handle(&mut self, event: Event, _: &mut SyncContext) -> Self::Result { - println!("EVENT: {:?}", event) - } -} -*/ diff --git a/kanidmd/src/lib/audit.rs b/kanidmd/src/lib/audit.rs index a54640245..181f12ff0 100644 --- a/kanidmd/src/lib/audit.rs +++ b/kanidmd/src/lib/audit.rs @@ -31,12 +31,12 @@ impl fmt::Display for LogTag { LogTag::AdminWarning => write!(f, "admin::warning 🚧"), LogTag::AdminInfo => write!(f, "admin::info"), LogTag::RequestError => write!(f, "request::error 🚨"), - LogTag::Security => write!(f, "security 🔒"), - LogTag::SecurityAccess => write!(f, "security::access 🔐"), + LogTag::Security => write!(f, "security 🔐"), + LogTag::SecurityAccess => write!(f, "security::access 🔓"), LogTag::Filter => write!(f, "filter"), LogTag::FilterWarning => write!(f, "filter::warning 🚧"), LogTag::FilterError => write!(f, "filter::error 🚨"), - LogTag::Trace => write!(f, "Trace"), + LogTag::Trace => write!(f, "trace ⌦"), } } } @@ -45,9 +45,11 @@ macro_rules! audit_log { ($audit:expr, $($arg:tt)*) => ({ use std::fmt; use crate::audit::LogTag; + /* if cfg!(test) || cfg!(debug_assertions) { - debug!($($arg)*) + error!($($arg)*) } + */ $audit.log_event( LogTag::AdminError, fmt::format( @@ -59,17 +61,21 @@ macro_rules! audit_log { macro_rules! ltrace { ($au:expr, $($arg:tt)*) => ({ - use std::fmt; - use crate::audit::LogTag; - if cfg!(test) || cfg!(debug_assertions) { - debug!($($arg)*) - } - $au.log_event( - LogTag::Trace, - fmt::format( - format_args!($($arg)*) + if log_enabled!(log::Level::Debug) { + /* + if cfg!(test) || cfg!(debug_assertions) { + error!($($arg)*) + } + */ + use std::fmt; + use crate::audit::LogTag; + $au.log_event( + LogTag::Trace, + fmt::format( + format_args!($($arg)*) + ) ) - ) + } }) } @@ -125,6 +131,19 @@ macro_rules! ladmin_error { }) } +macro_rules! ladmin_warning { + ($au:expr, $($arg:tt)*) => ({ + use std::fmt; + use crate::audit::LogTag; + $au.log_event( + LogTag::AdminWarning, + fmt::format( + format_args!($($arg)*) + ) + ) + }) +} + macro_rules! ladmin_info { ($au:expr, $($arg:tt)*) => ({ use std::fmt; @@ -331,24 +350,23 @@ impl PartialEq for PerfProcessed { * | |--> another layer */ impl PerfProcessed { - fn int_write_fmt( - &self, - f: &mut fmt::Formatter, - parents: usize, - uuid: &HyphenatedRef, - ) -> fmt::Result { - write!(f, "[- {} perf::trace] ", uuid)?; + fn int_write_fmt(&self, parents: usize, uuid: &HyphenatedRef) { + let mut prefix = String::new(); + prefix.push_str(format!("[- {} perf::trace] ", uuid).as_str()); let d = &self.duration; let df = d.as_secs() as f64 + d.subsec_nanos() as f64 * 1e-9; if parents > 0 { - for _i in 0..(parents - 1) { - write!(f, "| ")?; + for _i in 0..parents { + prefix.push_str("| "); } }; - writeln!(f, "|--> {} {1:.9} {2:.3}%", self.id, df, self.percent)?; + debug!( + "{}|--> {} {2:.9} {3:.3}%", + prefix, self.id, df, self.percent + ); self.contains .iter() - .try_for_each(|pe| pe.int_write_fmt(f, parents + 1, uuid)) + .for_each(|pe| pe.int_write_fmt(parents + 1, uuid)) } } @@ -368,37 +386,20 @@ pub struct AuditScope { active_perf: Option<&'static mut PerfEvent>, } +// unsafe impl Sync for AuditScope {} + // Allow us to be sent to the log subsystem impl Message for AuditScope { type Result = (); } -impl fmt::Display for AuditScope { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let uuid_ref = self.uuid.to_hyphenated_ref(); - self.events - .iter() - .try_for_each(|e| writeln!(f, "[{} {} {}] {}", e.time, uuid_ref, e.tag, e.data))?; - // First, we pre-process all the perf events to order them - let mut proc_perf: Vec<_> = self.perf.iter().map(|pe| pe.process()).collect(); - - // We still sort them by duration. - proc_perf.sort_unstable(); - - // Now write the perf events - proc_perf - .iter() - .try_for_each(|pe| pe.int_write_fmt(f, 0, &uuid_ref)) - } -} - impl AuditScope { - pub fn new(name: &str) -> Self { + pub fn new(name: &str, eventid: Uuid) -> Self { let t_now = SystemTime::now(); let datetime: DateTime = t_now.into(); AuditScope { - uuid: Uuid::new_v4(), + uuid: eventid, events: vec![AuditLog { time: datetime.to_rfc3339(), tag: LogTag::AdminInfo, @@ -409,8 +410,31 @@ impl AuditScope { } } - pub fn get_uuid(&self) -> &Uuid { - &self.uuid + pub fn write_log(self) { + let uuid_ref = self.uuid.to_hyphenated_ref(); + self.events.iter().for_each(|e| match e.tag { + LogTag::AdminError | LogTag::RequestError | LogTag::FilterError => { + error!("[{} {} {}] {}", e.time, uuid_ref, e.tag, e.data) + } + LogTag::AdminWarning + | LogTag::Security + | LogTag::SecurityAccess + | LogTag::FilterWarning => warn!("[{} {} {}] {}", e.time, uuid_ref, e.tag, e.data), + LogTag::AdminInfo | LogTag::Filter => { + info!("[{} {} {}] {}", e.time, uuid_ref, e.tag, e.data) + } + LogTag::Trace => debug!("[{} {} {}] {}", e.time, uuid_ref, e.tag, e.data), + }); + // First, we pre-process all the perf events to order them + let mut proc_perf: Vec<_> = self.perf.iter().map(|pe| pe.process()).collect(); + + // We still sort them by duration. + proc_perf.sort_unstable(); + + // Now write the perf events + proc_perf + .iter() + .for_each(|pe| pe.int_write_fmt(0, &uuid_ref)) } pub fn log_event(&mut self, tag: LogTag, data: String) { @@ -484,8 +508,8 @@ mod tests { // Create and remove. Perhaps add some core details? #[test] fn test_audit_simple() { - let au = AuditScope::new("au"); + let au = AuditScope::new("au", uuid::Uuid::new_v4()); let d = serde_json::to_string_pretty(&au).expect("Json serialise failure"); - println!("{}", d); + debug!("{}", d); } } diff --git a/kanidmd/src/lib/be/idl_arc_sqlite.rs b/kanidmd/src/lib/be/idl_arc_sqlite.rs index c3bf342e0..0e7e23f7c 100644 --- a/kanidmd/src/lib/be/idl_arc_sqlite.rs +++ b/kanidmd/src/lib/be/idl_arc_sqlite.rs @@ -80,16 +80,19 @@ macro_rules! get_identry { } }); - // Now, get anything from nidl that is needed. - let mut db_result = $self.db.get_identry($au, &IDL::Partial(nidl))?; + if !nidl.is_empty() { + ladmin_warning!($au, "idl_arc_sqlite cache miss detected - if this occurs frequently you SHOULD adjust your cache tuning."); + // Now, get anything from nidl that is needed. + let mut db_result = $self.db.get_identry($au, &IDL::Partial(nidl))?; - // Clone everything from db_result into the cache. - db_result.iter().for_each(|e| { - $self.entry_cache.insert(e.get_id(), Box::new(e.clone())); - }); + // Clone everything from db_result into the cache. + db_result.iter().for_each(|e| { + $self.entry_cache.insert(e.get_id(), Box::new(e.clone())); + }); - // Merge the two vecs - result.append(&mut db_result); + // Merge the two vecs + result.append(&mut db_result); + } // Return Ok(result) @@ -142,7 +145,7 @@ macro_rules! get_idl { let cache_r = $self.idl_cache.get(&cache_key); // If hit, continue. if let Some(ref data) = cache_r { - lfilter!( + ltrace!( $audit, "Got cached idl for index {:?} {:?} -> {}", $itype, @@ -500,4 +503,13 @@ impl IdlArcSqlite { idl_cache: idl_cache_write, } } + + /* + pub fn stats_audit(&self, audit: &mut AuditScope) { + let entry_stats = self.entry_cache.view_stats(); + let idl_stats = self.idl_cache.view_stats(); + ladmin_info!(audit, "entry_cache stats -> {:?}", *entry_stats); + ladmin_info!(audit, "idl_cache stats -> {:?}", *idl_stats); + } + */ } diff --git a/kanidmd/src/lib/be/idl_sqlite.rs b/kanidmd/src/lib/be/idl_sqlite.rs index f2e45b4a9..2e5c163ce 100644 --- a/kanidmd/src/lib/be/idl_sqlite.rs +++ b/kanidmd/src/lib/be/idl_sqlite.rs @@ -239,7 +239,7 @@ pub trait IdlSqliteTransaction { // have a corrupted index ..... None => IDLBitRange::new(), }; - lfilter!(audit, "Got idl for index {:?} {:?} -> {}", itype, attr, idl); + ltrace!(audit, "Got idl for index {:?} {:?} -> {}", itype, attr, idl); Ok(Some(idl)) }) @@ -316,25 +316,22 @@ pub trait IdlSqliteTransaction { // Allow this as it actually extends the life of stmt let r = match stmt.query(NO_PARAMS) { - Ok(mut rows) => { - match rows.next() { - Ok(Some(v)) => { - // println!("{:?}", v.column_names()); - let r: Result = v.get(0); - match r { - Ok(t) => { - if t == "ok" { - Vec::new() - } else { - vec![Err(ConsistencyError::SqliteIntegrityFailure)] - } + Ok(mut rows) => match rows.next() { + Ok(Some(v)) => { + let r: Result = v.get(0); + match r { + Ok(t) => { + if t == "ok" { + Vec::new() + } else { + vec![Err(ConsistencyError::SqliteIntegrityFailure)] } - Err(_) => vec![Err(ConsistencyError::SqliteIntegrityFailure)], } + Err(_) => vec![Err(ConsistencyError::SqliteIntegrityFailure)], } - _ => vec![Err(ConsistencyError::SqliteIntegrityFailure)], } - } + _ => vec![Err(ConsistencyError::SqliteIntegrityFailure)], + }, Err(_) => vec![Err(ConsistencyError::SqliteIntegrityFailure)], }; r @@ -351,7 +348,6 @@ impl Drop for IdlSqliteReadTransaction { // Abort - so far this has proven reliable to use drop here. fn drop(self: &mut Self) { if !self.committed { - debug!("Aborting BE RO txn"); self.conn .execute("ROLLBACK TRANSACTION", NO_PARAMS) // We can't do this without expect. @@ -365,7 +361,7 @@ impl Drop for IdlSqliteReadTransaction { impl IdlSqliteReadTransaction { pub fn new(conn: r2d2::PooledConnection) -> Self { // Start the transaction - debug!("Starting BE RO txn ..."); + // // I'm happy for this to be an expect, because this is a huge failure // of the server ... but if it happens a lot we should consider making // this a Result<> @@ -390,7 +386,6 @@ impl Drop for IdlSqliteWriteTransaction { // Abort fn drop(self: &mut Self) { if !self.committed { - debug!("Aborting BE WR txn"); self.conn .execute("ROLLBACK TRANSACTION", NO_PARAMS) .expect("Unable to rollback transaction! Can not proceed!!!"); @@ -401,7 +396,6 @@ impl Drop for IdlSqliteWriteTransaction { impl IdlSqliteWriteTransaction { pub fn new(conn: r2d2::PooledConnection) -> Self { // Start the transaction - debug!("Starting BE WR txn ..."); conn.execute("BEGIN TRANSACTION", NO_PARAMS) .expect("Unable to begin transaction!"); IdlSqliteWriteTransaction { @@ -412,7 +406,7 @@ impl IdlSqliteWriteTransaction { pub fn commit(mut self, audit: &mut AuditScope) -> Result<(), OperationError> { lperf_segment!(audit, "be::idl_sqlite::commit", || { - ltrace!(audit, "Commiting BE txn"); + // ltrace!(audit, "Commiting BE WR txn"); assert!(!self.committed); self.committed = true; @@ -420,7 +414,7 @@ impl IdlSqliteWriteTransaction { .execute("COMMIT TRANSACTION", NO_PARAMS) .map(|_| ()) .map_err(|e| { - println!("{:?}", e); + ladmin_error!(audit, "CRITICAL: failed to commit sqlite txn -> {:?}", e); OperationError::BackendEngine }) }) @@ -510,12 +504,13 @@ impl IdlSqliteWriteTransaction { I: Iterator, { lperf_segment!(au, "be::idl_sqlite::delete_identry", || { - let mut stmt = try_audit!( - au, - self.conn.prepare("DELETE FROM id2entry WHERE id = :id"), - "SQLite Error {:?}", - OperationError::SQLiteError - ); + let mut stmt = self + .conn + .prepare("DELETE FROM id2entry WHERE id = :id") + .map_err(|e| { + ladmin_error!(au, "SQLite Error {:?}", e); + OperationError::SQLiteError + })?; idl.try_for_each(|id| { let iid: i64 = id @@ -531,9 +526,10 @@ impl IdlSqliteWriteTransaction { debug_assert!(iid > 0); - stmt.execute(&[&iid]) - .map(|_| ()) - .map_err(|_| OperationError::SQLiteError) + stmt.execute(&[&iid]).map(|_| ()).map_err(|e| { + ladmin_error!(au, "SQLite Error {:?}", e); + OperationError::SQLiteError + }) }) }) } @@ -709,7 +705,7 @@ impl IdlSqliteWriteTransaction { ) .map(|_| ()) .map_err(|e| { - debug!("rusqlite error {:?}", e); + error!("rusqlite error {:?}", e); OperationError::SQLiteError }) @@ -725,7 +721,7 @@ impl IdlSqliteWriteTransaction { ) .map(|_| ()) .map_err(|e| { - debug!("rusqlite error {:?}", e); + error!("rusqlite error {:?}", e); OperationError::SQLiteError }) @@ -762,7 +758,7 @@ impl IdlSqliteWriteTransaction { pub(crate) fn set_db_index_version(&self, v: i64) -> Result<(), OperationError> { self.set_db_version_key(DBV_INDEXV, v).map_err(|e| { - debug!("sqlite error {:?}", e); + error!("sqlite error {:?}", e); OperationError::SQLiteError }) } @@ -926,7 +922,7 @@ mod tests { #[test] fn test_idl_sqlite_verify() { - let mut audit = AuditScope::new("run_test"); + let mut audit = AuditScope::new("run_test", uuid::Uuid::new_v4()); let be = IdlSqlite::new(&mut audit, "", 1).unwrap(); let be_w = be.write(); let r = be_w.verify(); diff --git a/kanidmd/src/lib/be/mod.rs b/kanidmd/src/lib/be/mod.rs index e99192be3..67913e456 100644 --- a/kanidmd/src/lib/be/mod.rs +++ b/kanidmd/src/lib/be/mod.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use crate::audit::AuditScope; use crate::be::dbentry::DbEntry; use crate::entry::{Entry, EntryCommitted, EntryNew, EntrySealed}; -use crate::filter::{Filter, FilterResolved, FilterValidResolved}; +use crate::filter::{Filter, FilterPlan, FilterResolved, FilterValidResolved}; use idlset::AndNot; use idlset::IDLBitRange; use kanidm_proto::v1::{ConsistencyError, OperationError}; @@ -69,14 +69,14 @@ pub trait BackendTransaction { type IdlLayerType: IdlArcSqliteTransaction; fn get_idlayer(&mut self) -> &mut Self::IdlLayerType; - /// Recursively apply a filter, transforming into IDL's on the way. + /// Recursively apply a filter, transforming into IDL's on the way. This builds a query + /// execution log, so that it can be examined how an operation proceeded. fn filter2idl( &mut self, au: &mut AuditScope, filt: &FilterResolved, thres: usize, - ) -> Result { - // debug!("testing filter -> {:?}", filt); + ) -> Result<(IDL, FilterPlan), OperationError> { let fr = Ok(match filt { FilterResolved::Eq(attr, value, idx) => { if *idx { @@ -87,12 +87,15 @@ pub trait BackendTransaction { .get_idlayer() .get_idl(au, attr, &IndexType::EQUALITY, &idx_key)? { - Some(idl) => IDL::Indexed(idl), - None => IDL::ALLIDS, + Some(idl) => ( + IDL::Indexed(idl), + FilterPlan::EqIndexed(attr.to_string(), idx_key), + ), + None => (IDL::ALLIDS, FilterPlan::EqCorrupt(attr.to_string())), } } else { // Schema believes this is not indexed - IDL::ALLIDS + (IDL::ALLIDS, FilterPlan::EqUnindexed(attr.to_string())) } } FilterResolved::Sub(attr, subvalue, idx) => { @@ -104,12 +107,15 @@ pub trait BackendTransaction { .get_idlayer() .get_idl(au, attr, &IndexType::SUBSTRING, &idx_key)? { - Some(idl) => IDL::Indexed(idl), - None => IDL::ALLIDS, + Some(idl) => ( + IDL::Indexed(idl), + FilterPlan::SubIndexed(attr.to_string(), idx_key), + ), + None => (IDL::ALLIDS, FilterPlan::SubCorrupt(attr.to_string())), } } else { // Schema believes this is not indexed - IDL::ALLIDS + (IDL::ALLIDS, FilterPlan::SubUnindexed(attr.to_string())) } } FilterResolved::Pres(attr, idx) => { @@ -121,21 +127,22 @@ pub trait BackendTransaction { &IndexType::PRESENCE, &"_".to_string(), )? { - Some(idl) => IDL::Indexed(idl), - None => IDL::ALLIDS, + Some(idl) => (IDL::Indexed(idl), FilterPlan::PresIndexed(attr.to_string())), + None => (IDL::ALLIDS, FilterPlan::PresCorrupt(attr.to_string())), } } else { // Schema believes this is not indexed - IDL::ALLIDS + (IDL::ALLIDS, FilterPlan::PresUnindexed(attr.to_string())) } } - FilterResolved::LessThan(_attr, _subvalue, _idx) => { + FilterResolved::LessThan(attr, _subvalue, _idx) => { // We have no process for indexing this right now. - IDL::ALLIDS + (IDL::ALLIDS, FilterPlan::LessThanUnindexed(attr.to_string())) } FilterResolved::Or(l) => { // Importantly if this has no inner elements, this returns // an empty list. + let mut plan = Vec::new(); let mut result = IDLBitRange::new(); let mut partial = false; let mut threshold = false; @@ -143,54 +150,72 @@ pub trait BackendTransaction { for f in l.iter() { // get their idls match self.filter2idl(au, f, thres)? { - IDL::Indexed(idl) => { + (IDL::Indexed(idl), fp) => { + plan.push(fp); // now union them (if possible) result = result | idl; } - IDL::Partial(idl) => { + (IDL::Partial(idl), fp) => { + plan.push(fp); // now union them (if possible) result = result | idl; partial = true; } - IDL::PartialThreshold(idl) => { + (IDL::PartialThreshold(idl), fp) => { + plan.push(fp); // now union them (if possible) result = result | idl; partial = true; threshold = true; } - IDL::ALLIDS => { + (IDL::ALLIDS, fp) => { + plan.push(fp); // If we find anything unindexed, the whole term is unindexed. lfilter_error!(au, "Term {:?} is ALLIDS, shortcut return", f); - return Ok(IDL::ALLIDS); + let setplan = FilterPlan::OrUnindexed(plan); + return Ok((IDL::ALLIDS, setplan)); } } } // end or.iter() // If we got here, every term must have been indexed or partial indexed. if partial { if threshold { - IDL::Partial(result) + let setplan = FilterPlan::OrPartialThreshold(plan); + (IDL::PartialThreshold(result), setplan) } else { - IDL::PartialThreshold(result) + let setplan = FilterPlan::OrPartial(plan); + (IDL::Partial(result), setplan) } } else { - IDL::Indexed(result) + let setplan = FilterPlan::OrIndexed(plan); + (IDL::Indexed(result), setplan) } } FilterResolved::And(l) => { // This algorithm is a little annoying. I couldn't get it to work with iter and // folds due to the logic needed ... - // First, setup the two filter lists. - let (f_andnot, mut f_rem): (Vec<_>, Vec<_>) = l.iter().partition(|f| f.is_andnot()); + // First, setup the two filter lists. We always apply AndNot after positive + // and terms. + let (f_andnot, f_rem): (Vec<_>, Vec<_>) = l.iter().partition(|f| f.is_andnot()); + + // We make this an iter, so everything comes off in order. Using pop means we + // pull from the tail, which is the WORST item to start with! + let mut f_rem_iter = f_rem.iter(); // Setup the initial result. - let mut cand_idl = match f_rem.pop() { + let (mut cand_idl, fp) = match f_rem_iter.next() { Some(f) => self.filter2idl(au, f, thres)?, None => { lfilter_error!(au, "WARNING: And filter was empty, or contains only AndNot, can not evaluate."); - return Ok(IDL::Indexed(IDLBitRange::new())); + return Ok((IDL::Indexed(IDLBitRange::new()), FilterPlan::Invalid)); } }; + + // Setup the query plan tracker + let mut plan = Vec::new(); + plan.push(fp); + match &cand_idl { IDL::Indexed(idl) | IDL::Partial(idl) | IDL::PartialThreshold(idl) => { // When below thres, we have to return partials to trigger the entry_no_match_filter check. @@ -201,14 +226,26 @@ pub trait BackendTransaction { au, "NOTICE: Cand set shorter than threshold, early return" ); - return Ok(IDL::PartialThreshold(idl.clone())); + let setplan = FilterPlan::AndPartialThreshold(plan); + return Ok((IDL::PartialThreshold(idl.clone()), setplan)); + } else if idl.len() == 0 { + // Regardless of the input state, if it's empty, this can never + // be satisfied, so return we are indexed and complete. + lfilter_warning!( + au, + "NOTICE: empty candidate set, shortcutting return." + ); + let setplan = FilterPlan::AndEmptyCand(plan); + return Ok((IDL::Indexed(IDLBitRange::new()), setplan)); } } IDL::ALLIDS => {} } - for f in f_rem.iter() { - let inter = self.filter2idl(au, f, thres)?; + // Now, for all remaining, + for f in f_rem_iter { + let (inter, fp) = self.filter2idl(au, f, thres)?; + plan.push(fp); cand_idl = match (cand_idl, inter) { (IDL::Indexed(ia), IDL::Indexed(ib)) => { let r = ia & ib; @@ -218,7 +255,17 @@ pub trait BackendTransaction { au, "NOTICE: Cand set shorter than threshold, early return" ); - return Ok(IDL::PartialThreshold(r)); + let setplan = FilterPlan::AndPartialThreshold(plan); + return Ok((IDL::PartialThreshold(r), setplan)); + } else if r.len() == 0 { + // Regardless of the input state, if it's empty, this can never + // be satisfied, so return we are indexed and complete. + lfilter_warning!( + au, + "NOTICE: empty candidate set, shortcutting return." + ); + let setplan = FilterPlan::AndEmptyCand(plan); + return Ok((IDL::Indexed(IDLBitRange::new()), setplan)); } else { IDL::Indexed(r) } @@ -233,7 +280,8 @@ pub trait BackendTransaction { au, "NOTICE: Cand set shorter than threshold, early return" ); - return Ok(IDL::PartialThreshold(r)); + let setplan = FilterPlan::AndPartialThreshold(plan); + return Ok((IDL::PartialThreshold(r), setplan)); } else { IDL::Partial(r) } @@ -250,7 +298,8 @@ pub trait BackendTransaction { au, "NOTICE: Cand set shorter than threshold, early return" ); - return Ok(IDL::PartialThreshold(r)); + let setplan = FilterPlan::AndPartialThreshold(plan); + return Ok((IDL::PartialThreshold(r), setplan)); } else { IDL::PartialThreshold(r) } @@ -278,7 +327,9 @@ pub trait BackendTransaction { return Err(OperationError::InvalidState); } }; - let inter = self.filter2idl(au, f_in, thres)?; + let (inter, fp) = self.filter2idl(au, f_in, thres)?; + // It's an and not, so we need to wrap the plan accordingly. + plan.push(FilterPlan::AndNot(Box::new(fp))); cand_idl = match (cand_idl, inter) { (IDL::Indexed(ia), IDL::Indexed(ib)) => { let r = ia.andnot(ib); @@ -305,7 +356,8 @@ pub trait BackendTransaction { au, "NOTICE: Cand set shorter than threshold, early return" ); - return Ok(IDL::PartialThreshold(r)); + let setplan = FilterPlan::AndPartialThreshold(plan); + return Ok((IDL::PartialThreshold(r), setplan)); } else { IDL::Partial(r) } @@ -323,7 +375,8 @@ pub trait BackendTransaction { au, "NOTICE: Cand set shorter than threshold, early return" ); - return Ok(IDL::PartialThreshold(r)); + let setplan = FilterPlan::AndPartialThreshold(plan); + return Ok((IDL::PartialThreshold(r), setplan)); } else { IDL::PartialThreshold(r) } @@ -344,9 +397,16 @@ pub trait BackendTransaction { }; } + // What state is the final cand idl in? + let setplan = match cand_idl { + IDL::Indexed(_) => FilterPlan::AndIndexed(plan), + IDL::Partial(_) | IDL::PartialThreshold(_) => FilterPlan::AndPartial(plan), + IDL::ALLIDS => FilterPlan::AndUnindexed(plan), + }; + // Finally, return the result. // debug!("final cand set ==> {:?}", cand_idl); - cand_idl + (cand_idl, setplan) } // end and // So why does this return empty? Normally we actually process an AndNot in the context // of an "AND" query, but if it's used anywhere else IE the root filter, then there is @@ -357,9 +417,9 @@ pub trait BackendTransaction { // now do andnot? lfilter_error!( au, - "WARNING: Requested a top level or isolated AndNot, returning empty" + "ERROR: Requested a top level or isolated AndNot, returning empty" ); - IDL::Indexed(IDLBitRange::new()) + (IDL::Indexed(IDLBitRange::new()), FilterPlan::Invalid) } }); // debug!("result of {:?} -> {:?}", filt, fr); @@ -377,15 +437,18 @@ pub trait BackendTransaction { // to the in-memory filter test and be done. lperf_segment!(au, "be::search", || { // Do a final optimise of the filter + lfilter!(au, "filter unoptimised form --> {:?}", filt); let filt = filt.optimise(); lfilter!(au, "filter optimised to --> {:?}", filt); // Using the indexes, resolve the IDL here, or ALLIDS. // Also get if the filter was 100% resolved or not. - let idl = lperf_segment!(au, "be::search -> filter2idl", || { + let (idl, fplan) = lperf_segment!(au, "be::search -> filter2idl", || { self.filter2idl(au, filt.to_inner(), FILTER_SEARCH_TEST_THRESHOLD) })?; + lfilter!(au, "filter executed plan -> {:?}", fplan); + let entries = try_audit!(au, self.get_idlayer().get_identry(au, &idl)); // Do other things // Now, de-serialise the raw_entries back to entries, and populate their ID's @@ -455,15 +518,18 @@ pub trait BackendTransaction { ) -> Result { lperf_segment!(au, "be::exists", || { // Do a final optimise of the filter + lfilter!(au, "filter unoptimised form --> {:?}", filt); let filt = filt.optimise(); lfilter!(au, "filter optimised to --> {:?}", filt); // Using the indexes, resolve the IDL here, or ALLIDS. // Also get if the filter was 100% resolved or not. - let idl = lperf_segment!(au, "be::exists -> filter2idl", || { + let (idl, fplan) = lperf_segment!(au, "be::exists -> filter2idl", || { self.filter2idl(au, filt.to_inner(), FILTER_EXISTS_TEST_THRESHOLD) })?; + lfilter!(au, "filter executed plan -> {:?}", fplan); + // Now, check the idl -- if it's fully resolved, we can skip this because the query // was fully indexed. match &idl { @@ -1085,9 +1151,13 @@ mod tests { ($test_fn:expr) => {{ use env_logger; ::std::env::set_var("RUST_LOG", "kanidm=debug"); - let _ = env_logger::builder().is_test(true).try_init(); + let _ = env_logger::builder() + .format_timestamp(None) + .format_level(false) + .is_test(true) + .try_init(); - let mut audit = AuditScope::new("run_test"); + let mut audit = AuditScope::new("run_test", uuid::Uuid::new_v4()); let be = Backend::new(&mut audit, "", 1).expect("Failed to setup backend"); @@ -1106,7 +1176,7 @@ mod tests { let r = $test_fn(&mut audit, &mut be_txn); // Commit, to guarantee it worked. assert!(be_txn.commit(&mut audit).is_ok()); - println!("{}", audit); + audit.write_log(); r }}; } @@ -1415,7 +1485,7 @@ mod tests { assert!(missing.len() == 7); assert!(be.reindex(audit).is_ok()); let missing = be.missing_idxs(audit).unwrap(); - println!("{:?}", missing); + debug!("{:?}", missing); assert!(missing.is_empty()); }); } @@ -1444,7 +1514,7 @@ mod tests { assert!(missing.len() == 7); assert!(be.reindex(audit).is_ok()); let missing = be.missing_idxs(audit).unwrap(); - println!("{:?}", missing); + debug!("{:?}", missing); assert!(missing.is_empty()); // check name and uuid ids on eq, sub, pres @@ -1801,7 +1871,7 @@ mod tests { let f_un = unsafe { filter_resolved!(f_eq("no-index", PartialValue::new_utf8s("william"))) }; - let r = be.filter2idl(audit, f_un.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_un.to_inner(), 0).unwrap(); match r { IDL::ALLIDS => {} _ => { @@ -1813,7 +1883,7 @@ mod tests { let f_eq = unsafe { filter_resolved!(f_eq("name", PartialValue::new_utf8s("william"))) }; - let r = be.filter2idl(audit, f_eq.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_eq.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { assert!(idl == IDLBitRange::from_iter(vec![1])); @@ -1835,7 +1905,7 @@ mod tests { ])) }; - let r = be.filter2idl(audit, f_in_and.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_in_and.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { assert!(idl == IDLBitRange::from_iter(vec![1])); @@ -1860,7 +1930,7 @@ mod tests { ])) }; - let r = be.filter2idl(audit, f_p1.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_p1.to_inner(), 0).unwrap(); match r { IDL::Partial(idl) => { assert!(idl == IDLBitRange::from_iter(vec![1])); @@ -1870,7 +1940,7 @@ mod tests { } } - let r = be.filter2idl(audit, f_p2.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_p2.to_inner(), 0).unwrap(); match r { IDL::Partial(idl) => { assert!(idl == IDLBitRange::from_iter(vec![1])); @@ -1888,7 +1958,7 @@ mod tests { ])) }; - let r = be.filter2idl(audit, f_no_and.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_no_and.to_inner(), 0).unwrap(); match r { IDL::ALLIDS => {} _ => { @@ -1901,7 +1971,7 @@ mod tests { filter_resolved!(f_or!([f_eq("name", PartialValue::new_utf8s("william"))])) }; - let r = be.filter2idl(audit, f_in_or.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_in_or.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { assert!(idl == IDLBitRange::from_iter(vec![1])); @@ -1918,7 +1988,7 @@ mod tests { )])) }; - let r = be.filter2idl(audit, f_un_or.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_un_or.to_inner(), 0).unwrap(); match r { IDL::ALLIDS => {} _ => { @@ -1931,7 +2001,7 @@ mod tests { filter_resolved!(f_andnot(f_eq("name", PartialValue::new_utf8s("william")))) }; - let r = be.filter2idl(audit, f_r_andnot.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_r_andnot.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { assert!(idl == IDLBitRange::from_iter(Vec::new())); @@ -1949,7 +2019,7 @@ mod tests { ))])) }; - let r = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { assert!(idl == IDLBitRange::from_iter(Vec::new())); @@ -1966,7 +2036,7 @@ mod tests { ))])) }; - let r = be.filter2idl(audit, f_or_andnot.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_or_andnot.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { assert!(idl == IDLBitRange::from_iter(Vec::new())); @@ -1984,10 +2054,10 @@ mod tests { ])) }; - let r = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { - println!("{:?}", idl); + debug!("{:?}", idl); assert!(idl == IDLBitRange::from_iter(vec![1])); } _ => { @@ -2002,7 +2072,7 @@ mod tests { ])) }; - let r = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { assert!(idl == IDLBitRange::from_iter(vec![1])); @@ -2019,7 +2089,7 @@ mod tests { ])) }; - let r = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); match r { IDL::ALLIDS => {} _ => { @@ -2034,7 +2104,7 @@ mod tests { ])) }; - let r = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_and_andnot.to_inner(), 0).unwrap(); match r { IDL::ALLIDS => {} _ => { @@ -2045,7 +2115,7 @@ mod tests { // empty or let f_e_or = unsafe { filter_resolved!(f_or!([])) }; - let r = be.filter2idl(audit, f_e_or.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_e_or.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { assert!(idl == IDLBitRange::from_iter(vec![])); @@ -2057,7 +2127,7 @@ mod tests { let f_e_and = unsafe { filter_resolved!(f_and!([])) }; - let r = be.filter2idl(audit, f_e_and.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_e_and.to_inner(), 0).unwrap(); match r { IDL::Indexed(idl) => { assert!(idl == IDLBitRange::from_iter(vec![])); @@ -2079,7 +2149,7 @@ mod tests { let f_eq = unsafe { filter_resolved!(f_eq("name", PartialValue::new_utf8s("william"))) }; - let r = be.filter2idl(audit, f_eq.to_inner(), 0).unwrap(); + let (r, _plan) = be.filter2idl(audit, f_eq.to_inner(), 0).unwrap(); match r { IDL::ALLIDS => {} _ => { diff --git a/kanidmd/src/lib/constants/acp.rs b/kanidmd/src/lib/constants/acp.rs index e717cf5df..27363d966 100644 --- a/kanidmd/src/lib/constants/acp.rs +++ b/kanidmd/src/lib/constants/acp.rs @@ -15,10 +15,10 @@ pub const JSON_IDM_ACP_XX_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff0000XX"], "description": ["Builtin IDM Control for xx"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-0000000000XX\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-0000000000XX\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"attr\",\"value\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"attr\",\"value\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ @@ -49,10 +49,10 @@ pub const JSON_IDM_ADMINS_ACP_RECYCLE_SEARCH_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000002"], "description": ["Builtin IDM admin recycle bin search permission."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000019\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000019\"]}" ], "acp_targetscope": [ - "{\"Eq\": [\"class\", \"recycled\"]}" + "{\"eq\": [\"class\", \"recycled\"]}" ], "acp_search_attr": ["name", "class", "uuid", "last_modified_cid"] } @@ -65,10 +65,10 @@ pub const JSON_IDM_ADMINS_ACP_REVIVE_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000003"], "description": ["Builtin IDM Administrators Access Controls."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000019\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000019\"]}" ], "acp_targetscope": [ - "{\"Eq\":[\"class\",\"recycled\"]}" + "{\"eq\":[\"class\",\"recycled\"]}" ], "acp_modify_removedattr": ["class"], "acp_modify_class": ["recycled"] @@ -82,10 +82,10 @@ pub const JSON_IDM_SELF_ACP_READ_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000004"], "description": ["Builtin IDM Control for self read - required for whoami and many other functions."], "acp_receiver": [ - "{\"And\": [\"Self\", {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [\"self\", {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_targetscope": [ - "\"Self\"" + "\"self\"" ], "acp_search_attr": [ "name", @@ -109,10 +109,10 @@ pub const JSON_IDM_SELF_ACP_WRITE_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000021"], "description": ["Builtin IDM Control for self write - required for people to update their own identities and credentials in line with best practices."], "acp_receiver": [ - "{\"And\": [\"Self\", {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}, {\"Eq\": [\"uuid\", \"00000000-0000-0000-0000-ffffffffffff\"]}]}}]}" + "{\"and\": [\"self\", {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}, {\"eq\": [\"uuid\", \"00000000-0000-0000-0000-ffffffffffff\"]}]}}]}" ], "acp_targetscope": [ - "\"Self\"" + "\"self\"" ], "acp_modify_removedattr": [ "name", "displayname", "legalname", "radius_secret", "primary_credential", "ssh_publickey", "unix_password" @@ -131,10 +131,10 @@ pub const JSON_IDM_ALL_ACP_READ_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000006"], "description": ["Builtin IDM Control for all read - IE anonymous and all authenticated accounts."], "acp_receiver": [ - "{\"Pres\":\"class\"}" + "{\"pres\":\"class\"}" ], "acp_targetscope": [ - "{\"And\": [{\"Pres\": \"class\"}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"pres\": \"class\"}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "name", @@ -163,10 +163,10 @@ pub const JSON_IDM_ACP_PEOPLE_READ_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000007"], "description": ["Builtin IDM Control for reading personal sensitive data."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000002\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000002\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "name", "displayname", "legalname", "mail" @@ -185,10 +185,10 @@ pub const JSON_IDM_ACP_PEOPLE_WRITE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000008"], "description": ["Builtin IDM Control for managing personal and sensitive data."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000003\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000003\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"person\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"person\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_modify_removedattr": [ "name", "displayname", "legalname", "mail" @@ -211,10 +211,10 @@ pub const JSON_IDM_ACP_PEOPLE_MANAGE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000013"], "description": ["Builtin IDM Control for creating person (user) accounts"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000013\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000013\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"Eq\": [\"class\",\"person\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"eq\": [\"class\",\"person\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_create_attr": [ "class", @@ -245,10 +245,10 @@ pub const JSON_IDM_ACP_PEOPLE_ACCOUNT_PASSWORD_IMPORT_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000031"], "description": ["Builtin IDM Control for allowing imports of passwords to people+account types."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000023\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000023\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"person\"]}, {\"Eq\": [\"class\",\"account\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"person\"]}, {\"eq\": [\"class\",\"account\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_modify_removedattr": [ "password_import" @@ -271,10 +271,10 @@ pub const JSON_IDM_ACP_PEOPLE_EXTEND_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000032"], "description": ["Builtin IDM Control for allowing person class extension"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000024\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000024\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_modify_presentattr": [ "class" @@ -298,10 +298,10 @@ pub const JSON_IDM_ACP_GROUP_WRITE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000009"], "description": ["Builtin IDM Control for managing groups"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000004\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000004\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"group\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"group\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "class", "name", "spn", "uuid", "description", "member" @@ -326,10 +326,10 @@ pub const JSON_IDM_ACP_ACCOUNT_READ_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000010"], "description": ["Builtin IDM Control for accounts."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000005\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000005\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "class", "name", "spn", "uuid", "displayname", "ssh_publickey", "primary_credential", "memberof", "mail", "gidnumber" @@ -348,10 +348,10 @@ pub const JSON_IDM_ACP_ACCOUNT_WRITE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000011"], "description": ["Builtin IDM Control for managing accounts."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000006\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000006\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_modify_removedattr": [ "name", "displayname", "ssh_publickey", "primary_credential", "mail" @@ -374,10 +374,10 @@ pub const JSON_IDM_ACP_ACCOUNT_MANAGE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000012"], "description": ["Builtin IDM Control for creating and deleting (service) accounts"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000014\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000014\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_create_attr": [ "class", @@ -407,10 +407,10 @@ pub const JSON_IDM_ACP_RADIUS_SERVERS_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000014"], "description": ["Builtin IDM Control for RADIUS servers to read credentials and other needed details."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000007\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000007\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Pres\": \"class\"}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"pres\": \"class\"}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "name", "spn", "uuid", "radius_secret" @@ -429,10 +429,10 @@ pub const JSON_IDM_ACP_HP_ACCOUNT_READ_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000015"], "description": ["Builtin IDM Control for reading high privilege accounts."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000009\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000009\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "class", "name", "spn", "uuid", "displayname", "ssh_publickey", "primary_credential", "memberof" @@ -451,10 +451,10 @@ pub const JSON_IDM_ACP_HP_ACCOUNT_WRITE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000016"], "description": ["Builtin IDM Control for managing high privilege accounts."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000009\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000009\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_modify_removedattr": [ "name", "displayname", "ssh_publickey", "primary_credential" @@ -478,10 +478,10 @@ pub const JSON_IDM_ACP_HP_GROUP_WRITE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000017"], "description": ["Builtin IDM Control for managing high privilege groups"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000012\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000012\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"group\"]}, {\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"group\"]}, {\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "class", "name", "uuid", "description", "member" @@ -509,10 +509,10 @@ pub const JSON_IDM_ACP_SCHEMA_WRITE_ATTRS_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000018"], "description": ["Builtin IDM Control for management of schema attributes."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000010\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000010\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"attributetype\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"attributetype\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "class", @@ -570,10 +570,10 @@ pub const JSON_IDM_ACP_ACP_MANAGE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000019"], "description": ["Builtin IDM Control for access profiles management."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000011\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000011\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"access_control_profile\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"access_control_profile\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "name", @@ -661,10 +661,10 @@ pub const JSON_IDM_ACP_SCHEMA_WRITE_CLASSES_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000020"], "description": ["Builtin IDM Control for management of schema classes."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000010\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000010\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"classtype\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"classtype\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "class", @@ -718,10 +718,10 @@ pub const JSON_IDM_ACP_GROUP_MANAGE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000022"], "description": ["Builtin IDM Control for creating and deleting groups in the directory"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000015\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000015\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"group\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"group\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_create_attr": [ "class", @@ -748,10 +748,10 @@ pub const JSON_IDM_ACP_HP_ACCOUNT_MANAGE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000023"], "description": ["Builtin IDM Control for creating and deleting hp and regular (service) accounts"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000016\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000016\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_create_attr": [ "class", @@ -780,10 +780,10 @@ pub const JSON_IDM_ACP_HP_GROUP_MANAGE_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000024"], "description": ["Builtin IDM Control for creating and deleting hp and regular groups in the directory"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000017\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000017\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"group\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"group\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_create_attr": [ "class", @@ -810,10 +810,10 @@ pub const JSON_IDM_ACP_DOMAIN_ADMIN_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000026"], "description": ["Builtin IDM Control for granting domain info administration locally"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000020\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000020\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"uuid\",\"00000000-0000-0000-0000-ffffff000025\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"uuid\",\"00000000-0000-0000-0000-ffffff000025\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "name", @@ -844,10 +844,10 @@ pub const JSON_IDM_ACP_SYSTEM_CONFIG_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000028"], "description": ["Builtin IDM Control for granting system configuration rights"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000019\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000019\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"uuid\",\"00000000-0000-0000-0000-ffffff000027\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"uuid\",\"00000000-0000-0000-0000-ffffff000027\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "name", @@ -874,10 +874,10 @@ pub const JSON_IDM_ACP_ACCOUNT_UNIX_EXTEND_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000029"], "description": ["Builtin IDM Control for managing accounts."], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000021\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000021\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"account\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"account\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "class", "name", "spn", "uuid", "description", "gidnumber", "loginshell", "unix_password" @@ -904,10 +904,10 @@ pub const JSON_IDM_ACP_GROUP_UNIX_EXTEND_PRIV_V1: &str = r#"{ "uuid": ["00000000-0000-0000-0000-ffffff000030"], "description": ["Builtin IDM Control for managing and extending unix groups"], "acp_receiver": [ - "{\"Eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000022\"]}" + "{\"eq\":[\"memberof\",\"00000000-0000-0000-0000-000000000022\"]}" ], "acp_targetscope": [ - "{\"And\": [{\"Eq\": [\"class\",\"group\"]}, {\"AndNot\": {\"Or\": [{\"Eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"Eq\": [\"class\", \"tombstone\"]}, {\"Eq\": [\"class\", \"recycled\"]}]}}]}" + "{\"and\": [{\"eq\": [\"class\",\"group\"]}, {\"andnot\": {\"or\": [{\"eq\": [\"memberof\",\"00000000-0000-0000-0000-000000001000\"]}, {\"eq\": [\"class\", \"tombstone\"]}, {\"eq\": [\"class\", \"recycled\"]}]}}]}" ], "acp_search_attr": [ "class", "name", "spn", "uuid", "description", "member", "gidnumber" diff --git a/kanidmd/src/lib/core/ctx.rs b/kanidmd/src/lib/core/ctx.rs new file mode 100644 index 000000000..7b0cbd3b3 --- /dev/null +++ b/kanidmd/src/lib/core/ctx.rs @@ -0,0 +1,38 @@ +use crate::audit::AuditScope; +use actix::prelude::*; +use crossbeam::channel::Sender; +use std::thread; + +pub struct ServerCtx { + system: System, + log_tx: Sender>, + log_thread: thread::JoinHandle<()>, +} + +impl ServerCtx { + pub fn new( + system: System, + log_tx: Sender>, + log_thread: thread::JoinHandle<()>, + ) -> Self { + ServerCtx { + system, + log_tx, + log_thread, + } + } + + pub fn current(&self) -> System { + self.system.clone() + } + + pub fn stop(self) { + // stop the actix system + self.system.stop(); + // drain the log thread + self.log_tx + .send(None) + .expect("unable to shutdown log thread!"); + self.log_thread.join().expect("failed to stop log thread"); + } +} diff --git a/kanidmd/src/lib/core/mod.rs b/kanidmd/src/lib/core/mod.rs index 244f155c3..e8c8433d1 100644 --- a/kanidmd/src/lib/core/mod.rs +++ b/kanidmd/src/lib/core/mod.rs @@ -1,15 +1,19 @@ +mod ctx; // 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 crossbeam::channel::unbounded; use std::sync::Arc; +use std::thread; use time::Duration; use crate::config::Configuration; // SearchResult +use self::ctx::ServerCtx; use crate::actors::v1_read::QueryServerReadV1; use crate::actors::v1_read::{ AuthMessage, IdmAccountUnixAuthMessage, InternalRadiusReadMessage, @@ -61,30 +65,49 @@ fn get_current_user(session: &Session) -> Option { } } -fn operation_error_to_response(e: OperationError) -> HttpResponse { +fn operation_error_to_response(e: OperationError, hvalue: String) -> HttpResponse { match e { - OperationError::NotAuthenticated => HttpResponse::Unauthorized().json(e), + OperationError::NotAuthenticated => HttpResponse::Unauthorized() + .header("X-KANIDM-OPID", hvalue) + .json(e), OperationError::AccessDenied | OperationError::SystemProtectedObject => { - HttpResponse::Forbidden().json(e) + HttpResponse::Forbidden() + .header("X-KANIDM-OPID", hvalue) + .json(e) } OperationError::EmptyRequest | OperationError::NoMatchingEntries - | OperationError::SchemaViolation(_) => HttpResponse::BadRequest().json(e), - _ => HttpResponse::InternalServerError().json(e), + | OperationError::SchemaViolation(_) => HttpResponse::BadRequest() + .header("X-KANIDM-OPID", hvalue) + .json(e), + _ => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json(e), } } +macro_rules! new_eventid { + () => {{ + let eventid = Uuid::new_v4(); + let hv = eventid.to_hyphenated().to_string(); + (eventid, hv) + }}; +} + 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); + let (eventid, hvalue) = new_eventid!(); + let m_obj = <$message_type>::new(uat, $req, eventid); 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } }}; } @@ -95,14 +118,17 @@ macro_rules! json_event_get { // 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); + let (eventid, hvalue) = new_eventid!(); // New event, feed current auth data from the token to it. - let obj = <$message_type>::new(uat); + let obj = <$message_type>::new(uat, eventid); 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } }}; } @@ -147,12 +173,20 @@ async fn json_rest_event_get( ) -> HttpResponse { let uat = get_current_user(&session); - let obj = InternalSearchMessage { uat, filter, attrs }; + let (eventid, hvalue) = new_eventid!(); + let obj = InternalSearchMessage { + uat, + filter, + attrs, + eventid, + }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -167,12 +201,23 @@ async fn json_rest_event_get_id( let filter = Filter::join_parts_and(filter, filter_all!(f_id(path.as_str()))); - let obj = InternalSearchMessage { uat, filter, attrs }; + let (eventid, hvalue) = new_eventid!(); + + let obj = InternalSearchMessage { + uat, + filter, + attrs, + eventid, + }; 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"), + Ok(Ok(mut r)) => HttpResponse::Ok() + .header("X-KANIDM-OPID", hvalue) + .json(r.pop()), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -185,13 +230,20 @@ async fn json_rest_event_delete_id( let uat = get_current_user(&session); let filter = Filter::join_parts_and(filter, filter_all!(f_id(path.as_str()))); + let (eventid, hvalue) = new_eventid!(); - let obj = InternalDeleteMessage { uat, filter }; + let obj = InternalDeleteMessage { + uat, + filter, + eventid, + }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -205,11 +257,13 @@ async fn json_rest_event_get_id_attr( let uat = get_current_user(&session); let filter = Filter::join_parts_and(filter, filter_all!(f_id(id.as_str()))); + let (eventid, hvalue) = new_eventid!(); let obj = InternalSearchMessage { uat, filter, attrs: Some(vec![attr.clone()]), + eventid, }; match state.qe_r.send(obj).await { @@ -220,12 +274,13 @@ async fn json_rest_event_get_id_attr( // 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) + HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r) } - Ok(Err(e)) => operation_error_to_response(e), - Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -239,11 +294,14 @@ async fn json_rest_event_post( let uat = get_current_user(&session); obj.attrs.insert("class".to_string(), classes); - let m_obj = CreateMessage::new_entry(uat, obj); + let (eventid, hvalue) = new_eventid!(); + let m_obj = CreateMessage::new_entry(uat, obj, eventid); 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -257,18 +315,22 @@ async fn json_rest_event_post_id_attr( let uat = get_current_user(&session); let (id, attr) = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let m_obj = AppendAttributeMessage { uat, uuid_or_name: id, attr, values, filter, + eventid, }; // 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -282,17 +344,21 @@ async fn json_rest_event_put_id_attr( let uat = get_current_user(&session); let (id, attr) = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let m_obj = SetAttributeMessage { uat, uuid_or_name: id, attr, values, filter, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -305,18 +371,22 @@ async fn json_rest_event_delete_id_attr( let uat = get_current_user(&session); let (id, attr) = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); // TODO: Attempt to get an option Vec here? let obj = PurgeAttributeMessage { uat, uuid_or_name: id, attr, filter, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -329,16 +399,20 @@ async fn json_rest_event_credential_put( ) -> HttpResponse { let uat = get_current_user(&session); + let (eventid, hvalue) = new_eventid!(); let m_obj = InternalCredentialSetMessage { uat, uuid_or_name: id, appid: cred_id, sac: obj, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -381,16 +455,22 @@ async fn schema_attributetype_get_id( f_eq("attributename", PartialValue::new_iutf8s(path.as_str())) ])); + let (eventid, hvalue) = new_eventid!(); let obj = InternalSearchMessage { uat, filter, attrs: None, + eventid, }; 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"), + Ok(Ok(mut r)) => HttpResponse::Ok() + .header("X-KANIDM-OPID", hvalue) + .json(r.pop()), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -410,16 +490,22 @@ async fn schema_classtype_get_id( f_eq("classname", PartialValue::new_iutf8s(path.as_str())) ])); + let (eventid, hvalue) = new_eventid!(); let obj = InternalSearchMessage { uat, filter, attrs: None, + eventid, }; 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"), + Ok(Ok(mut r)) => HttpResponse::Ok() + .header("X-KANIDM-OPID", hvalue) + .json(r.pop()), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -529,15 +615,19 @@ async fn account_get_id_ssh_pubkeys( let uat = get_current_user(&session); let id = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let obj = InternalSshKeyReadMessage { uat, uuid_or_name: id, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -553,18 +643,22 @@ async fn account_post_id_ssh_pubkey( let id = path.into_inner(); let (tag, key) = obj.into_inner(); + let (eventid, hvalue) = new_eventid!(); let m_obj = InternalSshKeyCreateMessage { uat, uuid_or_name: id, tag, key, filter: filter_all!(f_eq("class", PartialValue::new_class("account"))), + eventid, }; // 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -574,16 +668,20 @@ async fn account_get_id_ssh_pubkey_tag( let uat = get_current_user(&session); let (id, tag) = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let obj = InternalSshKeyTagReadMessage { uat, uuid_or_name: id, tag, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -593,18 +691,22 @@ async fn account_delete_id_ssh_pubkey_tag( let uat = get_current_user(&session); let (id, tag) = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); 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"))), + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -615,15 +717,19 @@ async fn account_get_id_radius( let uat = get_current_user(&session); let id = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let obj = InternalRadiusReadMessage { uat, uuid_or_name: id, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -634,12 +740,15 @@ async fn account_post_id_radius_regenerate( let uat = get_current_user(&session); let id = path.into_inner(); - let obj = InternalRegenerateRadiusMessage::new(uat, id); + let (eventid, hvalue) = new_eventid!(); + let obj = InternalRegenerateRadiusMessage::new(uat, id, eventid); 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -658,15 +767,19 @@ async fn account_get_id_radius_token( let uat = get_current_user(&session); let id = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let obj = InternalRadiusTokenReadMessage { uat, uuid_or_name: id, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -675,11 +788,18 @@ async fn account_post_id_person_extend( ) -> HttpResponse { let uat = get_current_user(&session); let uuid_or_name = path.into_inner(); - let m_obj = IdmAccountPersonExtendMessage { uat, uuid_or_name }; + let (eventid, hvalue) = new_eventid!(); + let m_obj = IdmAccountPersonExtendMessage { + uat, + uuid_or_name, + eventid, + }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -693,11 +813,14 @@ async fn account_post_id_unix( ) -> HttpResponse { let uat = get_current_user(&session); let id = path.into_inner(); - let m_obj = IdmAccountUnixExtendMessage::new(uat, id, obj.into_inner()); + let (eventid, hvalue) = new_eventid!(); + let m_obj = IdmAccountUnixExtendMessage::new(uat, id, obj.into_inner(), eventid); 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -707,15 +830,19 @@ async fn account_get_id_unix_token( let uat = get_current_user(&session); let id = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let obj = InternalUnixUserTokenReadMessage { uat, uuid_or_name: id, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -729,15 +856,19 @@ async fn account_post_id_unix_auth( ) -> HttpResponse { let uat = get_current_user(&session); let id = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let m_obj = IdmAccountUnixAuthMessage { uat, uuid_or_name: id, cred: obj.into_inner().value, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -751,15 +882,19 @@ async fn account_put_id_unix_credential( ) -> HttpResponse { let uat = get_current_user(&session); let id = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let m_obj = IdmAccountUnixSetCredMessage { uat, uuid_or_name: id, cred: obj.into_inner().value, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -769,17 +904,21 @@ async fn account_delete_id_unix_credential( let uat = get_current_user(&session); let id = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let obj = PurgeAttributeMessage { uat, uuid_or_name: id, attr: "unix_password".to_string(), filter: filter_all!(f_eq("class", PartialValue::new_class("posixaccount"))), + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -852,11 +991,14 @@ async fn group_post_id_unix( ) -> HttpResponse { let uat = get_current_user(&session); let id = path.into_inner(); - let m_obj = IdmGroupUnixExtendMessage::new(uat, id, obj.into_inner()); + let (eventid, hvalue) = new_eventid!(); + let m_obj = IdmGroupUnixExtendMessage::new(uat, id, obj.into_inner(), eventid); 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -866,15 +1008,19 @@ async fn group_get_id_unix_token( let uat = get_current_user(&session); let id = path.into_inner(); + let (eventid, hvalue) = new_eventid!(); let obj = InternalUnixGroupTokenReadMessage { uat, uuid_or_name: id, + eventid, }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -914,12 +1060,20 @@ async fn recycle_bin_get((session, state): (Session, Data)) -> HttpRes let uat = get_current_user(&session); let attrs = None; - let obj = InternalSearchRecycledMessage { uat, filter, attrs }; + let (eventid, hvalue) = new_eventid!(); + let obj = InternalSearchRecycledMessage { + uat, + filter, + attrs, + eventid, + }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -930,12 +1084,22 @@ async fn recycle_bin_id_get( let filter = filter_all!(f_id(path.as_str())); let attrs = None; - let obj = InternalSearchRecycledMessage { uat, filter, attrs }; + let (eventid, hvalue) = new_eventid!(); + let obj = InternalSearchRecycledMessage { + uat, + filter, + attrs, + eventid, + }; 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"), + Ok(Ok(mut r)) => HttpResponse::Ok() + .header("X-KANIDM-OPID", hvalue) + .json(r.pop()), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -945,11 +1109,18 @@ async fn recycle_bin_revive_id_post( let uat = get_current_user(&session); let filter = filter_all!(f_id(path.as_str())); - let m_obj = ReviveRecycledMessage { uat, filter }; + let (eventid, hvalue) = new_eventid!(); + let m_obj = ReviveRecycledMessage { + uat, + filter, + eventid, + }; 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"), + Ok(Ok(r)) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(r), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -969,12 +1140,17 @@ async fn auth((obj, session, state): (Json, Session, Data // 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 (eventid, hvalue) = new_eventid!(); let maybe_sessionid = match session.get::("auth-session-id") { Ok(c) => c, - Err(_e) => return HttpResponse::InternalServerError().json(()), + Err(_e) => { + return HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json(()) + } }; - let auth_msg = AuthMessage::new(obj.into_inner(), maybe_sessionid); + let auth_msg = AuthMessage::new(obj.into_inner(), maybe_sessionid, eventid); // 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 @@ -992,26 +1168,34 @@ async fn auth((obj, session, state): (Json, Session, Data 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(()), + Ok(_) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(ar), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json(()), } } AuthState::Denied(_) => { // Remove the auth-session-id session.remove("auth-session-id"); - HttpResponse::Unauthorized().json(ar) + HttpResponse::Unauthorized() + .header("X-KANIDM-OPID", hvalue) + .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(_) => HttpResponse::Ok().header("X-KANIDM-OPID", hvalue).json(ar), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json(()), } } } } - Ok(Err(e)) => operation_error_to_response(e), - Err(_) => HttpResponse::InternalServerError().json("mailbox failure"), + Ok(Err(e)) => operation_error_to_response(e, hvalue), + Err(_) => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json("mailbox failure"), } } @@ -1029,21 +1213,26 @@ async fn idm_account_set_password( // == Status async fn status((_session, state): (Session, Data)) -> HttpResponse { - let r = state.status.send(StatusRequestEvent {}).await; + let (eventid, hvalue) = new_eventid!(); + let r = state.status.send(StatusRequestEvent { eventid }).await; match r { - Ok(true) => HttpResponse::Ok().json(true), - _ => HttpResponse::InternalServerError().json(false), + Ok(true) => HttpResponse::Ok() + .header("X-KANIDM-OPID", hvalue) + .json(true), + _ => HttpResponse::InternalServerError() + .header("X-KANIDM-OPID", hvalue) + .json(false), } } // === internal setup helpers fn setup_backend(config: &Configuration) -> Result { - let mut audit_be = AuditScope::new("backend_setup"); + let mut audit_be = AuditScope::new("backend_setup", uuid::Uuid::new_v4()); 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); + audit_be.write_log(); be } @@ -1094,11 +1283,11 @@ pub fn backup_server_core(config: Configuration, dst_path: &str) { return; } }; - let mut audit = AuditScope::new("backend_backup"); + let mut audit = AuditScope::new("backend_backup", uuid::Uuid::new_v4()); let mut be_ro_txn = be.read(); let r = be_ro_txn.backup(&mut audit, dst_path); - debug!("{}", audit); + audit.write_log(); match r { Ok(_) => info!("Backup success!"), Err(e) => { @@ -1117,7 +1306,7 @@ pub fn restore_server_core(config: Configuration, dst_path: &str) { return; } }; - let mut audit = AuditScope::new("backend_restore"); + let mut audit = AuditScope::new("backend_restore", uuid::Uuid::new_v4()); // First, we provide the in-memory schema so that core attrs are indexed correctly. let schema = match Schema::new(&mut audit) { @@ -1137,7 +1326,7 @@ pub fn restore_server_core(config: Configuration, dst_path: &str) { .and_then(|_| be_wr_txn.commit(&mut audit)); if r.is_err() { - debug!("{}", audit); + audit.write_log(); error!("Failed to restore database: {:?}", r); std::process::exit(1); } @@ -1148,7 +1337,7 @@ pub fn restore_server_core(config: Configuration, dst_path: &str) { let (qs, _idms) = match setup_qs_idms(&mut audit, be) { Ok(t) => t, Err(e) => { - debug!("{}", audit); + audit.write_log(); error!("Unable to setup query server or idm server -> {:?}", e); return; } @@ -1179,7 +1368,7 @@ pub fn reindex_server_core(config: Configuration) { return; } }; - let mut audit = AuditScope::new("server_reindex"); + let mut audit = AuditScope::new("server_reindex", uuid::Uuid::new_v4()); // First, we provide the in-memory schema so that core attrs are indexed correctly. let schema = match Schema::new(&mut audit) { @@ -1202,7 +1391,7 @@ pub fn reindex_server_core(config: Configuration) { // Now that's done, setup a minimal qs and reindex from that. if r.is_err() { - debug!("{}", audit); + audit.write_log(); error!("Failed to reindex database: {:?}", r); std::process::exit(1); } @@ -1213,7 +1402,7 @@ pub fn reindex_server_core(config: Configuration) { let (qs, _idms) = match setup_qs_idms(&mut audit, be) { Ok(t) => t, Err(e) => { - debug!("{}", audit); + audit.write_log(); error!("Unable to setup query server or idm server -> {:?}", e); return; } @@ -1227,6 +1416,8 @@ pub fn reindex_server_core(config: Configuration) { .reindex(&mut audit) .and_then(|_| qs_write.commit(&mut audit)); + audit.write_log(); + match r { Ok(_) => info!("Index Phase 2 Success!"), Err(e) => { @@ -1237,7 +1428,7 @@ pub fn reindex_server_core(config: Configuration) { } pub fn domain_rename_core(config: Configuration, new_domain_name: String) { - let mut audit = AuditScope::new("domain_rename"); + let mut audit = AuditScope::new("domain_rename", uuid::Uuid::new_v4()); // Start the backend. let be = match setup_backend(&config) { @@ -1251,7 +1442,7 @@ pub fn domain_rename_core(config: Configuration, new_domain_name: String) { let (qs, _idms) = match setup_qs_idms(&mut audit, be) { Ok(t) => t, Err(e) => { - debug!("{}", audit); + audit.write_log(); error!("Unable to setup query server or idm server -> {:?}", e); return; } @@ -1272,7 +1463,7 @@ pub fn domain_rename_core(config: Configuration, new_domain_name: String) { } pub fn reset_sid_core(config: Configuration) { - let mut audit = AuditScope::new("reset_sid_core"); + let mut audit = AuditScope::new("reset_sid_core", uuid::Uuid::new_v4()); // Setup the be let be = match setup_backend(&config) { Ok(be) => be, @@ -1282,12 +1473,12 @@ pub fn reset_sid_core(config: Configuration) { } }; let nsid = be.reset_db_s_uuid(&mut audit); - debug!("{}", audit); + audit.write_log(); info!("New Server ID: {:?}", nsid); } pub fn verify_server_core(config: Configuration) { - let mut audit = AuditScope::new("server_verify"); + let mut audit = AuditScope::new("server_verify", uuid::Uuid::new_v4()); // Setup the be let be = match setup_backend(&config) { Ok(be) => be, @@ -1309,7 +1500,7 @@ pub fn verify_server_core(config: Configuration) { // Run verifications. let r = server.verify(&mut audit); - debug!("{}", audit); + audit.write_log(); if r.is_empty() { info!("Verification passed!"); @@ -1325,7 +1516,7 @@ pub fn verify_server_core(config: Configuration) { } pub fn recover_account_core(config: Configuration, name: String, password: String) { - let mut audit = AuditScope::new("recover_account"); + let mut audit = AuditScope::new("recover_account", uuid::Uuid::new_v4()); // Start the backend. let be = match setup_backend(&config) { @@ -1339,7 +1530,7 @@ pub fn recover_account_core(config: Configuration, name: String, password: Strin let (_qs, idms) = match setup_qs_idms(&mut audit, be) { Ok(t) => t, Err(e) => { - debug!("{}", audit); + audit.write_log(); error!("Unable to setup query server or idm server -> {:?}", e); return; } @@ -1352,12 +1543,12 @@ pub fn recover_account_core(config: Configuration, name: String, password: Strin idms_prox_write .commit(&mut audit) .expect("A critical error during commit occured."); - debug!("{}", audit); + audit.write_log(); info!("Password reset!"); } Err(e) => { error!("Error during password reset -> {:?}", e); - debug!("{}", audit); + audit.write_log(); // abort the txn std::mem::drop(idms_prox_write); std::process::exit(1); @@ -1365,7 +1556,7 @@ pub fn recover_account_core(config: Configuration, name: String, password: Strin }; } -pub fn create_server_core(config: Configuration) { +pub fn create_server_core(config: Configuration) -> Result { // Until this point, we probably want to write to the log macro fns. if config.integration_test_config.is_some() { @@ -1376,17 +1567,19 @@ pub fn create_server_core(config: Configuration) { 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(); + + let (log_tx, log_rx) = unbounded(); + let log_thread = thread::spawn(move || async_log::run(log_rx)); // Start the status tracking thread - let status_addr = StatusActor::start(log_addr.clone()); + let status_addr = StatusActor::start(log_tx.clone()); // 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; + return Err(()); } }; @@ -1398,18 +1591,18 @@ pub fn create_server_core(config: Configuration) { Ok(be) => be, Err(e) => { error!("Failed to setup BE -> {:?}", e); - return; + return Err(()); } }; - let mut audit = AuditScope::new("setup_qs_idms"); + let mut audit = AuditScope::new("setup_qs_idms", uuid::Uuid::new_v4()); // Start the IDM server. let (qs, idms) = match setup_qs_idms(&mut audit, be) { Ok(t) => t, Err(e) => { - debug!("{}", audit); + audit.write_log(); error!("Unable to setup query server or idm server -> {:?}", e); - return; + return Err(()); } }; // Any pre-start tasks here. @@ -1423,40 +1616,38 @@ pub fn create_server_core(config: Configuration) { ) { Ok(_) => {} Err(e) => { - debug!("{}", audit); + audit.write_log(); error!( "Unable to configure INTERGATION TEST admin account -> {:?}", e ); - return; + return Err(()); } }; match idms_prox_write.commit(&mut audit) { Ok(_) => {} Err(e) => { - debug!("{}", audit); + audit.write_log(); error!("Unable to commit INTERGATION TEST setup -> {:?}", e); - return; + return Err(()); } } } None => {} } - log_addr.do_send(audit); + log_tx.send(Some(audit)).unwrap_or_else(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); + }); // 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, - ); + let server_read_addr = + QueryServerReadV1::start(log_tx.clone(), qs.clone(), idms_arc.clone(), config.threads); // Start the write thread - let server_write_addr = QueryServerWriteV1::start(log_addr, qs, idms_arc); + let server_write_addr = QueryServerWriteV1::start(log_tx.clone(), qs, idms_arc); // Setup timed events associated to the write thread let _int_addr = IntervalActor::new(server_write_addr.clone()).start(); @@ -1677,4 +1868,6 @@ pub fn create_server_core(config: Configuration) { }; server.expect("Failed to initialise server!").run(); + + Ok(ServerCtx::new(System::current(), log_tx, log_thread)) } diff --git a/kanidmd/src/lib/credential/totp.rs b/kanidmd/src/lib/credential/totp.rs index 13d28e695..6850048ef 100644 --- a/kanidmd/src/lib/credential/totp.rs +++ b/kanidmd/src/lib/credential/totp.rs @@ -213,7 +213,7 @@ mod tests { let otp = TOTP::new("".to_string(), key.clone(), step, algo.clone()); let d = Duration::from_secs(secs); let r = otp.do_totp_duration_from_epoch(&d); - println!( + debug!( "key: {:?}, algo: {:?}, time: {:?}, step: {:?}, expect: {:?} == {:?}", key, algo, secs, step, expect, r ); diff --git a/kanidmd/src/lib/entry.rs b/kanidmd/src/lib/entry.rs index a544548d7..d9046fd99 100644 --- a/kanidmd/src/lib/entry.rs +++ b/kanidmd/src/lib/entry.rs @@ -570,11 +570,11 @@ impl Entry { Some(vs) => match vs.iter().take(1).next() { Some(uuid_v) => match uuid_v.to_uuid() { Some(uuid) => *uuid, - None => return Err(SchemaError::InvalidAttribute), + None => return Err(SchemaError::InvalidAttribute("uuid".to_string())), }, - None => return Err(SchemaError::MissingMustAttribute("uuid".to_string())), + None => return Err(SchemaError::MissingMustAttribute(vec!["uuid".to_string()])), }, - None => return Err(SchemaError::MissingMustAttribute("uuid".to_string())), + None => return Err(SchemaError::MissingMustAttribute(vec!["uuid".to_string()])), }; // Build the new valid entry ... @@ -592,28 +592,32 @@ impl Entry { { // First, check we have class on the object .... if !ne.attribute_pres("class") { - debug!("Missing attribute class"); - return Err(SchemaError::InvalidClass); + // lrequest_error!("Missing attribute class"); + return Err(SchemaError::NoClassFound); } // Do we have extensible? let extensible = ne.attribute_value_pres("class", &CLASS_EXTENSIBLE); - let entry_classes = ne.classes().ok_or(SchemaError::InvalidClass)?; - let entry_classes_size = entry_classes.len(); + let entry_classes = ne.classes().ok_or(SchemaError::NoClassFound)?; + let mut invalid_classes = Vec::with_capacity(0); - let classes: Vec<&SchemaClass> = entry_classes + let mut classes: Vec<&SchemaClass> = Vec::with_capacity(entry_classes.len()); + entry_classes.for_each(|c: &Value| { // we specify types here to help me clarify a few things in the // development process :) - .filter_map(|c: &Value| { - let x: Option<&SchemaClass> = c.as_string().and_then(|s| schema_classes.get(s)); - x - }) - .collect(); + match c.as_string() { + Some(s) => match schema_classes.get(s) { + Some(x) => classes.push(x), + None => invalid_classes.push(s.clone()), + }, + None => invalid_classes.push("corrupt classname".to_string()), + } + }); - if classes.len() != entry_classes_size { - debug!("Class on entry not found in schema?"); - return Err(SchemaError::InvalidClass); + if invalid_classes.len() != 0 { + // lrequest_error!("Class on entry not found in schema?"); + return Err(SchemaError::InvalidClass(invalid_classes)); }; // What this is really doing is taking a set of classes, and building an @@ -643,41 +647,47 @@ impl Entry { // Check that all must are inplace // for each attr in must, check it's present on our ent - for attr in must { + let mut missing_must = Vec::with_capacity(0); + must.iter().for_each(|attr| { let avas = ne.get_ava(&attr.name); if avas.is_none() { - return Err(SchemaError::MissingMustAttribute(attr.name.clone())); + missing_must.push(attr.name.clone()); } + }); + + if missing_must.len() != 0 { + return Err(SchemaError::MissingMustAttribute(missing_must)); } - debug!("Extensible object -> {}", extensible); - if extensible { + // ladmin_warning!("Extensible Object In Use!"); for (attr_name, avas) in ne.avas() { match schema_attributes.get(attr_name) { Some(a_schema) => { // Now, for each type we do a *full* check of the syntax // and validity of the ava. if a_schema.phantom { - debug!( + /* + lrequest_error!( "Attempt to add phantom attribute to extensible: {}", attr_name ); - return Err(SchemaError::PhantomAttribute); + */ + return Err(SchemaError::PhantomAttribute(attr_name.clone())); } let r = a_schema.validate_ava(avas); match r { Ok(_) => {} Err(e) => { - debug!("Failed to validate: {}", attr_name); + // lrequest_error!("Failed to validate: {}", attr_name); return Err(e); } } } None => { - debug!("Invalid Attribute {} for extensible object", attr_name); - return Err(SchemaError::InvalidAttribute); + // lrequest_error!("Invalid Attribute {} for extensible object", attr_name); + return Err(SchemaError::InvalidAttribute(attr_name.clone())); } } } @@ -725,14 +735,14 @@ impl Entry { match r { Ok(_) => {} Err(e) => { - debug!("Failed to validate: {}", attr_name); + // lrequest_error!("Failed to validate: {}", attr_name); return Err(e); } } } None => { - debug!("Invalid Attribute {} for may+must set", attr_name); - return Err(SchemaError::InvalidAttribute); + // lrequest_error!("Invalid Attribute {} for may+must set", attr_name); + return Err(SchemaError::InvalidAttribute(attr_name.clone())); } } } @@ -1533,10 +1543,7 @@ impl Entry { pub fn get_ava_single_protofilter(&self, attr: &str) -> Option { self.get_ava_single(attr) - .and_then(|v: &Value| { - debug!("get_ava_single_protofilter -> {:?}", v); - v.as_json_filter() - }) + .and_then(|v: &Value| v.as_json_filter()) .map(|f: &ProtoFilter| (*f).clone()) } @@ -2086,12 +2093,12 @@ mod tests { // When we do None, None, we get nothing back. let r1 = Entry::idx_diff(&idxmeta, None, None); - println!("{:?}", r1); + debug!("{:?}", r1); assert!(r1 == Vec::new()); // Check generating a delete diff let del_r = Entry::idx_diff(&idxmeta, Some(&e1), None); - println!("{:?}", del_r); + debug!("{:?}", del_r); assert!( del_r[0] == Err(( @@ -2104,7 +2111,7 @@ mod tests { // Check generating an add diff let add_r = Entry::idx_diff(&idxmeta, None, Some(&e1)); - println!("{:?}", add_r); + debug!("{:?}", add_r); assert!( add_r[0] == Ok(( @@ -2162,6 +2169,6 @@ mod tests { "claire".to_string() )) ); - println!("{:?}", chg_r); + debug!("{:?}", chg_r); } } diff --git a/kanidmd/src/lib/event.rs b/kanidmd/src/lib/event.rs index 061a36c47..af51c989a 100644 --- a/kanidmd/src/lib/event.rs +++ b/kanidmd/src/lib/event.rs @@ -988,6 +988,7 @@ impl WhoamiResult { #[derive(Debug)] pub struct PurgeTombstoneEvent { pub event: Event, + pub eventid: Uuid, } impl Message for PurgeTombstoneEvent { @@ -998,6 +999,7 @@ impl PurgeTombstoneEvent { pub fn new() -> Self { PurgeTombstoneEvent { event: Event::from_internal(), + eventid: Uuid::new_v4(), } } } @@ -1005,6 +1007,7 @@ impl PurgeTombstoneEvent { #[derive(Debug)] pub struct PurgeRecycledEvent { pub event: Event, + pub eventid: Uuid, } impl Message for PurgeRecycledEvent { @@ -1015,6 +1018,7 @@ impl PurgeRecycledEvent { pub fn new() -> Self { PurgeRecycledEvent { event: Event::from_internal(), + eventid: Uuid::new_v4(), } } } diff --git a/kanidmd/src/lib/filter.rs b/kanidmd/src/lib/filter.rs index 4b3afb7ce..f7ce261a8 100644 --- a/kanidmd/src/lib/filter.rs +++ b/kanidmd/src/lib/filter.rs @@ -138,6 +138,31 @@ pub struct FilterValidResolved { inner: FilterResolved, } +#[derive(Debug)] +pub enum FilterPlan { + Invalid, + EqIndexed(String, String), + EqUnindexed(String), + EqCorrupt(String), + SubIndexed(String, String), + SubUnindexed(String), + SubCorrupt(String), + PresIndexed(String), + PresUnindexed(String), + PresCorrupt(String), + LessThanUnindexed(String), + OrUnindexed(Vec), + OrIndexed(Vec), + OrPartial(Vec), + OrPartialThreshold(Vec), + AndEmptyCand(Vec), + AndIndexed(Vec), + AndUnindexed(Vec), + AndPartial(Vec), + AndPartialThreshold(Vec), + AndNot(Box), +} + /// A `Filter` is a logical set of assertions about the state of an [`Entry`] and /// it's avas. `Filter`s are built from a set of possible assertions. /// @@ -476,7 +501,7 @@ impl FilterComp { .map(|_| FilterComp::Eq(attr_norm, value.clone())) // On error, pass the error back out. } - None => Err(SchemaError::InvalidAttribute), + None => Err(SchemaError::InvalidAttribute(attr_norm)), } } FilterComp::Sub(attr, value) => { @@ -491,7 +516,7 @@ impl FilterComp { .map(|_| FilterComp::Sub(attr_norm, value.clone())) // On error, pass the error back out. } - None => Err(SchemaError::InvalidAttribute), + None => Err(SchemaError::InvalidAttribute(attr_norm)), } } FilterComp::Pres(attr) => { @@ -502,7 +527,7 @@ impl FilterComp { // Return our valid data Ok(FilterComp::Pres(attr_norm)) } - None => Err(SchemaError::InvalidAttribute), + None => Err(SchemaError::InvalidAttribute(attr_norm)), } } FilterComp::LessThan(attr, value) => { @@ -517,7 +542,7 @@ impl FilterComp { .map(|_| FilterComp::LessThan(attr_norm, value.clone())) // On error, pass the error back out. } - None => Err(SchemaError::InvalidAttribute), + None => Err(SchemaError::InvalidAttribute(attr_norm)), } } FilterComp::Or(filters) => { @@ -895,33 +920,46 @@ impl FilterResolved { } }); - // finally, optimise this list by sorting. - f_list_new.sort_unstable(); - f_list_new.dedup(); - - // return! - FilterResolved::And(f_list_new) + // If the f_list_or only has one element, pop it and return. + if f_list_new.len() == 1 { + f_list_new.pop().expect("corrupt?") + } else { + // finally, optimise this list by sorting. + f_list_new.sort_unstable(); + f_list_new.dedup(); + // return! + FilterResolved::And(f_list_new) + } } FilterResolved::Or(f_list) => { let (f_list_or, mut f_list_new): (Vec<_>, Vec<_>) = f_list .iter() + // Optimise all inner items. .map(|f_ref| f_ref.optimise()) + // Split out inner-or terms to fold into this term. .partition(|f| match f { FilterResolved::Or(_) => true, _ => false, }); + // Append the inner terms. f_list_or.into_iter().for_each(|fc| { if let FilterResolved::Or(mut l) = fc { f_list_new.append(&mut l) } }); - // sort, but reverse so that sub-optimal elements are later! - f_list_new.sort_unstable_by(|a, b| b.cmp(a)); - f_list_new.dedup(); + // If the f_list_or only has one element, pop it and return. + if f_list_new.len() == 1 { + f_list_new.pop().expect("corrupt?") + } else { + // sort, but reverse so that sub-optimal elements are earlier + // to promote fast-failure. + f_list_new.sort_unstable_by(|a, b| b.cmp(a)); + f_list_new.dedup(); - FilterResolved::Or(f_list_new) + FilterResolved::Or(f_list_new) + } } f => f.clone(), } @@ -972,23 +1010,30 @@ mod tests { let f_init_r = unsafe { f_init.into_valid_resolved() }; let f_init_o = f_init_r.optimise(); let f_init_e = unsafe { f_expect.into_valid_resolved() }; - println!("--"); - println!("init --> {:?}", f_init_r); - println!("opt --> {:?}", f_init_o); - println!("expect --> {:?}", f_init_e); + debug!("--"); + debug!("init --> {:?}", f_init_r); + debug!("opt --> {:?}", f_init_o); + debug!("expect --> {:?}", f_init_e); assert!(f_init_o == f_init_e); }}; } #[test] fn test_filter_optimise() { + use env_logger; + ::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug"); + let _ = env_logger::builder() + .format_timestamp(None) + .format_level(false) + .is_test(true) + .try_init(); // Given sets of "optimisable" filters, optimise them. filter_optimise_assert!( f_and(vec![f_and(vec![f_eq( "class", PartialValue::new_class("test") )])]), - f_and(vec![f_eq("class", PartialValue::new_class("test"))]) + f_eq("class", PartialValue::new_class("test")) ); filter_optimise_assert!( @@ -996,7 +1041,7 @@ mod tests { "class", PartialValue::new_class("test") )])]), - f_or(vec![f_eq("class", PartialValue::new_class("test"))]) + f_eq("class", PartialValue::new_class("test")) ); filter_optimise_assert!( @@ -1004,10 +1049,7 @@ mod tests { "class", PartialValue::new_class("test") )])])]), - f_and(vec![f_or(vec![f_and(vec![f_eq( - "class", - PartialValue::new_class("test") - )])])]) + f_eq("class", PartialValue::new_class("test")) ); // Later this can test duplicate filter detection. @@ -1073,8 +1115,7 @@ mod tests { f_or(vec![ f_and(vec![ f_eq("class", PartialValue::new_class("test")), - f_eq("term", PartialValue::new_class("test")), - f_or(vec![f_eq("class", PartialValue::new_class("test"))]) + f_eq("term", PartialValue::new_class("test")) ]), f_eq("class", PartialValue::new_class("test")), ]) diff --git a/kanidmd/src/lib/idm/account.rs b/kanidmd/src/lib/idm/account.rs index f417525c2..6f3cd683d 100644 --- a/kanidmd/src/lib/idm/account.rs +++ b/kanidmd/src/lib/idm/account.rs @@ -98,8 +98,10 @@ impl Account { value: Entry, qs: &mut QueryServerReadTransaction, ) -> Result { - let groups = Group::try_from_account_entry_ro(au, &value, qs)?; - try_from_entry!(value, groups) + lperf_segment!(au, "idm::account::try_from_entry_ro", || { + let groups = Group::try_from_account_entry_ro(au, &value, qs)?; + try_from_entry!(value, groups) + }) } pub(crate) fn try_from_entry_rw( @@ -210,7 +212,7 @@ mod tests { #[test] fn test_idm_account_from_anonymous() { let anon_e = entry_str_to_account!(JSON_ANONYMOUS_V1); - println!("{:?}", anon_e); + debug!("{:?}", anon_e); // I think that's it? we may want to check anonymous mech ... } diff --git a/kanidmd/src/lib/idm/authsession.rs b/kanidmd/src/lib/idm/authsession.rs index dc07b697f..0d9bce5e2 100644 --- a/kanidmd/src/lib/idm/authsession.rs +++ b/kanidmd/src/lib/idm/authsession.rs @@ -17,6 +17,7 @@ use std::time::Duration; const BAD_PASSWORD_MSG: &str = "incorrect password"; const BAD_TOTP_MSG: &str = "incorrect totp"; const BAD_AUTH_TYPE_MSG: &str = "invalid authentication method in this context"; +const BAD_CREDENTIALS: &str = "invalid credential message"; enum CredState { Success(Vec), @@ -72,10 +73,16 @@ impl TryFrom<&Credential> for CredHandler { } impl CredHandler { - pub fn validate(&mut self, creds: &[AuthCredential], ts: &Duration) -> CredState { + pub fn validate( + &mut self, + au: &mut AuditScope, + creds: &[AuthCredential], + ts: &Duration, + ) -> CredState { match self { CredHandler::Denied => { // Sad trombone. + lsecurity!(au, "Handler::Denied -> Result::Denied"); CredState::Denied("authentication denied") } CredHandler::Anonymous => { @@ -87,7 +94,10 @@ impl CredHandler { // the session to continue up to some timelimit. match acc { // If denied, continue returning denied. - CredState::Denied(_) => acc, + CredState::Denied(_) => { + lsecurity!(au, "Handler::Anonymous -> Result::Denied - already denied"); + acc + } // We have a continue or success, it's important we keep checking here // after the success, because if they sent "multiple" anonymous or // they sent anon + password, we need to handle both cases. Double anon @@ -97,9 +107,13 @@ impl CredHandler { match cred { AuthCredential::Anonymous => { // For anonymous, no claims will ever be issued. + lsecurity!(au, "Handler::Anonymous -> Result::Success"); CredState::Success(Vec::new()) } - _ => CredState::Denied(BAD_AUTH_TYPE_MSG), + _ => { + lsecurity!(au, "Handler::Anonymous -> Result::Denied - invalid cred type for handler"); + CredState::Denied(BAD_AUTH_TYPE_MSG) + } } } } // end match acc @@ -113,18 +127,26 @@ impl CredHandler { |acc, cred| { match acc { // If failed, continue to fail. - CredState::Denied(_) => acc, + CredState::Denied(_) => { + lsecurity!(au, "Handler::Password -> Result::Denied - already denied"); + acc + } _ => { match cred { AuthCredential::Password(cleartext) => { if pw.verify(cleartext.as_str()) { + lsecurity!(au, "Handler::Password -> Result::Success"); CredState::Success(Vec::new()) } else { + lsecurity!(au, "Handler::Password -> Result::Denied - incorrect password"); CredState::Denied(BAD_PASSWORD_MSG) } } // All other cases fail. - _ => CredState::Denied(BAD_AUTH_TYPE_MSG), + _ => { + lsecurity!(au, "Handler::Anonymous -> Result::Denied - invalid cred type for handler"); + CredState::Denied(BAD_AUTH_TYPE_MSG) + } } } } // end match acc @@ -138,7 +160,10 @@ impl CredHandler { CredState::Continue(vec![AuthAllowed::TOTP, AuthAllowed::Password]), |acc, cred| { match acc { - CredState::Denied(_) => acc, + CredState::Denied(_) => { + lsecurity!(au, "Handler::TOTPPassword -> Result::Denied - already denied"); + acc + } _ => { match cred { AuthCredential::Password(cleartext) => { @@ -149,15 +174,18 @@ impl CredHandler { CredVerifyState::Init => { // TOTP hasn't been run yet, we need it before // we indicate the pw status. + lsecurity!(au, "Handler::TOTPPassword -> Result::Continue - TOTP -, password OK"); CredState::Continue(vec![AuthAllowed::TOTP]) } CredVerifyState::Success => { // The totp is success, and password good, let's go! + lsecurity!(au, "Handler::TOTPPassword -> Result::Success - TOTP OK, password OK"); CredState::Success(Vec::new()) } CredVerifyState::Fail => { // The totp already failed, send that message now. // Should be impossible state. + lsecurity!(au, "Handler::TOTPPassword -> Result::Denied - TOTP Fail, password OK"); CredState::Denied(BAD_TOTP_MSG) } } @@ -167,15 +195,18 @@ impl CredHandler { CredVerifyState::Init => { // TOTP hasn't been run yet, we need it before // we indicate the pw status. + lsecurity!(au, "Handler::TOTPPassword -> Result::Continue - TOTP -, password Fail"); CredState::Continue(vec![AuthAllowed::TOTP]) } CredVerifyState::Success => { // The totp is success, but password bad. + lsecurity!(au, "Handler::TOTPPassword -> Result::Denied - TOTP OK, password Fail"); CredState::Denied(BAD_PASSWORD_MSG) } CredVerifyState::Fail => { // The totp already failed, remind. // this should be an impossible state. + lsecurity!(au, "Handler::TOTPPassword -> Result::Denied - TOTP Fail, password Fail"); CredState::Denied(BAD_TOTP_MSG) } } @@ -187,22 +218,29 @@ impl CredHandler { pw_totp.totp_state = CredVerifyState::Success; match pw_totp.pw_state { CredVerifyState::Init => { + lsecurity!(au, "Handler::TOTPPassword -> Result::Continue - TOTP OK, password -"); CredState::Continue(vec![AuthAllowed::Password]) } CredVerifyState::Success => { + lsecurity!(au, "Handler::TOTPPassword -> Result::Success - TOTP OK, password OK"); CredState::Success(Vec::new()) } CredVerifyState::Fail => { + lsecurity!(au, "Handler::TOTPPassword -> Result::Denied - TOTP OK, password Fail"); CredState::Denied(BAD_PASSWORD_MSG) } } } else { pw_totp.totp_state = CredVerifyState::Fail; + lsecurity!(au, "Handler::TOTPPassword -> Result::Denied - TOTP Fail, password -"); CredState::Denied(BAD_TOTP_MSG) } } // All other cases fail. - _ => CredState::Denied(BAD_AUTH_TYPE_MSG), + _ => { + lsecurity!(au, "Handler::TOTPPassword -> Result::Denied - invalid cred type for handler"); + CredState::Denied(BAD_AUTH_TYPE_MSG) + } } // end match cred } } // end match acc @@ -306,7 +344,16 @@ impl AuthSession { )); } - match self.handler.validate(creds, time) { + if creds.len() > 4 { + lsecurity!( + au, + "Credentials denied: potential flood/dos/bruteforce attempt. {} creds were sent.", + creds.len() + ); + return Ok(AuthState::Denied(BAD_CREDENTIALS.to_string())); + } + + match self.handler.validate(au, creds, time) { CredState::Success(claims) => { lsecurity!(au, "Successful cred handling"); self.finished = true; @@ -354,7 +401,9 @@ mod tests { use crate::constants::{JSON_ADMIN_V1, JSON_ANONYMOUS_V1}; use crate::credential::totp::{TOTP, TOTP_DEFAULT_STEP}; use crate::credential::Credential; - use crate::idm::authsession::{AuthSession, BAD_AUTH_TYPE_MSG, BAD_PASSWORD_MSG, BAD_TOTP_MSG}; + use crate::idm::authsession::{ + AuthSession, BAD_AUTH_TYPE_MSG, BAD_CREDENTIALS, BAD_PASSWORD_MSG, BAD_TOTP_MSG, + }; use kanidm_proto::v1::{AuthAllowed, AuthCredential, AuthState}; use std::time::Duration; @@ -374,6 +423,29 @@ mod tests { ); } + #[test] + fn test_idm_authsession_floodcheck_mech() { + let mut audit = + AuditScope::new("test_idm_authsession_floodcheck_mech", uuid::Uuid::new_v4()); + let anon_account = entry_str_to_account!(JSON_ANONYMOUS_V1); + let mut session = AuthSession::new(anon_account, None); + + let attempt = vec![ + AuthCredential::Anonymous, + AuthCredential::Anonymous, + AuthCredential::Anonymous, + AuthCredential::Anonymous, + AuthCredential::Anonymous, + ]; + match session.validate_creds(&mut audit, &attempt, &Duration::from_secs(0)) { + Ok(AuthState::Denied(msg)) => { + assert!(msg == BAD_CREDENTIALS); + } + _ => panic!(), + }; + audit.write_log(); + } + #[test] fn test_idm_authsession_missing_appid() { let anon_account = entry_str_to_account!(JSON_ANONYMOUS_V1); @@ -388,7 +460,10 @@ mod tests { #[test] fn test_idm_authsession_simple_password_mech() { - let mut audit = AuditScope::new("test_idm_authsession_simple_password_mech"); + let mut audit = AuditScope::new( + "test_idm_authsession_simple_password_mech", + uuid::Uuid::new_v4(), + ); // create the ent let mut account = entry_str_to_account!(JSON_ADMIN_V1); // manually load in a cred @@ -419,12 +494,15 @@ mod tests { _ => panic!(), }; - println!("{}", audit); + audit.write_log(); } #[test] fn test_idm_authsession_totp_password_mech() { - let mut audit = AuditScope::new("test_idm_authsession_totp_password_mech"); + let mut audit = AuditScope::new( + "test_idm_authsession_totp_password_mech", + uuid::Uuid::new_v4(), + ); // create the ent let mut account = entry_str_to_account!(JSON_ADMIN_V1); @@ -650,6 +728,6 @@ mod tests { }; } - println!("{}", audit); + audit.write_log(); } } diff --git a/kanidmd/src/lib/idm/macros.rs b/kanidmd/src/lib/idm/macros.rs index 5f9b7b814..7bbeb4f91 100644 --- a/kanidmd/src/lib/idm/macros.rs +++ b/kanidmd/src/lib/idm/macros.rs @@ -32,9 +32,13 @@ macro_rules! run_idm_test { use env_logger; ::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug"); - let _ = env_logger::builder().is_test(true).try_init(); + let _ = env_logger::builder() + .format_timestamp(None) + .format_level(false) + .is_test(true) + .try_init(); - let mut audit = AuditScope::new("run_test"); + let mut audit = AuditScope::new("run_test", uuid::Uuid::new_v4()); let be = Backend::new(&mut audit, "", 1).expect("Failed to init be"); let schema_outer = Schema::new(&mut audit).expect("Failed to init schema"); diff --git a/kanidmd/src/lib/idm/server.rs b/kanidmd/src/lib/idm/server.rs index cd392c4b0..217a1f164 100644 --- a/kanidmd/src/lib/idm/server.rs +++ b/kanidmd/src/lib/idm/server.rs @@ -136,97 +136,104 @@ impl<'a> IdmServerWriteTransaction<'a> { match &ae.step { AuthEventStep::Init(init) => { - // Allocate a session id, based on current time. - let sessionid = uuid_from_duration(ct, self.sid); + lperf_segment!(au, "idm::server::auth", || { + // Allocate a session id, based on current time. + let sessionid = uuid_from_duration(ct, self.sid); - // Begin the auth procedure! - // Start a read - // - // Actually we may not need this - at the time we issue the auth-init - // we could generate the uat, the nonce and cache hashes in memory, - // then this can just be fully without a txn. - // - // We do need a txn so that we can process/search and claims - // or related based on the quality of the provided auth steps - // - // We *DO NOT* need a write though, because I think that lock outs - // and rate limits are *per server* and *in memory* only. - // - // Check anything needed? Get the current auth-session-id from request - // because it associates to the nonce's etc which were all cached. + // Begin the auth procedure! + // Start a read + // + // Actually we may not need this - at the time we issue the auth-init + // we could generate the uat, the nonce and cache hashes in memory, + // then this can just be fully without a txn. + // + // We do need a txn so that we can process/search and claims + // or related based on the quality of the provided auth steps + // + // We *DO NOT* need a write though, because I think that lock outs + // and rate limits are *per server* and *in memory* only. + // + // Check anything needed? Get the current auth-session-id from request + // because it associates to the nonce's etc which were all cached. - let filter_entry = filter!(f_or!([ - f_eq("name", PartialValue::new_iutf8s(init.name.as_str())), - // This currently says invalid syntax, which is correct, but also - // annoying because it would be nice to search both ... - // f_eq("uuid", name.as_str()), - ])); + let filter_entry = filter!(f_or!([ + f_eq("name", PartialValue::new_iutf8s(init.name.as_str())), + // This currently says invalid syntax, which is correct, but also + // annoying because it would be nice to search both ... + // f_eq("uuid", name.as_str()), + ])); - // Get the first / single entry we expect here .... - let entry = match self.qs_read.internal_search(au, filter_entry) { - Ok(mut entries) => { - // Get only one entry out ... - if entries.len() >= 2 { - return Err(OperationError::InvalidDBState); + // Get the first / single entry we expect here .... + let entry = match self.qs_read.internal_search(au, filter_entry) { + Ok(mut entries) => { + // Get only one entry out ... + if entries.len() >= 2 { + return Err(OperationError::InvalidDBState); + } + entries.pop().ok_or(OperationError::NoMatchingEntries)? } - entries.pop().ok_or(OperationError::NoMatchingEntries)? - } - Err(e) => { - // Something went wrong! Abort! - return Err(e); - } - }; + Err(e) => { + // Something went wrong! Abort! + return Err(e); + } + }; - lsecurity!(au, "Initiating Authentication Session for ... {:?}", entry); + lsecurity!(au, "Initiating Authentication Session for ... {:?}", entry); - // Now, convert the Entry to an account - this gives us some stronger - // typing and functionality so we can assess what auth types can - // continue, and helps to keep non-needed entry specific data - // out of the LRU. - let account = Account::try_from_entry_ro(au, entry, &mut self.qs_read)?; - let auth_session = AuthSession::new(account, init.appid.clone()); + // Now, convert the Entry to an account - this gives us some stronger + // typing and functionality so we can assess what auth types can + // continue, and helps to keep non-needed entry specific data + // out of the LRU. + let account = Account::try_from_entry_ro(au, entry, &mut self.qs_read)?; + let auth_session = AuthSession::new(account, init.appid.clone()); - // Get the set of mechanisms that can proceed. This is tied - // to the session so that it can mutate state and have progression - // of what's next, or ordering. - let next_mech = auth_session.valid_auth_mechs(); + // Get the set of mechanisms that can proceed. This is tied + // to the session so that it can mutate state and have progression + // of what's next, or ordering. + let next_mech = auth_session.valid_auth_mechs(); - // If we have a session of the same id, return an error (despite how - // unlikely this is ... - if self.sessions.contains_key(&sessionid) { - return Err(OperationError::InvalidSessionState); - } - self.sessions.insert(sessionid, auth_session); + // If we have a session of the same id, return an error (despite how + // unlikely this is ... + lperf_segment!(au, "idm::server::auth -> sessions", || { + if self.sessions.contains_key(&sessionid) { + Err(OperationError::InvalidSessionState) + } else { + self.sessions.insert(sessionid, auth_session); + // Debugging: ensure we really inserted ... + debug_assert!(self.sessions.get(&sessionid).is_some()); + Ok(()) + } + })?; - // Debugging: ensure we really inserted ... - debug_assert!(self.sessions.get(&sessionid).is_some()); - - Ok(AuthResult { - sessionid, - state: AuthState::Continue(next_mech), + Ok(AuthResult { + sessionid, + state: AuthState::Continue(next_mech), + }) }) } AuthEventStep::Creds(creds) => { - // Do we have a session? - let auth_session = try_audit!( - au, - self.sessions - // Why is the session missing? - .get_mut(&creds.sessionid) - .ok_or(OperationError::InvalidSessionState) - ); - // Process the credentials here as required. - // Basically throw them at the auth_session and see what - // falls out. - auth_session - .validate_creds(au, &creds.creds, &ct) - .map(|aus| { - AuthResult { - // Is this right? - sessionid: creds.sessionid, - state: aus, - } - }) + lperf_segment!(au, "idm::server::auth", || { + // Do we have a session? + let auth_session = try_audit!( + au, + self.sessions + // Why is the session missing? + .get_mut(&creds.sessionid) + .ok_or(OperationError::InvalidSessionState) + ); + // Process the credentials here as required. + // Basically throw them at the auth_session and see what + // falls out. + auth_session + .validate_creds(au, &creds.creds, &ct) + .map(|aus| { + AuthResult { + // Is this right? + sessionid: creds.sessionid, + state: aus, + } + }) + }) } } } @@ -252,9 +259,11 @@ impl<'a> IdmServerWriteTransaction<'a> { account.verify_unix_credential(au, uae.cleartext.as_str()) } - pub fn commit(self) -> Result<(), OperationError> { - self.sessions.commit(); - Ok(()) + pub fn commit(self, au: &mut AuditScope) -> Result<(), OperationError> { + lperf_segment!(au, "idm::server::IdmServerWriteTransaction::commit", || { + self.sessions.commit(); + Ok(()) + }) } } @@ -421,10 +430,11 @@ impl<'a> IdmServerProxyWriteTransaction<'a> { account.spn.as_str(), ]; - try_audit!( - au, - self.check_password_quality(au, pce.cleartext.as_str(), related_inputs.as_slice()) - ); + self.check_password_quality(au, pce.cleartext.as_str(), related_inputs.as_slice()) + .map_err(|e| { + lrequest_error!(au, "check_password_quality -> {:?}", e); + e + })?; // it returns a modify let modlist = try_audit!( @@ -667,8 +677,10 @@ impl<'a> IdmServerProxyWriteTransaction<'a> { } pub fn commit(self, au: &mut AuditScope) -> Result<(), OperationError> { - self.mfareg_sessions.commit(); - self.qs_write.commit(au) + lperf_segment!(au, "idm::server::IdmServerWriteTransaction::commit", || { + self.mfareg_sessions.commit(); + self.qs_write.commit(au) + }) } } @@ -746,9 +758,9 @@ mod tests { } }; - println!("sessionid is ==> {:?}", sid); + debug!("sessionid is ==> {:?}", sid); - idms_write.commit().expect("Must not fail"); + idms_write.commit(au).expect("Must not fail"); sid }; @@ -759,7 +771,7 @@ mod tests { // Expect success let r2 = idms_write.auth(au, &anon_step, Duration::from_secs(TEST_CURRENT_TIME)); - println!("r2 ==> {:?}", r2); + debug!("r2 ==> {:?}", r2); match r2 { Ok(ar) => { @@ -786,7 +798,7 @@ mod tests { } }; - idms_write.commit().expect("Must not fail"); + idms_write.commit(au).expect("Must not fail"); } }); } @@ -802,7 +814,7 @@ mod tests { // Expect failure let r2 = idms_write.auth(au, &anon_step, Duration::from_secs(TEST_CURRENT_TIME)); - println!("r2 ==> {:?}", r2); + debug!("r2 ==> {:?}", r2); match r2 { Ok(_) => { @@ -859,7 +871,7 @@ mod tests { } }; - idms_write.commit().expect("Must not fail"); + idms_write.commit(au).expect("Must not fail"); sessionid } @@ -875,7 +887,7 @@ mod tests { // Expect success let r2 = idms_write.auth(au, &anon_step, Duration::from_secs(TEST_CURRENT_TIME)); - println!("r2 ==> {:?}", r2); + debug!("r2 ==> {:?}", r2); match r2 { Ok(ar) => { @@ -900,7 +912,7 @@ mod tests { } }; - idms_write.commit().expect("Must not fail"); + idms_write.commit(au).expect("Must not fail"); }) } @@ -914,7 +926,7 @@ mod tests { // Expect success let r2 = idms_write.auth(au, &anon_step, Duration::from_secs(TEST_CURRENT_TIME)); - println!("r2 ==> {:?}", r2); + debug!("r2 ==> {:?}", r2); match r2 { Ok(ar) => { @@ -939,7 +951,7 @@ mod tests { } }; - idms_write.commit().expect("Must not fail"); + idms_write.commit(au).expect("Must not fail"); }) } @@ -979,7 +991,7 @@ mod tests { // Expire as though we are in the future. idms_write.expire_auth_sessions(Duration::from_secs(TEST_CURRENT_EXPIRE)); assert!(!idms_write.is_sessionid_present(&sid)); - assert!(idms_write.commit().is_ok()); + assert!(idms_write.commit(au).is_ok()); let idms_write = idms.write(); assert!(!idms_write.is_sessionid_present(&sid)); }) @@ -1167,7 +1179,7 @@ mod tests { Ok(None) => {} _ => assert!(false), }; - assert!(idms_write.commit().is_ok()); + assert!(idms_write.commit(au).is_ok()); // Check deleting the password let mut idms_prox_write = idms.proxy_write(duration_from_epoch_now()); @@ -1187,7 +1199,7 @@ mod tests { Ok(None) => {} _ => assert!(false), }; - assert!(idms_write.commit().is_ok()); + assert!(idms_write.commit(au).is_ok()); }) } diff --git a/kanidmd/src/lib/lib.rs b/kanidmd/src/lib/lib.rs index 2d2aaefa0..aba3d71ec 100644 --- a/kanidmd/src/lib/lib.rs +++ b/kanidmd/src/lib/lib.rs @@ -1,4 +1,4 @@ -// #![deny(warnings)] +#![deny(warnings)] #![warn(unused_extern_crates)] #[macro_use] diff --git a/kanidmd/src/lib/macros.rs b/kanidmd/src/lib/macros.rs index e920fb970..b3b3e6b7a 100644 --- a/kanidmd/src/lib/macros.rs +++ b/kanidmd/src/lib/macros.rs @@ -9,14 +9,18 @@ macro_rules! run_test { use env_logger; ::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug"); - let _ = env_logger::builder().is_test(true).try_init(); + let _ = env_logger::builder() + .format_timestamp(None) + .format_level(false) + .is_test(true) + .try_init(); - let mut audit = AuditScope::new("run_test"); + let mut audit = AuditScope::new("run_test", uuid::Uuid::new_v4()); let be = match Backend::new(&mut audit, "", 1) { Ok(be) => be, Err(e) => { - debug!("{}", audit); + audit.write_log(); error!("{:?}", e); panic!() } diff --git a/kanidmd/src/lib/modify.rs b/kanidmd/src/lib/modify.rs index e636ff104..6a30422b6 100644 --- a/kanidmd/src/lib/modify.rs +++ b/kanidmd/src/lib/modify.rs @@ -143,7 +143,7 @@ impl ModifyList { Some(schema_a) => schema_a .validate_value(&value) .map(|_| Modify::Present(attr_norm, value.clone())), - None => Err(SchemaError::InvalidAttribute), + None => Err(SchemaError::InvalidAttribute(attr_norm)), } } Modify::Removed(attr, value) => { @@ -152,14 +152,14 @@ impl ModifyList { Some(schema_a) => schema_a .validate_partialvalue(&value) .map(|_| Modify::Removed(attr_norm, value.clone())), - None => Err(SchemaError::InvalidAttribute), + None => Err(SchemaError::InvalidAttribute(attr_norm)), } } Modify::Purged(attr) => { let attr_norm = schema.normalise_attr_name(attr); match schema_attributes.get(&attr_norm) { Some(_attr_name) => Ok(Modify::Purged(attr_norm)), - None => Err(SchemaError::InvalidAttribute), + None => Err(SchemaError::InvalidAttribute(attr_norm)), } } }) diff --git a/kanidmd/src/lib/plugins/attrunique.rs b/kanidmd/src/lib/plugins/attrunique.rs index c333ceb4b..3b2faa00b 100644 --- a/kanidmd/src/lib/plugins/attrunique.rs +++ b/kanidmd/src/lib/plugins/attrunique.rs @@ -76,13 +76,13 @@ fn enforce_unique( cand: &[Entry], attr: &str, ) -> Result<(), OperationError> { - debug!("{:?}", attr); + ltrace!(au, "{:?}", attr); // Build a set of all the value -> uuid for the cands. // If already exist, reject due to dup. let cand_attr = try_audit!(au, get_cand_attr_set(au, cand, attr)); - debug!("{:?}", cand_attr); + ltrace!(au, "{:?}", cand_attr); // No candidates to check! if cand_attr.is_empty() { @@ -104,7 +104,7 @@ fn enforce_unique( .collect() )); - debug!("{:?}", filt_in); + ltrace!(au, "{:?}", filt_in); // If any results, reject. let conflict_cand = try_audit!(au, qs.internal_exists(au, filt_in)); @@ -193,7 +193,7 @@ impl Plugin for AttrUnique { } } - debug!("{:?}", res); + ltrace!(au, "{:?}", res); res } diff --git a/kanidmd/src/lib/plugins/base.rs b/kanidmd/src/lib/plugins/base.rs index 9a5ec0a55..53987574a 100644 --- a/kanidmd/src/lib/plugins/base.rs +++ b/kanidmd/src/lib/plugins/base.rs @@ -290,10 +290,10 @@ mod tests { "description": ["Builtin IDM Administrators Access Controls."], "acp_enable": ["true"], "acp_receiver": [ - "{\"Eq\":[\"uuid\",\"00000000-0000-0000-0000-000000000000\"]}" + "{\"eq\":[\"uuid\",\"00000000-0000-0000-0000-000000000000\"]}" ], "acp_targetscope": [ - "{\"Pres\":\"class\"}" + "{\"pres\":\"class\"}" ], "acp_search_attr": ["name", "class", "uuid"], "acp_modify_class": ["system"], diff --git a/kanidmd/src/lib/plugins/macros.rs b/kanidmd/src/lib/plugins/macros.rs index 26e3a4d90..b8841fd01 100644 --- a/kanidmd/src/lib/plugins/macros.rs +++ b/kanidmd/src/lib/plugins/macros.rs @@ -7,7 +7,11 @@ macro_rules! setup_test { use crate::utils::duration_from_epoch_now; use env_logger; ::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug"); - let _ = env_logger::builder().is_test(true).try_init(); + let _ = env_logger::builder() + .format_timestamp(None) + .format_level(false) + .is_test(true) + .try_init(); // Create an in memory BE let be = Backend::new($au, "", 1).expect("Failed to init BE"); @@ -46,7 +50,7 @@ macro_rules! run_create_test { use crate::server::QueryServer; use crate::utils::duration_from_epoch_now; - let mut au = AuditScope::new("run_create_test"); + let mut au = AuditScope::new("run_create_test", uuid::Uuid::new_v4()); lperf_segment!(&mut au, "plugins::macros::run_create_test", || { let qs = setup_test!(&mut au, $preload_entries); @@ -60,7 +64,7 @@ macro_rules! run_create_test { { let mut qs_write = qs.write(duration_from_epoch_now()); let r = qs_write.create(&mut au, &ce); - debug!("r: {:?}", r); + debug!("test result: {:?}", r); assert!(r == $expect); $check(&mut au, &mut qs_write); match r { @@ -79,7 +83,7 @@ macro_rules! run_create_test { assert!(ver.len() == 0); }); // Dump the raw audit log. - println!("{}", au); + au.write_log(); }}; } @@ -101,7 +105,7 @@ macro_rules! run_modify_test { use crate::server::QueryServer; use crate::utils::duration_from_epoch_now; - let mut au = AuditScope::new("run_modify_test"); + let mut au = AuditScope::new("run_modify_test", uuid::Uuid::new_v4()); lperf_segment!(&mut au, "plugins::macros::run_modify_test", || { let qs = setup_test!(&mut au, $preload_entries); @@ -124,7 +128,7 @@ macro_rules! run_modify_test { "plugins::macros::run_modify_test -> post_test check", || { $check(&mut au, &mut qs_write) } ); - debug!("{:?}", r); + debug!("test result: {:?}", r); assert!(r == $expect); match r { Ok(_) => { @@ -142,7 +146,7 @@ macro_rules! run_modify_test { assert!(ver.len() == 0); }); // Dump the raw audit log. - println!("{}", au); + au.write_log(); }}; } @@ -163,7 +167,7 @@ macro_rules! run_delete_test { use crate::server::QueryServer; use crate::utils::duration_from_epoch_now; - let mut au = AuditScope::new("run_delete_test"); + let mut au = AuditScope::new("run_delete_test", uuid::Uuid::new_v4()); lperf_segment!(&mut au, "plugins::macros::run_delete_test", || { let qs = setup_test!(&mut au, $preload_entries); @@ -177,6 +181,7 @@ macro_rules! run_delete_test { { let mut qs_write = qs.write(duration_from_epoch_now()); let r = qs_write.delete(&mut au, &de); + debug!("test result: {:?}", r); $check(&mut au, &mut qs_write); assert!(r == $expect); match r { @@ -195,6 +200,6 @@ macro_rules! run_delete_test { assert!(ver.len() == 0); }); // Dump the raw audit log. - println!("{}", au); + au.write_log(); }}; } diff --git a/kanidmd/src/lib/plugins/memberof.rs b/kanidmd/src/lib/plugins/memberof.rs index 528011c7f..a49e1106d 100644 --- a/kanidmd/src/lib/plugins/memberof.rs +++ b/kanidmd/src/lib/plugins/memberof.rs @@ -457,7 +457,7 @@ mod tests { let cands = $qs .internal_search($au, filt) .expect("Internal search failure"); - println!("{:?}", cands); + debug!("assert_mo_cands {:?}", cands); assert!(cands.len() == $cand); }}; } @@ -1307,7 +1307,6 @@ mod tests { #[test] fn test_delete_mo_simple() { - debug!("TEST START"); // X -> B let mut ea: Entry = Entry::unsafe_from_entry_str(EA); diff --git a/kanidmd/src/lib/plugins/protected.rs b/kanidmd/src/lib/plugins/protected.rs index 08c5cefee..a3a270fc6 100644 --- a/kanidmd/src/lib/plugins/protected.rs +++ b/kanidmd/src/lib/plugins/protected.rs @@ -230,10 +230,10 @@ mod tests { "description": ["Builtin IDM Administrators Access Controls for TESTING."], "acp_enable": ["true"], "acp_receiver": [ - "{\"Eq\":[\"uuid\",\"00000000-0000-0000-0000-000000000000\"]}" + "{\"eq\":[\"uuid\",\"00000000-0000-0000-0000-000000000000\"]}" ], "acp_targetscope": [ - "{\"Pres\":\"class\"}" + "{\"pres\":\"class\"}" ], "acp_search_attr": ["name", "class", "uuid", "classname", "attributename"], "acp_modify_class": ["system", "domain_info"], diff --git a/kanidmd/src/lib/schema.rs b/kanidmd/src/lib/schema.rs index d10fa7dbc..143a9b835 100644 --- a/kanidmd/src/lib/schema.rs +++ b/kanidmd/src/lib/schema.rs @@ -219,10 +219,10 @@ impl SchemaAttribute { } pub fn validate_ava(&self, ava: &BTreeSet) -> Result<(), SchemaError> { - debug!("Checking for valid {:?} -> {:?}", self.name, ava); + // ltrace!("Checking for valid {:?} -> {:?}", self.name, ava); // Check multivalue if !self.multivalue && ava.len() > 1 { - debug!("Ava len > 1 on single value attribute!"); + // lrequest_error!("Ava len > 1 on single value attribute!"); return Err(SchemaError::InvalidAttributeSyntax); }; // If syntax, check the type is correct @@ -496,8 +496,8 @@ pub trait SchemaTransaction { match self.get_attributes().get(attr) { Some(a_schema) => Ok(a_schema.multivalue), None => { - debug!("Attribute does not exist?!"); - Err(SchemaError::InvalidAttribute) + // ladmin_error!("Attribute does not exist?!"); + Err(SchemaError::InvalidAttribute(attr.to_string())) } } } @@ -1828,18 +1828,18 @@ mod tests { #[test] fn test_schema_simple() { - let mut audit = AuditScope::new("test_schema_simple"); + let mut audit = AuditScope::new("test_schema_simple", uuid::Uuid::new_v4()); let schema = Schema::new(&mut audit).expect("failed to create schema"); let schema_ro = schema.read(); validate_schema!(schema_ro, &mut audit); - println!("{}", audit); + audit.write_log(); } #[test] fn test_schema_entries() { // Given an entry, assert it's schema is valid // We do - let mut audit = AuditScope::new("test_schema_entries"); + let mut audit = AuditScope::new("test_schema_entries", uuid::Uuid::new_v4()); let schema_outer = Schema::new(&mut audit).expect("failed to create schema"); let schema = schema_outer.read(); let e_no_uuid: Entry = unsafe { @@ -1853,7 +1853,7 @@ mod tests { assert_eq!( e_no_uuid.validate(&schema), - Err(SchemaError::MissingMustAttribute("uuid".to_string())) + Err(SchemaError::MissingMustAttribute(vec!["uuid".to_string()])) ); let e_no_class: Entry = unsafe { @@ -1867,7 +1867,7 @@ mod tests { .into_invalid_new() }; - assert_eq!(e_no_class.validate(&schema), Err(SchemaError::InvalidClass)); + assert_eq!(e_no_class.validate(&schema), Err(SchemaError::NoClassFound)); let e_bad_class: Entry = unsafe { Entry::unsafe_from_entry_str( @@ -1882,7 +1882,7 @@ mod tests { }; assert_eq!( e_bad_class.validate(&schema), - Err(SchemaError::InvalidClass) + Err(SchemaError::InvalidClass(vec!["zzzzzz".to_string()])) ); let e_attr_invalid: Entry = unsafe { @@ -1923,7 +1923,7 @@ mod tests { assert_eq!( e_attr_invalid_may.validate(&schema), - Err(SchemaError::InvalidAttribute) + Err(SchemaError::InvalidAttribute("zzzzz".to_string())) ); let e_attr_invalid_syn: Entry = unsafe { @@ -1985,13 +1985,13 @@ mod tests { .into_invalid_new() }; assert!(e_ok.validate(&schema).is_ok()); - println!("{}", audit); + audit.write_log(); } #[test] fn test_schema_entry_validate() { // Check that entries can be normalised and validated sanely - let mut audit = AuditScope::new("test_schema_entry_validate"); + let mut audit = AuditScope::new("test_schema_entry_validate", uuid::Uuid::new_v4()); let schema_outer = Schema::new(&mut audit).expect("failed to create schema"); let schema = schema_outer.write(); @@ -2032,12 +2032,12 @@ mod tests { let e_valid = e_test.validate(&schema).expect("validation failure"); assert_eq!(e_expect, e_valid); - println!("{}", audit); + audit.write_log(); } #[test] fn test_schema_extensible() { - let mut audit = AuditScope::new("test_schema_extensible"); + let mut audit = AuditScope::new("test_schema_extensible", uuid::Uuid::new_v4()); let schema_outer = Schema::new(&mut audit).expect("failed to create schema"); let schema = schema_outer.read(); // Just because you are extensible, doesn't mean you can be lazy @@ -2076,7 +2076,7 @@ mod tests { assert_eq!( e_extensible_phantom.validate(&schema), - Err(SchemaError::PhantomAttribute) + Err(SchemaError::PhantomAttribute("password_import".to_string())) ); let e_extensible: Entry = unsafe { @@ -2094,19 +2094,19 @@ mod tests { /* Is okay because extensible! */ assert!(e_extensible.validate(&schema).is_ok()); - println!("{}", audit); + audit.write_log(); } #[test] fn test_schema_filter_validation() { - let mut audit = AuditScope::new("test_schema_filter_validation"); + let mut audit = AuditScope::new("test_schema_filter_validation", uuid::Uuid::new_v4()); let schema_outer = Schema::new(&mut audit).expect("failed to create schema"); let schema = schema_outer.read(); // Test non existant attr name let f_mixed = filter_all!(f_eq("nonClAsS", PartialValue::new_class("attributetype"))); assert_eq!( f_mixed.validate(&schema), - Err(SchemaError::InvalidAttribute) + Err(SchemaError::InvalidAttribute("nonclass".to_string())) ); // test syntax of bool @@ -2156,13 +2156,13 @@ mod tests { ]))) }) ); - println!("{}", audit); + audit.write_log(); } #[test] fn test_schema_class_phantom_reject() { // Check that entries can be normalised and validated sanely - let mut audit = AuditScope::new("test_schema_class_phantom_reject"); + let mut audit = AuditScope::new("test_schema_class_phantom_reject", uuid::Uuid::new_v4()); let schema_outer = Schema::new(&mut audit).expect("failed to create schema"); let mut schema = schema_outer.write(); @@ -2183,6 +2183,6 @@ mod tests { assert!(schema.validate(&mut audit).len() == 1); - println!("{}", audit); + audit.write_log(); } } diff --git a/kanidmd/src/lib/server.rs b/kanidmd/src/lib/server.rs index 1b530bdac..a45a5079f 100644 --- a/kanidmd/src/lib/server.rs +++ b/kanidmd/src/lib/server.rs @@ -2099,7 +2099,7 @@ mod tests { assert!(cr.is_ok()); let r2 = server_txn.search(audit, &se2).expect("search failure"); - println!("--> {:?}", r2); + debug!("--> {:?}", r2); assert!(r2.len() == 1); let expected = unsafe { vec![e.into_sealed_committed()] }; @@ -2214,7 +2214,7 @@ mod tests { assert!( r_inv_1 == Err(OperationError::SchemaViolation( - SchemaError::InvalidAttribute + SchemaError::InvalidAttribute("tnanuanou".to_string()) )) ); @@ -2231,7 +2231,7 @@ mod tests { assert!( server_txn.modify(audit, &me_inv_m) == Err(OperationError::SchemaViolation( - SchemaError::InvalidAttribute + SchemaError::InvalidAttribute("htnaonu".to_string()) )) ); @@ -2835,7 +2835,7 @@ mod tests { &"cc8e95b4-c24f-4d68-ba54-8bed76f63930".to_string(), ); - println!("{:?}", r4); + debug!("{:?}", r4); assert!(r4 == Ok(Value::new_refer_s("cc8e95b4-c24f-4d68-ba54-8bed76f63930").unwrap())); }) } @@ -3336,11 +3336,11 @@ mod tests { let schema = server_txn.get_schema(); for k in schema.get_attributes().keys() { - println!("{}", k); + debug!("{}", k); } - println!("===="); + debug!("===="); for k in schema.get_classes().keys() { - println!("{}", k); + debug!("{}", k); } }) diff --git a/kanidmd/src/lib/status.rs b/kanidmd/src/lib/status.rs index 285e1ee99..157886d47 100644 --- a/kanidmd/src/lib/status.rs +++ b/kanidmd/src/lib/status.rs @@ -1,14 +1,16 @@ -use crate::async_log::{EventLog, LogEvent}; +use crate::audit::AuditScope; use actix::prelude::*; +use crossbeam::channel::Sender; +use uuid::Uuid; pub struct StatusActor { - log_addr: actix::Addr, + log_tx: Sender>, } impl StatusActor { - pub fn start(log_addr: actix::Addr) -> actix::Addr { + pub fn start(log_tx: Sender>) -> actix::Addr { SyncArbiter::start(1, move || StatusActor { - log_addr: log_addr.clone(), + log_tx: log_tx.clone(), }) } } @@ -17,7 +19,9 @@ impl Actor for StatusActor { type Context = SyncContext; } -pub struct StatusRequestEvent {} +pub struct StatusRequestEvent { + pub eventid: Uuid, +} impl Message for StatusRequestEvent { type Result = bool; @@ -26,9 +30,11 @@ impl Message for StatusRequestEvent { impl Handler for StatusActor { type Result = bool; - fn handle(&mut self, _event: StatusRequestEvent, _ctx: &mut SyncContext) -> Self::Result { - self.log_addr.do_send(LogEvent { - msg: "status request event: ok".to_string(), + fn handle(&mut self, event: StatusRequestEvent, _ctx: &mut SyncContext) -> Self::Result { + let mut audit = AuditScope::new("status_handler", event.eventid.clone()); + ladmin_info!(&mut audit, "status handler"); + self.log_tx.send(Some(audit)).unwrap_or_else(|_| { + error!("CRITICAL: UNABLE TO COMMIT LOGS"); }); true } diff --git a/kanidmd/src/server/main.rs b/kanidmd/src/server/main.rs index 9aefa49d2..2eb427c51 100644 --- a/kanidmd/src/server/main.rs +++ b/kanidmd/src/server/main.rs @@ -98,7 +98,8 @@ impl Opt { } } -fn main() { +#[actix_rt::main] +async fn main() { // Read cli args, determine if we should backup/restore let opt = Opt::from_args(); @@ -113,7 +114,11 @@ fn main() { } else { ::std::env::set_var("RUST_LOG", "actix_web=info,kanidm=info"); } - env_logger::init(); + + env_logger::builder() + .format_timestamp(None) + .format_level(false) + .init(); match opt { Opt::Server(sopt) => { @@ -123,9 +128,19 @@ fn main() { config.update_tls(&sopt.ca_path, &sopt.cert_path, &sopt.key_path); config.update_bind(&sopt.bind); - let sys = actix::System::new("kanidm-server"); - create_server_core(config); - let _ = sys.run(); + let _sys = actix::System::new("kanidm-server"); + let sctx = create_server_core(config); + match sctx { + Ok(sctx) => { + tokio::signal::ctrl_c().await.unwrap(); + println!("Ctrl-C received, shutting down"); + sctx.stop() + } + Err(_) => { + error!("Failed to start server core!"); + return; + } + } } Opt::Backup(bopt) => { info!("Running in backup mode ...");