diff --git a/Cargo.lock b/Cargo.lock index 34a0e4d1..697197bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -470,9 +470,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f523b4e98ba6897ae90994bc18423d9877c54f9047b06a00ddc8122a957b1c70" +checksum = "f4af7447fc1214c1f3a1ace861d0216a6c8bb13965b64bbad9650f375b67689a" dependencies = [ "async-trait", "axum-core", @@ -502,9 +502,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3ddbd16eabff8b45f21b98671fddcc93daaa7ac4c84f8473693437226040de5" +checksum = "3bdc19781b16e32f8a7200368a336fa4509d4b72ef15dd4e41df5290855ee1e6" dependencies = [ "async-trait", "bytes 1.1.0", @@ -1626,9 +1626,9 @@ checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" [[package]] name = "httparse" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -1989,6 +1989,7 @@ dependencies = [ "mas-email", "mas-handlers", "mas-http", + "mas-static-files", "mas-storage", "mas-tasks", "mas-templates", @@ -2096,7 +2097,6 @@ dependencies = [ "mas-http", "mas-iana", "mas-jose", - "mas-static-files", "mas-storage", "mas-templates", "mime", @@ -2213,10 +2213,12 @@ dependencies = [ "axum", "headers", "http", + "http-body", "mime_guess", "rust-embed", - "tokio", "tower", + "tower-http", + "tracing", ] [[package]] @@ -2422,9 +2424,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ "autocfg", "num-integer", @@ -2894,9 +2896,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -4009,9 +4011,9 @@ checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" [[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", ] @@ -4024,9 +4026,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "0f48b6d60512a392e34dbf7fd456249fd2de3c83669ab642e021903f4015185b" dependencies = [ "bytes 1.1.0", "libc", @@ -4192,9 +4194,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.2.5" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" +checksum = "f7755f984aa46a9d50829dc84b6a674b2f3b8b4de47c0708923953b090d48acc" dependencies = [ "async-compression", "bitflags", @@ -4204,7 +4206,11 @@ dependencies = [ "http", "http-body", "http-range-header", + "httpdate", "iri-string", + "mime", + "mime_guess", + "percent-encoding", "pin-project-lite", "tokio", "tokio-util 0.7.1", @@ -4251,9 +4257,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote", @@ -4282,9 +4288,9 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ "lazy_static", "log", @@ -4421,9 +4427,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-normalization" diff --git a/crates/axum-utils/Cargo.toml b/crates/axum-utils/Cargo.toml index d5639fee..6c193376 100644 --- a/crates/axum-utils/Cargo.toml +++ b/crates/axum-utils/Cargo.toml @@ -7,7 +7,7 @@ license = "Apache-2.0" [dependencies] async-trait = "0.1.53" -axum = { version = "0.5.3", features = ["headers"] } +axum = { version = "0.5.4", features = ["headers"] } bincode = "1.3.3" chrono = "0.4.19" cookie = { version = "0.16.0", features = ["private", "percent-encode"] } @@ -24,7 +24,7 @@ serde_urlencoded = "0.7.1" serde_json = "1.0.79" sqlx = "0.5.13" thiserror = "1.0.30" -tokio = "1.17.0" +tokio = "1.18.0" tower = { version = "0.4.12", features = ["util"] } tracing = "0.1.34" url = "2.2.2" diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index b9b899c3..c3585e04 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -tokio = { version = "1.17.0", features = ["full"] } +tokio = { version = "1.18.0", features = ["full"] } futures = "0.3.21" anyhow = "1.0.57" clap = { version = "3.1.12", features = ["derive"] } @@ -32,21 +32,22 @@ opentelemetry-jaeger = { version = "0.16.0", features = ["rt-tokio", "reqwest_co opentelemetry-otlp = { version = "0.10.0", features = ["trace", "metrics"], optional = true } opentelemetry-zipkin = { version = "0.15.0", features = ["reqwest-client", "reqwest-rustls"], default-features = false, optional = true } +mas-axum-utils = { path = "../axum-utils" } mas-config = { path = "../config" } mas-email = { path = "../email" } mas-handlers = { path = "../handlers" } mas-http = { path = "../http" } +mas-static-files = { path = "../static-files" } mas-storage = { path = "../storage" } mas-tasks = { path = "../tasks" } mas-templates = { path = "../templates" } -mas-axum-utils = { path = "../axum-utils" } [dev-dependencies] indoc = "1.0.4" [features] default = ["otlp", "jaeger", "zipkin"] -dev = ["mas-templates/dev", "mas-handlers/dev"] +dev = ["mas-templates/dev", "mas-static-files/dev"] # Enable OpenTelemetry OTLP exporter. Requires "protoc" otlp = ["opentelemetry-otlp"] # Enable OpenTelemetry Jaeger exporter and propagator. diff --git a/crates/cli/src/commands/server.rs b/crates/cli/src/commands/server.rs index c6429313..d83d44ae 100644 --- a/crates/cli/src/commands/server.rs +++ b/crates/cli/src/commands/server.rs @@ -194,6 +194,8 @@ impl Options { let url_builder = UrlBuilder::new(config.http.public_base.clone()); + let static_files = mas_static_files::service(&config.http.web_root); + // Explicitely the config to properly zeroize secret keys drop(config); @@ -217,6 +219,7 @@ impl Options { &mailer, &url_builder, ) + .fallback(static_files) .layer(ServerLayer::default()); info!("Listening on http://{}", listener.local_addr().unwrap()); diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index 24d09aab..4b24cdf4 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -tokio = { version = "1.17.0", features = [] } +tokio = { version = "1.18.0", features = [] } tracing = { version = "0.1.34", features = ["log"] } async-trait = "0.1.53" diff --git a/crates/email/Cargo.toml b/crates/email/Cargo.toml index d308e49c..66ab203d 100644 --- a/crates/email/Cargo.toml +++ b/crates/email/Cargo.toml @@ -8,7 +8,7 @@ license = "Apache-2.0" [dependencies] anyhow = "1.0.57" async-trait = "0.1.53" -tokio = { version = "1.17.0", features = ["macros"] } +tokio = { version = "1.18.0", features = ["macros"] } tracing = "0.1.34" aws-sdk-sesv2 = "0.10.1" aws-config = "0.10.1" diff --git a/crates/handlers/Cargo.toml b/crates/handlers/Cargo.toml index 9d3fe8b0..3c06a653 100644 --- a/crates/handlers/Cargo.toml +++ b/crates/handlers/Cargo.toml @@ -5,12 +5,9 @@ authors = ["Quentin Gliech "] edition = "2021" license = "Apache-2.0" -[features] -dev = ["mas-static-files/dev", "mas-templates/dev"] - [dependencies] # Async runtime -tokio = { version = "1.17.0", features = ["macros"] } +tokio = { version = "1.18.0", features = ["macros"] } # Logging and tracing tracing = "0.1.34" @@ -22,8 +19,8 @@ anyhow = "1.0.57" # Web server hyper = { version = "0.14.18", features = ["full"] } tower = "0.4.12" -tower-http = { version = "0.2.5", features = ["cors"] } -axum = "0.5.3" +tower-http = { version = "0.3.1", features = ["cors"] } +axum = "0.5.4" axum-macros = "0.2.0" # Emails @@ -64,7 +61,6 @@ mas-email = { path = "../email" } mas-http = { path = "../http" } mas-iana = { path = "../iana" } mas-jose = { path = "../jose" } -mas-static-files = { path = "../static-files" } mas-storage = { path = "../storage" } mas-templates = { path = "../templates" } diff --git a/crates/handlers/src/lib.rs b/crates/handlers/src/lib.rs index 38ca8bad..1e5086aa 100644 --- a/crates/handlers/src/lib.rs +++ b/crates/handlers/src/lib.rs @@ -125,7 +125,6 @@ where get(self::oauth2::authorization::step_get), ) .merge(api_router) - .fallback(mas_static_files::Assets) .layer(Extension(pool.clone())) .layer(Extension(templates.clone())) .layer(Extension(key_store.clone())) diff --git a/crates/http/Cargo.toml b/crates/http/Cargo.toml index 6efe0f3e..92c0e6ae 100644 --- a/crates/http/Cargo.toml +++ b/crates/http/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -axum = "0.5.3" +axum = "0.5.4" bytes = "1.1.0" futures-util = "0.3.21" headers = "0.3.7" @@ -22,8 +22,8 @@ rustls = "0.20.4" serde = "1.0.136" serde_json = "1.0.79" thiserror = "1.0.30" -tokio = { version = "1.17.0", features = ["sync", "parking_lot"] } +tokio = { version = "1.18.0", features = ["sync", "parking_lot"] } tower = { version = "0.4.12", features = ["timeout", "limit"] } -tower-http = { version = "0.2.5", features = ["follow-redirect", "decompression-full", "set-header", "compression-full", "cors"] } +tower-http = { version = "0.3.1", features = ["follow-redirect", "decompression-full", "set-header", "compression-full", "cors"] } tracing = "0.1.34" tracing-opentelemetry = "0.17.2" diff --git a/crates/iana-codegen/Cargo.toml b/crates/iana-codegen/Cargo.toml index ae79b7ef..d8a94637 100644 --- a/crates/iana-codegen/Cargo.toml +++ b/crates/iana-codegen/Cargo.toml @@ -13,6 +13,6 @@ csv = "1.1.6" futures-util = "0.3.21" reqwest = { version = "0.11.10", features = ["blocking", "rustls-tls"], default-features = false } serde = { version = "1.0.136", features = ["derive"] } -tokio = { version = "1.17.0", features = ["full"] } +tokio = { version = "1.18.0", features = ["full"] } tracing = "0.1.34" tracing-subscriber = "0.3.11" diff --git a/crates/jose/Cargo.toml b/crates/jose/Cargo.toml index b8856b3a..d43b275c 100644 --- a/crates/jose/Cargo.toml +++ b/crates/jose/Cargo.toml @@ -30,7 +30,7 @@ serde_with = { version = "1.13.0", features = ["base64"] } sha2 = "0.10.2" signature = "1.4.0" thiserror = "1.0.30" -tokio = { version = "1.17.0", features = ["macros", "rt", "sync"] } +tokio = { version = "1.18.0", features = ["macros", "rt", "sync"] } tower = { version = "0.4.12", features = ["util"] } tracing = "0.1.34" url = { version = "2.2.2", features = ["serde"] } diff --git a/crates/static-files/Cargo.toml b/crates/static-files/Cargo.toml index 570756c1..2f7bb997 100644 --- a/crates/static-files/Cargo.toml +++ b/crates/static-files/Cargo.toml @@ -9,10 +9,12 @@ license = "Apache-2.0" dev = [] [dependencies] -axum = "0.5.3" +axum = "0.5.4" headers = "0.3.7" http = "0.2.6" +http-body = "0.4.4" mime_guess = "2.0.4" rust-embed = "6.4.0" -tokio = { version = "1.17.0", features = ["fs"] } tower = "0.4.12" +tower-http = { version = "0.3.1", features = ["fs"] } +tracing = "0.1.34" diff --git a/crates/static-files/package-lock.json b/crates/static-files/package-lock.json index 09229f9a..b4ff1d2f 100644 --- a/crates/static-files/package-lock.json +++ b/crates/static-files/package-lock.json @@ -182,9 +182,9 @@ } }, "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, "funding": [ { @@ -197,10 +197,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" }, "bin": { @@ -496,9 +496,9 @@ "dev": true }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "dependencies": { "domelementtype": "^2.0.1", @@ -510,9 +510,9 @@ } }, "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -551,9 +551,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.86", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.86.tgz", - "integrity": "sha512-EVTZ+igi8x63pK4bPuA95PXIs2b2Cowi3WQwI9f9qManLiZJOD1Lash1J3W4TvvcUCcIR4o/rgi9o8UicXSO+w==", + "version": "1.4.123", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.123.tgz", + "integrity": "sha512-0pHGE53WkYoFbsgwYcVKEpWa6jbzlvkohIEA2CUoZ9b5KC+w/zlMiQHvW/4IBcOh7YoEFqRNavgTk02TBoUTUw==", "dev": true }, "node_modules/entities": { @@ -693,9 +693,9 @@ } }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -771,22 +771,22 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/mini-svg-data-uri": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz", - "integrity": "sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", "dev": true, "bin": { "mini-svg-data-uri": "cli.js" @@ -799,9 +799,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -811,9 +811,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, "node_modules/normalize-path": { @@ -1765,15 +1765,15 @@ } }, "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" } }, @@ -1982,9 +1982,9 @@ "dev": true }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "requires": { "domelementtype": "^2.0.1", @@ -1993,9 +1993,9 @@ } }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domhandler": { @@ -2019,9 +2019,9 @@ } }, "electron-to-chromium": { - "version": "1.4.86", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.86.tgz", - "integrity": "sha512-EVTZ+igi8x63pK4bPuA95PXIs2b2Cowi3WQwI9f9qManLiZJOD1Lash1J3W4TvvcUCcIR4o/rgi9o8UicXSO+w==", + "version": "1.4.123", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.123.tgz", + "integrity": "sha512-0pHGE53WkYoFbsgwYcVKEpWa6jbzlvkohIEA2CUoZ9b5KC+w/zlMiQHvW/4IBcOh7YoEFqRNavgTk02TBoUTUw==", "dev": true }, "entities": { @@ -2125,9 +2125,9 @@ } }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { "has": "^1.0.3" @@ -2185,19 +2185,19 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mini-svg-data-uri": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz", - "integrity": "sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", "dev": true }, "minimist": { @@ -2207,15 +2207,15 @@ "dev": true }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, "normalize-path": { diff --git a/crates/static-files/src/lib.rs b/crates/static-files/src/lib.rs index f5fd2c40..b1f9ff52 100644 --- a/crates/static-files/src/lib.rs +++ b/crates/static-files/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2021 The Matrix.org Foundation C.I.C. +// Copyright 2021, 2022 The Matrix.org Foundation C.I.C. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,99 +18,157 @@ #![deny(clippy::all, missing_docs, rustdoc::broken_intra_doc_links)] #![warn(clippy::pedantic)] -use std::{ - convert::Infallible, - future::{ready, Ready}, -}; +#[cfg(not(feature = "dev"))] +mod builtin { + use std::{ + fmt::Write, + future::{ready, Ready}, + }; -use axum::{ - response::{IntoResponse, Response}, - TypedHeader, -}; -use headers::{ContentLength, ContentType, ETag, HeaderMapExt, IfNoneMatch}; -use http::{Method, Request, StatusCode}; -use rust_embed::RustEmbed; -use tower::Service; + use axum::{ + response::{IntoResponse, Response}, + TypedHeader, + }; + use headers::{ContentLength, ContentType, ETag, HeaderMapExt, IfNoneMatch}; + use http::{Method, Request, StatusCode}; + use rust_embed::RustEmbed; + use tower::Service; -// TODO: read the assets live from the filesystem + /// Embedded public assets + #[derive(RustEmbed, Clone, Debug)] + #[folder = "public/"] + pub struct Assets; -/// Embedded public assets -#[derive(RustEmbed, Clone)] -#[folder = "public/"] -pub struct Assets; + impl Assets { + fn get_response( + is_head: bool, + path: &str, + if_none_match: Option, + ) -> Option { + let asset = Self::get(path)?; -impl Assets { - fn get_response( - is_head: bool, - path: &str, - if_none_match: Option, - ) -> Option { - let asset = Self::get(path)?; + let etag = { + let hash = asset.metadata.sha256_hash(); + let mut buf = String::with_capacity(2 + hash.len() * 2); + write!(buf, "\"").unwrap(); + for byte in hash { + write!(buf, "{:02x}", byte).unwrap(); + } + write!(buf, "\"").unwrap(); + buf + }; + let etag: ETag = etag.parse().unwrap(); - let etag: String = asset - .metadata - .sha256_hash() - .iter() - .map(|x| format!("{:02x}", x)) - .collect(); - let etag: ETag = format!("\"{}\"", etag).parse().unwrap(); - - if let Some(if_none_match) = if_none_match { - if if_none_match.precondition_passes(&etag) { - return Some(StatusCode::NOT_MODIFIED.into_response()); + if let Some(if_none_match) = if_none_match { + if if_none_match.precondition_passes(&etag) { + return Some(StatusCode::NOT_MODIFIED.into_response()); + } } + + let len = asset.data.len().try_into().unwrap(); + let mime = mime_guess::from_path(path).first_or_octet_stream(); + + let res = if is_head { + ( + StatusCode::OK, + TypedHeader(ContentType::from(mime)), + TypedHeader(ContentLength(len)), + TypedHeader(etag), + ) + .into_response() + } else { + ( + StatusCode::OK, + TypedHeader(ContentType::from(mime)), + TypedHeader(ContentLength(len)), + TypedHeader(etag), + asset.data, + ) + .into_response() + }; + + Some(res) + } + } + + impl Service> for Assets { + type Response = Response; + type Error = std::io::Error; + type Future = Ready>; + + fn poll_ready( + &mut self, + _cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + std::task::Poll::Ready(Ok(())) } - let len = asset.data.len().try_into().unwrap(); - let mime = mime_guess::from_path(path).first_or_octet_stream(); + fn call(&mut self, req: Request) -> Self::Future { + let (parts, _body) = req.into_parts(); + let path = parts.uri.path().trim_start_matches('/'); + let if_none_match = parts.headers.typed_get(); + let is_head = match parts.method { + Method::GET => false, + Method::HEAD => true, + _ => return ready(Ok(StatusCode::METHOD_NOT_ALLOWED.into_response())), + }; - let res = if is_head { - ( - StatusCode::OK, - TypedHeader(ContentType::from(mime)), - TypedHeader(ContentLength(len)), - TypedHeader(etag), - ) - .into_response() - } else { - ( - StatusCode::OK, - TypedHeader(ContentType::from(mime)), - TypedHeader(ContentLength(len)), - TypedHeader(etag), - asset.data, - ) - .into_response() - }; + // TODO: support range requests + let response = Self::get_response(is_head, path, if_none_match) + .unwrap_or_else(|| StatusCode::NOT_FOUND.into_response()); + ready(Ok(response)) + } + } - Some(res) + /// Serve static files + #[must_use] + pub fn service() -> Assets { + Assets } } -impl Service> for Assets { - type Response = Response; - type Error = Infallible; - type Future = Ready>; +#[cfg(feature = "dev")] +mod builtin { + use std::path::PathBuf; - fn poll_ready( - &mut self, - _cx: &mut std::task::Context<'_>, - ) -> std::task::Poll> { - std::task::Poll::Ready(Ok(())) - } + use tower_http::services::ServeDir; - fn call(&mut self, req: Request) -> Self::Future { - let path = req.uri().path().trim_start_matches('/'); - let if_none_match = req.headers().typed_get(); - let is_head = match *req.method() { - Method::GET => false, - Method::HEAD => true, - _ => return ready(Ok(StatusCode::METHOD_NOT_ALLOWED.into_response())), - }; - - // TODO: support range requests - let response = Self::get_response(is_head, path, if_none_match) - .unwrap_or_else(|| StatusCode::NOT_FOUND.into_response()); - ready(Ok(response)) + /// Serve static files in dev mode + #[must_use] + pub fn service() -> ServeDir { + let path = PathBuf::from(format!("{}/public", env!("CARGO_MANIFEST_DIR"))); + ServeDir::new(path).append_index_html_on_directories(false) } } + +use std::{convert::Infallible, future::ready, path::PathBuf}; + +use axum::{ + body::HttpBody, + response::Response, + routing::{on_service, MethodFilter}, +}; +use http::{Request, StatusCode}; +use tower::{util::BoxCloneService, ServiceExt}; +use tower_http::services::ServeDir; + +/// Serve static files +#[must_use] +pub fn service( + path: &Option, +) -> BoxCloneService, Response, Infallible> { + let builtin = self::builtin::service(); + + let svc = if let Some(path) = path { + // TODO: fallback seems to have issues + let handler = ServeDir::new(path) + .append_index_html_on_directories(false) + .fallback(builtin); + on_service(MethodFilter::HEAD | MethodFilter::GET, handler) + } else { + on_service(MethodFilter::HEAD | MethodFilter::GET, builtin) + }; + + svc.handle_error(|_| ready(StatusCode::INTERNAL_SERVER_ERROR)) + .boxed_clone() +} diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index 0580ca73..9e591a16 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -tokio = "1.17.0" +tokio = "1.18.0" sqlx = { version = "0.5.13", features = ["runtime-tokio-rustls", "postgres", "migrate", "chrono", "offline", "json"] } chrono = { version = "0.4.19", features = ["serde"] } serde = { version = "1.0.136", features = ["derive"] } diff --git a/crates/tasks/Cargo.toml b/crates/tasks/Cargo.toml index 0ea59c62..6b4442c3 100644 --- a/crates/tasks/Cargo.toml +++ b/crates/tasks/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -tokio = "1.17.0" +tokio = "1.18.0" async-trait = "0.1.53" tokio-stream = "0.1.8" futures-util = "0.3.21" diff --git a/crates/templates/Cargo.toml b/crates/templates/Cargo.toml index ce18921d..ce6210e0 100644 --- a/crates/templates/Cargo.toml +++ b/crates/templates/Cargo.toml @@ -10,7 +10,7 @@ dev = [] [dependencies] tracing = "0.1.34" -tokio = { version = "1.17.0", features = ["macros"] } +tokio = { version = "1.18.0", features = ["macros"] } anyhow = "1.0.57" thiserror = "1.0.30"