♻️ 使用 Actix RS 重构 #8
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,5 @@ | ||||
| /config | ||||
| /certs | ||||
| /letsencrypt | ||||
|  | ||||
| # Added by cargo | ||||
|   | ||||
							
								
								
									
										96
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										96
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -51,6 +51,7 @@ dependencies = [ | ||||
|  "actix-codec", | ||||
|  "actix-rt", | ||||
|  "actix-service", | ||||
|  "actix-tls", | ||||
|  "actix-utils", | ||||
|  "ahash", | ||||
|  "base64", | ||||
| @@ -168,8 +169,10 @@ dependencies = [ | ||||
|  "impl-more", | ||||
|  "openssl", | ||||
|  "pin-project-lite", | ||||
|  "rustls-pki-types", | ||||
|  "tokio", | ||||
|  "tokio-openssl", | ||||
|  "tokio-rustls", | ||||
|  "tokio-util", | ||||
|  "tracing", | ||||
| ] | ||||
| @@ -197,6 +200,7 @@ dependencies = [ | ||||
|  "actix-rt", | ||||
|  "actix-server", | ||||
|  "actix-service", | ||||
|  "actix-tls", | ||||
|  "actix-utils", | ||||
|  "actix-web-codegen", | ||||
|  "ahash", | ||||
| @@ -1267,6 +1271,20 @@ version = "0.8.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" | ||||
|  | ||||
| [[package]] | ||||
| name = "ring" | ||||
| version = "0.17.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" | ||||
| dependencies = [ | ||||
|  "cc", | ||||
|  "getrandom", | ||||
|  "libc", | ||||
|  "spin", | ||||
|  "untrusted", | ||||
|  "windows-sys", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "roadsign" | ||||
| version = "0.1.0" | ||||
| @@ -1284,6 +1302,8 @@ dependencies = [ | ||||
|  "queryst", | ||||
|  "rand", | ||||
|  "regex", | ||||
|  "rustls", | ||||
|  "rustls-pemfile", | ||||
|  "serde", | ||||
|  "serde_json", | ||||
|  "tokio", | ||||
| @@ -1331,6 +1351,47 @@ dependencies = [ | ||||
|  "semver", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "rustls" | ||||
| version = "0.22.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" | ||||
| dependencies = [ | ||||
|  "log", | ||||
|  "ring", | ||||
|  "rustls-pki-types", | ||||
|  "rustls-webpki", | ||||
|  "subtle", | ||||
|  "zeroize", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "rustls-pemfile" | ||||
| version = "2.0.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" | ||||
| dependencies = [ | ||||
|  "base64", | ||||
|  "rustls-pki-types", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "rustls-pki-types" | ||||
| version = "1.2.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" | ||||
|  | ||||
| [[package]] | ||||
| name = "rustls-webpki" | ||||
| version = "0.102.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" | ||||
| dependencies = [ | ||||
|  "ring", | ||||
|  "rustls-pki-types", | ||||
|  "untrusted", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "ryu" | ||||
| version = "1.0.16" | ||||
| @@ -1466,6 +1527,18 @@ dependencies = [ | ||||
|  "windows-sys", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "spin" | ||||
| version = "0.9.8" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" | ||||
|  | ||||
| [[package]] | ||||
| name = "subtle" | ||||
| version = "2.5.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" | ||||
|  | ||||
| [[package]] | ||||
| name = "syn" | ||||
| version = "1.0.109" | ||||
| @@ -1613,6 +1686,17 @@ dependencies = [ | ||||
|  "tokio", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "tokio-rustls" | ||||
| version = "0.25.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" | ||||
| dependencies = [ | ||||
|  "rustls", | ||||
|  "rustls-pki-types", | ||||
|  "tokio", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "tokio-tungstenite" | ||||
| version = "0.21.0" | ||||
| @@ -1798,6 +1882,12 @@ version = "1.11.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" | ||||
|  | ||||
| [[package]] | ||||
| name = "untrusted" | ||||
| version = "0.9.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" | ||||
|  | ||||
| [[package]] | ||||
| name = "url" | ||||
| version = "2.5.0" | ||||
| @@ -1977,6 +2067,12 @@ dependencies = [ | ||||
|  "syn 2.0.48", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "zeroize" | ||||
| version = "1.7.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" | ||||
|  | ||||
| [[package]] | ||||
| name = "zstd" | ||||
| version = "0.13.0" | ||||
|   | ||||
| @@ -8,7 +8,7 @@ edition = "2021" | ||||
| [dependencies] | ||||
| actix-files = "0.6.5" | ||||
| actix-proxy = "0.2.0" | ||||
| actix-web = "4.5.1" | ||||
| actix-web = { version = "4.5.1", features = ["rustls-0_22"] } | ||||
| actix-web-httpauth = "0.8.1" | ||||
| awc = "3.4.0" | ||||
| config = { version = "0.14.0", features = ["toml"] } | ||||
| @@ -32,3 +32,5 @@ tracing = "0.1.40" | ||||
| tracing-subscriber = "0.3.18" | ||||
| wildmatch = "2.3.0" | ||||
| derive_more = "0.99.17" | ||||
| rustls = "0.22.2" | ||||
| rustls-pemfile = "2.0.0" | ||||
|   | ||||
| @@ -5,3 +5,8 @@ secret = "aEXcED5xJ3" | ||||
| proxies = "0.0.0.0:80" | ||||
| proxies_tls = "0.0.0.0:443" | ||||
| sideload = "0.0.0.0:81" | ||||
|  | ||||
| [[certificates]] | ||||
| domain = "localhost" | ||||
| certs = "certs/fullchain.pem" | ||||
| key = "certs/privkey.pem" | ||||
| @@ -1,98 +0,0 @@ | ||||
| -----BEGIN CERTIFICATE----- | ||||
| MIIGITCCBQmgAwIBAgISBPa2ahmRa5l0SrbR75K29TlqMA0GCSqGSIb3DQEBCwUA | ||||
| MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD | ||||
| EwJSMzAeFw0yNDAxMjgxNjM1MzZaFw0yNDA0MjcxNjM1MzVaMBwxGjAYBgNVBAMT | ||||
| EXNtYXJ0c2hlZXAuc3R1ZGlvMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC | ||||
| AgEAumtDoEkBHiqBGNl9JUbt3Nw1a/iLa2JHZvCmUuilvafAj0k1UPEu457iJVjh | ||||
| nxlTl/tgpCooRNviboB0lMAecwiKb5PIZzInY2/gb+rceL7rycalDAjWnwZZg8Tl | ||||
| 3JWJaU0D3+jeBQ9p7xkRPTcRpkGxFX9hRdInRqFGmCK4/OXrBwI3FkoP9Z8Nvgzc | ||||
| RyIhmMEafOi2AaLJSXZQE508djHpcxlwoxvVmFIYsjTMJiq+zdqCZDTjDqt7bZC+ | ||||
| mp3n/DFLL0sTzIBLuHnPkrjwlE4w/XTLkMLgrGPvEJVHn4kOvnJSWJb95d3sRZqB | ||||
| PLrekQGDtcb0dpFx8ctWycVp0qhBTpuLAoN+AK6cJ3IkxOcGm7sKzYwRINjAblMe | ||||
| n1Y6as6JKL4zSZBt1jxua1NGIRQ1c4ReA78NniTMrFIk1mFL4kNT9ppgDsWGNTJx | ||||
| FqC76rr3TdKXKzD/c8h57j3CPTF9lGB4Vmlkrq/zA++br0IG7Ki/+1n04Q1UDN0E | ||||
| 8z/vgUsT+pMItrmUhpnhb+4QWLQHTWOg1CyWT9xSm77ArkuNSdzNFGjpSbYZEPlh | ||||
| pmAYTz+kWvnyg7T3Lt7fmSPCBnnIWhi9CJofvyomICWfcKEfwc0msJquXMyJBayA | ||||
| K91VMoudbveI+CX8Zuc5u4uCOk/Dr6JJWnYkIDK7cW+tFh0CAwEAAaOCAkUwggJB | ||||
| MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw | ||||
| DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUPabqUNdBFv+3fEpgh2seAHvPQFgwHwYD | ||||
| VR0jBBgwFoAUFC6zF7dYVsuuUAlA5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEG | ||||
| CCsGAQUFBzABhhVodHRwOi8vcjMuby5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0 | ||||
| dHA6Ly9yMy5pLmxlbmNyLm9yZy8wTQYDVR0RBEYwRIIaKi5wbGF5bWMuc21hcnRz | ||||
| aGVlcC5zdHVkaW+CEyouc21hcnRzaGVlcC5zdHVkaW+CEXNtYXJ0c2hlZXAuc3R1 | ||||
| ZGlvMBMGA1UdIAQMMAowCAYGZ4EMAQIBMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDx | ||||
| AHcAO1N3dT4tuYBOizBbBv5AO2fYT8P0x70ADS1yb+H61BcAAAGNUSQZ5gAABAMA | ||||
| SDBGAiEA9i8QVPKh68OY9Ug+KqZ1aWSx5SVUvPKVyp8KkI/RMssCIQD0JsqwhLFx | ||||
| SQFVROa1yhbZIdIHs9NMuW7lHbOWOU4F+AB2AO7N0GTV2xrOxVy3nbTNE6Iyh0Z8 | ||||
| vOzew1FIWUZxH7WbAAABjVEkGesAAAQDAEcwRQIhAKXGxcDa/aGK50QyhOXAdlKl | ||||
| VCk0Yo9wYzw2sB48BF1TAiBsW2R+CJXhnCBzcRRh8GQuj+aBcYIzHBaRvsanC9nx | ||||
| 9zANBgkqhkiG9w0BAQsFAAOCAQEAgYR8uizQZkkvlEyI5dsz/tGJ0Vuejnd6yfoE | ||||
| OT6BaNF45UtdMfSoJRLwgW6SM1hsuwmPjoUVS9VZ83NAhnWQqSeR9P4m7aMfhaeK | ||||
| qPlDDcGh/SZOvgeja8AsUhCq+9csUzR+FEfk7xJXFflcG1FNGzRglzmqrSvFHKhE | ||||
| EyJQuk6Oa/UiL0ICdKiLxh75gTJvTB/7wznTP7NGsayzqkBj4nxqHIwCGh7hPe2c | ||||
| 2xMEbcFA9aArInJEg2PzlYRy1C9qtuhU2hJUhLjEix4WVCHUyAV/X6kwjqIaUEOz | ||||
| NdUrFCahGkWDVZZcPgl/FdFSPfSL/pnT8jOotELnhj0AiX2SNQ== | ||||
| -----END CERTIFICATE----- | ||||
|  | ||||
| -----BEGIN CERTIFICATE----- | ||||
| MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw | ||||
| TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh | ||||
| cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw | ||||
| WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg | ||||
| RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK | ||||
| AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP | ||||
| R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx | ||||
| sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm | ||||
| NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg | ||||
| Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG | ||||
| /kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC | ||||
| AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB | ||||
| Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA | ||||
| FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw | ||||
| AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw | ||||
| Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB | ||||
| gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W | ||||
| PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl | ||||
| ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz | ||||
| CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm | ||||
| lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 | ||||
| avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 | ||||
| yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O | ||||
| yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids | ||||
| hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ | ||||
| HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv | ||||
| MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX | ||||
| nLRbwHOoq7hHwg== | ||||
| -----END CERTIFICATE----- | ||||
|  | ||||
| -----BEGIN CERTIFICATE----- | ||||
| MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ | ||||
| MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT | ||||
| DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow | ||||
| TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh | ||||
| cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB | ||||
| AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC | ||||
| ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL | ||||
| wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D | ||||
| LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK | ||||
| 4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5 | ||||
| bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y | ||||
| sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ | ||||
| Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4 | ||||
| FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc | ||||
| SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql | ||||
| PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND | ||||
| TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw | ||||
| SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1 | ||||
| c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx | ||||
| +tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB | ||||
| ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu | ||||
| b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E | ||||
| U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu | ||||
| MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC | ||||
| 5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW | ||||
| 9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG | ||||
| WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O | ||||
| he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC | ||||
| Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5 | ||||
| -----END CERTIFICATE----- | ||||
| @@ -1,51 +0,0 @@ | ||||
| -----BEGIN RSA PRIVATE KEY----- | ||||
| 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 | ||||
| -----END RSA PRIVATE KEY----- | ||||
| @@ -7,5 +7,5 @@ use crate::config::loader::load_settings; | ||||
| pub mod loader; | ||||
|  | ||||
| lazy_static! { | ||||
|     pub static ref C: RwLock<Config> = RwLock::new(load_settings()); | ||||
|     pub static ref CFG: RwLock<Config> = RwLock::new(load_settings()); | ||||
| } | ||||
|   | ||||
							
								
								
									
										34
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								src/main.rs
									
									
									
									
									
								
							| @@ -2,7 +2,9 @@ mod config; | ||||
| mod proxies; | ||||
| mod sideload; | ||||
| pub mod warden; | ||||
| mod tls; | ||||
|  | ||||
| use std::error; | ||||
| use actix_web::{App, HttpServer, web}; | ||||
| use actix_web::middleware::Logger; | ||||
| use actix_web_httpauth::extractors::AuthenticationError; | ||||
| @@ -20,7 +22,7 @@ lazy_static! { | ||||
| } | ||||
|  | ||||
| #[tokio::main] | ||||
| async fn main() -> Result<(), std::io::Error> { | ||||
| async fn main() -> Result<(), Box<dyn error::Error>> { | ||||
|     // Setting up logging | ||||
|     tracing_subscriber::fmt() | ||||
|         .with_max_level(Level::DEBUG) | ||||
| @@ -29,11 +31,10 @@ async fn main() -> Result<(), std::io::Error> { | ||||
|     // Prepare all the stuff | ||||
|     info!("Loading proxy regions..."); | ||||
|     match proxies::loader::scan_regions( | ||||
|         config::C | ||||
|         config::CFG | ||||
|             .read() | ||||
|             .await | ||||
|             .get_string("regions") | ||||
|             .unwrap_or("./regions".to_string()), | ||||
|             .get_string("regions")? | ||||
|     ) { | ||||
|         Err(_) => error!("Loading proxy regions... failed"), | ||||
|         Ok((regions, count)) => { | ||||
| @@ -48,23 +49,30 @@ async fn main() -> Result<(), std::io::Error> { | ||||
|             .wrap(Logger::default()) | ||||
|             .app_data(web::Data::new(Client::default())) | ||||
|             .route("/", web::to(route::handle)) | ||||
|     }).bind( | ||||
|         config::C | ||||
|     }).bind_rustls_0_22( | ||||
|         config::CFG | ||||
|             .read() | ||||
|             .await | ||||
|             .get_string("listen.proxies") | ||||
|             .unwrap_or("0.0.0.0:80".to_string()) | ||||
|             .get_string("listen.proxies_tls")?, | ||||
|         tls::use_rustls().await?, | ||||
|     )?.bind( | ||||
|         config::CFG | ||||
|             .read() | ||||
|             .await | ||||
|             .get_string("listen.proxies")? | ||||
|     )?.run(); | ||||
|  | ||||
|     // Sideload | ||||
|     let sideload_server = HttpServer::new(|| { | ||||
|         App::new() | ||||
|             .wrap(HttpAuthentication::basic(|req, credentials| async move { | ||||
|                 let password = config::C | ||||
|                 let password = match config::CFG | ||||
|                     .read() | ||||
|                     .await | ||||
|                     .get_string("secret") | ||||
|                     .unwrap_or("".to_string()); | ||||
|                     .get_string("secret") { | ||||
|                     Ok(val) => val, | ||||
|                     Err(_) => return Err((AuthenticationError::new(Basic::new()).into(), req)) | ||||
|                 }; | ||||
|                 if credentials.password().unwrap_or("") != password { | ||||
|                     Err((AuthenticationError::new(Basic::new()).into(), req)) | ||||
|                 } else { | ||||
| @@ -73,12 +81,12 @@ async fn main() -> Result<(), std::io::Error> { | ||||
|             })) | ||||
|             .service(sideload::service()) | ||||
|     }).bind( | ||||
|         config::C | ||||
|         config::CFG | ||||
|             .read() | ||||
|             .await | ||||
|             .get_string("listen.sideload") | ||||
|             .unwrap_or("0.0.0.0:81".to_string()) | ||||
|     )?.run(); | ||||
|     )?.workers(1).run(); | ||||
|  | ||||
|     // Process manager | ||||
|     { | ||||
|   | ||||
							
								
								
									
										78
									
								
								src/tls.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								src/tls.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| use std::fs::File; | ||||
| use std::{error}; | ||||
| use std::io::BufReader; | ||||
| use std::sync::Arc; | ||||
| use config::ConfigError; | ||||
| use lazy_static::lazy_static; | ||||
| use rustls::crypto::ring::sign::RsaSigningKey; | ||||
| use rustls::server::{ClientHello, ResolvesServerCert}; | ||||
| use rustls::sign::CertifiedKey; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use std::sync::Mutex; | ||||
| use wildmatch::WildMatch; | ||||
|  | ||||
| lazy_static! { | ||||
|     static ref CERTS: Mutex<Vec<CertificateConfig>> = Mutex::new(Vec::new()); | ||||
| } | ||||
|  | ||||
| #[derive(Debug)] | ||||
| struct ProxyCertResolver; | ||||
|  | ||||
| impl ResolvesServerCert for ProxyCertResolver { | ||||
|     fn resolve(&self, handshake: ClientHello) -> Option<Arc<CertifiedKey>> { | ||||
|         let domain = handshake.server_name()?; | ||||
|  | ||||
|         let certs = CERTS.lock().unwrap(); | ||||
|         for cert in certs.iter() { | ||||
|             if WildMatch::new(cert.domain.as_str()).matches(domain) { | ||||
|                 return match cert.clone().load() { | ||||
|                     Ok(val) => Some(val), | ||||
|                     Err(_) => None | ||||
|                 }; | ||||
|             } | ||||
|         } | ||||
|         None | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Clone, Serialize, Deserialize)] | ||||
| struct CertificateConfig { | ||||
|     pub domain: String, | ||||
|     pub certs: String, | ||||
|     pub key: String, | ||||
| } | ||||
|  | ||||
| impl CertificateConfig { | ||||
|     pub fn load(self) -> Result<Arc<CertifiedKey>, Box<dyn error::Error>> { | ||||
|         let certs = | ||||
|             rustls_pemfile::certs(&mut BufReader::new(&mut File::open(self.certs)?)) | ||||
|                 .collect::<Result<Vec<_>, _>>()?; | ||||
|         let key = | ||||
|             rustls_pemfile::private_key(&mut BufReader::new(&mut File::open(self.key)?))? | ||||
|                 .unwrap(); | ||||
|         let sign = RsaSigningKey::new(&key)?; | ||||
|  | ||||
|         Ok(Arc::new(CertifiedKey::new(certs, Arc::new(sign)))) | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub async fn load_certificates() -> Result<(), ConfigError> { | ||||
|     let certs = crate::config::CFG | ||||
|         .read() | ||||
|         .await | ||||
|         .get::<Vec<CertificateConfig>>("certificates")?; | ||||
|  | ||||
|     CERTS.lock().unwrap().clone_from(&certs); | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
| pub async fn use_rustls() -> Result<rustls::ServerConfig, ConfigError> { | ||||
|     load_certificates().await?; | ||||
|  | ||||
|     Ok( | ||||
|         rustls::ServerConfig::builder() | ||||
|             .with_no_client_auth() | ||||
|             .with_cert_resolver(Arc::new(ProxyCertResolver)) | ||||
|     ) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user