├── .dockerignore ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── LICENSE ├── README.md ├── cargo-scripts └── build.rs ├── developer.md ├── scripts ├── build-prod.sh └── run-tryout.sh └── src ├── browse.rs ├── certbot.rs ├── config.rs ├── imap.rs └── main.rs /.dockerignore: -------------------------------------------------------------------------------- 1 | cargo-scripts 2 | scripts 3 | src 4 | target/debug 5 | target/release 6 | target/rls 7 | target/x86_64-unknown-linux-gnu/release/.fingerprint 8 | target/x86_64-unknown-linux-gnu/release/build 9 | target/x86_64-unknown-linux-gnu/release/deps 10 | target/x86_64-unknown-linux-gnu/release/examples 11 | target/x86_64-unknown-linux-gnu/release/incremental 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | /tryout 4 | 5 | # MacOS 6 | 7 | ## General 8 | .DS_Store 9 | .AppleDouble 10 | .LSOverride 11 | 12 | ## Icon must end with two \r 13 | Icon 14 | 15 | ## Thumbnails 16 | ._* 17 | 18 | ## Files that might appear in the root of a volume 19 | .DocumentRevisions-V100 20 | .fseventsd 21 | .Spotlight-V100 22 | .TemporaryItems 23 | .Trashes 24 | .VolumeIcon.icns 25 | .com.apple.timemachine.donotpresent 26 | 27 | ## Directories potentially created on remote AFP share 28 | .AppleDB 29 | .AppleDesktop 30 | Network Trash Folder 31 | Temporary Items 32 | .apdisk 33 | 34 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "acme-lib" 5 | version = "0.5.2" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | dependencies = [ 8 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 9 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 10 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 11 | "openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)", 12 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 13 | "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", 14 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 15 | "ureq 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", 16 | ] 17 | 18 | [[package]] 19 | name = "aho-corasick" 20 | version = "0.7.6" 21 | source = "registry+https://github.com/rust-lang/crates.io-index" 22 | dependencies = [ 23 | "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 24 | ] 25 | 26 | [[package]] 27 | name = "anyhow" 28 | version = "1.0.25" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | 31 | [[package]] 32 | name = "atty" 33 | version = "0.2.13" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | dependencies = [ 36 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 37 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 38 | ] 39 | 40 | [[package]] 41 | name = "autocfg" 42 | version = "0.1.7" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | 45 | [[package]] 46 | name = "backtrace" 47 | version = "0.3.40" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | dependencies = [ 50 | "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 51 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 52 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 53 | "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 54 | ] 55 | 56 | [[package]] 57 | name = "backtrace-sys" 58 | version = "0.1.32" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | dependencies = [ 61 | "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", 62 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 63 | ] 64 | 65 | [[package]] 66 | name = "base64" 67 | version = "0.9.3" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | dependencies = [ 70 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 71 | "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 72 | ] 73 | 74 | [[package]] 75 | name = "base64" 76 | version = "0.10.1" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | dependencies = [ 79 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 80 | ] 81 | 82 | [[package]] 83 | name = "bitflags" 84 | version = "1.2.1" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | 87 | [[package]] 88 | name = "bufstream" 89 | version = "0.1.4" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | 92 | [[package]] 93 | name = "bumpalo" 94 | version = "2.6.0" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | 97 | [[package]] 98 | name = "byteorder" 99 | version = "1.3.2" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | 102 | [[package]] 103 | name = "c2-chacha" 104 | version = "0.2.3" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | dependencies = [ 107 | "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 108 | ] 109 | 110 | [[package]] 111 | name = "cc" 112 | version = "1.0.48" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | 115 | [[package]] 116 | name = "certbot-alfahosting" 117 | version = "1.0.2" 118 | dependencies = [ 119 | "acme-lib 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 120 | "headless_chrome 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 121 | "imap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 122 | "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 123 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 124 | "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 125 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 126 | "toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 127 | ] 128 | 129 | [[package]] 130 | name = "cfg-if" 131 | version = "0.1.10" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | 134 | [[package]] 135 | name = "chrono" 136 | version = "0.4.10" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | dependencies = [ 139 | "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 140 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 141 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 142 | ] 143 | 144 | [[package]] 145 | name = "chunked_transfer" 146 | version = "1.0.0" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | 149 | [[package]] 150 | name = "cloudabi" 151 | version = "0.0.3" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | dependencies = [ 154 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 155 | ] 156 | 157 | [[package]] 158 | name = "cookie" 159 | version = "0.12.0" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | dependencies = [ 162 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 163 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 164 | ] 165 | 166 | [[package]] 167 | name = "core-foundation" 168 | version = "0.6.4" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | dependencies = [ 171 | "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 172 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 173 | ] 174 | 175 | [[package]] 176 | name = "core-foundation-sys" 177 | version = "0.6.2" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | 180 | [[package]] 181 | name = "darling" 182 | version = "0.9.0" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | dependencies = [ 185 | "darling_core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 186 | "darling_macro 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 187 | ] 188 | 189 | [[package]] 190 | name = "darling_core" 191 | version = "0.9.0" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | dependencies = [ 194 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 195 | "ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 196 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 197 | "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 198 | "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 199 | "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", 200 | ] 201 | 202 | [[package]] 203 | name = "darling_macro" 204 | version = "0.9.0" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | dependencies = [ 207 | "darling_core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 208 | "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 209 | "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", 210 | ] 211 | 212 | [[package]] 213 | name = "derive_builder" 214 | version = "0.7.2" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | dependencies = [ 217 | "darling 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 218 | "derive_builder_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 219 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 220 | "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 221 | "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", 222 | ] 223 | 224 | [[package]] 225 | name = "derive_builder_core" 226 | version = "0.5.0" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | dependencies = [ 229 | "darling 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 230 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 231 | "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 232 | "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", 233 | ] 234 | 235 | [[package]] 236 | name = "env_logger" 237 | version = "0.6.2" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | dependencies = [ 240 | "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", 241 | "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 242 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 243 | "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 244 | "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 245 | ] 246 | 247 | [[package]] 248 | name = "failure" 249 | version = "0.1.6" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | dependencies = [ 252 | "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", 253 | "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 254 | ] 255 | 256 | [[package]] 257 | name = "failure_derive" 258 | version = "0.1.6" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | dependencies = [ 261 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 262 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 263 | "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", 264 | "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 265 | ] 266 | 267 | [[package]] 268 | name = "fnv" 269 | version = "1.0.6" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | 272 | [[package]] 273 | name = "foreign-types" 274 | version = "0.3.2" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | dependencies = [ 277 | "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 278 | ] 279 | 280 | [[package]] 281 | name = "foreign-types-shared" 282 | version = "0.1.1" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | 285 | [[package]] 286 | name = "fuchsia-cprng" 287 | version = "0.1.1" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | 290 | [[package]] 291 | name = "getrandom" 292 | version = "0.1.13" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | dependencies = [ 295 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 296 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 297 | "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 298 | ] 299 | 300 | [[package]] 301 | name = "headless_chrome" 302 | version = "0.9.0" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | dependencies = [ 305 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 306 | "derive_builder 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 307 | "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 308 | "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 309 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 310 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 311 | "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 312 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 313 | "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 314 | "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", 315 | "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 316 | "websocket 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)", 317 | "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 318 | "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 319 | ] 320 | 321 | [[package]] 322 | name = "heck" 323 | version = "0.3.1" 324 | source = "registry+https://github.com/rust-lang/crates.io-index" 325 | dependencies = [ 326 | "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 327 | ] 328 | 329 | [[package]] 330 | name = "hermit-abi" 331 | version = "0.1.5" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | dependencies = [ 334 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 335 | ] 336 | 337 | [[package]] 338 | name = "httparse" 339 | version = "1.3.4" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | 342 | [[package]] 343 | name = "humantime" 344 | version = "1.3.0" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | dependencies = [ 347 | "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 348 | ] 349 | 350 | [[package]] 351 | name = "hyper" 352 | version = "0.10.16" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | dependencies = [ 355 | "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 356 | "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 357 | "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 358 | "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 359 | "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 360 | "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)", 361 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 362 | "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 363 | "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 364 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 365 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 366 | ] 367 | 368 | [[package]] 369 | name = "ident_case" 370 | version = "1.0.1" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | 373 | [[package]] 374 | name = "idna" 375 | version = "0.1.5" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | dependencies = [ 378 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 379 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 380 | "unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 381 | ] 382 | 383 | [[package]] 384 | name = "idna" 385 | version = "0.2.0" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | dependencies = [ 388 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 389 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 390 | "unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 391 | ] 392 | 393 | [[package]] 394 | name = "imap" 395 | version = "1.0.2" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | dependencies = [ 398 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 399 | "bufstream 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 400 | "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", 401 | "imap-proto 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 402 | "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 403 | "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 404 | "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 405 | ] 406 | 407 | [[package]] 408 | name = "imap-proto" 409 | version = "0.7.0" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | dependencies = [ 412 | "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 413 | ] 414 | 415 | [[package]] 416 | name = "itoa" 417 | version = "0.4.4" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | 420 | [[package]] 421 | name = "js-sys" 422 | version = "0.3.33" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | dependencies = [ 425 | "wasm-bindgen 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)", 426 | ] 427 | 428 | [[package]] 429 | name = "language-tags" 430 | version = "0.2.2" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | 433 | [[package]] 434 | name = "lazy_static" 435 | version = "1.4.0" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | 438 | [[package]] 439 | name = "libc" 440 | version = "0.2.66" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | 443 | [[package]] 444 | name = "log" 445 | version = "0.3.9" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | dependencies = [ 448 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 449 | ] 450 | 451 | [[package]] 452 | name = "log" 453 | version = "0.4.8" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | dependencies = [ 456 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 457 | ] 458 | 459 | [[package]] 460 | name = "matches" 461 | version = "0.1.8" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | 464 | [[package]] 465 | name = "memchr" 466 | version = "2.2.1" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | 469 | [[package]] 470 | name = "mime" 471 | version = "0.2.6" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | dependencies = [ 474 | "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 475 | ] 476 | 477 | [[package]] 478 | name = "native-tls" 479 | version = "0.2.3" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | dependencies = [ 482 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 483 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 484 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 485 | "openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)", 486 | "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 487 | "openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)", 488 | "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 489 | "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 490 | "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 491 | "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 492 | ] 493 | 494 | [[package]] 495 | name = "nom" 496 | version = "4.2.3" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | dependencies = [ 499 | "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 500 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 501 | ] 502 | 503 | [[package]] 504 | name = "num-integer" 505 | version = "0.1.41" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | dependencies = [ 508 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 509 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 510 | ] 511 | 512 | [[package]] 513 | name = "num-traits" 514 | version = "0.2.10" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | dependencies = [ 517 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 518 | ] 519 | 520 | [[package]] 521 | name = "num_cpus" 522 | version = "1.11.1" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | dependencies = [ 525 | "hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 526 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 527 | ] 528 | 529 | [[package]] 530 | name = "openssl" 531 | version = "0.10.26" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | dependencies = [ 534 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 535 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 536 | "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 537 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 538 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 539 | "openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)", 540 | ] 541 | 542 | [[package]] 543 | name = "openssl-probe" 544 | version = "0.1.2" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | 547 | [[package]] 548 | name = "openssl-sys" 549 | version = "0.9.53" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | dependencies = [ 552 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 553 | "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", 554 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 555 | "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", 556 | "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 557 | ] 558 | 559 | [[package]] 560 | name = "percent-encoding" 561 | version = "1.0.1" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | 564 | [[package]] 565 | name = "percent-encoding" 566 | version = "2.1.0" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | 569 | [[package]] 570 | name = "pkg-config" 571 | version = "0.3.17" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | 574 | [[package]] 575 | name = "ppv-lite86" 576 | version = "0.2.6" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | 579 | [[package]] 580 | name = "proc-macro2" 581 | version = "0.4.30" 582 | source = "registry+https://github.com/rust-lang/crates.io-index" 583 | dependencies = [ 584 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 585 | ] 586 | 587 | [[package]] 588 | name = "proc-macro2" 589 | version = "1.0.6" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | dependencies = [ 592 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 593 | ] 594 | 595 | [[package]] 596 | name = "qstring" 597 | version = "0.7.0" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | dependencies = [ 600 | "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 601 | ] 602 | 603 | [[package]] 604 | name = "quick-error" 605 | version = "1.2.2" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | 608 | [[package]] 609 | name = "quote" 610 | version = "0.6.13" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | dependencies = [ 613 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 614 | ] 615 | 616 | [[package]] 617 | name = "quote" 618 | version = "1.0.2" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | dependencies = [ 621 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 622 | ] 623 | 624 | [[package]] 625 | name = "rand" 626 | version = "0.6.5" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | dependencies = [ 629 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 630 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 631 | "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 632 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 633 | "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 634 | "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 635 | "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 636 | "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 637 | "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 638 | "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 639 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 640 | ] 641 | 642 | [[package]] 643 | name = "rand" 644 | version = "0.7.2" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | dependencies = [ 647 | "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 648 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 649 | "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 650 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 651 | "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 652 | ] 653 | 654 | [[package]] 655 | name = "rand_chacha" 656 | version = "0.1.1" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | dependencies = [ 659 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 660 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 661 | ] 662 | 663 | [[package]] 664 | name = "rand_chacha" 665 | version = "0.2.1" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | dependencies = [ 668 | "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 669 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 670 | ] 671 | 672 | [[package]] 673 | name = "rand_core" 674 | version = "0.3.1" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | dependencies = [ 677 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 678 | ] 679 | 680 | [[package]] 681 | name = "rand_core" 682 | version = "0.4.2" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | 685 | [[package]] 686 | name = "rand_core" 687 | version = "0.5.1" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | dependencies = [ 690 | "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 691 | ] 692 | 693 | [[package]] 694 | name = "rand_hc" 695 | version = "0.1.0" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | dependencies = [ 698 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 699 | ] 700 | 701 | [[package]] 702 | name = "rand_hc" 703 | version = "0.2.0" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | dependencies = [ 706 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 707 | ] 708 | 709 | [[package]] 710 | name = "rand_isaac" 711 | version = "0.1.1" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | dependencies = [ 714 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 715 | ] 716 | 717 | [[package]] 718 | name = "rand_jitter" 719 | version = "0.1.4" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | dependencies = [ 722 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 723 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 724 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 725 | ] 726 | 727 | [[package]] 728 | name = "rand_os" 729 | version = "0.1.3" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | dependencies = [ 732 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 733 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 734 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 735 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 736 | "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 737 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 738 | ] 739 | 740 | [[package]] 741 | name = "rand_pcg" 742 | version = "0.1.2" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | dependencies = [ 745 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 746 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 747 | ] 748 | 749 | [[package]] 750 | name = "rand_xorshift" 751 | version = "0.1.1" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | dependencies = [ 754 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 755 | ] 756 | 757 | [[package]] 758 | name = "rdrand" 759 | version = "0.4.0" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | dependencies = [ 762 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 763 | ] 764 | 765 | [[package]] 766 | name = "redox_syscall" 767 | version = "0.1.56" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | 770 | [[package]] 771 | name = "regex" 772 | version = "1.3.1" 773 | source = "registry+https://github.com/rust-lang/crates.io-index" 774 | dependencies = [ 775 | "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", 776 | "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 777 | "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 778 | "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 779 | ] 780 | 781 | [[package]] 782 | name = "regex-syntax" 783 | version = "0.6.12" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | 786 | [[package]] 787 | name = "remove_dir_all" 788 | version = "0.5.2" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | dependencies = [ 791 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 792 | ] 793 | 794 | [[package]] 795 | name = "ring" 796 | version = "0.16.9" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | dependencies = [ 799 | "cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", 800 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 801 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 802 | "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 803 | "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 804 | "web-sys 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)", 805 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 806 | ] 807 | 808 | [[package]] 809 | name = "rustc-demangle" 810 | version = "0.1.16" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | 813 | [[package]] 814 | name = "rustls" 815 | version = "0.16.0" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | dependencies = [ 818 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 819 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 820 | "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", 821 | "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 822 | "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", 823 | ] 824 | 825 | [[package]] 826 | name = "ryu" 827 | version = "1.0.2" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | 830 | [[package]] 831 | name = "safemem" 832 | version = "0.3.3" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | 835 | [[package]] 836 | name = "schannel" 837 | version = "0.1.16" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | dependencies = [ 840 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 841 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 842 | ] 843 | 844 | [[package]] 845 | name = "sct" 846 | version = "0.6.0" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | dependencies = [ 849 | "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", 850 | "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 851 | ] 852 | 853 | [[package]] 854 | name = "security-framework" 855 | version = "0.3.4" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | dependencies = [ 858 | "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", 859 | "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 860 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 861 | "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 862 | ] 863 | 864 | [[package]] 865 | name = "security-framework-sys" 866 | version = "0.3.3" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | dependencies = [ 869 | "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 870 | ] 871 | 872 | [[package]] 873 | name = "serde" 874 | version = "1.0.104" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | dependencies = [ 877 | "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 878 | ] 879 | 880 | [[package]] 881 | name = "serde_derive" 882 | version = "1.0.104" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | dependencies = [ 885 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 886 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 887 | "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", 888 | ] 889 | 890 | [[package]] 891 | name = "serde_json" 892 | version = "1.0.44" 893 | source = "registry+https://github.com/rust-lang/crates.io-index" 894 | dependencies = [ 895 | "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", 896 | "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 897 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 898 | ] 899 | 900 | [[package]] 901 | name = "sha1" 902 | version = "0.6.0" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | 905 | [[package]] 906 | name = "smallvec" 907 | version = "1.1.0" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | 910 | [[package]] 911 | name = "sourcefile" 912 | version = "0.1.4" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | 915 | [[package]] 916 | name = "spin" 917 | version = "0.5.2" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | 920 | [[package]] 921 | name = "strsim" 922 | version = "0.7.0" 923 | source = "registry+https://github.com/rust-lang/crates.io-index" 924 | 925 | [[package]] 926 | name = "syn" 927 | version = "0.15.44" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | dependencies = [ 930 | "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", 931 | "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 932 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 933 | ] 934 | 935 | [[package]] 936 | name = "syn" 937 | version = "1.0.11" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | dependencies = [ 940 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 941 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 942 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 943 | ] 944 | 945 | [[package]] 946 | name = "synstructure" 947 | version = "0.12.3" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | dependencies = [ 950 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 951 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 952 | "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", 953 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 954 | ] 955 | 956 | [[package]] 957 | name = "tempfile" 958 | version = "3.1.0" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | dependencies = [ 961 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 962 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 963 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 964 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 965 | "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 966 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 967 | ] 968 | 969 | [[package]] 970 | name = "termcolor" 971 | version = "1.0.5" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | dependencies = [ 974 | "wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 975 | ] 976 | 977 | [[package]] 978 | name = "thread_local" 979 | version = "0.3.6" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | dependencies = [ 982 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 983 | ] 984 | 985 | [[package]] 986 | name = "time" 987 | version = "0.1.42" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | dependencies = [ 990 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 991 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 992 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 993 | ] 994 | 995 | [[package]] 996 | name = "toml" 997 | version = "0.5.5" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | dependencies = [ 1000 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 1001 | ] 1002 | 1003 | [[package]] 1004 | name = "traitobject" 1005 | version = "0.1.0" 1006 | source = "registry+https://github.com/rust-lang/crates.io-index" 1007 | 1008 | [[package]] 1009 | name = "typeable" 1010 | version = "0.1.2" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | 1013 | [[package]] 1014 | name = "unicase" 1015 | version = "1.4.2" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | dependencies = [ 1018 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "unicode-bidi" 1023 | version = "0.3.4" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | dependencies = [ 1026 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "unicode-normalization" 1031 | version = "0.1.11" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | dependencies = [ 1034 | "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "unicode-segmentation" 1039 | version = "1.6.0" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | 1042 | [[package]] 1043 | name = "unicode-xid" 1044 | version = "0.1.0" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | 1047 | [[package]] 1048 | name = "unicode-xid" 1049 | version = "0.2.0" 1050 | source = "registry+https://github.com/rust-lang/crates.io-index" 1051 | 1052 | [[package]] 1053 | name = "untrusted" 1054 | version = "0.7.0" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | 1057 | [[package]] 1058 | name = "ureq" 1059 | version = "0.11.2" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | dependencies = [ 1062 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 1063 | "chunked_transfer 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1064 | "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 1065 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1066 | "qstring 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1067 | "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", 1068 | "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1069 | "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", 1070 | "webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "url" 1075 | version = "1.7.2" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | dependencies = [ 1078 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1079 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1080 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1081 | ] 1082 | 1083 | [[package]] 1084 | name = "url" 1085 | version = "2.1.0" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | dependencies = [ 1088 | "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1089 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1090 | "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1091 | ] 1092 | 1093 | [[package]] 1094 | name = "vcpkg" 1095 | version = "0.2.8" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | 1098 | [[package]] 1099 | name = "version_check" 1100 | version = "0.1.5" 1101 | source = "registry+https://github.com/rust-lang/crates.io-index" 1102 | 1103 | [[package]] 1104 | name = "wasi" 1105 | version = "0.7.0" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | 1108 | [[package]] 1109 | name = "wasm-bindgen" 1110 | version = "0.2.56" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | dependencies = [ 1113 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1114 | "wasm-bindgen-macro 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)", 1115 | ] 1116 | 1117 | [[package]] 1118 | name = "wasm-bindgen-backend" 1119 | version = "0.2.56" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | dependencies = [ 1122 | "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 1123 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1124 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1125 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1126 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1127 | "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", 1128 | "wasm-bindgen-shared 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "wasm-bindgen-macro" 1133 | version = "0.2.56" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | dependencies = [ 1136 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1137 | "wasm-bindgen-macro-support 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "wasm-bindgen-macro-support" 1142 | version = "0.2.56" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | dependencies = [ 1145 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1146 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1147 | "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", 1148 | "wasm-bindgen-backend 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)", 1149 | "wasm-bindgen-shared 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "wasm-bindgen-shared" 1154 | version = "0.2.56" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | 1157 | [[package]] 1158 | name = "wasm-bindgen-webidl" 1159 | version = "0.2.56" 1160 | source = "registry+https://github.com/rust-lang/crates.io-index" 1161 | dependencies = [ 1162 | "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", 1163 | "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1164 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1165 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1166 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1167 | "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", 1168 | "wasm-bindgen-backend 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)", 1169 | "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "web-sys" 1174 | version = "0.3.33" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | dependencies = [ 1177 | "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", 1178 | "js-sys 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)", 1179 | "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1180 | "wasm-bindgen 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)", 1181 | "wasm-bindgen-webidl 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)", 1182 | ] 1183 | 1184 | [[package]] 1185 | name = "webpki" 1186 | version = "0.21.0" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | dependencies = [ 1189 | "ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)", 1190 | "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1191 | ] 1192 | 1193 | [[package]] 1194 | name = "webpki-roots" 1195 | version = "0.18.0" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | dependencies = [ 1198 | "webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", 1199 | ] 1200 | 1201 | [[package]] 1202 | name = "websocket" 1203 | version = "0.23.0" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | dependencies = [ 1206 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 1207 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1208 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 1209 | "hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", 1210 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1211 | "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 1212 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1213 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "weedle" 1218 | version = "0.10.0" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | dependencies = [ 1221 | "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1222 | ] 1223 | 1224 | [[package]] 1225 | name = "which" 1226 | version = "2.0.1" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | dependencies = [ 1229 | "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1230 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1231 | ] 1232 | 1233 | [[package]] 1234 | name = "winapi" 1235 | version = "0.3.8" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | dependencies = [ 1238 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1239 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1240 | ] 1241 | 1242 | [[package]] 1243 | name = "winapi-i686-pc-windows-gnu" 1244 | version = "0.4.0" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | 1247 | [[package]] 1248 | name = "winapi-util" 1249 | version = "0.1.2" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | dependencies = [ 1252 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1253 | ] 1254 | 1255 | [[package]] 1256 | name = "winapi-x86_64-pc-windows-gnu" 1257 | version = "0.4.0" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | 1260 | [[package]] 1261 | name = "wincolor" 1262 | version = "1.0.2" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | dependencies = [ 1265 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1266 | "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1267 | ] 1268 | 1269 | [[package]] 1270 | name = "winreg" 1271 | version = "0.6.2" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | dependencies = [ 1274 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1275 | ] 1276 | 1277 | [metadata] 1278 | "checksum acme-lib 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c5b7277eab14e2bba8a454fff4b5ba57e506c61239f86bd131c170a496cf9d6" 1279 | "checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" 1280 | "checksum anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "9267dff192e68f3399525901e709a48c1d3982c9c072fa32f2127a0cb0babf14" 1281 | "checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" 1282 | "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" 1283 | "checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea" 1284 | "checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" 1285 | "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 1286 | "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" 1287 | "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 1288 | "checksum bufstream 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8" 1289 | "checksum bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad807f2fc2bf185eeb98ff3a901bd46dc5ad58163d0fa4577ba0d25674d71708" 1290 | "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" 1291 | "checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" 1292 | "checksum cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "f52a465a666ca3d838ebbf08b241383421412fe7ebb463527bba275526d89f76" 1293 | "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 1294 | "checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" 1295 | "checksum chunked_transfer 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f98beb6554de08a14bd7b5c6014963c79d6a25a1c66b1d4ecb9e733ccba51d6c" 1296 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 1297 | "checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" 1298 | "checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" 1299 | "checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" 1300 | "checksum darling 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fcfbcb0c5961907597a7d1148e3af036268f2b773886b8bb3eeb1e1281d3d3d6" 1301 | "checksum darling_core 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6afc018370c3bff3eb51f89256a6bdb18b4fdcda72d577982a14954a7a0b402c" 1302 | "checksum darling_macro 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c6d8dac1c6f1d29a41c4712b4400f878cb4fcc4c7628f298dd75038e024998d1" 1303 | "checksum derive_builder 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ac53fa6a3cda160df823a9346442525dcaf1e171999a1cf23e67067e4fd64d4" 1304 | "checksum derive_builder_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0288a23da9333c246bb18c143426074a6ae96747995c5819d2947b64cd942b37" 1305 | "checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" 1306 | "checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" 1307 | "checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" 1308 | "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 1309 | "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1310 | "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1311 | "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 1312 | "checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407" 1313 | "checksum headless_chrome 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b972f505b0adbacd697b3d78c94fbaf9c02d569ca11d416816956851f3a83017" 1314 | "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" 1315 | "checksum hermit-abi 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f629dc602392d3ec14bfc8a09b5e644d7ffd725102b48b81e59f90f2633621d7" 1316 | "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" 1317 | "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" 1318 | "checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" 1319 | "checksum ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1320 | "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 1321 | "checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" 1322 | "checksum imap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "178392198cb2716f4fe34b86a1bf1de1240a3e31136a199b16490fa87538fa25" 1323 | "checksum imap-proto 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4e77b1d61faf028893531b071cc5584cdd02b6186cebe7f7168ffd8d591339a" 1324 | "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" 1325 | "checksum js-sys 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)" = "367647c532db6f1555d7151e619540ec5f713328235b8c062c6b4f63e84adfe3" 1326 | "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 1327 | "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1328 | "checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" 1329 | "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" 1330 | "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" 1331 | "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1332 | "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" 1333 | "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" 1334 | "checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" 1335 | "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" 1336 | "checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" 1337 | "checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4" 1338 | "checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72" 1339 | "checksum openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585" 1340 | "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" 1341 | "checksum openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)" = "465d16ae7fc0e313318f7de5cecf57b2fbe7511fd213978b457e1c96ff46736f" 1342 | "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 1343 | "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1344 | "checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" 1345 | "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" 1346 | "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" 1347 | "checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" 1348 | "checksum qstring 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "267047d2df92990367cbbf6b686c363c1518eb98e225b5193c8b936e52ab565a" 1349 | "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" 1350 | "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" 1351 | "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" 1352 | "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" 1353 | "checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412" 1354 | "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" 1355 | "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" 1356 | "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 1357 | "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" 1358 | "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1359 | "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 1360 | "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1361 | "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 1362 | "checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" 1363 | "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" 1364 | "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" 1365 | "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" 1366 | "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 1367 | "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" 1368 | "checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd" 1369 | "checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716" 1370 | "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" 1371 | "checksum ring 0.16.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6747f8da1f2b1fabbee1aaa4eb8a11abf9adef0bf58a41cee45db5d59cecdfac" 1372 | "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" 1373 | "checksum rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e" 1374 | "checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" 1375 | "checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 1376 | "checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" 1377 | "checksum sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" 1378 | "checksum security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df" 1379 | "checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895" 1380 | "checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" 1381 | "checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" 1382 | "checksum serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)" = "48c575e0cc52bdd09b47f330f646cf59afc586e9c4e3ccd6fc1f625b8ea1dad7" 1383 | "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" 1384 | "checksum smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44e59e0c9fa00817912ae6e4e6e3c4fe04455e75699d06eedc7d85917ed8e8f4" 1385 | "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" 1386 | "checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 1387 | "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" 1388 | "checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" 1389 | "checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238" 1390 | "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" 1391 | "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" 1392 | "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" 1393 | "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" 1394 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 1395 | "checksum toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "01d1404644c8b12b16bfcffa4322403a91a451584daaaa7c28d3152e6cbc98cf" 1396 | "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" 1397 | "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" 1398 | "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" 1399 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 1400 | "checksum unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b561e267b2326bb4cebfc0ef9e68355c7abe6c6f522aeac2f5bf95d56c59bdcf" 1401 | "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" 1402 | "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" 1403 | "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 1404 | "checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" 1405 | "checksum ureq 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "29bd1aba30a6937339e66e4ae3a651a72dda3df66a2584482298d4aa8cd84332" 1406 | "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" 1407 | "checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61" 1408 | "checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" 1409 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 1410 | "checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" 1411 | "checksum wasm-bindgen 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)" = "99de4b68939a880d530aed51289a7c7baee154e3ea8ac234b542c49da7134aaf" 1412 | "checksum wasm-bindgen-backend 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)" = "b58e66a093a7b7571cb76409763c495b8741ac4319ac20acc2b798f6766d92ee" 1413 | "checksum wasm-bindgen-macro 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)" = "a80f89daea7b0a67b11f6e9f911422ed039de9963dce00048a653b63d51194bf" 1414 | "checksum wasm-bindgen-macro-support 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)" = "4f9dbc3734ad6cff6b76b75b7df98c06982becd0055f651465a08f769bca5c61" 1415 | "checksum wasm-bindgen-shared 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)" = "d907984f8506b3554eab48b8efff723e764ddbf76d4cd4a3fe4196bc00c49a70" 1416 | "checksum wasm-bindgen-webidl 0.2.56 (registry+https://github.com/rust-lang/crates.io-index)" = "f85a3825a459cf6a929d03bacb54dca37a614d43032ad1343ef2d4822972947d" 1417 | "checksum web-sys 0.3.33 (registry+https://github.com/rust-lang/crates.io-index)" = "2fb60433d0dc12c803b9b017b3902d80c9451bab78d27bc3210bf2a7b96593f1" 1418 | "checksum webpki 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d7e664e770ac0110e2384769bcc59ed19e329d81f555916a6e072714957b81b4" 1419 | "checksum webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" 1420 | "checksum websocket 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b255b190f412e45000c35be7fe9b48b39a2ac5eb90d093d421694e5dae8b335c" 1421 | "checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" 1422 | "checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" 1423 | "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" 1424 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1425 | "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" 1426 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1427 | "checksum wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9" 1428 | "checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" 1429 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "certbot-alfahosting" 3 | version = "1.0.2" 4 | authors = ["Lukas Wagner "] 5 | edition = "2018" 6 | build="cargo-scripts/build.rs" 7 | 8 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 9 | 10 | [dependencies] 11 | rand = "0.7.2" 12 | native-tls = "0.2.3" 13 | imap = "1.0.2" 14 | regex = "1.3.1" 15 | headless_chrome = "0.9.0" 16 | acme-lib = "0.5.2" 17 | toml = "0.5.5" 18 | serde = "1.0.104" 19 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos:centos8 2 | # FROM ubuntu:18.04 3 | 4 | RUN mkdir /etc/letsencrypt 5 | RUN mkdir /etc/certbot-alfahosting 6 | 7 | RUN dnf install -y wget 8 | RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 9 | RUN dnf install -y ./google-chrome-stable_current_x86_64.rpm 10 | RUN rm ./google-chrome-stable_current_x86_64.rpm 11 | 12 | # RUN apt-get -y update && apt-get -y install chromium-browser 13 | 14 | COPY target/x86_64-unknown-linux-gnu/release/certbot-alfahosting /usr/bin/certbot-alfahosting 15 | 16 | VOLUME [ "/etc/letsencrypt", "/etc/certbot-alfahosting" ] 17 | 18 | CMD [ "/usr/bin/certbot-alfahosting" ] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Lukas Wagner 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ACME Client Automating DNS-01 Challenge for Alfahosting Domains 2 | 3 | This is an ACME (letsencrypt by default) client that performs DNS-01 proofs agains an alfahosting standard contract with browser DNS settings. 4 | 5 | If you like my work consider supporting me over at [Patreon](https://www.patreon.com/lukaswagner). 6 | 7 | ## Config file 8 | 9 | There needs to be a file `/etc/certbot-alfahosting/config.toml` containing the following entries: 10 | 11 | ```toml 12 | # certpath = "/etc/letsencrypt" 13 | 14 | [alfahosting] 15 | username = "alfauser" 16 | password = "alfapassword" 17 | ## id of the contract (usually called "NameX" where X can be a number such as 30) 18 | ipid = "000000" 19 | 20 | # this is where you configure the email address the alfahosting login code is sent to. 21 | [imap] 22 | domain = "imap.example.com" 23 | port = 993 24 | username = "user@example.com" 25 | password = "password" 26 | 27 | [acme] 28 | # directory_url = "https://acme-v02.api.letsencrypt.org/directory" 29 | account = "user@example.com" 30 | 31 | [domains] 32 | ## IDs on the right hand side represent the ID of the domain in the 33 | ## Alfahosting DNS configuration. It can be acquired by inspecting the 34 | ## DOM on that page. 35 | "*.example.com" = "000000" 36 | # The first domain is the CN all others are aliases 37 | "*.another-domain.com alias.another-domain.com" = "123456" 38 | ``` 39 | 40 | Note, that it needs the email address in order to check for the code that is sent to your email address whenever you try to log in to your alfahosting account from a new browser. 41 | 42 | ## The docker container 43 | 44 | In order for the client to work best and in order to play nice with your ACME provider this container is best run as a weekly cron job. 45 | 46 | ```crontab 47 | 0 0 * * 0 root docker run --rm -v /etc/letsencrypt:/etc/letsencrypt -v /etc/certbot-alfahosting:/etc/certbot-alfahosting m3t4lukas/certbot-alfahosting:latest 48 | ``` 49 | 50 | Please feel free to randomize the numbers set to zero in this example as to not hit the letsencrypt servers with too high of a load at that time. 51 | 52 | 53 | -------------------------------------------------------------------------------- /cargo-scripts/build.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | 3 | pub fn main() { 4 | if let Ok(profile) = env::var("PROFILE") { 5 | println!("cargo:rustc-cfg=build=\"{}\"", profile.as_str()); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /developer.md: -------------------------------------------------------------------------------- 1 | # How to run 2 | 3 | Create a file `tryout/config.toml`. Configure this one according to the readme. -------------------------------------------------------------------------------- /scripts/build-prod.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | WORKDIR="$( cd "$(dirname "$0")"/.. ; pwd -P )" 4 | 5 | docker run --name build_certbot-alfahosting \ 6 | -v "$WORKDIR:/root/src" \ 7 | --rm -i -t -w=/root/src rust:1-stretch \ 8 | cargo build --release --target=x86_64-unknown-linux-gnu 9 | 10 | docker build -t certbot-alfahosting "$WORKDIR" 11 | -------------------------------------------------------------------------------- /scripts/run-tryout.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | WORKDIR="$( cd "$(dirname "$0")"/.. ; pwd -P )" 4 | 5 | cargo run 6 | -------------------------------------------------------------------------------- /src/browse.rs: -------------------------------------------------------------------------------- 1 | extern crate rand; 2 | 3 | use crate::config::AlfahostingConfig; 4 | 5 | use headless_chrome::browser::tab::Tab; 6 | use std::sync::Arc; 7 | 8 | pub fn browse_alfahosting_signin(tab: &Arc, config: &AlfahostingConfig) { 9 | tab.navigate_to("https://alfahosting.de/kunden-login/") 10 | .unwrap(); 11 | tab.wait_until_navigated().unwrap(); 12 | let accept_cookie_button = tab 13 | .find_element("[data-cookiefirst-button=\"primary\"]") 14 | .unwrap(); 15 | accept_cookie_button.click().unwrap(); 16 | std::thread::sleep(std::time::Duration::from_millis( 17 | 5_000 + (rand::random::() % 3_000), 18 | )); 19 | let form_login = tab.find_element("#loginForm").unwrap(); 20 | let input_username = tab.find_element("#username").unwrap(); 21 | let input_password = tab.find_element("#password").unwrap(); 22 | let submit_button = tab 23 | .find_element("#loginForm input[type=\"submit\"]") 24 | .unwrap(); 25 | tab.press_key("PageDown").unwrap(); 26 | std::thread::sleep(std::time::Duration::from_millis(500)); 27 | form_login.scroll_into_view().unwrap(); 28 | input_username.type_into(config.username.as_ref()).unwrap(); 29 | input_password.type_into(config.password.as_ref()).unwrap(); 30 | submit_button.click().unwrap(); 31 | std::thread::sleep(std::time::Duration::from_millis( 32 | 5_000 + (rand::random::() % 5_000), 33 | )); 34 | if browse_alfahosting_is_login_error(&tab) { 35 | panic!("The provided username or password was not correct."); 36 | } 37 | } 38 | 39 | pub fn browse_alfahosting_check_login_protection(tab: &Arc) -> bool { 40 | match tab.find_element("#loginProtectionForm") { 41 | Ok(_f) => true, 42 | Err(_e) => false, 43 | } 44 | } 45 | 46 | pub fn browse_alfahosting_solve_login_protection(tab: &Arc, protection_code: String) { 47 | let form_protection = tab.find_element("#loginProtectionForm").unwrap(); 48 | let input_code = tab.find_element("#loginProtectionForm #code").unwrap(); 49 | let submit_button = tab 50 | .find_element("#loginProtectionForm input[type=\"submit\"]") 51 | .unwrap(); 52 | tab.press_key("PageDown").unwrap(); 53 | std::thread::sleep(std::time::Duration::from_millis( 54 | 500 + (rand::random::() % 500), 55 | )); 56 | form_protection.scroll_into_view().unwrap(); 57 | input_code.type_into(protection_code.as_ref()).unwrap(); 58 | submit_button.click().unwrap(); 59 | std::thread::sleep(std::time::Duration::from_millis( 60 | 5_000 + (rand::random::() % 5_000), 61 | )); 62 | if browse_alfahosting_is_login_error(&tab) { 63 | panic!("The provided code was incorrect."); 64 | } 65 | } 66 | 67 | fn browse_alfahosting_is_login_error(tab: &Arc) -> bool { 68 | match tab.find_element("#login.errorSection") { 69 | Ok(_f) => true, 70 | Err(_e) => false, 71 | } 72 | } 73 | 74 | pub fn browse_alfahosting_dns(tab: &Arc, config: &AlfahostingConfig) { 75 | tab.navigate_to( 76 | (String::from("https://secure.alfahosting.de/kunden/index.php/Kundencenter:Tarife?ipid=") 77 | + config.ipid.as_ref()) 78 | .as_ref(), 79 | ) 80 | .unwrap(); 81 | tab.wait_until_navigated().unwrap(); 82 | std::thread::sleep(std::time::Duration::from_millis( 83 | 2_000 + (rand::random::() % 3_000), 84 | )); 85 | tab.navigate_to( 86 | "https://secure.alfahosting.de/kunden/index.php/Kundencenter:Tarife/Details#dns", 87 | ) 88 | .unwrap(); 89 | std::thread::sleep(std::time::Duration::from_millis( 90 | 2_000 + (rand::random::() % 3_000), 91 | )); 92 | let button_continue = tab.find_element("#dns_layer a").unwrap(); 93 | button_continue.click().unwrap(); 94 | std::thread::sleep(std::time::Duration::from_millis( 95 | 2_000 + (rand::random::() % 3_000), 96 | )); 97 | } 98 | 99 | pub fn browse_alfahosting_domain_create_acme( 100 | tab: &Arc, 101 | id: String, 102 | domain: String, 103 | text: String, 104 | ) { 105 | let body = tab.find_element("body").unwrap(); 106 | dns_open_domain_and_scroll_into_view(tab, &id); 107 | body.call_js_fn( 108 | format!( 109 | "function () {{document.fire('dns:add_zonelist', {});return false;}}", 110 | id 111 | ) 112 | .as_str(), 113 | false, 114 | ) 115 | .unwrap(); 116 | std::thread::sleep(std::time::Duration::from_millis( 117 | 500 + (rand::random::() % 500), 118 | )); 119 | let input_zonedata = tab.find_element("#zonelist_pattern").unwrap(); 120 | // _acme-challenge.novitaslaboratories.com. IN TXT "this is just a manual test" 121 | input_zonedata 122 | .type_into(format!("_acme-challenge.{}. IN TXT \"{}\"", domain, text).as_str()) 123 | .unwrap(); 124 | std::thread::sleep(std::time::Duration::from_millis( 125 | 500 + (rand::random::() % 500), 126 | )); 127 | body.call_js_fn( 128 | "function () {document.fire('dns:exec_zonelist_add');return false;}", 129 | false, 130 | ) 131 | .unwrap(); 132 | overwrite_window_popups(tab); 133 | dns_save(tab, &id); 134 | dns_close_domain(tab, &id); 135 | } 136 | 137 | pub fn browse_alfahosting_domain_delete_last_dns_entry(tab: &Arc, id: String) { 138 | dns_open_domain_and_scroll_into_view(tab, &id); 139 | overwrite_window_popups(tab); 140 | let last_entry_id = tab 141 | .find_elements(format!("#dns_entries_{} .dns_entry", id).as_str()) 142 | .unwrap() 143 | .iter() 144 | .fold(String::new(), |current, elem| { 145 | if let Some(attributes) = elem.get_attributes().unwrap() { 146 | if let Some(new_id) = attributes.get("id") { 147 | return new_id.clone(); 148 | } 149 | } 150 | current 151 | }); 152 | let button_delete = tab 153 | .find_element(format!("#{} .dns_entry_action", last_entry_id).as_str()) 154 | .unwrap(); 155 | button_delete.click().unwrap(); 156 | dns_save(tab, &id); 157 | dns_close_domain(tab, &id); 158 | } 159 | 160 | fn dns_open_domain_and_scroll_into_view(tab: &Arc, id: &str) { 161 | let header = tab.find_element(format!("#hdr{}", id).as_str()).unwrap(); 162 | tab.press_key("PageDown").unwrap(); 163 | std::thread::sleep(std::time::Duration::from_millis( 164 | 500 + (rand::random::() % 500), 165 | )); 166 | header.scroll_into_view().unwrap(); 167 | header.click().unwrap(); 168 | tab.press_key("PageDown").unwrap(); 169 | std::thread::sleep(std::time::Duration::from_millis( 170 | 500 + (rand::random::() % 500), 171 | )); 172 | header.scroll_into_view().unwrap(); 173 | } 174 | 175 | fn dns_close_domain(tab: &Arc, id: &str) { 176 | let header = tab.find_element(format!("#hdr{}", id).as_str()).unwrap(); 177 | header.click().unwrap(); 178 | std::thread::sleep(std::time::Duration::from_millis( 179 | 500 + (rand::random::() % 500), 180 | )); 181 | } 182 | 183 | fn overwrite_window_popups(tab: &Arc) { 184 | let body = tab.find_element("body").unwrap(); 185 | body.call_js_fn( 186 | "function () {window.confirm = function myConfirm() {return true;}}", 187 | false, 188 | ) 189 | .unwrap(); 190 | body.call_js_fn( 191 | "function () {window.alert = function myAlert() {return true;}}", 192 | false, 193 | ) 194 | .unwrap(); 195 | std::thread::sleep(std::time::Duration::from_millis( 196 | 500 + (rand::random::() % 176), 197 | )); 198 | } 199 | 200 | fn dns_save(tab: &Arc, id: &str) { 201 | let body = tab.find_element("body").unwrap(); 202 | body.call_js_fn( 203 | format!( 204 | "function () {{document.fire('dns:save_records',{});return false;}}", 205 | id 206 | ) 207 | .as_str(), 208 | false, 209 | ) 210 | .unwrap(); 211 | std::thread::sleep(std::time::Duration::from_millis( 212 | 2_000 + (rand::random::() % 3_000), 213 | )); 214 | } 215 | -------------------------------------------------------------------------------- /src/certbot.rs: -------------------------------------------------------------------------------- 1 | extern crate acme_lib; 2 | 3 | use crate::browse::{ 4 | browse_alfahosting_domain_create_acme, browse_alfahosting_domain_delete_last_dns_entry, 5 | }; 6 | use crate::config::{AcmeConfig, Certpath}; 7 | use acme_lib::create_p384_key; 8 | use acme_lib::order::{CsrOrder, NewOrder}; 9 | use acme_lib::persist::FilePersist; 10 | use acme_lib::{Certificate, Directory, DirectoryUrl, Error}; 11 | use headless_chrome::browser::tab::Tab; 12 | use std::fs::{create_dir_all, OpenOptions}; 13 | use std::io::Write; 14 | use std::os::unix::fs::OpenOptionsExt; 15 | use std::sync::Arc; 16 | 17 | pub fn request_cert( 18 | certpath: &Certpath, 19 | config: &AcmeConfig, 20 | names: &str, 21 | alfahosting_id: &str, 22 | tab: &Arc, 23 | ) -> Result<(), Error> { 24 | let names_arr: Vec<&str> = names.split(' ').collect(); 25 | let (primary, alt) = names_arr.split_first().unwrap(); 26 | let url = DirectoryUrl::Other(config.directory_url.0.as_str()); 27 | 28 | #[cfg(not(build = "release"))] 29 | let persist_path = String::from(certpath.0.as_str()) 30 | + "/accounts/acme-staging-v02.api.letsencrypt.org/directory"; 31 | #[cfg(build = "release")] 32 | let persist_path = 33 | String::from(certpath.0.as_str()) + "/accounts/acme-v01.api.letsencrypt.org/directory"; 34 | create_dir_all(persist_path.as_str()).unwrap(); 35 | // Save/load keys and certificates to current dir. 36 | let persist = FilePersist::new(persist_path.as_str()); 37 | 38 | // Create a directory entrypoint. 39 | let dir = Directory::from_url(persist, url)?; 40 | 41 | let acc = dir.account(config.account.as_ref())?; 42 | 43 | if let Some(cert) = acc.certificate(primary)? { 44 | if cert.valid_days_left() > 30 { 45 | save_cert_to_live(certpath.0.as_str(), primary, &cert); 46 | println!("Certificate \"{}\" does not need to be renewed.", primary); 47 | return Ok(()); 48 | } 49 | } 50 | 51 | let ord_new = acc.new_order(primary, &alt)?; 52 | 53 | let ord_csr = do_challenges(names, tab, alfahosting_id, ord_new)?; 54 | let (pkey_pri, pkey_pub) = create_p384_key(); 55 | let ord_cert = ord_csr.finalize_pkey(pkey_pri, pkey_pub, 5000)?; 56 | let cert = ord_cert.download_and_save_cert()?; 57 | 58 | // TODO archive old certs 59 | 60 | save_cert_to_live(certpath.0.as_str(), primary, &cert); 61 | 62 | println!("Certificate \"{}\" has been successfully renewed.", primary); 63 | Ok(()) 64 | } 65 | 66 | fn do_challenges( 67 | names: &str, 68 | tab: &Arc, 69 | alfahosting_id: &str, 70 | mut ord_new: NewOrder, 71 | ) -> Result, Error> { 72 | loop { 73 | // are we done? 74 | if let Some(ord_csr) = ord_new.confirm_validations() { 75 | break Ok(ord_csr); 76 | } 77 | 78 | // Get the possible authorizations 79 | for auth in ord_new.authorizations()? { 80 | if auth.need_challenge() { 81 | let mut retries = 5; 82 | while retries != 0 { 83 | let chall = auth.dns_challenge(); 84 | browse_alfahosting_domain_create_acme( 85 | tab, 86 | String::from(alfahosting_id), 87 | String::from(auth.domain_name()), 88 | chall.dns_proof(), 89 | ); 90 | std::thread::sleep(std::time::Duration::from_millis(5_000)); 91 | let result_chall = chall.validate(0); 92 | match result_chall.as_ref() { 93 | Ok(_v) => { 94 | browse_alfahosting_domain_delete_last_dns_entry( 95 | tab, 96 | String::from(alfahosting_id), 97 | ); 98 | break; 99 | } 100 | Err(error) => { 101 | browse_alfahosting_domain_delete_last_dns_entry( 102 | tab, 103 | String::from(alfahosting_id), 104 | ); 105 | retries -= 1; 106 | match error { 107 | Error::ApiProblem(e) => println!("An api error occured while trying to validate dns challenge for \"{}\" (retrying {} times): {}", names, retries, e), 108 | Error::Base64Decode(e) => println!("A base64 error occured while trying to validate dns challenge for \"{}\" (retrying {} times): {}", names, retries, e), 109 | Error::Call(e) => println!("A call error occured while trying to validate dns challenge for \"{}\" (retrying {} times): {}", names, retries, e), 110 | Error::Io(e) => println!("An I/O error occured while trying to validate dns challenge for \"{}\" (retrying {} times): {}", names, retries, e), 111 | Error::Json(e) => println!("A json error occured while trying to validate dns challenge for \"{}\" (retrying {} times): {}", names, retries, e), 112 | Error::Other(e) => println!("An undefined error occured while trying to validate dns challenge for \"{}\" (retrying {} times): {}", names, retries, e), 113 | } 114 | if retries == 0 { 115 | if let Err(e) = result_chall { 116 | return Err(e); 117 | } 118 | } 119 | } 120 | } 121 | } 122 | } 123 | } 124 | ord_new.refresh()?; 125 | } 126 | } 127 | 128 | fn save_cert_to_live(certpath: &str, primary: &str, cert: &Certificate) { 129 | let save_path = String::from(certpath) + format!("/live/{}", primary).as_str(); 130 | create_dir_all(save_path.as_str()).unwrap(); 131 | OpenOptions::new() 132 | .write(true) 133 | .create(true) 134 | .mode(0o640) 135 | .open(String::from(&save_path) + "/fullchain.pem") 136 | .unwrap() 137 | .write_all(cert.certificate().as_bytes()) 138 | .unwrap(); 139 | OpenOptions::new() 140 | .write(true) 141 | .create(true) 142 | .mode(0o640) 143 | .open(String::from(&save_path) + "/privkey.pem") 144 | .unwrap() 145 | .write_all(cert.private_key().as_bytes()) 146 | .unwrap(); 147 | let fullchain_arr: Vec<&str> = cert.certificate().split("\n\n").collect(); 148 | let (singlecert, chain) = fullchain_arr.split_first().unwrap(); 149 | OpenOptions::new() 150 | .write(true) 151 | .create(true) 152 | .mode(0o640) 153 | .open(String::from(&save_path) + "/cert.pem") 154 | .unwrap() 155 | .write_all(singlecert.as_bytes()) 156 | .unwrap(); 157 | OpenOptions::new() 158 | .write(true) 159 | .create(true) 160 | .mode(0o640) 161 | .open(String::from(&save_path) + "/chain.pem") 162 | .unwrap() 163 | .write_all(chain.join("\n\n").as_bytes()) 164 | .unwrap(); 165 | } 166 | -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | extern crate serde; 2 | extern crate toml; 3 | 4 | use serde::{Deserialize, Serialize}; 5 | use toml::value::Table; 6 | 7 | pub fn load_config(path: &str) -> Result> { 8 | let config_string: String = std::fs::read_to_string(path)?; 9 | let config: Configuration = toml::from_str(config_string.as_ref()).unwrap(); 10 | Ok(config) 11 | } 12 | 13 | #[derive(Serialize, Deserialize, Debug)] 14 | pub struct Configuration { 15 | #[serde(default)] 16 | pub certpath: Certpath, 17 | pub alfahosting: AlfahostingConfig, 18 | pub imap: ImapConfig, 19 | pub acme: AcmeConfig, 20 | pub domains: Option, 21 | } 22 | 23 | #[derive(Serialize, Deserialize, Debug)] 24 | pub struct Certpath(pub String); 25 | 26 | impl Default for Certpath { 27 | #[cfg(not(build = "release"))] 28 | fn default() -> Self { 29 | Certpath("./tryout/letsencrypt".to_string()) 30 | } 31 | 32 | #[cfg(build = "release")] 33 | fn default() -> Self { 34 | Certpath("/etc/letsencrypt".to_string()) 35 | } 36 | } 37 | 38 | #[derive(Serialize, Deserialize, Debug)] 39 | pub struct AlfahostingConfig { 40 | pub username: String, 41 | pub password: String, 42 | pub ipid: String, 43 | } 44 | 45 | #[derive(Serialize, Deserialize, Debug)] 46 | pub struct ImapConfig { 47 | pub domain: String, 48 | pub port: u16, 49 | pub username: String, 50 | pub password: String, 51 | } 52 | 53 | #[derive(Serialize, Deserialize, Debug)] 54 | pub struct AcmeConfig { 55 | #[serde(default)] 56 | pub directory_url: DirectoryUrl, 57 | pub account: String, 58 | } 59 | 60 | #[derive(Serialize, Deserialize, Debug)] 61 | pub struct DirectoryUrl(pub String); 62 | 63 | impl Default for DirectoryUrl { 64 | #[cfg(not(build = "release"))] 65 | fn default() -> Self { 66 | DirectoryUrl("https://acme-staging-v02.api.letsencrypt.org/directory".to_string()) 67 | } 68 | 69 | #[cfg(build = "release")] 70 | fn default() -> Self { 71 | DirectoryUrl("https://acme-v02.api.letsencrypt.org/directory".to_string()) 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/imap.rs: -------------------------------------------------------------------------------- 1 | extern crate imap; 2 | extern crate native_tls; 3 | extern crate regex; 4 | 5 | use crate::config::ImapConfig; 6 | use regex::Regex; 7 | use std::error::Error; 8 | 9 | pub fn get_code_from_inbox(config: &ImapConfig) -> Result> { 10 | let domain: &str = config.domain.as_ref(); 11 | let tls = native_tls::TlsConnector::builder().build().unwrap(); 12 | let client = imap::connect((domain, config.port), domain, &tls).unwrap(); 13 | let mut imap_session = client 14 | .login(config.username.to_string(), config.password.to_string()) 15 | .map_err(|e| e.0)?; 16 | // imap_session.select("INBOX").unwrap(); 17 | let inbox = imap_session.examine("INBOX").unwrap(); 18 | let highest_uid = inbox.exists; 19 | for i in 0..20 { 20 | let uid = highest_uid - i; 21 | let messages = imap_session.fetch(uid.to_string(), "(ENVELOPE RFC822.TEXT)")?; 22 | for message in messages.iter() { 23 | if let Some(s) = handle_message(message) { 24 | return Ok(s); 25 | } 26 | } 27 | } 28 | imap_session.logout()?; 29 | Ok(String::from("test")) 30 | } 31 | 32 | fn handle_message(message: &imap::types::Fetch) -> Option { 33 | let envelope = message.envelope().unwrap(); 34 | if envelope.subject.unwrap() == "=?UTF-8?Q?Alfahosting_-_Anmeldung_von_einem_neuen_Ger=C3=A4t?=" 35 | { 36 | let body = std::str::from_utf8(message.text().unwrap()) 37 | .unwrap() 38 | .to_string(); 39 | // println!( 40 | // "Subject is: {}\nSender is: {:?}\nBody is: {:?}", 41 | // envelope.subject.unwrap(), 42 | // envelope.sender, 43 | // body, 44 | // ); 45 | let re = Regex::new(r"\s{2}(?P\d{6})\s{2}").unwrap(); 46 | let caps = re.captures(body.as_ref()).unwrap(); 47 | return Some(String::from(&caps["code"])); 48 | } 49 | None 50 | } 51 | 52 | #[derive(Debug)] 53 | struct ImapError(String); 54 | 55 | impl std::fmt::Display for ImapError { 56 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 57 | write!(f, "{}", self.0) 58 | } 59 | } 60 | 61 | impl Error for ImapError { 62 | fn description(&self) -> &str { 63 | self.0.as_ref() 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | extern crate headless_chrome; 2 | extern crate rand; 3 | extern crate toml; 4 | 5 | mod browse; 6 | mod certbot; 7 | mod config; 8 | mod imap; 9 | 10 | use crate::browse::{ 11 | browse_alfahosting_check_login_protection, browse_alfahosting_dns, browse_alfahosting_signin, 12 | browse_alfahosting_solve_login_protection, 13 | }; 14 | use crate::certbot::request_cert; 15 | use crate::config::{ 16 | load_config, AcmeConfig, AlfahostingConfig, Certpath, Configuration, DirectoryUrl, ImapConfig, 17 | }; 18 | use crate::imap::get_code_from_inbox; 19 | use headless_chrome::{Browser, LaunchOptionsBuilder}; 20 | use toml::value::{Table, Value}; 21 | 22 | #[cfg(not(build = "release"))] 23 | const CONFIG_FILE_PATH: &str = "./tryout/config.toml"; 24 | 25 | #[cfg(build = "release")] 26 | const CONFIG_FILE_PATH: &str = "/etc/certbot-alfahosting/config.toml"; 27 | 28 | fn main() { 29 | // test_config(); 30 | println!("Starting certbot-alfahosting..."); 31 | let config: Configuration = load_config(CONFIG_FILE_PATH).unwrap(); 32 | if let Some(domains) = config.domains { 33 | let browser = configure_browser(); 34 | println!("Browser has been configured."); 35 | let tab = browser.wait_for_initial_tab().unwrap(); 36 | println!("Successfully opened initial tab."); 37 | browse_alfahosting_signin(&tab, &config.alfahosting); 38 | if browse_alfahosting_check_login_protection(&tab) { 39 | std::thread::sleep(std::time::Duration::from_millis( 40 | 15_000 + (rand::random::() % 15_000), 41 | )); 42 | let code: String = match get_code_from_inbox(&config.imap) { 43 | Ok(code) => code, 44 | Err(err) => panic!( 45 | "An error occured while trying to authenticate at IMAP server: {:?}", 46 | err 47 | ), 48 | }; 49 | browse_alfahosting_solve_login_protection(&tab, code); 50 | } 51 | println!("Successfully logged into alfahosting account."); 52 | browse_alfahosting_dns(&tab, &config.alfahosting); 53 | println!("Alfahosting DNS view successfully initialized."); 54 | for (names, value_alfahosting_id) in domains { 55 | match value_alfahosting_id { 56 | toml::Value::Array(_v) => { 57 | println!("Invalid type for domains \"{}\". Must be a string.", names) 58 | } 59 | toml::Value::Boolean(_v) => { 60 | println!("Invalid type for domains \"{}\". Must be a string.", names) 61 | } 62 | toml::Value::Datetime(_v) => { 63 | println!("Invalid type for domains \"{}\". Must be a string.", names) 64 | } 65 | toml::Value::Float(_v) => { 66 | println!("Invalid type for domains \"{}\". Must be a string.", names) 67 | } 68 | toml::Value::Integer(_v) => { 69 | println!("Invalid type for domains \"{}\". Must be a string.", names) 70 | } 71 | toml::Value::Table(_v) => { 72 | println!("Invalid type for domains \"{}\". Must be a string.", names) 73 | } 74 | toml::Value::String(alfahosting_id) => { 75 | if let Err(e) = request_cert( 76 | &config.certpath, 77 | &config.acme, 78 | names.as_str(), 79 | alfahosting_id.as_str(), 80 | &tab, 81 | ) { 82 | println!( 83 | "An error occured while getting certificate for \"{}\": {}", 84 | names, e 85 | ); 86 | } 87 | } 88 | } 89 | std::thread::sleep(std::time::Duration::from_millis(30_000)); 90 | } 91 | } 92 | } 93 | 94 | fn configure_browser() -> Browser { 95 | // let browser: Browser = Browser::default().unwrap(); 96 | let mut lob = LaunchOptionsBuilder::default(); 97 | lob.idle_browser_timeout(std::time::Duration::from_millis(300_000)); 98 | lob.headless(true); 99 | lob.sandbox(false); 100 | lob.port(Some(8467)); 101 | match Browser::new(lob.build().unwrap()) { 102 | Ok(browser) => browser, 103 | Err(err) => panic!("{}", err.as_fail()), 104 | } 105 | } 106 | 107 | #[allow(dead_code)] 108 | fn test_config() { 109 | let mut domains = Table::new(); 110 | domains.insert( 111 | String::from("example.com"), 112 | Value::String(String::from("123456")), 113 | ); 114 | let config = Configuration { 115 | certpath: Certpath(String::from(".")), 116 | alfahosting: AlfahostingConfig { 117 | username: String::from("testuser"), 118 | password: String::from("testpass"), 119 | ipid: String::from("123456"), 120 | }, 121 | imap: ImapConfig { 122 | domain: String::from("imap.example.com"), 123 | port: 993, 124 | username: String::from("username"), 125 | password: String::from("password"), 126 | }, 127 | acme: AcmeConfig { 128 | directory_url: DirectoryUrl(String::from( 129 | "https://acme-staging-v02.api.letsencrypt.org/directory", 130 | )), 131 | account: String::from("user@example.com"), 132 | }, 133 | domains: Some(domains), 134 | }; 135 | 136 | println!("{:?}", config); 137 | 138 | // Convert the Configuration to a TOML string. 139 | let serialized = toml::to_string(&config).unwrap(); 140 | 141 | println!("{}", serialized); 142 | } 143 | --------------------------------------------------------------------------------