From 0bbd0499aa012612921d71a6076f0da5d91f7dc0 Mon Sep 17 00:00:00 2001 From: James Westman Date: Tue, 24 May 2022 12:28:07 -0500 Subject: [PATCH] Add storefront-info-endpoint configuration If this configuration option is present, this endpoint will be used to get information about each app when it is uploaded. It can be used to validate or modify appstream files and to set the token type of the commit. --- .github/workflows/ci.yml | 16 +- Cargo.lock | 1359 +++++++++++++++++++++++++++++++------- Cargo.toml | 6 +- src/app.rs | 1 + src/jobs.rs | 186 +++++- src/lib.rs | 1 + src/storefront.rs | 371 +++++++++++ 7 files changed, 1684 insertions(+), 256 deletions(-) create mode 100644 src/storefront.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b76c73..feaed28 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,7 @@ name: Continuous integration jobs: check: name: Check - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -13,13 +13,15 @@ jobs: profile: minimal toolchain: stable override: true + - name: Install dependencies + run: sudo apt-get install -y libostree-dev - uses: actions-rs/cargo@v1 with: command: check test: name: Test Suite - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -27,13 +29,15 @@ jobs: profile: minimal toolchain: stable override: true + - name: Install dependencies + run: sudo apt-get install -y libostree-dev - uses: actions-rs/cargo@v1 with: command: test end-to-end: name: End-to-end upload test - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 @@ -50,7 +54,7 @@ jobs: fmt: name: Rustfmt - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -66,7 +70,7 @@ jobs: clippy: name: Clippy - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -75,6 +79,8 @@ jobs: toolchain: stable override: true components: clippy + - name: Install dependencies + run: sudo apt-get install -y libostree-dev - uses: actions-rs/cargo@v1 with: command: clippy diff --git a/Cargo.lock b/Cargo.lock index e66df85..ab8d7b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,7 +10,7 @@ checksum = "6c616db5fa4b0c40702fb75201c2af7f8aa8f3a2e2c1dda3b0655772aa949666" dependencies = [ "actix_derive 0.3.2", "bitflags", - "bytes", + "bytes 0.4.12", "crossbeam-channel", "failure", "fnv", @@ -19,7 +19,7 @@ dependencies = [ "log", "parking_lot 0.7.1", "smallvec 0.6.14", - "tokio", + "tokio 0.1.22", "tokio-codec", "tokio-executor", "tokio-io", @@ -42,7 +42,7 @@ dependencies = [ "actix-rt", "actix_derive 0.4.0", "bitflags", - "bytes", + "bytes 0.4.12", "crossbeam-channel", "derive_more 0.14.1", "futures", @@ -65,7 +65,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f2c11af4b06dc935d8e1b1491dad56bfb32febc49096a91e773f8535c176453" dependencies = [ - "bytes", + "bytes 0.4.12", "futures", "log", "tokio-codec", @@ -85,7 +85,7 @@ dependencies = [ "derive_more 0.15.0", "either", "futures", - "http", + "http 0.1.21", "log", "tokio-current-thread", "tokio-tcp", @@ -102,7 +102,7 @@ dependencies = [ "actix-service", "actix-web", "bitflags", - "bytes", + "bytes 0.4.12", "derive_more 0.15.0", "futures", "log", @@ -127,7 +127,7 @@ dependencies = [ "base64 0.10.1", "bitflags", "brotli2", - "bytes", + "bytes 0.4.12", "chrono", "copyless", "derive_more 0.15.0", @@ -136,9 +136,9 @@ dependencies = [ "failure", "flate2", "futures", - "h2", + "h2 0.1.26", "hashbrown 0.6.3", - "http", + "http 0.1.21", "httparse", "indexmap", "language-tags", @@ -150,7 +150,7 @@ dependencies = [ "regex", "serde", "serde_json", - "serde_urlencoded", + "serde_urlencoded 0.6.1", "sha1", "slab", "time", @@ -168,7 +168,7 @@ checksum = "d91f0604a1bf3e628b4c3f516f07280f33a33cece27df514227f5ec30925bb55" dependencies = [ "actix-service", "actix-web", - "bytes", + "bytes 0.4.12", "derive_more 0.15.0", "futures", "httparse", @@ -185,21 +185,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bebfbe6629e0131730746718c9e032b58f02c6ce06ed7c982b9fef6c8545acd" dependencies = [ "actix 0.7.9", - "bytes", + "bytes 0.4.12", "futures", "log", - "mio", + "mio 0.6.23", "net2", "num_cpus", "slab", - "tokio", + "tokio 0.1.22", "tokio-codec", "tokio-current-thread", "tokio-io", "tokio-reactor", "tokio-tcp", "tokio-timer", - "tower-service", + "tower-service 0.1.0", "trust-dns-resolver 0.10.3", ] @@ -209,8 +209,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23224bb527e204261d0291102cb9b52713084def67d94f7874923baefe04ccf7" dependencies = [ - "bytes", - "http", + "bytes 0.4.12", + "http 0.1.21", "log", "regex", "serde", @@ -243,7 +243,7 @@ dependencies = [ "actix-service", "futures", "log", - "mio", + "mio 0.6.23", "net2", "num_cpus", "slab", @@ -314,7 +314,7 @@ checksum = "908c3109948f5c37a8b57fd343a37dcad5bb1d90bfd06300ac96b17bbe017b95" dependencies = [ "actix-codec", "actix-service", - "bytes", + "bytes 0.4.12", "either", "futures", "log", @@ -340,7 +340,7 @@ dependencies = [ "actix-utils", "actix-web-codegen", "awc", - "bytes", + "bytes 0.4.12", "derive_more 0.15.0", "encoding_rs", "futures", @@ -352,7 +352,7 @@ dependencies = [ "regex", "serde", "serde_json", - "serde_urlencoded", + "serde_urlencoded 0.6.1", "time", "url 2.2.2", ] @@ -367,7 +367,7 @@ dependencies = [ "actix-codec", "actix-http", "actix-web", - "bytes", + "bytes 0.4.12", "futures", ] @@ -377,9 +377,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "068a33520e21c1eea89726be4d6b3ce2e6b81046904367e1677287695a043abb" dependencies = [ - "proc-macro2 1.0.36", - "quote 1.0.14", - "syn 1.0.85", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", ] [[package]] @@ -437,12 +437,24 @@ dependencies = [ "memchr", ] +[[package]] +name = "anyhow" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" + [[package]] name = "argparse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f8ebf5827e4ac4fd5946560e6a99776ea73b596d80898f357007317a7141e47" +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + [[package]] name = "askama" version = "0.7.2" @@ -475,7 +487,7 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "toml", + "toml 0.4.10", ] [[package]] @@ -491,15 +503,18 @@ dependencies = [ [[package]] name = "autocfg" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" +checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" +dependencies = [ + "autocfg 1.1.0", +] [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "awc" @@ -511,7 +526,7 @@ dependencies = [ "actix-http", "actix-service", "base64 0.10.1", - "bytes", + "bytes 0.4.12", "derive_more 0.15.0", "futures", "log", @@ -520,15 +535,15 @@ dependencies = [ "rand 0.7.3", "serde", "serde_json", - "serde_urlencoded", + "serde_urlencoded 0.6.1", "tokio-timer", ] [[package]] name = "backtrace" -version = "0.3.63" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321629d8ba6513061f26707241fa9bc89524ff1cd7a915a97ef0c62c666ce1b6" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" dependencies = [ "addr2line", "cc", @@ -588,9 +603,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.9.1" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" [[package]] name = "byteorder" @@ -608,11 +623,26 @@ dependencies = [ "iovec", ] +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + [[package]] name = "cc" -version = "1.0.72" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-expr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e" +dependencies = [ + "smallvec 1.8.0", +] [[package]] name = "cfg-if" @@ -665,7 +695,7 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "615f6e27d000a2bffbc7f2f6a8669179378fa27ee4d0a509e985dfc0a7defb40" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.6", "lazy_static", "proc-macro-hack", "tiny-keccak", @@ -677,11 +707,27 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "crc32fast" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if 1.0.0", ] @@ -712,7 +758,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "cfg-if 0.1.10", "crossbeam-utils 0.7.2", "lazy_static", @@ -757,7 +803,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "cfg-if 0.1.10", "lazy_static", ] @@ -815,9 +861,9 @@ version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" dependencies = [ - "proc-macro2 1.0.36", - "quote 1.0.14", - "syn 1.0.85", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", ] [[package]] @@ -848,11 +894,21 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "elementtree" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6319c9433cf1e95c60c8533978bccf0614f27f03bb4e514253468eeeaa7fe3" +dependencies = [ + "string_cache", + "xml-rs", +] + [[package]] name = "encoding_rs" -version = "0.8.30" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ "cfg-if 1.0.0", ] @@ -906,30 +962,30 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "proc-macro2 1.0.36", - "quote 1.0.14", - "syn 1.0.85", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", "synstructure", ] [[package]] name = "fastrand" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779d043b6a0b90cc4c0ed7ee380a6504394cee7efd7db050e3774eee387324b2" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" dependencies = [ "instant", ] [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.10", + "redox_syscall 0.2.13", "winapi 0.3.9", ] @@ -951,14 +1007,16 @@ dependencies = [ "awc", "base64 0.13.0", "byteorder", - "bytes", + "bytes 0.4.12", "chrono", "diesel", "diesel_migrations", "dotenv", + "elementtree", "env_logger", "failure", "filetime", + "flate2", "futures", "futures-fs", "futures-locks", @@ -968,14 +1026,16 @@ dependencies = [ "log", "mpart-async", "num_cpus", + "ostree", "r2d2", - "rand 0.8.4", + "rand 0.8.5", + "reqwest", "serde", "serde_derive", "serde_json", "tempfile", "time", - "tokio", + "tokio 0.1.22", "tokio-process", "tokio-signal", "walkdir", @@ -983,14 +1043,11 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if 1.0.0", "crc32fast", - "libc", - "miniz-sys", "miniz_oxide", ] @@ -1000,6 +1057,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.0.1" @@ -1038,6 +1110,21 @@ version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + [[package]] name = "futures-cpupool" version = "0.1.8" @@ -1048,17 +1135,34 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "futures-executor" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-fs" version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b9f2aeb603383051bab2898cb253a0efed9b590582d0b7baaa0b25de2a536d5" dependencies = [ - "bytes", + "bytes 0.4.12", "futures", "futures-cpupool", ] +[[package]] +name = "futures-io" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" + [[package]] name = "futures-locks" version = "0.3.3" @@ -1070,6 +1174,33 @@ dependencies = [ "tokio-executor", ] +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-core", + "futures-io", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -1083,9 +1214,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1098,6 +1229,91 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +[[package]] +name = "gio" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711c3632b3ebd095578a9c091418d10fed492da9443f58ebc8f45efbeb215cb0" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi 0.3.9", +] + +[[package]] +name = "glib" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c515f1e62bf151ef6635f528d05b02c11506de986e43b34a5c920ef0b3796a4" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec 1.8.0", +] + +[[package]] +name = "glib-macros" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", +] + +[[package]] +name = "glib-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "gobject-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + [[package]] name = "h2" version = "0.1.26" @@ -1105,10 +1321,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" dependencies = [ "byteorder", - "bytes", + "bytes 0.4.12", "fnv", "futures", - "http", + "http 0.1.21", "indexmap", "log", "slab", @@ -1116,6 +1332,25 @@ dependencies = [ "tokio-io", ] +[[package]] +name = "h2" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +dependencies = [ + "bytes 1.1.0", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.8", + "indexmap", + "slab", + "tokio 1.19.2", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.3.1" @@ -1129,7 +1364,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" dependencies = [ "ahash", - "autocfg 0.1.7", + "autocfg 0.1.8", ] [[package]] @@ -1138,6 +1373,15 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1170,16 +1414,44 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" dependencies = [ - "bytes", + "bytes 0.4.12", "fnv", "itoa 0.4.8", ] +[[package]] +name = "http" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +dependencies = [ + "bytes 1.1.0", + "fnv", + "itoa 1.0.2", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes 1.1.0", + "http 0.2.8", + "pin-project-lite", +] + [[package]] name = "httparse" -version = "1.5.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "humantime" @@ -1187,6 +1459,43 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "hyper" +version = "0.14.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" +dependencies = [ + "bytes 1.1.0", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.13", + "http 0.2.8", + "http-body", + "httparse", + "httpdate", + "itoa 1.0.2", + "pin-project-lite", + "socket2 0.4.4", + "tokio 1.19.2", + "tower-service 0.3.1", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes 1.1.0", + "hyper", + "native-tls", + "tokio 1.19.2", + "tokio-native-tls", +] + [[package]] name = "idna" version = "0.1.5" @@ -1211,11 +1520,11 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "hashbrown 0.11.2", ] @@ -1244,7 +1553,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08f7eadeaf4b52700de180d147c4805f199854600b36faa963d91114827b2ffc" dependencies = [ "error-chain", - "socket2", + "socket2 0.3.19", "widestring 0.2.2", "winapi 0.3.9", "winreg 0.5.1", @@ -1256,12 +1565,27 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" dependencies = [ - "socket2", + "socket2 0.3.19", "widestring 0.4.3", "winapi 0.3.9", "winreg 0.6.2", ] +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -1270,15 +1594,15 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" dependencies = [ "wasm-bindgen", ] @@ -1321,9 +1645,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.112" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "linked-hash-map" @@ -1361,18 +1685,19 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg 1.1.0", "scopeguard 1.1.0", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", ] @@ -1406,9 +1731,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -1416,7 +1741,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", ] [[package]] @@ -1435,9 +1760,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9753f12909fd8d923f75ae5c3258cae1ed3c8ec052e1b38c93c21a6d157f789c" dependencies = [ "migrations_internals", - "proc-macro2 1.0.36", - "quote 1.0.14", - "syn 1.0.85", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", ] [[package]] @@ -1448,32 +1773,21 @@ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "mime_guess" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" dependencies = [ "mime", "unicase", ] -[[package]] -name = "miniz-sys" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" dependencies = [ "adler", - "autocfg 1.0.1", ] [[package]] @@ -1495,6 +1809,18 @@ dependencies = [ "winapi 0.2.8", ] +[[package]] +name = "mio" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", +] + [[package]] name = "mio-named-pipes" version = "0.1.7" @@ -1502,7 +1828,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" dependencies = [ "log", - "mio", + "mio 0.6.23", "miow 0.3.7", "winapi 0.3.9", ] @@ -1515,7 +1841,7 @@ checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" dependencies = [ "iovec", "libc", - "mio", + "mio 0.6.23", ] [[package]] @@ -1545,7 +1871,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5fc9c36a235da74d4686ebaefe0eeaa3c4460afa95e3a3d95dfcfc9f1e29cd0" dependencies = [ - "bytes", + "bytes 0.4.12", "failure", "futures", "log", @@ -1554,6 +1880,24 @@ dependencies = [ "tokio-fs", ] +[[package]] +name = "native-tls" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "net2" version = "0.2.37" @@ -1565,6 +1909,12 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + [[package]] name = "nom" version = "4.2.3" @@ -1581,28 +1931,28 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "num-integer", "num-traits", ] [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", ] [[package]] @@ -1617,18 +1967,93 @@ dependencies = [ [[package]] name = "object" -version = "0.27.1" +version = "0.28.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.9.0" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" + +[[package]] +name = "openssl" +version = "0.10.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" +dependencies = [ + "autocfg 1.1.0", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ostree" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1216f3647b8b60b5c74f78548c584b3ec69fe004aeed959490b16c8262da2e2" +dependencies = [ + "bitflags", + "gio", + "glib", + "hex", + "libc", + "once_cell", + "ostree-sys", + "radix64", + "thiserror", +] + +[[package]] +name = "ostree-sys" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "2171f373b9592c4e8fa31a4ccd63f310a57da0e04513aab9b616447681e5dc92" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] [[package]] name = "owning_ref" @@ -1678,10 +2103,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", - "lock_api 0.4.5", + "lock_api 0.4.7", "parking_lot_core 0.8.5", ] +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api 0.4.7", + "parking_lot_core 0.9.3", +] + [[package]] name = "parking_lot_core" version = "0.4.0" @@ -1735,11 +2170,24 @@ dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall 0.2.10", - "smallvec 1.7.0", + "redox_syscall 0.2.13", + "smallvec 1.8.0", "winapi 0.3.9", ] +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.13", + "smallvec 1.8.0", + "windows-sys", +] + [[package]] name = "pem" version = "0.8.3" @@ -1761,21 +2209,88 @@ checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "pq-sys" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac25eee5a0582f45a67e837e350d784e7003bd29a5f460796772061ca49ffda" +dependencies = [ + "vcpkg", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror", + "toml 0.5.9", +] [[package]] -name = "ppv-lite86" -version = "0.2.16" +name = "proc-macro-error" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", + "version_check 0.9.4", +] [[package]] -name = "pq-sys" -version = "0.4.6" +name = "proc-macro-error-attr" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac25eee5a0582f45a67e837e350d784e7003bd29a5f460796772061ca49ffda" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "vcpkg", + "proc-macro2 1.0.39", + "quote 1.0.18", + "version_check 0.9.4", ] [[package]] @@ -1795,11 +2310,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid 0.2.2", + "unicode-ident", ] [[package]] @@ -1819,11 +2334,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ - "proc-macro2 1.0.36", + "proc-macro2 1.0.39", ] [[package]] @@ -1837,6 +2352,16 @@ dependencies = [ "scheduled-thread-pool", ] +[[package]] +name = "radix64" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "999718fa65c3be3a74f3f6dae5a98526ff436ea58a82a574f0de89eecd342bee" +dependencies = [ + "arrayref", + "cfg-if 0.1.10", +] + [[package]] name = "rand" version = "0.5.6" @@ -1856,7 +2381,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "libc", "rand_chacha 0.1.1", "rand_core 0.4.2", @@ -1884,14 +2409,13 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.3", - "rand_hc 0.3.1", ] [[package]] @@ -1900,7 +2424,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "rand_core 0.3.1", ] @@ -1954,7 +2478,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.6", ] [[package]] @@ -1975,15 +2499,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rand_isaac" version = "0.1.1" @@ -2024,7 +2539,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "rand_core 0.4.2", ] @@ -2054,18 +2569,18 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.5.4" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr", @@ -2074,9 +2589,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "remove_dir_all" @@ -2087,6 +2602,42 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "reqwest" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" +dependencies = [ + "base64 0.13.0", + "bytes 1.1.0", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.13", + "http 0.2.8", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding 2.1.0", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded 0.7.1", + "tokio 1.19.2", + "tokio-native-tls", + "url 2.2.2", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.10.1", +] + [[package]] name = "resolv-conf" version = "0.6.3" @@ -2129,9 +2680,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "same-file" @@ -2142,13 +2693,23 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys", +] + [[package]] name = "scheduled-thread-pool" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6f74fd1204073fa02d5d5d68bec8021be4c38690b61264b2fdb48083d0e7d7" +checksum = "977a7519bff143a44f842fd07e80ad1329295bd71686457f18e496736f4bf9bf" dependencies = [ - "parking_lot 0.11.2", + "parking_lot 0.12.1", ] [[package]] @@ -2163,6 +2724,29 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "security-framework" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "0.9.0" @@ -2180,31 +2764,31 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.133" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.133" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ - "proc-macro2 1.0.36", - "quote 1.0.14", - "syn 1.0.85", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", ] [[package]] name = "serde_json" -version = "1.0.74" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ - "itoa 1.0.1", + "itoa 1.0.2", "ryu", "serde", ] @@ -2221,11 +2805,32 @@ dependencies = [ "url 2.2.2", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.2", + "ryu", + "serde", +] + [[package]] name = "sha1" -version = "0.6.0" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "sha1_smol" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "signal-hook-registry" @@ -2247,11 +2852,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "smallvec" @@ -2264,9 +2875,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "socket2" @@ -2279,6 +2890,16 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "spin" version = "0.5.2" @@ -2297,7 +2918,39 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" dependencies = [ - "bytes", + "bytes 0.4.12", +] + +[[package]] +name = "string_cache" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot 0.12.1", + "phf_shared", + "precomputed-hash", + "serde", +] + +[[package]] +name = "strum" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" + +[[package]] +name = "strum_macros" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" +dependencies = [ + "heck", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", ] [[package]] @@ -2313,13 +2966,13 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.85" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a684ac3dcd8913827e18cd09a68384ee66c1de24157e3c556c9ab16d85695fb7" +checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" dependencies = [ - "proc-macro2 1.0.36", - "quote 1.0.14", - "unicode-xid 0.2.2", + "proc-macro2 1.0.39", + "quote 1.0.18", + "unicode-ident", ] [[package]] @@ -2328,10 +2981,28 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.36", - "quote 1.0.14", - "syn 1.0.85", - "unicode-xid 0.2.2", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", + "unicode-xid 0.2.3", +] + +[[package]] +name = "system-deps" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6" +dependencies = [ + "anyhow", + "cfg-expr", + "heck", + "itertools", + "pkg-config", + "strum", + "strum_macros", + "thiserror", + "toml 0.5.9", + "version-compare", ] [[package]] @@ -2343,20 +3014,40 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "libc", - "redox_syscall 0.2.10", + "redox_syscall 0.2.13", "remove_dir_all", "winapi 0.3.9", ] [[package]] name = "termcolor" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", +] + [[package]] name = "threadpool" version = "1.8.1" @@ -2388,9 +3079,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -2407,9 +3098,9 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" dependencies = [ - "bytes", + "bytes 0.4.12", "futures", - "mio", + "mio 0.6.23", "num_cpus", "tokio-codec", "tokio-current-thread", @@ -2425,13 +3116,30 @@ dependencies = [ "tokio-uds", ] +[[package]] +name = "tokio" +version = "1.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" +dependencies = [ + "bytes 1.1.0", + "libc", + "memchr", + "mio 0.8.3", + "num_cpus", + "once_cell", + "pin-project-lite", + "socket2 0.4.4", + "winapi 0.3.9", +] + [[package]] name = "tokio-codec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" dependencies = [ - "bytes", + "bytes 0.4.12", "futures", "tokio-io", ] @@ -2473,11 +3181,21 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" dependencies = [ - "bytes", + "bytes 0.4.12", "futures", "log", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio 1.19.2", +] + [[package]] name = "tokio-process" version = "0.2.5" @@ -2489,7 +3207,7 @@ dependencies = [ "lazy_static", "libc", "log", - "mio", + "mio 0.6.23", "mio-named-pipes", "tokio-io", "tokio-reactor", @@ -2507,7 +3225,7 @@ dependencies = [ "futures", "lazy_static", "log", - "mio", + "mio 0.6.23", "num_cpus", "parking_lot 0.9.0", "slab", @@ -2524,7 +3242,7 @@ checksum = "d0c34c6e548f101053321cba3da7cbb87a610b85555884c41b07da2eb91aff12" dependencies = [ "futures", "libc", - "mio", + "mio 0.6.23", "mio-uds", "signal-hook-registry", "tokio-executor", @@ -2549,10 +3267,10 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" dependencies = [ - "bytes", + "bytes 0.4.12", "futures", "iovec", - "mio", + "mio 0.6.23", "tokio-io", "tokio-reactor", ] @@ -2592,10 +3310,10 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" dependencies = [ - "bytes", + "bytes 0.4.12", "futures", "log", - "mio", + "mio 0.6.23", "tokio-codec", "tokio-io", "tokio-reactor", @@ -2607,18 +3325,32 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0" dependencies = [ - "bytes", + "bytes 0.4.12", "futures", "iovec", "libc", "log", - "mio", + "mio 0.6.23", "mio-uds", "tokio-codec", "tokio-io", "tokio-reactor", ] +[[package]] +name = "tokio-util" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +dependencies = [ + "bytes 1.1.0", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio 1.19.2", + "tracing", +] + [[package]] name = "toml" version = "0.4.10" @@ -2628,6 +3360,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + [[package]] name = "tower-service" version = "0.1.0" @@ -2637,6 +3378,32 @@ dependencies = [ "futures", ] +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7709595b8878a4965ce5e87ebf880a7d39c9afc6837721b21a5a816a8117d921" +dependencies = [ + "once_cell", +] + [[package]] name = "trust-dns-proto" version = "0.5.0" @@ -2651,7 +3418,7 @@ dependencies = [ "log", "rand 0.5.6", "smallvec 0.6.14", - "socket2", + "socket2 0.3.19", "tokio-executor", "tokio-io", "tokio-reactor", @@ -2675,7 +3442,7 @@ dependencies = [ "log", "rand 0.5.6", "smallvec 0.6.14", - "socket2", + "socket2 0.3.19", "tokio-executor", "tokio-io", "tokio-reactor", @@ -2700,7 +3467,7 @@ dependencies = [ "log", "rand 0.6.5", "smallvec 0.6.14", - "socket2", + "socket2 0.3.19", "tokio-executor", "tokio-io", "tokio-reactor", @@ -2725,7 +3492,7 @@ dependencies = [ "lru-cache", "resolv-conf", "smallvec 0.6.14", - "tokio", + "tokio 0.1.22", "trust-dns-proto 0.6.3", ] @@ -2748,6 +3515,12 @@ dependencies = [ "trust-dns-proto 0.7.4", ] +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + [[package]] name = "twoway" version = "0.2.2" @@ -2775,9 +3548,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" [[package]] name = "unicode-normalization" @@ -2788,6 +3567,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + [[package]] name = "unicode-xid" version = "0.1.0" @@ -2796,9 +3581,9 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "untrusted" @@ -2854,9 +3639,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" dependencies = [ "nom", - "proc-macro2 1.0.36", - "quote 1.0.14", - "syn 1.0.85", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", ] [[package]] @@ -2875,6 +3660,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + [[package]] name = "version_check" version = "0.1.5" @@ -2898,6 +3689,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -2910,11 +3711,17 @@ version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -2922,53 +3729,65 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" dependencies = [ "bumpalo", "lazy_static", "log", - "proc-macro2 1.0.36", - "quote 1.0.14", - "syn 1.0.85", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" dependencies = [ - "quote 1.0.14", + "quote 1.0.18", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ - "proc-macro2 1.0.36", - "quote 1.0.14", - "syn 1.0.85", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn 1.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" dependencies = [ "js-sys", "wasm-bindgen", @@ -3029,6 +3848,49 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + [[package]] name = "winreg" version = "0.5.1" @@ -3047,6 +3909,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3056,3 +3927,9 @@ dependencies = [ "winapi 0.2.8", "winapi-build", ] + +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" diff --git a/Cargo.toml b/Cargo.toml index 31750fb..7149e2a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,8 +32,10 @@ chrono = { version = "0.4.6", features = ["serde"] } diesel = { version = "^1.3.0", features = ["postgres", "chrono", "serde_json", "r2d2"] } diesel_migrations = { version = "^1.3.0" } dotenv = "0.15" +elementtree = "0.7.0" failure = "0.1.2" filetime = "0.2" +flate2 = "1.0" futures = "0.1" futures-fs = "0.0" futures-locks = "0.3" @@ -43,8 +45,10 @@ libc = "0.2" log = "0.4" mpart-async = "0.2" num_cpus = "1.0" +libostree = { package = "ostree", version = "0.14", features = ["v2021_5"] } r2d2 = "0.8" rand = "0.8" +reqwest = { version = "0.11", features = ["json", "blocking"] } serde = "1.0" serde_derive = "1.0" serde_json = "1.0" @@ -53,4 +57,4 @@ time = "0.1" tokio = "0.1" tokio-process = "0.2" tokio-signal = "0.2" -walkdir = "2" +walkdir = "2" \ No newline at end of file diff --git a/src/app.rs b/src/app.rs index 876219f..dfd0ccd 100644 --- a/src/app.rs +++ b/src/app.rs @@ -252,6 +252,7 @@ pub struct Config { pub delay_update_secs: u64, #[serde(default = "default_numcpu")] pub local_delta_threads: u32, + pub storefront_info_endpoint: Option, } impl RepoConfig { diff --git a/src/jobs.rs b/src/jobs.rs index 6029d66..d323925 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -4,14 +4,22 @@ use diesel::pg::PgConnection; use diesel::prelude::*; use diesel::result::DatabaseErrorKind::SerializationFailure; use diesel::result::Error as DieselError; +use flate2::read::GzDecoder; +use flate2::write::GzEncoder; +use flate2::Compression; +use libostree::gio::{Cancellable, FileType}; +use libostree::glib::{GString, VariantDict}; +use libostree::prelude::{Cast, InputStreamExt}; +use libostree::{self, MutableTree}; use log::{error, info}; use serde_json::json; use std::cell::RefCell; use std::collections::{HashMap, HashSet}; +use std::error::Error; use std::ffi::OsString; use std::fmt::Write as _; use std::fs::{self, File}; -use std::io::Write; +use std::io::{Read, Write}; use std::iter::FromIterator; use std::os::unix::process::CommandExt; use std::path::PathBuf; @@ -25,7 +33,7 @@ use walkdir::WalkDir; use crate::app::{Config, RepoConfig}; use crate::deltas::{DeltaGenerator, DeltaRequest, DeltaRequestSync}; use crate::errors::{JobError, JobResult}; -use crate::models; +use crate::models::{self, BuildRef}; use crate::models::{ job_dependencies_with_status, CommitJob, Job, JobDependency, JobKind, JobStatus, NewJob, PublishJob, PublishedState, RepoState, UpdateRepoJob, @@ -33,6 +41,7 @@ use crate::models::{ use crate::ostree; use crate::schema; use crate::schema::*; +use crate::storefront::StorefrontInfo; use crate::Pool; /************************************************************************** @@ -411,8 +420,9 @@ impl CommitJobInstance { }; for build_ref in build_refs.iter() { - let mut src_ref_arg = String::from("--src-ref="); - src_ref_arg.push_str(&build_ref.commit); + let storefront_info = self + .use_storefront_info(config, build_ref, upload_path.to_str().unwrap(), conn) + .map_err(|e| JobError::new(&format!("Failed to apply storefront info: {}", e)))?; let mut cmd = Command::new("flatpak"); cmd.arg("build-commit-from") @@ -432,10 +442,21 @@ impl CommitJobInstance { cmd.arg(&endoflife_rebase_arg); }; - if let Some(token_type) = &self.token_type { + if let Some(token_type) = self + .token_type + .or_else(|| storefront_info.as_ref().and_then(|s| s.0.token_type)) + { cmd.arg(format!("--token-type={}", token_type)); + } + + let real_commit = if let Some(storefront_info) = &storefront_info { + &storefront_info.1 + } else { + &build_ref.commit }; + let src_ref_arg = format!("--src-ref={}", real_commit); + cmd.arg(&src_repo_arg) .arg(&src_ref_arg) .arg(&build_repo_path) @@ -444,10 +465,7 @@ impl CommitJobInstance { job_log_and_info( self.job_id, conn, - &format!( - "Committing ref {} ({})", - build_ref.ref_name, build_ref.commit - ), + &format!("Committing ref {} ({})", build_ref.ref_name, real_commit,), ); do_command(cmd)?; @@ -487,6 +505,156 @@ impl CommitJobInstance { Ok(json!({ "refs": commits })) } + + fn use_storefront_info( + &self, + config: &Config, + build_ref: &BuildRef, + upload_path: &str, + conn: &PgConnection, + ) -> Result, Box> { + /* If applicable, get the storefront info for this app from the backend and apply it to the commit. This might + require rewriting the commit with a new dirtree. */ + + fn mtree_lookup( + mtree: &MutableTree, + path: &[&str], + ) -> Result<(Option, Option), Box> { + match path { + [file] => mtree.lookup(file).map_err(Into::into), + [subdir, rest @ ..] => mtree_lookup( + &mtree + .lookup(subdir)? + .1 + .ok_or_else(|| "subdirectory not found".to_string())?, + rest, + ), + [] => Err("no path given".into()), + } + } + + let mtree_lookup_file = |mtree, path| -> Result<_, Box> { + mtree_lookup(mtree, path)? + .0 + .ok_or_else(|| "file not found".into()) + }; + + let app_id = build_ref.ref_name.split('/').nth(1).unwrap(); + + if build_ref.ref_name.starts_with("app/") { + if let Some(endpoint) = &config.storefront_info_endpoint { + let convert_err = + |e| format!("Failed to fetch storefront info from {}: {}", &endpoint, e); + + /* Fetch the storefront info */ + let storefront_info = reqwest::blocking::Client::new() + .get(endpoint) + .query(&[("app_id", app_id)]) + .send() + .map_err(convert_err)? + .error_for_status()? + .json::() + .map_err(convert_err)?; + + /* Read the appstream file from the commit */ + let repo = libostree::Repo::new_for_path(upload_path); + repo.open::(None)?; + + let mtree = libostree::MutableTree::from_commit(&repo, &build_ref.commit)?; + + let appstream_file = mtree_lookup_file( + &mtree, + &[ + "files", + "share", + "app-info", + "xmls", + &format!("{}.xml.gz", app_id), + ], + ).map_err(|e| format!("Failed to apply storefront info: Could not find the appstream file in the uploaded commit: {}",e))?; + + let (appstream_file, fileinfo, _) = + repo.load_file::(&appstream_file, None)?; + + let fileinfo = fileinfo.unwrap(); + + let appstream_content = appstream_file + .unwrap() + .read_bytes::(fileinfo.size().try_into().unwrap(), None)?; + + let mut s = String::new(); + GzDecoder::new(&*appstream_content).read_to_string(&mut s)?; + + storefront_info.validate_storefront_info(app_id, &s)?; + let new_appstream = storefront_info.apply_storefront_info(&s)?; + + if new_appstream == s { + /* If the appstream file didn't change, we shouldn't bother rewriting the commit */ + return Ok(Some((storefront_info, build_ref.commit.clone()))); + } + + /* gzip encode the new appstream file */ + let mut s = vec![]; + GzEncoder::new(&mut s, Compression::default()) + .write_all(new_appstream.as_bytes())?; + + /* Make sure all the file attributes are correct */ + fileinfo.set_size(s.len().try_into().unwrap()); + fileinfo.set_name(&format!("{}.xml.gz", app_id)); + fileinfo.set_file_type(FileType::Regular); + fileinfo.set_attribute_uint32("unix::uid", 0); + fileinfo.set_attribute_uint32("unix::gid", 0); + fileinfo.set_attribute_uint32("unix::mode", 0o100644); + + repo.prepare_transaction::(None)?; + + /* Write the new appstream file to the repo */ + let checksum = + repo.write_regfile_inline::(None, 0, 0, 0o100644, None, &s, None)?; + + /* Edit the MutableTree with a reference to the new appstream file */ + mtree_lookup(&mtree, &["files", "share", "app-info", "xmls"])? + .1 + .ok_or("file not found")? + .replace_file(&format!("{}.xml.gz", app_id), &checksum)?; + + let repo_file = repo.write_mtree::(&mtree, None)?; + + /* Copy the original commit metadata. Leave out extended attributes, that's just the signature, which + won't be valid when we rewrite the commit (and we will sign the resulting commit ourselves anyway) */ + let (commit_metadata, _state) = repo.load_commit(&build_ref.commit)?; + let metadata = commit_metadata.child_get::(0); + let subject = &commit_metadata.child_get::(3); + let body = &commit_metadata.child_get::(4); + let time = libostree::commit_get_timestamp(&commit_metadata); + + /* Write a new commit with the new dirtree but (mostly) the same metadata */ + let commit = repo.write_commit_with_time::( + Some(&build_ref.commit), + Some(subject), + Some(body), + Some(&metadata.end()), + repo_file.dynamic_cast_ref().unwrap(), + time, + None, + )?; + + repo.commit_transaction::(None)?; + + job_log_and_info( + self.job_id, + conn, + &format!("Rewriting commit {} -> {}", build_ref.commit, commit), + ); + + Ok(Some((storefront_info, commit.to_string()))) + } else { + Ok(None) + } + } else { + Ok(None) + } + } } impl JobInstance for CommitJobInstance { diff --git a/src/lib.rs b/src/lib.rs index dafec9f..bc98d23 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,6 +18,7 @@ mod logger; mod models; pub mod ostree; mod schema; +mod storefront; mod tokens; use actix::prelude::*; diff --git a/src/storefront.rs b/src/storefront.rs new file mode 100644 index 0000000..1ae1b5a --- /dev/null +++ b/src/storefront.rs @@ -0,0 +1,371 @@ +use std::collections::HashMap; +use std::error::Error; + +use elementtree::Element; +use serde::Deserialize; + +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct AllowList { + pub allowed: Option>, + pub blocked: Vec, +} + +impl AllowList { + pub fn check(&self, string: &str) -> bool { + if self.blocked.contains(&string.to_string()) { + false + } else if let Some(allowed) = &self.allowed { + allowed.contains(&string.to_string()) + } else { + true + } + } +} + +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct StorefrontInfo { + /* The token type for the flatpak commit. If not present, the token-type will not be changed from what the client + uploaded or specified when creating the commit. */ + pub token_type: Option, + + /* Values to add to the appstream section. */ + pub add_custom_values: HashMap, + /* URLs to add to the appstream file. */ + pub add_urls: HashMap, + + /* Settings for validating uploaded appstream files. These settings don't affect anything added by the + StorefrontInfo itself. */ + /* Check the XML tags themselves */ + pub check_xml_tags: AllowList, + /* Check the types of tags */ + pub check_url_types: AllowList, + /* Check the keys in the section */ + pub check_custom_values: AllowList, +} + +impl StorefrontInfo { + pub fn validate_storefront_info( + &self, + expected_appid: &str, + original_appstream: &str, + ) -> Result<(), Box> { + let root = Element::from_reader(original_appstream.as_bytes())?; + + let components: Vec<_> = root.children().collect(); + if components.len() > 1 { + return Err( + "There should only be one element in the appstream file".into(), + ); + } else if components.is_empty() { + return Err("No components found in the appstream file".into()); + } else if components[0].tag().name() != "component" { + return Err(format!( + "Expected element, not <{}/>", + components[0].tag() + ) + .into()); + } + + let component = components[0]; + + /* Make sure the id tag is correct */ + let id_tags: Vec<_> = component.find_all("id").collect(); + if id_tags.len() > 1 { + return Err("Duplicate tag in appstream file".into()); + } else if id_tags.is_empty() { + return Err("No tag found in appstream file".into()); + } else if id_tags[0].text() != expected_appid { + return Err(format!( + "Expected app ID to be '{}', not '{}'", + expected_appid, + id_tags[0].text() + ) + .into()); + } + + for element in component.children() { + match element.tag().name() { + "url" => { + /* Filter existing URLs */ + if let Some(url_type) = element.get_attr("type") { + if !self.check_xml_tags.check(url_type) { + return Err(format!( + "Appstream is not permitted.", + url_type + ) + .into()); + } + } else { + return Err("Appstream must have a 'type' attribute.".into()); + } + } + + "custom" => { + for custom_child in element.children() { + if let Some(key) = custom_child.get_attr("key") { + if !self.check_custom_values.check(key) { + return Err(format!( + "Appstream is not permitted.", + key + ) + .into()); + } + } else { + return Err("Appstream must have a 'key' attribute.".into()); + } + } + } + + other => { + if !self.check_xml_tags.check(other) { + return Err(format!("Appstream tag <{}/> is not permitted.", other).into()); + } + } + } + } + + Ok(()) + } + + pub fn apply_storefront_info( + &self, + original_appstream: &str, + ) -> Result> { + let mut root = Element::from_reader(original_appstream.as_bytes())?; + + let mut components: Vec<_> = root.children_mut().collect(); + let component = &mut components[0]; + + fn find_element<'a>( + parent: &'a mut Element, + tag: &'a str, + attr: Option<(&'a str, &'a str)>, + ) -> Option<&'a mut Element> { + let existing = if let Some((key, val)) = attr { + parent + .find_all_mut(tag) + .find(|el| el.get_attr(key) == Some(val)) + } else { + parent.find_mut(tag) + }; + + existing + } + + fn find_or_create_element<'a>( + parent: &'a mut Element, + tag: &'a str, + attr: Option<(&'a str, &'a str)>, + ) -> &'a mut Element { + if find_element(parent, tag, attr).is_some() { + // running find_element twice is a borrow checker workaround + find_element(parent, tag, attr).unwrap() + } else { + let new_tag = parent.append_new_child(tag); + if let Some((key, val)) = attr { + new_tag.set_attr(key, val); + } + new_tag + } + } + + fn sort_hash_map(map: &HashMap) -> Vec<(&String, &String)> { + /* Hash maps iterate in an arbitrary order. Sort them so that diffs are less cluttered and so the tests work + reliably. */ + let mut values = map.iter().collect::>(); + values.sort(); + values + } + + let custom = find_or_create_element(component, "custom", None); + for (key, value) in sort_hash_map(&self.add_custom_values) { + find_or_create_element(custom, "value", Some(("key", &key))).set_text(value); + } + + for (key, value) in sort_hash_map(&self.add_urls) { + find_or_create_element(component, "url", Some(("type", key))).set_text(value); + } + + Ok(root.to_string()?) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn run_test(input: &str, expected: &str) { + let mut info = StorefrontInfo::default(); + info.add_custom_values + .insert("TestKey".to_string(), "TestValue".to_string()); + info.add_custom_values + .insert("TestKey4".to_string(), "TestValue4".to_string()); + + info.add_urls + .insert("homepage".to_string(), "https://example.com".to_string()); + info.add_urls + .insert("bugtracker".to_string(), "https://github.com".to_string()); + + info.validate_storefront_info("org.flatpak.Test", input) + .unwrap(); + + let output = info.apply_storefront_info(input).unwrap(); + + assert_eq!(output, expected); + } + + #[test] + fn test_add_info() { + const INPUT: &str = r#" + + + org.flatpak.Test + +"#; + const EXPECTED: &str = r#" + + org.flatpak.Test + TestValueTestValue4https://jackfan.us.kghttps://example.com +"#; + + run_test(INPUT, EXPECTED); + } + + #[test] + fn test_replace_info() { + const INPUT: &str = r#" + + + org.flatpak.Test + https://flatpak.org + + TestValue1 + TestValue2 + TestValue3 + + +"#; + const EXPECTED: &str = r#" + + org.flatpak.Test + https://example.com + + TestValue1 + TestValue + TestValue3 + TestValue4 + https://github.com +"#; + + run_test(INPUT, EXPECTED); + } + + fn run_error_test(input: &str, expected_error: &str) { + let mut info = StorefrontInfo::default(); + + info.check_url_types.blocked = vec!["bugtracker".to_string()].into(); + info.check_custom_values.blocked = vec!["TestKey2".to_string()]; + + info.check_xml_tags.allowed = Some(vec![ + "id".to_string(), + "url".to_string(), + "custom".to_string(), + "tags".to_string(), + ]); + + let err = info + .validate_storefront_info("org.flatpak.Test", input) + .unwrap_err(); + + assert_eq!(err.to_string(), expected_error); + } + + #[test] + fn test_bad_app_id() { + const INPUT: &str = r#" + + + org.flatpak.NotTest + + + "#; + run_error_test( + INPUT, + "Expected app ID to be 'org.flatpak.Test', not 'org.flatpak.NotTest'", + ); + } + + #[test] + fn test_blocked_url_type() { + const INPUT: &str = r#" + + + org.flatpak.Test + https://flatpak.org + + + "#; + run_error_test( + INPUT, + "Appstream is not permitted.", + ); + } + + #[test] + fn test_blocked_custom_value() { + const INPUT: &str = r#" + + + org.flatpak.Test + + TestValue + + + + "#; + run_error_test(INPUT, "Appstream is not permitted."); + } + + #[test] + fn test_blocked_xml_tag() { + const INPUT: &str = r#" + + + org.flatpak.Test + + + + "#; + run_error_test(INPUT, "Appstream tag is not permitted."); + } + + #[test] + fn test_url_no_type() { + const INPUT: &str = r#" + + + org.flatpak.Test + https://flatpak.org + + + "#; + run_error_test(INPUT, "Appstream must have a 'type' attribute."); + } + + #[test] + fn test_value_no_key() { + const INPUT: &str = r#" + + + org.flatpak.Test + + value + + + + "#; + run_error_test(INPUT, "Appstream must have a 'key' attribute."); + } +}