From 2bb2c80768aa640c5cb33b289598179d946d2ff4 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Wed, 2 Feb 2022 00:55:56 +0800 Subject: [PATCH 1/4] v1.1.0 add dns challenge support --- Cargo.lock | 1149 ++++++++++++++++++++++++++++++++++++++++++++++----- Cargo.toml | 3 +- src/main.rs | 45 +- 3 files changed, 1089 insertions(+), 108 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58a85f5..362b5da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,16 +4,17 @@ version = 3 [[package]] name = "acme-client" -version = "1.0.3" +version = "1.1.0" dependencies = [ "acme-lib", + "aliyun-openapi-core-rust-sdk", "async-std", "base64 0.11.0", "clap", "deser-hjson", "hmac 0.7.1", "lazy_static", - "reqwest", + "reqwest 0.11.4", "rust_util", "serde", "serde_json", @@ -41,6 +42,21 @@ dependencies = [ "ureq", ] +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aead" version = "0.3.2" @@ -95,13 +111,27 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "aliyun-openapi-core-rust-sdk" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "026a486f1627edeb04226aa2113ff0b3cbc557fffa70272b1712f70ab156fd3b" +dependencies = [ + "base64 0.10.1", + "chrono", + "failure", + "reqwest 0.9.24", + "rust-crypto", + "url 2.2.2", +] + [[package]] name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -217,7 +247,7 @@ dependencies = [ "slab", "socket2 0.4.1", "waker-fn", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -252,7 +282,7 @@ dependencies = [ "libc", "once_cell", "signal-hook", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -302,7 +332,7 @@ dependencies = [ "async-io", "async-lock", "async-process", - "crossbeam-utils", + "crossbeam-utils 0.8.5", "futures-channel", "futures-core", "futures-io", @@ -350,21 +380,51 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", - "winapi", + "winapi 0.3.9", ] +[[package]] +name = "autocfg" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" + [[package]] name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "backtrace" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base-x" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" +[[package]] +name = "base64" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" +dependencies = [ + "byteorder", +] + [[package]] name = "base64" version = "0.11.0" @@ -481,7 +541,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c7230ddbb427b1094d477d821a99f3f54d36333178eeb806e279bcdcecf0ca" dependencies = [ - "crossbeam-queue", + "crossbeam-queue 0.3.2", "stable_deref_trait", ] @@ -497,6 +557,17 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +dependencies = [ + "byteorder", + "either", + "iovec", +] + [[package]] name = "bytes" version = "1.1.0" @@ -538,7 +609,7 @@ dependencies = [ "num-traits", "serde", "time 0.1.43", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -571,6 +642,15 @@ dependencies = [ "vec_map", ] +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -592,6 +672,16 @@ 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", + "url 1.7.2", +] + [[package]] name = "cookie" version = "0.14.4" @@ -602,27 +692,45 @@ dependencies = [ "base64 0.13.0", "hkdf", "hmac 0.10.1", - "percent-encoding", + "percent-encoding 2.1.0", "rand 0.8.4", "sha2 0.9.6", "time 0.2.27", "version_check", ] +[[package]] +name = "cookie_store" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c" +dependencies = [ + "cookie 0.12.0", + "failure", + "idna 0.1.5", + "log", + "publicsuffix", + "serde", + "serde_json", + "time 0.1.43", + "try_from", + "url 1.7.2", +] + [[package]] name = "cookie_store" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3818dfca4b0cb5211a659bbcbb94225b7127407b2b135e650d717bfb78ab10d3" dependencies = [ - "cookie", - "idna", + "cookie 0.14.4", + "idna 0.2.3", "log", "publicsuffix", "serde", "serde_json", "time 0.2.27", - "url", + "url 2.2.2", ] [[package]] @@ -656,6 +764,52 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" +[[package]] +name = "crc32fast" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2209c310e29876f7f0b2721e7e26b84aff178aa3da5d091f9bfbf47669e60e3" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils 0.7.2", + "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.1", + "cfg-if 0.1.10", + "crossbeam-utils 0.7.2", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" +dependencies = [ + "cfg-if 0.1.10", + "crossbeam-utils 0.7.2", + "maybe-uninit", +] + [[package]] name = "crossbeam-queue" version = "0.3.2" @@ -663,7 +817,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b10ddc024425c88c2ad148c1b0fd53f4c6d38db9697c9f1588381212fa657c9" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils", + "crossbeam-utils 0.8.5", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg 1.0.1", + "cfg-if 0.1.10", + "lazy_static", ] [[package]] @@ -811,7 +976,7 @@ checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", "redox_users", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -820,6 +985,18 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + [[package]] name = "encoding_rs" version = "0.8.28" @@ -847,6 +1024,28 @@ version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "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", + "quote", + "syn", + "synstructure", +] + [[package]] name = "fake-simd" version = "0.1.2" @@ -878,6 +1077,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -906,15 +1117,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ "matches", - "percent-encoding", + "percent-encoding 2.1.0", ] +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "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 = "funty" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + [[package]] name = "futures-channel" version = "0.3.17" @@ -930,6 +1169,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" +[[package]] +name = "futures-cpupool" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" +dependencies = [ + "futures", + "num_cpus", +] + [[package]] name = "futures-io" version = "0.3.17" @@ -957,7 +1206,7 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" dependencies = [ - "autocfg", + "autocfg 1.0.1", "proc-macro-hack", "proc-macro2", "quote", @@ -982,7 +1231,7 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" dependencies = [ - "autocfg", + "autocfg 1.0.1", "futures-core", "futures-io", "futures-macro", @@ -995,6 +1244,12 @@ dependencies = [ "slab", ] +[[package]] +name = "gcc" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" + [[package]] name = "generic-array" version = "0.12.4" @@ -1046,6 +1301,12 @@ dependencies = [ "polyval", ] +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + [[package]] name = "gloo-timers" version = "0.2.1" @@ -1059,21 +1320,39 @@ dependencies = [ "web-sys", ] +[[package]] +name = "h2" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" +dependencies = [ + "byteorder", + "bytes 0.4.12", + "fnv", + "futures", + "http 0.1.21", + "indexmap", + "log", + "slab", + "string", + "tokio-io", +] + [[package]] name = "h2" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472" dependencies = [ - "bytes", + "bytes 1.1.0", "fnv", "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.4", "indexmap", "slab", - "tokio", + "tokio 1.11.0", "tokio-util", "tracing", ] @@ -1150,7 +1429,18 @@ checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ "libc", "match_cfg", - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "http" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" +dependencies = [ + "bytes 0.4.12", + "fnv", + "itoa", ] [[package]] @@ -1159,19 +1449,31 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ - "bytes", + "bytes 1.1.0", "fnv", "itoa", ] +[[package]] +name = "http-body" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" +dependencies = [ + "bytes 0.4.12", + "futures", + "http 0.1.21", + "tokio-buf", +] + [[package]] name = "http-body" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" dependencies = [ - "bytes", - "http", + "bytes 1.1.0", + "http 0.2.4", "pin-project-lite 0.2.7", ] @@ -1198,7 +1500,7 @@ dependencies = [ "async-channel", "async-std", "base64 0.13.0", - "cookie", + "cookie 0.14.4", "futures-lite", "infer", "pin-project-lite 0.2.7", @@ -1206,8 +1508,8 @@ dependencies = [ "serde", "serde_json", "serde_qs", - "serde_urlencoded", - "url", + "serde_urlencoded 0.7.0", + "url 2.2.2", ] [[package]] @@ -1222,28 +1524,71 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" +[[package]] +name = "hyper" +version = "0.12.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52" +dependencies = [ + "bytes 0.4.12", + "futures", + "futures-cpupool", + "h2 0.1.26", + "http 0.1.21", + "http-body 0.1.0", + "httparse", + "iovec", + "itoa", + "log", + "net2", + "rustc_version", + "time 0.1.43", + "tokio 0.1.22", + "tokio-buf", + "tokio-executor", + "tokio-io", + "tokio-reactor", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", + "want 0.2.0", +] + [[package]] name = "hyper" version = "0.14.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13f67199e765030fa08fe0bd581af683f0d5bc04ea09c2b1102012c5fb90e7fd" dependencies = [ - "bytes", + "bytes 1.1.0", "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.4", + "http 0.2.4", + "http-body 0.4.3", "httparse", "httpdate", "itoa", "pin-project-lite 0.2.7", "socket2 0.4.1", - "tokio", + "tokio 1.11.0", "tower-service", "tracing", - "want", + "want 0.3.0", +] + +[[package]] +name = "hyper-tls" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" +dependencies = [ + "bytes 0.4.12", + "futures", + "hyper 0.12.36", + "native-tls", + "tokio-io", ] [[package]] @@ -1252,13 +1597,24 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes", - "hyper", + "bytes 1.1.0", + "hyper 0.14.12", "native-tls", - "tokio", + "tokio 1.11.0", "tokio-native-tls", ] +[[package]] +name = "idna" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "0.2.3" @@ -1276,7 +1632,7 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ - "autocfg", + "autocfg 1.0.1", "hashbrown", ] @@ -1295,6 +1651,15 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + [[package]] name = "ipconfig" version = "0.2.2" @@ -1303,7 +1668,7 @@ checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" dependencies = [ "socket2 0.3.19", "widestring", - "winapi", + "winapi 0.3.9", "winreg 0.6.2", ] @@ -1328,6 +1693,16 @@ dependencies = [ "wasm-bindgen", ] +[[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", + "winapi-build", +] + [[package]] name = "kv-log-macro" version = "1.0.7" @@ -1368,6 +1743,15 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +[[package]] +name = "lock_api" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" +dependencies = [ + "scopeguard", +] + [[package]] name = "lock_api" version = "0.4.5" @@ -1408,18 +1792,72 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +[[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.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +[[package]] +name = "memoffset" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +dependencies = [ + "autocfg 1.0.1", +] + [[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", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg 1.0.1", +] + +[[package]] +name = "mio" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +dependencies = [ + "cfg-if 0.1.10", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow 0.2.2", + "net2", + "slab", + "winapi 0.2.8", +] + [[package]] name = "mio" version = "0.7.13" @@ -1428,9 +1866,21 @@ checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" dependencies = [ "libc", "log", - "miow", + "miow 0.3.7", "ntapi", - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "miow" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", ] [[package]] @@ -1439,7 +1889,7 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1460,6 +1910,17 @@ dependencies = [ "tempfile", ] +[[package]] +name = "net2" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + [[package]] name = "nom" version = "6.1.2" @@ -1479,7 +1940,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1488,7 +1949,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74e768dff5fb39a41b3bcd30bb25cf989706c90d028d1ad71971987aa309d535" dependencies = [ - "autocfg", + "autocfg 1.0.1", "num-integer", "num-traits", ] @@ -1499,7 +1960,7 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" dependencies = [ - "autocfg", + "autocfg 1.0.1", "num-traits", ] @@ -1509,7 +1970,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ - "autocfg", + "autocfg 1.0.1", ] [[package]] @@ -1522,6 +1983,15 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +dependencies = [ + "memchr", +] + [[package]] name = "oid-registry" version = "0.1.5" @@ -1575,7 +2045,7 @@ version = "0.9.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1996d2d305e561b70d1ee0c53f1542833f4e1ac6ce9a6708b6ff2738ca67dc82" dependencies = [ - "autocfg", + "autocfg 1.0.1", "cc", "libc", "pkg-config", @@ -1588,6 +2058,17 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +[[package]] +name = "parking_lot" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" +dependencies = [ + "lock_api 0.3.4", + "parking_lot_core 0.6.2", + "rustc_version", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -1595,8 +2076,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", - "lock_api", - "parking_lot_core", + "lock_api 0.4.5", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" +dependencies = [ + "cfg-if 0.1.10", + "cloudabi", + "libc", + "redox_syscall 0.1.57", + "rustc_version", + "smallvec 0.6.14", + "winapi 0.3.9", ] [[package]] @@ -1608,11 +2104,17 @@ dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall", - "smallvec", - "winapi", + "redox_syscall 0.2.10", + "smallvec 1.6.1", + "winapi 0.3.9", ] +[[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" @@ -1673,7 +2175,7 @@ dependencies = [ "libc", "log", "wepoll-ffi", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1720,8 +2222,8 @@ version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95b4ce31ff0a27d93c8de1849cf58162283752f065a90d508f1105fa6c9a213f" dependencies = [ - "idna", - "url", + "idna 0.2.3", + "url 2.2.2", ] [[package]] @@ -1730,7 +2232,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" dependencies = [ - "percent-encoding", + "percent-encoding 2.1.0", ] [[package]] @@ -1754,6 +2256,48 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" +[[package]] +name = "rand" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +dependencies = [ + "libc", + "rand 0.4.6", +] + +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi 0.3.9", +] + +[[package]] +name = "rand" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +dependencies = [ + "autocfg 0.1.7", + "libc", + "rand_chacha 0.1.1", + "rand_core 0.4.2", + "rand_hc 0.1.0", + "rand_isaac", + "rand_jitter", + "rand_os", + "rand_pcg", + "rand_xorshift", + "winapi 0.3.9", +] + [[package]] name = "rand" version = "0.7.3" @@ -1779,6 +2323,16 @@ dependencies = [ "rand_hc 0.3.1", ] +[[package]] +name = "rand_chacha" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.3.1", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -1799,6 +2353,21 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + [[package]] name = "rand_core" version = "0.5.1" @@ -1817,6 +2386,15 @@ dependencies = [ "getrandom 0.2.3", ] +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +dependencies = [ + "rand_core 0.3.1", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -1835,6 +2413,74 @@ dependencies = [ "rand_core 0.6.3", ] +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_jitter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +dependencies = [ + "libc", + "rand_core 0.4.2", + "winapi 0.3.9", +] + +[[package]] +name = "rand_os" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +dependencies = [ + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.4.2", + "rdrand", + "winapi 0.3.9", +] + +[[package]] +name = "rand_pcg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.4.2", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + [[package]] name = "redox_syscall" version = "0.2.10" @@ -1851,7 +2497,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ "getrandom 0.2.3", - "redox_syscall", + "redox_syscall 0.2.10", ] [[package]] @@ -1860,7 +2506,41 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "reqwest" +version = "0.9.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab" +dependencies = [ + "base64 0.10.1", + "bytes 0.4.12", + "cookie 0.12.0", + "cookie_store 0.7.0", + "encoding_rs", + "flate2", + "futures", + "http 0.1.21", + "hyper 0.12.36", + "hyper-tls 0.3.2", + "log", + "mime", + "mime_guess", + "native-tls", + "serde", + "serde_json", + "serde_urlencoded 0.5.5", + "time 0.1.43", + "tokio 0.1.22", + "tokio-executor", + "tokio-io", + "tokio-threadpool", + "tokio-timer", + "url 1.7.2", + "uuid", + "winreg 0.6.2", ] [[package]] @@ -1870,27 +2550,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" dependencies = [ "base64 0.13.0", - "bytes", + "bytes 1.1.0", "encoding_rs", "futures-core", "futures-util", - "http", - "http-body", - "hyper", - "hyper-tls", + "http 0.2.4", + "http-body 0.4.3", + "hyper 0.14.12", + "hyper-tls 0.5.0", "ipnet", "js-sys", "lazy_static", "log", "mime", "native-tls", - "percent-encoding", + "percent-encoding 2.1.0", "pin-project-lite 0.2.7", "serde", - "serde_urlencoded", - "tokio", + "serde_urlencoded 0.7.0", + "tokio 1.11.0", "tokio-native-tls", - "url", + "url 2.2.2", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1919,7 +2599,7 @@ dependencies = [ "spin", "untrusted", "web-sys", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1928,6 +2608,19 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56770675ebc04927ded3e60633437841581c285dc6236109ea25fbf3beb7b59e" +[[package]] +name = "rust-crypto" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" +dependencies = [ + "gcc", + "libc", + "rand 0.3.23", + "rustc-serialize", + "time 0.1.43", +] + [[package]] name = "rust_util" version = "0.6.41" @@ -1940,6 +2633,18 @@ dependencies = [ "term_size", ] +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "rustc-serialize" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" + [[package]] name = "rustc_version" version = "0.2.3" @@ -1990,7 +2695,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" dependencies = [ "lazy_static", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2084,11 +2789,23 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8a72808528a89fa9eca23bbb6a1eb92cb639b881357269b6510f11e50c0f8a9" dependencies = [ - "percent-encoding", + "percent-encoding 2.1.0", "serde", "thiserror", ] +[[package]] +name = "serde_urlencoded" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" +dependencies = [ + "dtoa", + "itoa", + "serde", + "url 1.7.2", +] + [[package]] name = "serde_urlencoded" version = "0.7.0" @@ -2176,6 +2893,15 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" +[[package]] +name = "smallvec" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" +dependencies = [ + "maybe-uninit", +] + [[package]] name = "smallvec" version = "1.6.1" @@ -2190,7 +2916,7 @@ checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" dependencies = [ "cfg-if 1.0.0", "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2200,7 +2926,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2279,6 +3005,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" +[[package]] +name = "string" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" +dependencies = [ + "bytes 0.4.12", +] + [[package]] name = "strsim" version = "0.8.0" @@ -2314,6 +3049,18 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + [[package]] name = "tap" version = "1.0.1" @@ -2329,9 +3076,9 @@ dependencies = [ "cfg-if 1.0.0", "libc", "rand 0.8.4", - "redox_syscall", + "redox_syscall 0.2.10", "remove_dir_all", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2342,7 +3089,7 @@ checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" dependencies = [ "dirs-next", "rustversion", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2352,7 +3099,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2414,7 +3161,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2429,7 +3176,7 @@ dependencies = [ "stdweb", "time-macros", "version_check", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2470,20 +3217,81 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +[[package]] +name = "tokio" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" +dependencies = [ + "bytes 0.4.12", + "futures", + "mio 0.6.23", + "num_cpus", + "tokio-current-thread", + "tokio-executor", + "tokio-io", + "tokio-reactor", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", +] + [[package]] name = "tokio" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4efe6fc2395938c8155973d7be49fe8d03a843726e285e100a8a383cc0154ce" dependencies = [ - "autocfg", - "bytes", + "autocfg 1.0.1", + "bytes 1.1.0", "libc", "memchr", - "mio", + "mio 0.7.13", "num_cpus", "pin-project-lite 0.2.7", - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "tokio-buf" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" +dependencies = [ + "bytes 0.4.12", + "either", + "futures", +] + +[[package]] +name = "tokio-current-thread" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" +dependencies = [ + "futures", + "tokio-executor", +] + +[[package]] +name = "tokio-executor" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" +dependencies = [ + "crossbeam-utils 0.7.2", + "futures", +] + +[[package]] +name = "tokio-io" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" +dependencies = [ + "bytes 0.4.12", + "futures", + "log", ] [[package]] @@ -2493,7 +3301,79 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" dependencies = [ "native-tls", - "tokio", + "tokio 1.11.0", +] + +[[package]] +name = "tokio-reactor" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" +dependencies = [ + "crossbeam-utils 0.7.2", + "futures", + "lazy_static", + "log", + "mio 0.6.23", + "num_cpus", + "parking_lot 0.9.0", + "slab", + "tokio-executor", + "tokio-io", + "tokio-sync", +] + +[[package]] +name = "tokio-sync" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" +dependencies = [ + "fnv", + "futures", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" +dependencies = [ + "bytes 0.4.12", + "futures", + "iovec", + "mio 0.6.23", + "tokio-io", + "tokio-reactor", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" +dependencies = [ + "crossbeam-deque", + "crossbeam-queue 0.2.3", + "crossbeam-utils 0.7.2", + "futures", + "lazy_static", + "log", + "num_cpus", + "slab", + "tokio-executor", +] + +[[package]] +name = "tokio-timer" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" +dependencies = [ + "crossbeam-utils 0.7.2", + "futures", + "slab", + "tokio-executor", ] [[package]] @@ -2502,12 +3382,12 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" dependencies = [ - "bytes", + "bytes 1.1.0", "futures-core", "futures-sink", "log", "pin-project-lite 0.2.7", - "tokio", + "tokio 1.11.0", ] [[package]] @@ -2549,16 +3429,16 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna", + "idna 0.2.3", "ipnet", "lazy_static", "log", "rand 0.8.4", - "smallvec", + "smallvec 1.6.1", "thiserror", "tinyvec", - "tokio", - "url", + "tokio 1.11.0", + "url 2.2.2", ] [[package]] @@ -2573,11 +3453,11 @@ dependencies = [ "lazy_static", "log", "lru-cache", - "parking_lot", + "parking_lot 0.11.2", "resolv-conf", - "smallvec", + "smallvec 1.6.1", "thiserror", - "tokio", + "tokio 1.11.0", "trust-dns-proto", ] @@ -2587,12 +3467,30 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "try_from" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b" +dependencies = [ + "cfg-if 0.1.10", +] + [[package]] name = "typenum" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.6" @@ -2650,17 +3548,28 @@ checksum = "2b8b063c2d59218ae09f22b53c42eaad0d53516457905f5235ca4bc9e99daa71" dependencies = [ "base64 0.13.0", "chunked_transfer", - "cookie", - "cookie_store", + "cookie 0.14.4", + "cookie_store 0.12.0", "log", "once_cell", "qstring", "rustls", - "url", + "url 2.2.2", "webpki", "webpki-roots", ] +[[package]] +name = "url" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +dependencies = [ + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", +] + [[package]] name = "url" version = "2.2.2" @@ -2668,9 +3577,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", - "idna", + "idna 0.2.3", "matches", - "percent-encoding", + "percent-encoding 2.1.0", "serde", ] @@ -2680,6 +3589,15 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a1f0175e03a0973cf4afd476bef05c26e228520400eb1fd473ad417b1c00ffb" +[[package]] +name = "uuid" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" +dependencies = [ + "rand 0.6.5", +] + [[package]] name = "value-bag" version = "1.0.0-alpha.7" @@ -2715,6 +3633,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +[[package]] +name = "want" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" +dependencies = [ + "futures", + "log", + "try-lock", +] + [[package]] name = "want" version = "0.3.0" @@ -2849,6 +3778,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" +[[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.9" @@ -2859,6 +3794,12 @@ dependencies = [ "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" @@ -2877,7 +3818,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2886,7 +3827,17 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" dependencies = [ - "winapi", + "winapi 0.3.9", +] + +[[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", + "winapi-build", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f078523..8665e1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "acme-client" -version = "1.0.3" +version = "1.1.0" authors = ["Hatter Jiang "] edition = "2018" description = "Acme auto challenge client, acme-client can issue certificates from Let's encrypt" @@ -25,6 +25,7 @@ urlencoding = "1.0.0" base64 = "0.11.0" hmac = "0.7.1" sha2 = "0.8.1" +aliyun-openapi-core-rust-sdk = "0.3.0" [profile.release] codegen-units = 1 diff --git a/src/main.rs b/src/main.rs index 2d27b5a..7f0441c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,6 +31,7 @@ use crate::config::{CertConfig, CERT_NAME, KEY_NAME}; use crate::x509::{X509PublicKeyAlgo, X509EcPublicKeyAlgo}; use std::path::PathBuf; use rust_util::util_cmd::run_command_and_wait; +use crate::AcmeChallenge::Http; use crate::dingtalk::send_dingtalk_message; use crate::network::{get_local_public_ip, get_resolver, resolve_first_ipv4}; use crate::statics::{AcmeStatics, AcmeStatus}; @@ -44,8 +45,21 @@ lazy_static! { static ref TOKEN_MAP: RwLock> = RwLock::new(BTreeMap::new()); } +#[derive(Debug, Clone, Copy)] +enum AcmeChallenge { + Http, + Dns, +} + +impl Default for AcmeChallenge { + fn default() -> Self { + Http + } +} + #[derive(Debug, Default)] struct AcmeRequest<'a> { + challenge: AcmeChallenge, contract_email: &'a str, primary_name: &'a str, alt_names: &'a [&'a str], @@ -238,6 +252,7 @@ async fn main() -> tide::Result<()> { }; let acme_request = AcmeRequest { + challenge: Http, contract_email: &email, primary_name, alt_names: &alt_names, @@ -273,6 +288,7 @@ async fn main() -> tide::Result<()> { information!("Domains, main: {}, alt: {:?}", common_name, dns_names); let alt_names: Vec<&str> = dns_names.iter().map(|n| n.as_str()).collect(); let acme_request = AcmeRequest { + challenge: Http, contract_email: &email, primary_name: common_name, alt_names: &alt_names, @@ -435,16 +451,29 @@ fn request_acme_certificate(acme_request: AcmeRequest) -> XResult<()> { debugging!("Start acme certificate http challenge"); let auths = opt_result!(ord_new.authorizations(), "Order auth failed: {}"); for auth in &auths { - let chall = auth.http_challenge(); - let token = chall.http_token(); - let proof = chall.http_proof(); + match acme_request.challenge { + Http => { + let chall = auth.http_challenge(); + let token = chall.http_token(); + let proof = chall.http_proof(); - { - information!("Add acme http challenge: {} -> {}",token, proof); - TOKEN_MAP.write().unwrap().insert(token.to_string(), proof); + { + information!("Add acme http challenge: {} -> {}",token, proof); + TOKEN_MAP.write().unwrap().insert(token.to_string(), proof); + } + debugging!("Valid acme certificate http challenge"); + opt_result!(chall.validate(acme_request.timeout), "Validate http challenge failed: {}"); + } + Dns => { + let chall = auth.dns_challenge(); + let record = format!("_acme-challenge.{}.", auth.domain_name()); + let proof = chall.dns_proof(); + information!("Add acme dns challenge: {} -> {}",record, proof); + + debugging!("Valid acme certificate dns challenge"); + opt_result!(chall.validate(acme_request.timeout), "Validate dns challenge failed: {}"); + } } - debugging!("Valid acme certificate http challenge"); - opt_result!(chall.validate(acme_request.timeout), "Validate http challenge failed: {}"); } debugging!("Refresh acme certificate order"); -- 2.27.0 From e52d9c02cbdbbd0cc1dd257e77d7689b95772626 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Thu, 3 Feb 2022 01:00:14 +0800 Subject: [PATCH 2/4] add ali dns --- src/ali_dns.rs | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 1 + 2 files changed, 99 insertions(+) create mode 100644 src/ali_dns.rs diff --git a/src/ali_dns.rs b/src/ali_dns.rs new file mode 100644 index 0000000..71e4e0e --- /dev/null +++ b/src/ali_dns.rs @@ -0,0 +1,98 @@ +use aliyun_openapi_core_rust_sdk::RPClient; +use rust_util::XResult; + +static ALI_DNS_ENDPOINT: &str = "https://alidns.aliyuncs.com"; +static ALI_DNS_API_VERSION: &str = "2015-01-09"; + +#[derive(Debug)] +pub struct AccessCredential { + access_key_id: String, + access_key_secret: String, +} + +#[test] +fn test() { + let a = AccessCredential { + access_key_id: "***".to_string(), + access_key_secret: "***".to_string(), + }; + let client = create_dns_client(&a); + println!("{}", list_dns(&client, "webauthn.host").unwrap()); + // println!("{}", add_dns_txt(&client, "webauthn.host").unwrap()); + // println!("{}", delete_dns(&client, "744459160027659264").unwrap()); +} + +// { +// "TotalCount": 2, +// "RequestId": "8993B447-F1FF-58ED-9D4B-1027B551DC5E", +// "PageSize": 20, +// "DomainRecords": { +// "Record": [ +// { +// "RR": "www", +// "Line": "default", +// "Status": "ENABLE", +// "Locked": false, +// "Type": "A", +// "DomainName": "webauthn.host", +// "Value": "47.52.7.223", +// "RecordId": "714019124998091776", +// "TTL": 1800, +// "Weight": 1 +// }, +// { +// "RR": "@", +// "Line": "default", +// "Status": "ENABLE", +// "Locked": false, +// "Type": "A", +// "DomainName": "webauthn.host", +// "Value": "47.52.7.223", +// "RecordId": "714019101941960704", +// "TTL": 1800, +// "Weight": 1 +// } +// ] +// }, +// "PageNumber": 1 +// } +pub fn list_dns(client: &RPClient, domain: &str) -> XResult { + Ok(client.get("DescribeDomainRecords") + .query(&[ + ("RegionId", "cn-hangzhou"), + ("DomainName", domain) + ]) + .send()?) +} + +// {"RequestId":"AD997158-68D2-5084-B6B9-5F5A0893DDC1","RecordId":"744459160027659264"} +pub fn delete_dns(client: &RPClient, record_id: &str) -> XResult { + Ok(client.get("DeleteDomainRecord") + .query(&[ + ("RegionId", "cn-hangzhou"), + ("RecordId", record_id) + ]) + .send()?) +} + +// {"RequestId":"F3D54AB2-7058-54FD-AAF3-566FB8EC9BD1","RecordId":"744459160027659264"} +pub fn add_dns_txt(client: &RPClient, domain: &str) -> XResult { + Ok(client.get("AddDomainRecord") + .query(&[ + ("RegionId", "cn-hangzhou"), + ("DomainName", domain), + ("RR", "_acme-challenge_test"), + ("Type", "TXT"), + ("Value", "test") + ]) + .send()?) +} + +fn create_dns_client(access_credential: &AccessCredential) -> RPClient { + RPClient::new( + access_credential.access_key_id.clone(), + access_credential.access_key_secret.clone(), + String::from(ALI_DNS_ENDPOINT), + String::from(ALI_DNS_API_VERSION), + ) +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 7f0441c..ddfebcb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ mod x509; mod network; mod statics; mod dingtalk; +mod ali_dns; // mod simple_thread_pool; use std::env; -- 2.27.0 From 53e71c62d6907a171d68ac0e6579d632cc1b4a28 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Thu, 3 Feb 2022 01:18:30 +0800 Subject: [PATCH 3/4] add responses --- src/ali_dns.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/src/ali_dns.rs b/src/ali_dns.rs index 71e4e0e..79f4ed6 100644 --- a/src/ali_dns.rs +++ b/src/ali_dns.rs @@ -4,6 +4,66 @@ use rust_util::XResult; static ALI_DNS_ENDPOINT: &str = "https://alidns.aliyuncs.com"; static ALI_DNS_API_VERSION: &str = "2015-01-09"; +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct ListDnsResponseErrorResponse { + #[serde(rename = "RequestId")] + pub request_id: String, + #[serde(rename = "Message")] + pub message: String, + #[serde(rename = "Recommend")] + pub recommend: String, + #[serde(rename = "HostId")] + pub host_id: String, + #[serde(rename = "Code")] + pub code: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct ListDnsResponse { + #[serde(rename = "TotalCount")] + pub total_count: i32, + #[serde(rename = "RequestId")] + pub request_id: String, + #[serde(rename = "PageSize")] + pub page_size: i32, + #[serde(rename = "PageNumber")] + pub page_number: i32, + #[serde(rename = "DomainRecords")] + pub domain_records: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DnsRecord { + #[serde(rename = "RR")] + pub rr: String, + #[serde(rename = "Line")] + pub line: String, + #[serde(rename = "Status")] + pub status: String, + #[serde(rename = "Locked")] + pub locked: bool, + #[serde(rename = "Type")] + pub r#type: String, + #[serde(rename = "DomainName")] + pub domain_name: String, + #[serde(rename = "Value")] + pub value: String, + #[serde(rename = "RecordId")] + pub record_id: String, + #[serde(rename = "TTL")] + pub ttl: i32, + #[serde(rename = "Weight")] + pub weight: i32, +} + +pub struct Response { + #[serde(rename = "RequestId")] + pub request_id: String, + #[serde(rename = "RecordId")] + pub record_id: String, +} + + #[derive(Debug)] pub struct AccessCredential { access_key_id: String, @@ -17,7 +77,7 @@ fn test() { access_key_secret: "***".to_string(), }; let client = create_dns_client(&a); - println!("{}", list_dns(&client, "webauthn.host").unwrap()); + println!("{}", list_dns(&client, "webauthn1.host").unwrap()); // println!("{}", add_dns_txt(&client, "webauthn.host").unwrap()); // println!("{}", delete_dns(&client, "744459160027659264").unwrap()); } -- 2.27.0 From 8d8b1c24f09f4deee079a5918971809e736de27f Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Thu, 3 Feb 2022 16:55:13 +0800 Subject: [PATCH 4/4] dns challenge for aliyun works --- .gitignore | 2 + src/ali_dns.rs | 156 ++++++++++++++++++++++++------------------------- src/config.rs | 27 +++++++++ src/main.rs | 130 +++++++++++++++++++++++++++++++---------- src/util.rs | 35 +++++++++++ 5 files changed, 240 insertions(+), 110 deletions(-) create mode 100644 src/util.rs diff --git a/.gitignore b/.gitignore index a8e6166..fddddc8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +certs/ +test_cert_config.json acme_dir/ .idea/ __temp_dir/ diff --git a/src/ali_dns.rs b/src/ali_dns.rs index 79f4ed6..e921194 100644 --- a/src/ali_dns.rs +++ b/src/ali_dns.rs @@ -1,11 +1,40 @@ +use serde::{Deserialize, Serialize}; use aliyun_openapi_core_rust_sdk::RPClient; use rust_util::XResult; static ALI_DNS_ENDPOINT: &str = "https://alidns.aliyuncs.com"; static ALI_DNS_API_VERSION: &str = "2015-01-09"; +#[derive(Debug)] +pub struct AccessCredential { + access_key_id: String, + access_key_secret: String, +} + +// syntax: account://***:***@alibabacloud?id=dns +pub fn simple_parse_aliyun_supplier(supplier: &str) -> XResult { + if !supplier.starts_with("account://") { + return simple_error!("Supplier syntax error: {}", supplier); + } + let access_key_id_and_secret: String = supplier.chars().skip("account://".len()).take_while(|c| *c != '@').collect(); + let c_pos = opt_value_result!(access_key_id_and_secret.find(":"), "Supplier syntax error: {}", supplier); + + let access_key_id = access_key_id_and_secret.chars().take(c_pos).collect(); + let access_key_secret = access_key_id_and_secret.chars().skip(c_pos + 1).collect(); + + Ok(AccessCredential { access_key_id, access_key_secret }) +} + #[derive(Clone, Debug, Serialize, Deserialize)] -pub struct ListDnsResponseErrorResponse { +pub struct CommonSuccessResponse { + #[serde(rename = "RequestId")] + pub request_id: String, + #[serde(rename = "RecordId")] + pub record_id: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct CommonErrorResponse { #[serde(rename = "RequestId")] pub request_id: String, #[serde(rename = "Message")] @@ -29,7 +58,13 @@ pub struct ListDnsResponse { #[serde(rename = "PageNumber")] pub page_number: i32, #[serde(rename = "DomainRecords")] - pub domain_records: Vec, + pub domain_records: DnsRecords, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DnsRecords { + #[serde(rename = "Record")] + pub record: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -53,106 +88,69 @@ pub struct DnsRecord { #[serde(rename = "TTL")] pub ttl: i32, #[serde(rename = "Weight")] - pub weight: i32, + pub weight: Option, } -pub struct Response { - #[serde(rename = "RequestId")] - pub request_id: String, - #[serde(rename = "RecordId")] - pub record_id: String, -} - - -#[derive(Debug)] -pub struct AccessCredential { - access_key_id: String, - access_key_secret: String, -} - -#[test] -fn test() { - let a = AccessCredential { - access_key_id: "***".to_string(), - access_key_secret: "***".to_string(), - }; - let client = create_dns_client(&a); - println!("{}", list_dns(&client, "webauthn1.host").unwrap()); - // println!("{}", add_dns_txt(&client, "webauthn.host").unwrap()); - // println!("{}", delete_dns(&client, "744459160027659264").unwrap()); -} - -// { -// "TotalCount": 2, -// "RequestId": "8993B447-F1FF-58ED-9D4B-1027B551DC5E", -// "PageSize": 20, -// "DomainRecords": { -// "Record": [ -// { -// "RR": "www", -// "Line": "default", -// "Status": "ENABLE", -// "Locked": false, -// "Type": "A", -// "DomainName": "webauthn.host", -// "Value": "47.52.7.223", -// "RecordId": "714019124998091776", -// "TTL": 1800, -// "Weight": 1 -// }, -// { -// "RR": "@", -// "Line": "default", -// "Status": "ENABLE", -// "Locked": false, -// "Type": "A", -// "DomainName": "webauthn.host", -// "Value": "47.52.7.223", -// "RecordId": "714019101941960704", -// "TTL": 1800, -// "Weight": 1 -// } -// ] -// }, -// "PageNumber": 1 -// } -pub fn list_dns(client: &RPClient, domain: &str) -> XResult { - Ok(client.get("DescribeDomainRecords") +pub fn list_dns(client: &RPClient, domain: &str) -> XResult> { + let describe_domain_records_response = opt_result!(client.get("DescribeDomainRecords") .query(&[ ("RegionId", "cn-hangzhou"), ("DomainName", domain) ]) - .send()?) + .send(), "List domain records: {}, failed: {}", domain); + parse_result("DescribeDomainRecords", &describe_domain_records_response) } -// {"RequestId":"AD997158-68D2-5084-B6B9-5F5A0893DDC1","RecordId":"744459160027659264"} -pub fn delete_dns(client: &RPClient, record_id: &str) -> XResult { - Ok(client.get("DeleteDomainRecord") +pub fn delete_dns_record(client: &RPClient, record_id: &str) -> XResult> { + let delete_domain_record_response = opt_result!(client.get("DeleteDomainRecord") .query(&[ ("RegionId", "cn-hangzhou"), ("RecordId", record_id) ]) - .send()?) + .send(), "Delete domain record id: {}, failed: {}", record_id); + parse_result("DeleteDomainRecord", &delete_domain_record_response) } -// {"RequestId":"F3D54AB2-7058-54FD-AAF3-566FB8EC9BD1","RecordId":"744459160027659264"} -pub fn add_dns_txt(client: &RPClient, domain: &str) -> XResult { - Ok(client.get("AddDomainRecord") +pub fn add_txt_dns_record(client: &RPClient, domain: &str, rr: &str, value: &str) -> XResult> { + add_dns_record(client, domain, rr, "TXT", value) +} + +// domain -> "example.com" +// rr -> "@", "_acme-challenge" +// t -> "TXT" +// value -> "test" +pub fn add_dns_record(client: &RPClient, domain: &str, rr: &str, t: &str, value: &str) -> XResult> { + let add_domain_record_response = opt_result!(client.get("AddDomainRecord") .query(&[ ("RegionId", "cn-hangzhou"), ("DomainName", domain), - ("RR", "_acme-challenge_test"), - ("Type", "TXT"), - ("Value", "test") + ("RR", rr), + ("Type", t), + ("Value", value) ]) - .send()?) + .send(), "Add domain record: {}.{} -> {} {} ,failed: {}", rr, domain, t, value); + parse_result("AddDomainRecord", &add_domain_record_response) } -fn create_dns_client(access_credential: &AccessCredential) -> RPClient { +pub fn build_dns_client(access_credential: &AccessCredential) -> RPClient { RPClient::new( access_credential.access_key_id.clone(), access_credential.access_key_secret.clone(), String::from(ALI_DNS_ENDPOINT), String::from(ALI_DNS_API_VERSION), ) -} \ No newline at end of file +} + +fn parse_result<'a, S, E>(fn_name: &str, response: &'a str) -> XResult> where S: Deserialize<'a>, E: Deserialize<'a> { + let describe_domain_records_result: serde_json::Result = serde_json::from_str(&response); + match describe_domain_records_result { + Ok(r) => Ok(Ok(r)), + Err(_) => { + let describe_domain_records_error_result: serde_json::Result = serde_json::from_str(&response); + match describe_domain_records_error_result { + Ok(r) => Ok(Err(r)), + Err(_) => simple_error!("Parse {} response failed: {}", fn_name, response), + } + } + } +} diff --git a/src/config.rs b/src/config.rs index 0387ba8..acc304b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use serde::{Deserialize, Serialize}; use rust_util::XResult; use std::fs; @@ -11,6 +12,18 @@ use std::time::SystemTime; pub const CERT_NAME: &str = "cert.pem"; pub const KEY_NAME: &str = "key.pem"; +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum AcmeChallenge { + Http, + Dns, +} + +impl Default for AcmeChallenge { + fn default() -> Self { + AcmeChallenge::Http + } +} + #[derive(Debug, Clone, Copy)] pub enum AcmeMode { Prod, @@ -43,6 +56,9 @@ impl AcmeMode { #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CertConfigItem { + // HTTP, DNS + pub r#type: Option, + pub supplier: Option, pub path: String, pub algo: Option, pub public_key_algo: Option, @@ -54,6 +70,7 @@ pub struct CertConfigItem { #[serde(rename_all = "camelCase")] pub struct CertConfig { pub port: Option, + pub credential_suppliers: Option>, pub cert_items: Vec, pub trigger_after_update: Option>, pub notify_token: Option, @@ -102,6 +119,7 @@ impl CertConfig { Self { port: self.port, + credential_suppliers: self.credential_suppliers, cert_items: filtered_cert_items, trigger_after_update: self.trigger_after_update, notify_token: self.notify_token, @@ -116,6 +134,15 @@ impl CertConfig { } impl CertConfigItem { + pub fn get_acme_challenge(&self) -> AcmeChallenge { + let t = self.r#type.as_ref().map(|t| t.to_ascii_lowercase()).unwrap_or_else(|| "http".to_string()); + if t == "dns" { + AcmeChallenge::Dns + } else { + AcmeChallenge::Http + } + } + pub fn fill_dns_names(&mut self) -> XResult> { if self.path.is_empty() { return simple_error!("Cert config item path is empty"); diff --git a/src/main.rs b/src/main.rs index ddfebcb..fe6687c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ extern crate lazy_static; #[macro_use] extern crate rust_util; +mod util; mod config; mod x509; mod network; @@ -28,14 +29,16 @@ use async_std::task; use async_std::channel; use async_std::channel::Sender; use config::AcmeMode; -use crate::config::{CertConfig, CERT_NAME, KEY_NAME}; +use crate::config::{AcmeChallenge, CertConfig, CERT_NAME, KEY_NAME}; use crate::x509::{X509PublicKeyAlgo, X509EcPublicKeyAlgo}; use std::path::PathBuf; +use aliyun_openapi_core_rust_sdk::RPClient; use rust_util::util_cmd::run_command_and_wait; -use crate::AcmeChallenge::Http; +use crate::ali_dns::{add_txt_dns_record, build_dns_client, delete_dns_record, list_dns, simple_parse_aliyun_supplier}; use crate::dingtalk::send_dingtalk_message; use crate::network::{get_local_public_ip, get_resolver, resolve_first_ipv4}; use crate::statics::{AcmeStatics, AcmeStatus}; +use crate::util::parse_dns_record; const NAME: &str = env!("CARGO_PKG_NAME"); const VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -46,21 +49,12 @@ lazy_static! { static ref TOKEN_MAP: RwLock> = RwLock::new(BTreeMap::new()); } -#[derive(Debug, Clone, Copy)] -enum AcmeChallenge { - Http, - Dns, -} - -impl Default for AcmeChallenge { - fn default() -> Self { - Http - } -} - #[derive(Debug, Default)] struct AcmeRequest<'a> { challenge: AcmeChallenge, + // issue, single acme request can only process one supplier + credential_supplier: Option<&'a str>, + allow_interact: bool, contract_email: &'a str, primary_name: &'a str, alt_names: &'a [&'a str], @@ -97,6 +91,7 @@ async fn main() -> tide::Result<()> { .arg(Arg::with_name("hide-logo").long("hide-logo").help("Hide logo")) .arg(Arg::with_name("skip-verify-ip").short("k").long("skip-verify-ip").help("Skip verify public ip")) .arg(Arg::with_name("skip-verify-certificate").short("K").long("skip-verify-certificate").help("Skip verify certificate")) + .arg(Arg::with_name("allow-interact").long("allow-interact").help("Allow interact")) .get_matches(); if matches.is_present("verbose") { @@ -227,6 +222,7 @@ async fn main() -> tide::Result<()> { task::sleep(Duration::from_millis(500)).await; } + let mut dns_cleaned_domains: Vec = vec![]; match cert_config { None => { // cert config is not assigned if check { @@ -253,7 +249,9 @@ async fn main() -> tide::Result<()> { }; let acme_request = AcmeRequest { - challenge: Http, + challenge: AcmeChallenge::Http, + credential_supplier: None, + allow_interact: false, contract_email: &email, primary_name, alt_names: &alt_names, @@ -267,7 +265,7 @@ async fn main() -> tide::Result<()> { outputs_file: matches.value_of("outputs").map(|s| s.into()), ..Default::default() }; - if let Err(e) = request_acme_certificate(acme_request) { + if let Err(e) = request_acme_certificate(acme_request, &mut dns_cleaned_domains) { failure!("Request certificate by acme failed: {}", e); exit(1); } @@ -282,14 +280,35 @@ async fn main() -> tide::Result<()> { for item in &filtered_cert_config.cert_items { if item.common_name.as_ref().map(|n| n.contains('*')).unwrap_or(false) || item.dns_names.as_ref().map(|dns_names| dns_names.iter().any(|n| n.contains('*'))).unwrap_or(false) { - warning!("Currently not support wide card domain name"); - continue; + if item.get_acme_challenge() != AcmeChallenge::Dns { + warning!("Currently not support wide card domain name"); + continue; + } } if let (Some(common_name), Some(dns_names)) = (&item.common_name, &item.dns_names) { information!("Domains, main: {}, alt: {:?}", common_name, dns_names); let alt_names: Vec<&str> = dns_names.iter().map(|n| n.as_str()).collect(); + let challenge = item.get_acme_challenge(); + let credential_supplier = if challenge == AcmeChallenge::Dns { + match &item.supplier { + None => None, + Some(supplier) => { + let credential_supplier = filtered_cert_config.credential_suppliers.as_ref() + .map(|m| m.get(supplier)).flatten(); + match credential_supplier { + None => { + warning!("DNS challenge no credential supplier found"); + None + } + Some(credential_supplier) => Some(credential_supplier.as_str()), + } + } + } + } else { None }; let acme_request = AcmeRequest { - challenge: Http, + challenge, + credential_supplier, + allow_interact: matches.is_present("allow-interact"), contract_email: &email, primary_name: common_name, alt_names: &alt_names, @@ -304,7 +323,7 @@ async fn main() -> tide::Result<()> { }; let mut domains = vec![common_name.clone()]; dns_names.iter().for_each(|dns_name| domains.push(dns_name.clone())); - if let Err(e) = request_acme_certificate(acme_request) { + if let Err(e) = request_acme_certificate(acme_request, &mut dns_cleaned_domains) { failure!("Request certificate: {}, by acme failed: {}", item.path, e); acme_statics.add_item(domains, AcmeStatus::Fail(format!("{}", e))); } else { @@ -411,7 +430,7 @@ fn check_cert_config(cert_config: &CertConfig) { } } -fn request_acme_certificate(acme_request: AcmeRequest) -> XResult<()> { +fn request_acme_certificate(acme_request: AcmeRequest, dns_cleaned_domains: &mut Vec) -> XResult<()> { if let Some(local_public_ip) = acme_request.local_public_ip { let mut all_domains = vec![acme_request.primary_name.to_string()]; for alt_name in acme_request.alt_names { @@ -420,13 +439,15 @@ fn request_acme_certificate(acme_request: AcmeRequest) -> XResult<()> { information!("Checking domain dns records, domains: {:?}", all_domains); let resolver = opt_result!(get_resolver(), "Get resolver failed: {}"); - for domain in &all_domains { - debugging!("Checking domain: {}", domain); - let ipv4 = opt_result!(resolve_first_ipv4(&resolver, domain), "{}"); - match ipv4 { - None => return simple_error!("Resolve domain ip failed: {}", domain), - Some(ipv4) => if local_public_ip != ipv4 { - return simple_error!("Check domain ip: {}, mis-match, local: {} vs domain: {}", domain, local_public_ip, ipv4); + if acme_request.challenge == AcmeChallenge::Http { + for domain in &all_domains { + debugging!("Checking domain: {}", domain); + let ipv4 = opt_result!(resolve_first_ipv4(&resolver, domain), "{}"); + match ipv4 { + None => return simple_error!("Resolve domain ip failed: {}", domain), + Some(ipv4) => if local_public_ip != ipv4 { + return simple_error!("Check domain ip: {}, mis-match, local: {} vs domain: {}", domain, local_public_ip, ipv4); + } } } } @@ -438,6 +459,11 @@ fn request_acme_certificate(acme_request: AcmeRequest) -> XResult<()> { let dir = opt_result!(Directory::from_url(persist, url), "Create directory from url failed: {}"); let acc = opt_result!(dir.account(acme_request.contract_email), "Directory set account failed: {}"); let mut ord_new = opt_result!( acc.new_order(acme_request.primary_name, acme_request.alt_names), "Create order failed: {}"); + let ali_yun_client: Option = match acme_request.credential_supplier { + Some(credential_supplier) => Some(build_dns_client( + &opt_result!(simple_parse_aliyun_supplier(credential_supplier), "Parse credential supplier failed: {}"))), + None => None, + }; let mut order_csr_index = 0; let ord_csr = loop { @@ -453,7 +479,7 @@ fn request_acme_certificate(acme_request: AcmeRequest) -> XResult<()> { let auths = opt_result!(ord_new.authorizations(), "Order auth failed: {}"); for auth in &auths { match acme_request.challenge { - Http => { + AcmeChallenge::Http => { let chall = auth.http_challenge(); let token = chall.http_token(); let proof = chall.http_proof(); @@ -465,11 +491,53 @@ fn request_acme_certificate(acme_request: AcmeRequest) -> XResult<()> { debugging!("Valid acme certificate http challenge"); opt_result!(chall.validate(acme_request.timeout), "Validate http challenge failed: {}"); } - Dns => { + AcmeChallenge::Dns => { let chall = auth.dns_challenge(); let record = format!("_acme-challenge.{}.", auth.domain_name()); let proof = chall.dns_proof(); - information!("Add acme dns challenge: {} -> {}",record, proof); + information!("Add acme dns challenge: {} -> {}", record, proof); + + let rr_and_domain = opt_result!(parse_dns_record(&record), "Parse record to rr&domain failed: {}"); + + if !dns_cleaned_domains.contains(&rr_and_domain.1) { + information!("Clearing domain: {}", &rr_and_domain.1); + dns_cleaned_domains.push(rr_and_domain.1.clone()); + ali_yun_client.as_ref().map(|client| { + match list_dns(client, &rr_and_domain.1) { + Err(e) => warning!("List dns for: {}, failed: {}", &rr_and_domain.1, e), + Ok(Err(e)) => warning!("List dns for: {}, failed: {:?}", &rr_and_domain.1, e), + Ok(Ok(s)) => { + for r in &s.domain_records.record { + let rr = &r.rr; + if rr == "_acme-challenge" || rr.starts_with("_acme-challenge.") { + match delete_dns_record(client, &r.record_id) { + Err(e) => warning!("Delete dns: {}.{}, failed: {}", r.rr, r.domain_name, e), + Ok(Err(e)) => warning!("Delete dns: {}.{}, failed: {:?}", r.rr, r.domain_name, e), + Ok(Ok(_)) => success!("Delete dns: {}.{}", r.rr, r.domain_name), + } + } + } + } + } + }); + } + + match &ali_yun_client { + Some(client) => { + let add_txt_dns_result = opt_result!(add_txt_dns_record(client, &rr_and_domain.1, &rr_and_domain.0, &proof), "Add DNS TXT record failed: {}"); + match add_txt_dns_result { + Ok(s) => success!("Add dns txt record successes: {}", s.record_id), + Err(e) => return simple_error!("Add dns txt record failed: {:?}", e), + } + } + None => if acme_request.allow_interact { + let mut line = String::new(); + information!("You need to config dns manually, press enter to continue..."); + let _ = std::io::stdin().read_line(&mut line).unwrap(); + } else { + return simple_error!("Interact is not allowed, --allow-interact to allow interact"); + } + } debugging!("Valid acme certificate dns challenge"); opt_result!(chall.validate(acme_request.timeout), "Validate dns challenge failed: {}"); diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..590ef88 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,35 @@ +use rust_util::XResult; + +pub fn parse_dns_record(record: &str) -> XResult<(String, String)> { + let r = if record.ends_with(".") { + record.chars().take(record.len() - 1).collect::().to_ascii_lowercase() + } else { + record.to_ascii_lowercase() + }; + + let parts: Vec<&str> = r.split(".").collect(); + if parts.len() < 2 { + return simple_error!("Invalid record : {}", record); + } + + let last_part = parts[parts.len() - 1]; + let last_part_2 = parts[parts.len() - 2]; + + // SHOULD read from: https://publicsuffix.org/ + let domain_parts_len = match last_part { + "cn" => match last_part_2 { + "com" | "net" | "org" | "gov" => 3, + _ => 2, + }, + _ => 2, + }; + + if parts.len() < domain_parts_len { + return simple_error!("Invalid record: {}", record); + } + + let domain = parts.iter().skip(parts.len() - domain_parts_len).map(|s| s.to_string()).collect::>().join("."); + let rr = parts.iter().take(parts.len() - domain_parts_len).map(|s| s.to_string()).collect::>().join("."); + + Ok((if rr.is_empty() { "@".to_string() } else { rr }, domain)) +} \ No newline at end of file -- 2.27.0