From afdab0300e7a982776cd5d30fecb5209f84fc4bf Mon Sep 17 00:00:00 2001 From: Geometrically <18202329+Geometrically@users.noreply.github.com> Date: Wed, 1 Feb 2023 10:08:02 -0700 Subject: [PATCH] Update Analytics req + Fix versions list (#529) * Update Analytics req + Fix versions list * Fix sentry support * Fix lint --- Cargo.lock | 389 +++++++++++++++++--- Cargo.toml | 6 +- sqlx-data.json | 102 ++--- src/database/models/version_item.rs | 2 +- src/file_hosting/backblaze/authorization.rs | 2 +- src/file_hosting/s3_host.rs | 4 +- src/main.rs | 8 +- src/routes/admin.rs | 12 +- src/routes/maven.rs | 2 +- src/routes/midas.rs | 2 +- src/routes/project_creation.rs | 13 +- src/routes/projects.rs | 20 +- src/routes/teams.rs | 7 +- src/routes/users.rs | 5 +- src/routes/v1/mods.rs | 6 +- src/routes/version_creation.rs | 2 +- src/routes/version_file.rs | 3 +- src/search/mod.rs | 4 +- src/util/auth.rs | 2 +- src/util/validate.rs | 7 +- src/validate/mod.rs | 3 +- 21 files changed, 441 insertions(+), 160 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 938439ade..82b6b13e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -204,7 +204,7 @@ dependencies = [ "ahash", "bytes", "bytestring", - "cfg-if", + "cfg-if 1.0.0", "cookie", "derive_more", "encoding_rs", @@ -271,7 +271,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cipher", "cpufeatures", "opaque-debug", @@ -333,6 +333,18 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "as-slice" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0" +dependencies = [ + "generic-array 0.12.4", + "generic-array 0.13.3", + "generic-array 0.14.6", + "stable_deref_trait", +] + [[package]] name = "async-channel" version = "1.7.1" @@ -430,7 +442,7 @@ checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" dependencies = [ "addr2line", "cc", - "cfg-if", + "cfg-if 1.0.0", "libc", "miniz_oxide 0.5.4", "object", @@ -482,7 +494,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array", + "generic-array 0.14.6", ] [[package]] @@ -491,7 +503,7 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ - "generic-array", + "generic-array 0.14.6", ] [[package]] @@ -515,6 +527,19 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "build_id" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6deb6795d8b4d2269c3fcf87a87bff9f4cd45a99e259806603ee8007077daf3" +dependencies = [ + "byteorder", + "once_cell", + "palaver", + "twox-hash", + "uuid 0.8.2", +] + [[package]] name = "bumpalo" version = "3.11.1" @@ -599,6 +624,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -633,7 +664,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" dependencies = [ - "generic-array", + "generic-array 0.14.6", ] [[package]] @@ -739,7 +770,7 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -748,7 +779,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crossbeam-utils", ] @@ -758,7 +789,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crossbeam-epoch", "crossbeam-utils", ] @@ -770,7 +801,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ "autocfg", - "cfg-if", + "cfg-if 1.0.0", "crossbeam-utils", "memoffset", "scopeguard", @@ -782,7 +813,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crossbeam-utils", ] @@ -792,7 +823,7 @@ version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -807,7 +838,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.6", "typenum", ] @@ -817,7 +848,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" dependencies = [ - "generic-array", + "generic-array 0.14.6", "subtle", ] @@ -937,7 +968,7 @@ version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "hashbrown", "lock_api", "once_cell", @@ -951,7 +982,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ "serde", - "uuid", + "uuid 1.2.2", ] [[package]] @@ -963,7 +994,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version", + "rustc_version 0.4.0", "syn", ] @@ -973,7 +1004,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array", + "generic-array 0.14.6", ] [[package]] @@ -1034,7 +1065,7 @@ version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -1080,6 +1111,18 @@ dependencies = [ "instant", ] +[[package]] +name = "findshlibs" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" +dependencies = [ + "cc", + "lazy_static", + "libc", + "winapi", +] + [[package]] name = "flate2" version = "1.0.24" @@ -1254,6 +1297,24 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309" +dependencies = [ + "typenum", +] + [[package]] name = "generic-array" version = "0.14.6" @@ -1270,7 +1331,7 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -1321,6 +1382,15 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hash32" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1339,6 +1409,18 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "heapless" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74911a68a1658cfcfb61bc0ccfbd536e3b6e906f8c2f7883ee50157e3e2184f1" +dependencies = [ + "as-slice", + "generic-array 0.13.3", + "hash32", + "stable_deref_trait", +] + [[package]] name = "heck" version = "0.4.0" @@ -1572,7 +1654,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -1670,7 +1752,7 @@ dependencies = [ [[package]] name = "labrinth" -version = "2.6.0" +version = "2.7.0" dependencies = [ "actix", "actix-cors", @@ -1748,7 +1830,7 @@ checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" dependencies = [ "arrayvec 0.5.2", "bitflags", - "cfg-if", + "cfg-if 1.0.0", "ryu", "static_assertions", ] @@ -1830,7 +1912,7 @@ version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -1842,6 +1924,15 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + [[package]] name = "match_cfg" version = "0.1.0" @@ -1906,6 +1997,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memmap2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -2003,6 +2103,36 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nix" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229" +dependencies = [ + "bitflags", + "cc", + "cfg-if 0.1.10", + "libc", + "void", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", +] + +[[package]] +name = "nom" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf51a729ecf40266a2368ad335a5fdde43471f545a967109cd62146ecf8b66ff" + [[package]] name = "nom" version = "5.1.2" @@ -2118,7 +2248,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13" dependencies = [ "bitflags", - "cfg-if", + "cfg-if 1.0.0", "foreign-types", "libc", "once_cell", @@ -2177,6 +2307,23 @@ dependencies = [ "winapi", ] +[[package]] +name = "palaver" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49dfc200733ac34dcd9a1e4a7e454b521723936010bef3710e2d8024a32d685f" +dependencies = [ + "bitflags", + "heapless", + "lazy_static", + "libc", + "mach", + "nix 0.15.0", + "procinfo", + "typenum", + "winapi", +] + [[package]] name = "parking" version = "2.0.0" @@ -2199,7 +2346,7 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall", "smallvec", @@ -2318,13 +2465,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab4609a838d88b73d8238967b60dd115cc08d38e2bbaf51ee1e4b695f89122e2" dependencies = [ "autocfg", - "cfg-if", + "cfg-if 1.0.0", "libc", "log", "wepoll-ffi", "winapi", ] +[[package]] +name = "pprof" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e20150f965e0e4c925982b9356da71c84bcd56cb66ef4e894825837cbcf6613e" +dependencies = [ + "backtrace", + "cfg-if 1.0.0", + "findshlibs", + "libc", + "log", + "nix 0.24.3", + "once_cell", + "parking_lot", + "smallvec", + "symbolic-demangle", + "tempfile", + "thiserror", +] + [[package]] name = "ppv-lite86" version = "0.2.16" @@ -2364,6 +2531,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "procinfo" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab1427f3d2635891f842892dda177883dca0639e05fe66796a62c9d2f23b49c" +dependencies = [ + "byteorder", + "libc", + "nom 2.2.1", + "rustc_version 0.2.3", +] + [[package]] name = "quick-xml" version = "0.18.1" @@ -2561,7 +2740,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "ordered-multimap", ] @@ -2575,7 +2754,7 @@ dependencies = [ "aws-creds", "aws-region", "base64 0.13.1", - "cfg-if", + "cfg-if 1.0.0", "hex", "hmac 0.12.1", "http", @@ -2613,13 +2792,32 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver 0.9.0", +] + [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.14", +] + +[[package]] +name = "rustc_version_runtime" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d31b7153270ebf48bf91c65ae5b0c00e749c4cfad505f66530ac74950249582f" +dependencies = [ + "rustc_version 0.2.3", + "semver 0.9.0", ] [[package]] @@ -2729,6 +2927,15 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + [[package]] name = "semver" version = "1.0.14" @@ -2736,10 +2943,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" [[package]] -name = "sentry" -version = "0.29.1" +name = "semver-parser" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ad137b9df78294b98cab1a650bef237cc6c950e82e5ce164655e674d07c5cc" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "sentry" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6097dc270a9c4555c5d6222ed243eaa97ff38e29299ed7c5cb36099033c604e" dependencies = [ "httpdate", "native-tls", @@ -2754,9 +2967,9 @@ dependencies = [ [[package]] name = "sentry-actix" -version = "0.29.1" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c832f99bbda819c89ce700fba806ff4def97d6bdff59d15b5c898bfaf54a956" +checksum = "cb6546964a8f825f1b19249167362f3c36d4c7eaaa4d816cc93478b2fc072eca" dependencies = [ "actix-web", "futures-util", @@ -2765,9 +2978,9 @@ dependencies = [ [[package]] name = "sentry-backtrace" -version = "0.29.1" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afe4800806552aab314129761d5d3b3d422284eca3de2ab59e9fd133636cbd3d" +checksum = "9d92d1e4d591534ae4f872d6142f3b500f4ffc179a6aed8a3e86c7cc96d10a6a" dependencies = [ "backtrace", "once_cell", @@ -2777,36 +2990,44 @@ dependencies = [ [[package]] name = "sentry-contexts" -version = "0.29.1" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a42938426670f6e7974989cd1417837a96dd8bbb01567094f567d6acb360bf88" +checksum = "3afa877b1898ff67dd9878cf4bec4e53cef7d3be9f14b1fc9e4fcdf36f8e4259" dependencies = [ "hostname", "libc", "os_info", - "rustc_version", + "rustc_version 0.4.0", "sentry-core", "uname", ] [[package]] name = "sentry-core" -version = "0.29.1" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df9b9d8de2658a1ecd4e45f7b06c80c5dd97b891bfbc7c501186189b7e9bbdf" +checksum = "fc43eb7e4e3a444151a0fe8a0e9ce60eabd905dae33d66e257fa26f1b509c1bd" dependencies = [ + "build_id", + "findshlibs", + "indexmap", + "libc", "once_cell", + "pprof", "rand", + "rustc_version_runtime", "sentry-types", "serde", "serde_json", + "sys-info", + "uuid 1.2.2", ] [[package]] name = "sentry-panic" -version = "0.29.1" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0af37b8500f273e511ebd6eb0d342ff7937d64ce3f134764b2b4653112d48cb4" +checksum = "ccab4fab11e3e63c45f4524bee2e75cde39cdf164cb0b0cbe6ccd1948ceddf66" dependencies = [ "sentry-backtrace", "sentry-core", @@ -2814,9 +3035,9 @@ dependencies = [ [[package]] name = "sentry-types" -version = "0.29.1" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc95faa4078768a6bf8df45e2b894bbf372b3dbbfb364e9429c1c58ab7545c6" +checksum = "f63708ec450b6bdcb657af760c447416d69c38ce421f34e5e2e9ce8118410bc7" dependencies = [ "debugid", "getrandom", @@ -2826,7 +3047,7 @@ dependencies = [ "thiserror", "time 0.3.16", "url", - "uuid", + "uuid 1.2.2", ] [[package]] @@ -2927,7 +3148,7 @@ version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.10.5", ] @@ -2945,7 +3166,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.9.0", "opaque-debug", @@ -2957,7 +3178,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest 0.10.5", ] @@ -3150,6 +3371,12 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -3178,6 +3405,28 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +[[package]] +name = "symbolic-common" +version = "10.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b55cdc318ede251d0957f07afe5fed912119b8c1bc5a7804151826db999e737" +dependencies = [ + "debugid", + "memmap2", + "stable_deref_trait", + "uuid 1.2.2", +] + +[[package]] +name = "symbolic-demangle" +version = "10.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79be897be8a483a81fff6a3a4e195b4ac838ef73ca42d348b3f722da9902e489" +dependencies = [ + "rustc-demangle", + "symbolic-common", +] + [[package]] name = "syn" version = "1.0.103" @@ -3189,13 +3438,23 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sys-info" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "tempfile" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "fastrand", "libc", "redox_syscall", @@ -3384,7 +3643,7 @@ version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "log", "pin-project-lite", "tracing-attributes", @@ -3437,6 +3696,16 @@ dependencies = [ "unchecked-index", ] +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if 1.0.0", + "static_assertions", +] + [[package]] name = "typenum" version = "1.15.0" @@ -3544,6 +3813,12 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + [[package]] name = "uuid" version = "1.2.2" @@ -3609,6 +3884,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "waker-fn" version = "1.1.0" @@ -3643,7 +3924,7 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen-macro", ] @@ -3668,7 +3949,7 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", diff --git a/Cargo.toml b/Cargo.toml index 1d20f4fb2..9693e0121 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "labrinth" -version = "2.6.0" +version = "2.7.0" authors = ["geometrically "] edition = "2018" license = "AGPL-3.0" @@ -67,8 +67,8 @@ thiserror = "1.0.37" sqlx = { version = "0.6.2", features = ["runtime-actix-rustls", "postgres", "chrono", "offline", "macros", "migrate", "decimal", "json"] } rust_decimal = { version = "1.26", features = ["serde-with-float", "serde-with-str"] } -sentry = "0.29.1" -sentry-actix = "0.29.1" +sentry = { version = "0.29.2", features = ["profiling"] } +sentry-actix = "0.29.2" image = "0.24.5" color-thief = "0.2.2" diff --git a/sqlx-data.json b/sqlx-data.json index f4b15fe45..41000ee1d 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -4695,37 +4695,6 @@ }, "query": "\n SELECT m.id id, tm.user_id user_id, tm.payouts_split payouts_split, pt.name project_type\n FROM mods m\n INNER JOIN team_members tm on m.team_id = tm.team_id AND tm.accepted = TRUE\n INNER JOIN project_types pt ON pt.id = m.project_type\n WHERE m.id = ANY($1)\n " }, - "9768966125ca0d148944fb03894b3f90d64563cb56adee48e1fb5f27158c43ce": { - "describe": { - "columns": [ - { - "name": "version_id", - "ordinal": 0, - "type_info": "Int8" - }, - { - "name": "date_published", - "ordinal": 1, - "type_info": "Timestamptz" - } - ], - "nullable": [ - false, - false - ], - "parameters": { - "Left": [ - "Int8", - "VarcharArray", - "VarcharArray", - "Text", - "Int8", - "Int8" - ] - } - }, - "query": "\n SELECT DISTINCT ON(v.date_published, v.id) version_id, v.date_published FROM versions v\n INNER JOIN game_versions_versions gvv ON gvv.joining_version_id = v.id\n INNER JOIN game_versions gv on gvv.game_version_id = gv.id AND (cardinality($2::varchar[]) = 0 OR gv.version = ANY($2::varchar[]))\n INNER JOIN loaders_versions lv ON lv.version_id = v.id\n INNER JOIN loaders l on lv.loader_id = l.id AND (cardinality($3::varchar[]) = 0 OR l.loader = ANY($3::varchar[]))\n WHERE v.mod_id = $1 AND ($4 = NULL OR v.version_type = $4)\n ORDER BY v.date_published, v.id ASC\n LIMIT $5 OFFSET $6\n " - }, "97690dda7edea8c985891cae5ad405f628ed81e333bc88df5493c928a4324d43": { "describe": { "columns": [ @@ -5098,26 +5067,6 @@ }, "query": "\n SELECT id FROM users\n WHERE LOWER(username) = LOWER($1)\n " }, - "ac840a3ba466cfa1f914a1e44fcc9052bd1e0e908140e7147d1ff72d1794cfbf": { - "describe": { - "columns": [ - { - "name": "exists", - "ordinal": 0, - "type_info": "Bool" - } - ], - "nullable": [ - null - ], - "parameters": { - "Left": [ - "Int8" - ] - } - }, - "query": "\n SELECT EXISTS(SELECT 1 FROM mods WHERE id=$1)\n " - }, "acbafe265c4b7a1c95b0494a0a03c8bd2cd778ae561ef5a662fa931ca26cf603": { "describe": { "columns": [], @@ -7549,6 +7498,26 @@ }, "query": "\n DELETE FROM team_members\n WHERE user_id = $1\n " }, + "f34bbe639ad21801258dc8beaab9877229a451761be07f85a1dd04d027832329": { + "describe": { + "columns": [ + { + "name": "exists", + "ordinal": 0, + "type_info": "Bool" + } + ], + "nullable": [ + null + ], + "parameters": { + "Left": [ + "Int8" + ] + } + }, + "query": "\n SELECT EXISTS(SELECT 1 FROM mods WHERE id=$1)\n " + }, "f3a8ad4a802dde0eb9304078e0368066e7d48121dfe73a63b2911b0998840a79": { "describe": { "columns": [ @@ -7778,6 +7747,37 @@ }, "query": "SELECT EXISTS(SELECT 1 FROM notifications WHERE id=$1)" }, + "fcc7bedf9709bf49ae152064240a6e8bfa8ff4d5a63707e8b1450d9d77fb6f14": { + "describe": { + "columns": [ + { + "name": "version_id", + "ordinal": 0, + "type_info": "Int8" + }, + { + "name": "date_published", + "ordinal": 1, + "type_info": "Timestamptz" + } + ], + "nullable": [ + false, + false + ], + "parameters": { + "Left": [ + "Int8", + "VarcharArray", + "VarcharArray", + "Varchar", + "Int8", + "Int8" + ] + } + }, + "query": "\n SELECT DISTINCT ON(v.date_published, v.id) version_id, v.date_published FROM versions v\n INNER JOIN game_versions_versions gvv ON gvv.joining_version_id = v.id\n INNER JOIN game_versions gv on gvv.game_version_id = gv.id AND (cardinality($2::varchar[]) = 0 OR gv.version = ANY($2::varchar[]))\n INNER JOIN loaders_versions lv ON lv.version_id = v.id\n INNER JOIN loaders l on lv.loader_id = l.id AND (cardinality($3::varchar[]) = 0 OR l.loader = ANY($3::varchar[]))\n WHERE v.mod_id = $1 AND ($4::varchar IS NULL OR v.version_type = $4)\n ORDER BY v.date_published, v.id ASC\n LIMIT $5 OFFSET $6\n " + }, "fcd15905507769ab7f9839d64d1be3ee3f61cd555aee57dace76f8e53e91d344": { "describe": { "columns": [], diff --git a/src/database/models/version_item.rs b/src/database/models/version_item.rs index a80f183a7..2651f4ae7 100644 --- a/src/database/models/version_item.rs +++ b/src/database/models/version_item.rs @@ -498,7 +498,7 @@ impl Version { INNER JOIN game_versions gv on gvv.game_version_id = gv.id AND (cardinality($2::varchar[]) = 0 OR gv.version = ANY($2::varchar[])) INNER JOIN loaders_versions lv ON lv.version_id = v.id INNER JOIN loaders l on lv.loader_id = l.id AND (cardinality($3::varchar[]) = 0 OR l.loader = ANY($3::varchar[])) - WHERE v.mod_id = $1 AND ($4 = NULL OR v.version_type = $4) + WHERE v.mod_id = $1 AND ($4::varchar IS NULL OR v.version_type = $4) ORDER BY v.date_published, v.id ASC LIMIT $5 OFFSET $6 ", diff --git a/src/file_hosting/backblaze/authorization.rs b/src/file_hosting/backblaze/authorization.rs index 698083b67..a75aeb78d 100644 --- a/src/file_hosting/backblaze/authorization.rs +++ b/src/file_hosting/backblaze/authorization.rs @@ -34,7 +34,7 @@ pub async fn authorize_account( key_id: &str, application_key: &str, ) -> Result { - let combined_key = format!("{}:{}", key_id, application_key); + let combined_key = format!("{key_id}:{application_key}"); let formatted_key = format!("Basic {}", base64::encode(combined_key)); let response = reqwest::Client::new() diff --git a/src/file_hosting/s3_host.rs b/src/file_hosting/s3_host.rs index 277ebdb67..87be229ab 100644 --- a/src/file_hosting/s3_host.rs +++ b/src/file_hosting/s3_host.rs @@ -69,7 +69,7 @@ impl FileHost for S3Host { self.bucket .put_object_with_content_type( - format!("/{}", file_name), + format!("/{file_name}"), &file_bytes, content_type, ) @@ -98,7 +98,7 @@ impl FileHost for S3Host { file_name: &str, ) -> Result { self.bucket - .delete_object(format!("/{}", file_name)) + .delete_object(format!("/{file_name}")) .await .map_err(|_| { FileHostingError::S3Error( diff --git a/src/main.rs b/src/main.rs index 91dfbb292..d65d75910 100644 --- a/src/main.rs +++ b/src/main.rs @@ -43,7 +43,13 @@ async fn main() -> std::io::Result<()> { // DSN is from SENTRY_DSN env variable. // Has no effect if not set. - let sentry = sentry::init(()); + let sentry = sentry::init(sentry::ClientOptions { + release: sentry::release_name!(), + traces_sample_rate: 0.1, + enable_profiling: true, + profiles_sample_rate: 0.1, + ..Default::default() + }); if sentry.is_enabled() { info!("Enabled Sentry integration"); std::env::set_var("RUST_BACKTRACE", "1"); diff --git a/src/routes/admin.rs b/src/routes/admin.rs index a0375934e..8f79d228d 100644 --- a/src/routes/admin.rs +++ b/src/routes/admin.rs @@ -14,8 +14,11 @@ use std::sync::Arc; #[derive(Deserialize)] pub struct DownloadBody { pub url: String, - pub hash: ProjectId, + pub project_id: ProjectId, pub version_name: String, + + pub ip: String, + pub headers: HashMap, } // This is an internal route, cannot be used without key @@ -26,7 +29,7 @@ pub async fn count_download( download_queue: web::Data>, ) -> Result { let project_id: crate::database::models::ids::ProjectId = - download_body.hash.into(); + download_body.project_id.into(); let id_option = crate::models::ids::base62_impl::parse_base62( &download_body.version_name, @@ -81,8 +84,11 @@ pub async fn count_download( .post(format!("{}downloads", dotenvy::var("ARIADNE_URL")?)) .header("Modrinth-Admin", dotenvy::var("ARIADNE_ADMIN_KEY")?) .json(&json!({ + "ip": download_body.ip, "url": download_body.url, - "project_id": download_body.hash + "project_id": download_body.project_id, + "version_id": crate::models::projects::VersionId(version_id as u64).to_string(), + "headers": download_body.headers })) .send() .await diff --git a/src/routes/maven.rs b/src/routes/maven.rs index 4434fcb2d..574550e08 100644 --- a/src/routes/maven.rs +++ b/src/routes/maven.rs @@ -115,7 +115,7 @@ pub async fn maven_metadata( let respdata = Metadata { group_id: "maven.modrinth".to_string(), - artifact_id: format!("{}", project_id), + artifact_id: project_id.to_string(), versioning: Versioning { latest: new_versions .last() diff --git a/src/routes/midas.rs b/src/routes/midas.rs index e8b75b62c..9f48346b7 100644 --- a/src/routes/midas.rs +++ b/src/routes/midas.rs @@ -163,7 +163,7 @@ pub async fn handle_stripe_webhook( ) })?; - key.update(format!("{}.{}", timestamp, body).as_bytes()); + key.update(format!("{timestamp}.{body}").as_bytes()); key.verify(&signature).map_err(|_| { ApiError::Crypto( diff --git a/src/routes/project_creation.rs b/src/routes/project_creation.rs index 9abb0e2c7..bfc523a83 100644 --- a/src/routes/project_creation.rs +++ b/src/routes/project_creation.rs @@ -545,8 +545,7 @@ pub async fn project_create_inner( })?; let url = format!( - "data/{}/images/{}.{}", - project_id, hash, file_extension + "data/{project_id}/images/{hash}.{file_extension}" ); let upload_data = file_host .upload_file(content_type, &url, data.freeze()) @@ -558,7 +557,7 @@ pub async fn project_create_inner( }); gallery_urls.push(crate::models::projects::GalleryItem { - url: format!("{}/{}", cdn_url, url), + url: format!("{cdn_url}/{url}"), featured: item.featured, title: item.title.clone(), description: item.description.clone(), @@ -574,8 +573,7 @@ pub async fn project_create_inner( *i } else { return Err(CreateError::InvalidInput(format!( - "File `{}` (field {}) isn't specified in the versions data", - file_name, name + "File `{file_name}` (field {name}) isn't specified in the versions data" ))); }; @@ -720,8 +718,7 @@ pub async fn project_create_inner( ) .map_err(|err| { CreateError::InvalidInput(format!( - "Invalid SPDX license identifier: {}", - err + "Invalid SPDX license identifier: {err}" )) })?; @@ -960,7 +957,7 @@ async fn process_icon_upload( let upload_data = file_host .upload_file( content_type, - &format!("data/{}/{}.{}", project_id, hash, file_extension), + &format!("data/{project_id}/{hash}.{file_extension}"), data.freeze(), ) .await?; diff --git a/src/routes/projects.rs b/src/routes/projects.rs index 10616ebf6..287b0dbfc 100644 --- a/src/routes/projects.rs +++ b/src/routes/projects.rs @@ -2,6 +2,7 @@ use crate::database; use crate::database::models::notification_item::NotificationBuilder; use crate::file_hosting::FileHost; use crate::models; +use crate::models::ids::base62_impl::parse_base62; use crate::models::projects::{ DonationLink, Project, ProjectId, ProjectStatus, SearchRequest, SideType, }; @@ -873,16 +874,14 @@ pub async fn project_edit( )); } - let slug_project_id_option: Option = - serde_json::from_str(&format!("\"{}\"", slug)).ok(); + let slug_project_id_option: Option = + parse_base62(slug).ok(); if let Some(slug_project_id) = slug_project_id_option { - let slug_project_id: database::models::ids::ProjectId = - slug_project_id.into(); let results = sqlx::query!( " - SELECT EXISTS(SELECT 1 FROM mods WHERE id=$1) - ", - slug_project_id as database::models::ids::ProjectId + SELECT EXISTS(SELECT 1 FROM mods WHERE id=$1) + ", + slug_project_id as i64 ) .fetch_one(&mut *transaction) .await?; @@ -980,8 +979,7 @@ pub async fn project_edit( spdx::Expression::parse(&license).map_err(|err| { ApiError::InvalidInput(format!( - "Invalid SPDX license identifier: {}", - err + "Invalid SPDX license identifier: {err}" )) })?; @@ -1846,7 +1844,7 @@ pub async fn add_gallery_item( let id: ProjectId = project_item.inner.id.into(); let url = format!("data/{}/images/{}.{}", id, hash, &*ext.ext); - let file_url = format!("{}/{}", cdn_url, url); + let file_url = format!("{cdn_url}/{url}"); if project_item .gallery_items .iter() @@ -2359,7 +2357,7 @@ pub async fn delete_from_index( let indexes: Vec = client.get_indexes().await?; for index in indexes { - index.delete_document(format!("{}", id)).await?; + index.delete_document(id.to_string()).await?; } Ok(()) diff --git a/src/routes/teams.rs b/src/routes/teams.rs index 604a9b0b1..7b757b691 100644 --- a/src/routes/teams.rs +++ b/src/routes/teams.rs @@ -345,16 +345,13 @@ pub async fn add_team_member( actions: vec![ NotificationActionBuilder { title: "Accept".to_string(), - action_route: ( - "POST".to_string(), - format!("team/{}/join", team), - ), + action_route: ("POST".to_string(), format!("team/{team}/join")), }, NotificationActionBuilder { title: "Deny".to_string(), action_route: ( "DELETE".to_string(), - format!("team/{}/members/{}", team, new_member.user_id), + format!("team/{team}/members/{}", new_member.user_id), ), }, ], diff --git a/src/routes/users.rs b/src/routes/users.rs index 049d0af6f..1c06e03a0 100644 --- a/src/routes/users.rs +++ b/src/routes/users.rs @@ -61,7 +61,7 @@ pub async fn user_get( ) -> Result { let string = info.into_inner().0; let id_option: Option = - serde_json::from_str(&format!("\"{}\"", string)).ok(); + serde_json::from_str(&format!("\"{string}\"")).ok(); let mut user_data; @@ -222,8 +222,7 @@ pub async fn user_edit( .await?; } else { return Err(ApiError::InvalidInput(format!( - "Username {} is taken!", - username + "Username {username} is taken!" ))); } } diff --git a/src/routes/v1/mods.rs b/src/routes/v1/mods.rs index 96a76448c..7783b18c0 100644 --- a/src/routes/v1/mods.rs +++ b/src/routes/v1/mods.rs @@ -97,7 +97,7 @@ pub async fn mod_get( database::models::Project::get_full_from_slug_or_project_id( &string, &**pool, ) - .await?; + .await?; let user_option = get_user_from_headers(req.headers(), &**pool).await.ok(); @@ -109,7 +109,9 @@ pub async fn mod_get( format!("[STOP USING API v1] {}", data.inner.description); data.inner.body = format!("# STOP USING API v1 - whatever application you're using right now is likely deprecated or abandoned\n{}", data.inner.body); - return Ok(HttpResponse::Ok().json(models::projects::Project::from(data))); + return Ok( + HttpResponse::Ok().json(models::projects::Project::from(data)) + ); } } Ok(HttpResponse::NotFound().body("")) diff --git a/src/routes/version_creation.rs b/src/routes/version_creation.rs index f4fdf64fa..d319b91ef 100644 --- a/src/routes/version_creation.rs +++ b/src/routes/version_creation.rs @@ -875,7 +875,7 @@ pub async fn upload_file( version_files.push(VersionFileBuilder { filename: file_name.to_string(), - url: format!("{}/{}", cdn_url, file_path_encode), + url: format!("{cdn_url}/{file_path_encode}"), hashes: vec![ models::version_item::HashBuilder { algorithm: "sha1".to_string(), diff --git a/src/routes/version_file.rs b/src/routes/version_file.rs index 77a4c6f08..e7d0b1917 100644 --- a/src/routes/version_file.rs +++ b/src/routes/version_file.rs @@ -537,8 +537,7 @@ pub async fn update_files( version.inner.id.into(); return Err(ApiError::Database(DatabaseError::Other(format!( - "Could not parse hash for version {}", - version_id + "Could not parse hash for version {version_id}" )))); } } diff --git a/src/search/mod.rs b/src/search/mod.rs index 3373c3d26..9d4368973 100644 --- a/src/search/mod.rs +++ b/src/search/mod.rs @@ -196,7 +196,7 @@ pub async fn search_for_project( let filters: Cow<_> = match (info.filters.as_deref(), info.version.as_deref()) { - (Some(f), Some(v)) => format!("({}) AND ({})", f, v).into(), + (Some(f), Some(v)) => format!("({f}) AND ({v})").into(), (Some(f), None) => f.into(), (None, Some(v)) => v.into(), (None, None) => "".into(), @@ -224,7 +224,7 @@ pub async fn search_for_project( filter_string.push(')'); if !filters.is_empty() { - write!(filter_string, " AND ({})", filters)?; + write!(filter_string, " AND ({filters})")?; } } else { filter_string.push_str(&filters); diff --git a/src/util/auth.rs b/src/util/auth.rs index 7f85f1dfe..652ac371c 100644 --- a/src/util/auth.rs +++ b/src/util/auth.rs @@ -40,7 +40,7 @@ pub async fn get_github_user_from_token( .header(reqwest::header::USER_AGENT, "Modrinth") .header( reqwest::header::AUTHORIZATION, - format!("token {}", access_token), + format!("token {access_token}"), ) .send() .await? diff --git a/src/util/validate.rs b/src/util/validate.rs index 5d371e568..c1feff760 100644 --- a/src/util/validate.rs +++ b/src/util/validate.rs @@ -25,17 +25,14 @@ pub fn validation_errors_to_string( ValidationErrorsKind::Struct(errors) => { validation_errors_to_string( *errors.clone(), - Some(format!("of item {}", field)), + Some(format!("of item {field}")), ) } ValidationErrorsKind::List(list) => { if let Some((index, errors)) = list.iter().next() { output.push_str(&validation_errors_to_string( *errors.clone(), - Some(format!( - "of list {} with index {}", - field, index - )), + Some(format!("of list {field} with index {index}")), )); } diff --git a/src/validate/mod.rs b/src/validate/mod.rs index 197ff9df6..90905ed83 100644 --- a/src/validate/mod.rs +++ b/src/validate/mod.rs @@ -149,8 +149,7 @@ pub async fn validate_file( if visited { Err(ValidationError::InvalidInput( format!( - "File extension {} is invalid for input file", - file_extension + "File extension {file_extension} is invalid for input file" ) .into(), ))