From 30000a480351664d29b04eb09643b46e4fb0033c Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 2 Jun 2025 22:20:37 +0300 Subject: [PATCH] 0.1.1-cors-internal --- CHANGELOG.md | 11 ++ Cargo.lock | 294 ++++++++++++++++++++++++++++++-------------- Cargo.toml | 13 +- README.md | 1 + nginx.conf.sigil | 107 ++++++++-------- src/handlers/mod.rs | 17 ++- src/main.rs | 28 ++++- 7 files changed, 315 insertions(+), 156 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..024250d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +## [0.1.1] + +- Added application-level CORS middleware using actix-cors +- Configured precise CORS headers and methods for security +- Added root handler for GET requests to "/" endpoint +- Removed CORS configuration from nginx.conf.sigil +- Simplified nginx configuration to pure proxy mode + +## [0.1.0] + +- inital version \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index cdafc2d..4216415 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "ab_glyph" @@ -61,24 +61,39 @@ dependencies = [ ] [[package]] -name = "actix-http" -version = "3.9.0" +name = "actix-cors" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" +checksum = "daa239b93927be1ff123eebada5a3ff23e89f0124ccb8609234e5103d5a5ae6d" +dependencies = [ + "actix-utils", + "actix-web", + "derive_more 2.0.1", + "futures-util", + "log", + "once_cell", + "smallvec", +] + +[[package]] +name = "actix-http" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", - "ahash", "base64 0.22.1", "bitflags 2.6.0", "brotli", "bytes", "bytestring", - "derive_more", + "derive_more 2.0.1", "encoding_rs", "flate2", + "foldhash", "futures-core", "h2 0.3.26", "http 0.2.12", @@ -90,7 +105,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand", + "rand 0.9.1", "sha1", "smallvec", "tokio", @@ -118,7 +133,7 @@ dependencies = [ "actix-multipart-derive", "actix-utils", "actix-web", - "derive_more", + "derive_more 0.99.18", "futures-core", "futures-util", "httparse", @@ -126,7 +141,7 @@ dependencies = [ "log", "memchr", "mime", - "rand", + "rand 0.8.5", "serde", "serde_json", "serde_plain", @@ -230,7 +245,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more", + "derive_more 0.99.18", "encoding_rs", "futures-core", "futures-util", @@ -297,7 +312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -409,12 +424,6 @@ version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - [[package]] name = "arg_enum_proc_macro" version = "0.3.4" @@ -432,17 +441,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "async-trait" -version = "0.1.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -936,9 +934,9 @@ dependencies = [ [[package]] name = "brotli" -version = "6.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -947,9 +945,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.1" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1187,7 +1185,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -1198,7 +1196,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1289,6 +1287,27 @@ dependencies = [ "syn", ] +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + [[package]] name = "digest" version = "0.10.7" @@ -1302,10 +1321,11 @@ dependencies = [ [[package]] name = "discoursio-quoter" -version = "0.1.0" +version = "0.1.1" dependencies = [ "ab_glyph", "actix", + "actix-cors", "actix-multipart", "actix-web", "aws-config", @@ -1372,7 +1392,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -1462,7 +1482,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1632,10 +1652,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gif" version = "0.13.1" @@ -1659,7 +1691,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -2132,12 +2164,12 @@ checksum = "2393fb7808960751a52e8a154f67e7dd3f8a2ef9bd80d1553078a7b4e8ed3f0d" dependencies = [ "ab_glyph", "approx", - "getrandom", + "getrandom 0.2.15", "image", "itertools", "nalgebra", "num", - "rand", + "rand 0.8.5", "rand_distr", "rayon", ] @@ -2166,9 +2198,9 @@ dependencies = [ [[package]] name = "infer" -version = "0.15.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" dependencies = [ "cfb", ] @@ -2237,9 +2269,9 @@ dependencies = [ [[package]] name = "kamadak-exif" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077" +checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837" dependencies = [ "mutate_once", ] @@ -2264,9 +2296,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.162" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libfuzzer-sys" @@ -2424,7 +2456,7 @@ dependencies = [ "hermit-abi", "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -2824,6 +2856,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.8.5" @@ -2831,8 +2869,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -2842,7 +2890,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -2851,7 +2909,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", ] [[package]] @@ -2861,7 +2928,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -2890,11 +2957,11 @@ dependencies = [ "once_cell", "paste", "profiling", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "simd_helpers", "system-deps", - "thiserror", + "thiserror 1.0.69", "v_frame", "wasm-bindgen", ] @@ -2942,13 +3009,12 @@ dependencies = [ [[package]] name = "redis" -version = "0.27.5" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cccf17a692ce51b86564334614d72dcae1def0fd5ecebc9f02956da74352b5" +checksum = "0bc1ea653e0b2e097db3ebb5b7f678be339620b8041f66b30a308c1d45d36a7f" dependencies = [ - "arc-swap", - "async-trait", "bytes", + "cfg-if", "combine", "futures-util", "itoa", @@ -3076,7 +3142,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -3278,13 +3344,14 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "sentry" -version = "0.34.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5484316556650182f03b43d4c746ce0e3e48074a21e2f51244b648b6542e1066" +checksum = "a505499b38861edd82b5a688fa06ba4ba5875bb832adeeeba22b7b23fc4bc39a" dependencies = [ "httpdate", "native-tls", "reqwest", + "sentry-actix", "sentry-backtrace", "sentry-contexts", "sentry-core", @@ -3297,32 +3364,33 @@ dependencies = [ [[package]] name = "sentry-actix" -version = "0.34.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e461c7d3a46d298b5ffc66127c1f16454dd11d3d89fcfb21023cd499d82b9a78" +checksum = "39ad8bfdcfbc6e0d0dacaa5728555085ef459fa9226cfc2fe64eefa4b8038b7f" dependencies = [ + "actix-http", "actix-web", + "bytes", "futures-util", "sentry-core", ] [[package]] name = "sentry-backtrace" -version = "0.34.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40aa225bb41e2ec9d7c90886834367f560efc1af028f1c5478a6cce6a59c463a" +checksum = "8dace796060e4ad10e3d1405b122ae184a8b2e71dce05ae450e4f81b7686b0d9" dependencies = [ "backtrace", - "once_cell", "regex", "sentry-core", ] [[package]] name = "sentry-contexts" -version = "0.34.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a8dd746da3d16cb8c39751619cefd4fcdbd6df9610f3310fd646b55f6e39910" +checksum = "87bd9e6b51ffe2bc7188ebe36cb67557cb95749c08a3f81f33e8c9b135e0d1bc" dependencies = [ "hostname", "libc", @@ -3334,12 +3402,11 @@ dependencies = [ [[package]] name = "sentry-core" -version = "0.34.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161283cfe8e99c8f6f236a402b9ccf726b201f365988b5bb637ebca0abbd4a30" +checksum = "7426d4beec270cfdbb50f85f0bb2ce176ea57eed0b11741182a163055a558187" dependencies = [ - "once_cell", - "rand", + "rand 0.9.1", "sentry-types", "serde", "serde_json", @@ -3347,20 +3414,19 @@ dependencies = [ [[package]] name = "sentry-debug-images" -version = "0.34.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc6b25e945fcaa5e97c43faee0267eebda9f18d4b09a251775d8fef1086238a" +checksum = "9df15c066c04f34c4dfd496a8e76590106b93283f72ef1a47d8fb24d88493424" dependencies = [ "findshlibs", - "once_cell", "sentry-core", ] [[package]] name = "sentry-panic" -version = "0.34.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc74f229c7186dd971a9491ffcbe7883544aa064d1589bd30b83fb856cd22d63" +checksum = "c92beed69b776a162b6d269bef1eaa3e614090b6df45a88d9b239c4fdbffdfba" dependencies = [ "sentry-backtrace", "sentry-core", @@ -3368,9 +3434,9 @@ dependencies = [ [[package]] name = "sentry-tracing" -version = "0.34.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c5faf2103cd01eeda779ea439b68c4ee15adcdb16600836e97feafab362ec" +checksum = "55c323492795de90824f3198562e33dd74ae3bc852fbb13c0cabec54a1cf73cd" dependencies = [ "sentry-backtrace", "sentry-core", @@ -3380,16 +3446,16 @@ dependencies = [ [[package]] name = "sentry-types" -version = "0.34.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d68cdf6bc41b8ff3ae2a9c4671e97426dcdd154cc1d4b6b72813f285d6b163f" +checksum = "04b6c9287202294685cb1f749b944dbbce8160b81a1061ecddc073025fed129f" dependencies = [ "debugid", "hex", - "rand", + "rand 0.9.1", "serde", "serde_json", - "thiserror", + "thiserror 2.0.12", "time", "url", "uuid", @@ -3507,7 +3573,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -3687,7 +3753,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -3701,6 +3776,17 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tiff" version = "0.9.1" @@ -3755,9 +3841,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.1" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -3773,9 +3859,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -3947,6 +4033,12 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" @@ -4008,7 +4100,7 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ - "getrandom", + "getrandom 0.2.15", "serde", ] @@ -4068,6 +4160,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.95" @@ -4323,6 +4424,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "write16" version = "1.0.0" diff --git a/Cargo.toml b/Cargo.toml index 6c0f7b2..d120f68 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "discoursio-quoter" -version = "0.1.0" +version = "0.1.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -9,13 +9,14 @@ edition = "2021" futures = "0.3.30" serde_json = "1.0.115" actix-web = "4.5.1" +actix-cors = "0.7.0" reqwest = { version = "0.12.3", features = ["json"] } -sentry = { version = "0.34.0", features = ["tokio"] } +sentry = { version = "0.38.1", features = ["tokio"] } uuid = { version = "1.8.0", features = ["v4"] } -redis = { version = "0.27.2", features = ["tokio-comp"] } +redis = { version = "0.31.0", features = ["tokio-comp"] } tokio = { version = "1.37.0", features = ["full"] } serde = { version = "1.0.209", features = ["derive"] } -sentry-actix = "0.34.0" +sentry-actix = "0.38.1" aws-sdk-s3 = "1.47.0" image = "0.25.2" mime_guess = "2.0.5" @@ -28,8 +29,8 @@ imageproc = "0.25.0" ab_glyph = "0.2.29" # libheif-sys = "1.12.0" once_cell = "1.18" -kamadak-exif = "0.5" -infer = "0.15" +kamadak-exif = "0.6.1" +infer = "0.19.0" [[bin]] name = "quoter" diff --git a/README.md b/README.md index 6fc8331..48d4b98 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ - S3/STORJ интеграция: Загрузка файлов в через `aws-sdk-s3` и возврат публичных URL-адресов. - Управление квотами: Ограничение объема загружаемых данных для каждого пользователя с использованием Redis. - Отслеживание файлов: Хранение информации о загруженных файлах в Redis для управления квотами. + - CORS поддержка: Встроенная поддержка кросс-доменных запросов на уровне приложения для безопасного взаимодействия с веб-интерфейсами. ### Как это работает diff --git a/nginx.conf.sigil b/nginx.conf.sigil index 6be8712..9b414bb 100644 --- a/nginx.conf.sigil +++ b/nginx.conf.sigil @@ -1,14 +1,15 @@ -# Proxy settings +log_format custom '$remote_addr - $remote_user [$time_local] "$request" ' + 'origin=$http_origin status=$status ' + '"$http_referer" "$http_user_agent"'; + {{ $proxy_settings := "proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_set_header Host $http_host; proxy_set_header X-Request-Start $msec;" }} -# GZIP settings -{{ $gzip_settings := "gzip on; gzip_min_length 1100; gzip_buffers 4 32k; gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml; gzip_vary on; gzip_comp_level 6;" }} -# CORS headers based on request methods -{{ $cors_headers_options := "if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '$allow_origin' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; }" }} -{{ $cors_headers_post := "if ($request_method = 'POST') { add_header 'Access-Control-Allow-Origin' '$allow_origin' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; add_header 'Access-Control-Allow-Credentials' 'true' always; }" }} -{{ $cors_headers_get := "if ($request_method = 'GET') { add_header 'Access-Control-Allow-Origin' '$allow_origin' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; add_header 'Access-Control-Allow-Credentials' 'true' always; }" }} +{{ $gzip_settings := "gzip on; gzip_min_length 1100; gzip_buffers 4 32k; gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml; gzip_vary on; gzip_comp_level 6;" }} +proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g + inactive=60m use_temp_path=off; +limit_conn_zone $binary_remote_addr zone=addr:10m; +limit_req_zone $binary_remote_addr zone=req_zone:10m rate=20r/s; -# Server block setup {{ range $port_map := .PROXY_PORT_MAP | split " " }} {{ $port_map_list := $port_map | split ":" }} {{ $scheme := index $port_map_list 0 }} @@ -16,59 +17,61 @@ {{ $upstream_port := index $port_map_list 2 }} server { - # HTTP/HTTPS settings {{ if eq $scheme "http" }} - listen [::]:{{ $listen_port }}; - listen {{ $listen_port }}; - server_name {{ $.NOSSL_SERVER_NAME }}; - access_log /var/log/nginx/{{ $.APP }}-access.log; - error_log /var/log/nginx/{{ $.APP }}-error.log; + listen [::]:{{ $listen_port }}; + listen {{ $listen_port }}; + server_name {{ $.NOSSL_SERVER_NAME }}; + access_log /var/log/nginx/{{ $.APP }}-access.log custom; + error_log /var/log/nginx/{{ $.APP }}-error.log; + client_max_body_size 100M; {{ else if eq $scheme "https" }} + listen [::]:{{ $listen_port }} ssl http2; + listen {{ $listen_port }} ssl http2; + server_name {{ $.NOSSL_SERVER_NAME }}; + access_log /var/log/nginx/{{ $.APP }}-access.log custom; + error_log /var/log/nginx/{{ $.APP }}-error.log; + ssl_certificate {{ $.APP_SSL_PATH }}/server.crt; + ssl_certificate_key {{ $.APP_SSL_PATH }}/server.key; + ssl_protocols TLSv1.2 TLSv1.3; + ssl_prefer_server_ciphers off; - listen [::]:{{ $listen_port }} ssl http2; - listen {{ $listen_port }} ssl http2; - server_name {{ $.NOSSL_SERVER_NAME }}; - access_log /var/log/nginx/{{ $.APP }}-access.log; - error_log /var/log/nginx/{{ $.APP }}-error.log; - ssl_certificate {{ $.APP_SSL_PATH }}/server.crt; - ssl_certificate_key {{ $.APP_SSL_PATH }}/server.key; - ssl_protocols TLSv1.2 TLSv1.3; - ssl_prefer_server_ciphers off; - keepalive_timeout 70; + keepalive_timeout 70; + keepalive_requests 500; + proxy_read_timeout 3600; + limit_conn addr 10000; + client_max_body_size 100M; {{ end }} - location = / { - if ($request_method = GET) { - return 200 'ok'; - add_header Content-Type text/plain; - } - proxy_pass http://{{ $.APP }}-{{ $upstream_port }}; - {{ $proxy_settings }} - {{ $cors_headers_options }} - {{ $cors_headers_post }} - {{ $cors_headers_get }} - } - - # Default location block + location / { proxy_pass http://{{ $.APP }}-{{ $upstream_port }}; - add_header 'Cache-Control' 'no-cache'; - add_header 'Content-Type' 'text/event-stream'; - add_header 'Connection' 'keep-alive'; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_buffering off; - proxy_cache off; - proxy_read_timeout 36000s; {{ $proxy_settings }} - {{ $cors_headers_options }} - {{ $cors_headers_post }} - {{ $cors_headers_get }} + {{ $gzip_settings }} + + proxy_cache my_cache; + proxy_cache_revalidate on; + proxy_cache_min_uses 2; + proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; + proxy_cache_background_update on; + proxy_cache_lock on; + + # Connections and request limits increase (bad for DDos) + limit_req zone=req_zone burst=10 nodelay; } - # Error pages - error_page 400 401 402 403 405 406 407 408 409 410 411 412 413 414 415 416 417 418 420 422 423 424 426 428 429 431 444 449 450 451 /400-error.html; + location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { + proxy_pass http://{{ $.APP }}-{{ $upstream_port }}; + expires 30d; + add_header Cache-Control "public, no-transform"; + } + + location ~* \.(mp3|wav|ogg|flac|aac|aif|webm)$ { + proxy_pass http://{{ $.APP }}-{{ $upstream_port }}; + } + + + error_page 400 401 402 403 405 406 407 408 409 410 411 412 413 414 415 416 417 418 420 422 423 424 426 428 429 431 444 449 450 451 /400-error.html; location /400-error.html { root /var/lib/dokku/data/nginx-vhosts/dokku-errors; internal; @@ -92,13 +95,11 @@ server { internal; } - - # include /home/dokku/gateway/nginx.conf.d/*.conf; include {{ $.DOKKU_ROOT }}/{{ $.APP }}/nginx.conf.d/*.conf; } {{ end }} -# Upstream setup + {{ range $upstream_port := $.PROXY_UPSTREAM_PORTS | split " " }} upstream {{ $.APP }}-{{ $upstream_port }} { {{ range $listeners := $.DOKKU_APP_WEB_LISTENERS | split " " }} diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 18775d2..7969290 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -1,10 +1,21 @@ -mod upload; mod proxy; +mod upload; mod serve_file; -pub use upload::upload_handler; pub use proxy::proxy_handler; -// pub use serve_file::serve_file; +pub use upload::upload_handler; // Лимит квоты на пользователя: 2 ГБ в неделю pub const MAX_WEEK_BYTES: u64 = 2 * 1024 * 1024 * 1024; + +use actix_web::{HttpResponse, Result, HttpRequest}; + +/// Обработчик для корневого пути / +pub async fn root_handler(req: HttpRequest) -> Result { + match req.method().as_str() { + "GET" => Ok(HttpResponse::Ok() + .content_type("text/plain") + .body("ok")), + _ => Ok(HttpResponse::MethodNotAllowed().finish()) + } +} diff --git a/src/main.rs b/src/main.rs index cd125bf..be21981 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,9 +7,10 @@ mod thumbnail; mod core; mod overlay; -use actix_web::{middleware::Logger, web, App, HttpServer}; +use actix_web::{middleware::Logger, web, App, HttpServer, http::header::{self, HeaderName}}; +use actix_cors::Cors; use app_state::AppState; -use handlers::{proxy_handler, upload_handler}; +use handlers::{proxy_handler, upload_handler, root_handler}; use log::warn; use tokio::task::spawn_blocking; use std::env; @@ -34,9 +35,32 @@ async fn main() -> std::io::Result<()> { }); HttpServer::new(move || { + // Настройка CORS middleware + let cors = Cors::default() + .allow_any_origin() // TODO: ограничить конкретными доменами в продакшене + .allowed_methods(vec!["GET", "POST", "OPTIONS"]) + .allowed_headers(vec![ + header::DNT, + header::USER_AGENT, + HeaderName::from_static("x-requested-with"), + header::IF_MODIFIED_SINCE, + header::CACHE_CONTROL, + header::CONTENT_TYPE, + header::RANGE, + header::AUTHORIZATION, + ]) + .expose_headers(vec![ + header::CONTENT_LENGTH, + header::CONTENT_RANGE, + ]) + .supports_credentials() + .max_age(1728000); // 20 дней + App::new() .app_data(web::Data::new(app_state.clone())) + .wrap(cors) .wrap(Logger::default()) + .route("/", web::get().to(root_handler)) .route("/", web::post().to(upload_handler)) .route("/{path:.*}", web::get().to(proxy_handler)) })