mirror of
https://github.com/Pumpkin-MC/Pumpkin.git
synced 2026-08-30 20:14:23 +00:00
Improve compile time
This commit is contained in:
720
Cargo.lock
generated
720
Cargo.lock
generated
@@ -43,21 +43,6 @@ version = "0.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
|
||||
|
||||
[[package]]
|
||||
name = "android-tzdata"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
||||
|
||||
[[package]]
|
||||
name = "android_system_properties"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anes"
|
||||
version = "0.1.6"
|
||||
@@ -147,12 +132,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atomic-waker"
|
||||
version = "1.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.5.0"
|
||||
@@ -266,21 +245,6 @@ version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.41"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
|
||||
dependencies = [
|
||||
"android-tzdata",
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
"num-traits",
|
||||
"serde",
|
||||
"wasm-bindgen",
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ciborium"
|
||||
version = "0.2.2"
|
||||
@@ -374,20 +338,33 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation"
|
||||
version = "0.9.4"
|
||||
name = "cookie"
|
||||
version = "0.18.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
|
||||
checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"percent-encoding",
|
||||
"time",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation-sys"
|
||||
version = "0.8.7"
|
||||
name = "cookie_store"
|
||||
version = "0.21.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
||||
checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9"
|
||||
dependencies = [
|
||||
"cookie",
|
||||
"document-features",
|
||||
"idna",
|
||||
"indexmap",
|
||||
"log",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"time",
|
||||
"url",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cpufeatures"
|
||||
@@ -421,8 +398,6 @@ dependencies = [
|
||||
"itertools 0.13.0",
|
||||
"num-traits",
|
||||
"oorandom",
|
||||
"plotters",
|
||||
"rayon",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -704,15 +679,6 @@ version = "1.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
|
||||
|
||||
[[package]]
|
||||
name = "encoding_rs"
|
||||
version = "0.8.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "enum_dispatch"
|
||||
version = "0.3.13"
|
||||
@@ -802,21 +768,6 @@ version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "foreign-types"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
|
||||
dependencies = [
|
||||
"foreign-types-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "foreign-types-shared"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
||||
|
||||
[[package]]
|
||||
name = "form_urlencoded"
|
||||
version = "1.2.1"
|
||||
@@ -954,25 +905,6 @@ version = "0.31.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.4.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785"
|
||||
dependencies = [
|
||||
"atomic-waker",
|
||||
"bytes",
|
||||
"fnv",
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"http",
|
||||
"indexmap",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "half"
|
||||
version = "2.6.0"
|
||||
@@ -1032,29 +964,6 @@ dependencies = [
|
||||
"itoa",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http-body"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"http",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http-body-util"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-core",
|
||||
"http",
|
||||
"http-body",
|
||||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "httparse"
|
||||
version = "1.10.1"
|
||||
@@ -1070,108 +979,6 @@ dependencies = [
|
||||
"typenum",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "1.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
"h2",
|
||||
"http",
|
||||
"http-body",
|
||||
"httparse",
|
||||
"itoa",
|
||||
"pin-project-lite",
|
||||
"smallvec",
|
||||
"tokio",
|
||||
"want",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-rustls"
|
||||
version = "0.27.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
|
||||
dependencies = [
|
||||
"http",
|
||||
"hyper",
|
||||
"hyper-util",
|
||||
"rustls",
|
||||
"rustls-pki-types",
|
||||
"tokio",
|
||||
"tokio-rustls",
|
||||
"tower-service",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-tls"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"http-body-util",
|
||||
"hyper",
|
||||
"hyper-util",
|
||||
"native-tls",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
"tower-service",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-util"
|
||||
version = "0.1.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"bytes",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"http",
|
||||
"http-body",
|
||||
"hyper",
|
||||
"ipnet",
|
||||
"libc",
|
||||
"percent-encoding",
|
||||
"pin-project-lite",
|
||||
"socket2",
|
||||
"system-configuration",
|
||||
"tokio",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
"windows-registry",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
version = "0.1.63"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
|
||||
dependencies = [
|
||||
"android_system_properties",
|
||||
"core-foundation-sys",
|
||||
"iana-time-zone-haiku",
|
||||
"js-sys",
|
||||
"log",
|
||||
"wasm-bindgen",
|
||||
"windows-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone-haiku"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
|
||||
dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "icu_collections"
|
||||
version = "2.0.0"
|
||||
@@ -1310,22 +1117,6 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ipnet"
|
||||
version = "2.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
|
||||
|
||||
[[package]]
|
||||
name = "iri-string"
|
||||
version = "0.7.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "is_terminal_polyfill"
|
||||
version = "1.70.1"
|
||||
@@ -1518,12 +1309,6 @@ version = "2.7.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||
|
||||
[[package]]
|
||||
name = "miniz_oxide"
|
||||
version = "0.8.9"
|
||||
@@ -1551,23 +1336,6 @@ dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "native-tls"
|
||||
version = "0.2.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"log",
|
||||
"openssl",
|
||||
"openssl-probe",
|
||||
"openssl-sys",
|
||||
"schannel",
|
||||
"security-framework",
|
||||
"security-framework-sys",
|
||||
"tempfile",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
@@ -1659,50 +1427,6 @@ version = "11.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
|
||||
|
||||
[[package]]
|
||||
name = "openssl"
|
||||
version = "0.10.73"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cfg-if",
|
||||
"foreign-types",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"openssl-macros",
|
||||
"openssl-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl-macros"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl-probe"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
|
||||
|
||||
[[package]]
|
||||
name = "openssl-sys"
|
||||
version = "0.9.109"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
"pkg-config",
|
||||
"vcpkg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.4"
|
||||
@@ -1887,34 +1611,6 @@ version = "0.3.32"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
|
||||
|
||||
[[package]]
|
||||
name = "plotters"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
"plotters-backend",
|
||||
"plotters-svg",
|
||||
"wasm-bindgen",
|
||||
"web-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "plotters-backend"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
|
||||
|
||||
[[package]]
|
||||
name = "plotters-svg"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
|
||||
dependencies = [
|
||||
"plotters-backend",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "portable-atomic"
|
||||
version = "1.11.1"
|
||||
@@ -1993,7 +1689,6 @@ dependencies = [
|
||||
"base64",
|
||||
"bitflags",
|
||||
"bytes",
|
||||
"chrono",
|
||||
"crossbeam",
|
||||
"dhat",
|
||||
"flate2",
|
||||
@@ -2013,7 +1708,6 @@ dependencies = [
|
||||
"pumpkin-world",
|
||||
"rand",
|
||||
"rayon",
|
||||
"reqwest",
|
||||
"rsa",
|
||||
"rsa-der",
|
||||
"rustc-hash 2.1.1",
|
||||
@@ -2028,6 +1722,7 @@ dependencies = [
|
||||
"time",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
"ureq",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
@@ -2309,46 +2004,6 @@ version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
||||
|
||||
[[package]]
|
||||
name = "reqwest"
|
||||
version = "0.12.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"bytes",
|
||||
"encoding_rs",
|
||||
"futures-core",
|
||||
"h2",
|
||||
"http",
|
||||
"http-body",
|
||||
"http-body-util",
|
||||
"hyper",
|
||||
"hyper-rustls",
|
||||
"hyper-tls",
|
||||
"hyper-util",
|
||||
"js-sys",
|
||||
"log",
|
||||
"mime",
|
||||
"native-tls",
|
||||
"percent-encoding",
|
||||
"pin-project-lite",
|
||||
"rustls-pki-types",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
"tower",
|
||||
"tower-http",
|
||||
"tower-service",
|
||||
"url",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-futures",
|
||||
"web-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ring"
|
||||
version = "0.17.14"
|
||||
@@ -2429,13 +2084,24 @@ version = "0.23.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643"
|
||||
dependencies = [
|
||||
"log",
|
||||
"once_cell",
|
||||
"ring",
|
||||
"rustls-pki-types",
|
||||
"rustls-webpki",
|
||||
"subtle",
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls-pemfile"
|
||||
version = "2.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
|
||||
dependencies = [
|
||||
"rustls-pki-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls-pki-types"
|
||||
version = "1.12.0"
|
||||
@@ -2492,44 +2158,12 @@ dependencies = [
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "schannel"
|
||||
version = "0.1.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "security-framework"
|
||||
version = "2.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"core-foundation",
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"security-framework-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "security-framework-sys"
|
||||
version = "2.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.219"
|
||||
@@ -2582,18 +2216,6 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_urlencoded"
|
||||
version = "0.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
|
||||
dependencies = [
|
||||
"form_urlencoded",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serdect"
|
||||
version = "0.3.0"
|
||||
@@ -2774,15 +2396,6 @@ dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sync_wrapper"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "synstructure"
|
||||
version = "0.13.2"
|
||||
@@ -2794,27 +2407,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration"
|
||||
version = "0.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"core-foundation",
|
||||
"system-configuration-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration-sys"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "take_mut"
|
||||
version = "0.2.2"
|
||||
@@ -2834,7 +2426,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
|
||||
dependencies = [
|
||||
"fastrand",
|
||||
"getrandom 0.3.3",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"windows-sys 0.59.0",
|
||||
@@ -2977,26 +2568,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-native-tls"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
|
||||
dependencies = [
|
||||
"native-tls",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-rustls"
|
||||
version = "0.26.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
|
||||
dependencies = [
|
||||
"rustls",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-util"
|
||||
version = "0.7.15"
|
||||
@@ -3051,76 +2622,6 @@ version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b679217f2848de74cabd3e8fc5e6d66f40b7da40f8e1954d92054d9010690fd5"
|
||||
|
||||
[[package]]
|
||||
name = "tower"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"pin-project-lite",
|
||||
"sync_wrapper",
|
||||
"tokio",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tower-http"
|
||||
version = "0.6.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bytes",
|
||||
"futures-util",
|
||||
"http",
|
||||
"http-body",
|
||||
"iri-string",
|
||||
"pin-project-lite",
|
||||
"tower",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tower-layer"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
|
||||
|
||||
[[package]]
|
||||
name = "tower-service"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
|
||||
|
||||
[[package]]
|
||||
name = "tracing"
|
||||
version = "0.1.41"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
|
||||
dependencies = [
|
||||
"pin-project-lite",
|
||||
"tracing-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tracing-core"
|
||||
version = "0.1.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "try-lock"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
||||
|
||||
[[package]]
|
||||
name = "twox-hash"
|
||||
version = "1.6.3"
|
||||
@@ -3167,6 +2668,39 @@ version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
||||
|
||||
[[package]]
|
||||
name = "ureq"
|
||||
version = "3.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9f0fde9bc91026e381155f8c67cb354bcd35260b2f4a29bcc84639f762760c39"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"cookie_store",
|
||||
"flate2",
|
||||
"log",
|
||||
"percent-encoding",
|
||||
"rustls",
|
||||
"rustls-pemfile",
|
||||
"rustls-pki-types",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"ureq-proto",
|
||||
"utf-8",
|
||||
"webpki-roots 0.26.11",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ureq-proto"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "59db78ad1923f2b1be62b6da81fe80b173605ca0d57f85da2e005382adf693f7"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"http",
|
||||
"httparse",
|
||||
"log",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "url"
|
||||
version = "2.5.4"
|
||||
@@ -3178,6 +2712,12 @@ dependencies = [
|
||||
"percent-encoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "utf-8"
|
||||
version = "0.7.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
|
||||
|
||||
[[package]]
|
||||
name = "utf8_iter"
|
||||
version = "1.0.4"
|
||||
@@ -3203,12 +2743,6 @@ dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "vcpkg"
|
||||
version = "0.2.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.9.5"
|
||||
@@ -3225,15 +2759,6 @@ dependencies = [
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "want"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
|
||||
dependencies = [
|
||||
"try-lock",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.1+wasi-snapshot-preview1"
|
||||
@@ -3275,19 +2800,6 @@ dependencies = [
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-futures"
|
||||
version = "0.4.50"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"js-sys",
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
"web-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.100"
|
||||
@@ -3321,13 +2833,21 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "web-sys"
|
||||
version = "0.3.77"
|
||||
name = "webpki-roots"
|
||||
version = "0.26.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
|
||||
checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
|
||||
dependencies = [
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
"webpki-roots 1.0.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "webpki-roots"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502"
|
||||
dependencies = [
|
||||
"rustls-pki-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -3361,76 +2881,6 @@ version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.61.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
|
||||
dependencies = [
|
||||
"windows-implement",
|
||||
"windows-interface",
|
||||
"windows-link",
|
||||
"windows-result",
|
||||
"windows-strings",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-implement"
|
||||
version = "0.60.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-interface"
|
||||
version = "0.59.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-link"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
|
||||
|
||||
[[package]]
|
||||
name = "windows-registry"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
"windows-result",
|
||||
"windows-strings",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-result"
|
||||
version = "0.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-strings"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
|
||||
dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.52.0"
|
||||
|
||||
@@ -52,7 +52,6 @@ rayon = "1.10"
|
||||
crossbeam = "0.8"
|
||||
|
||||
uuid = { version = "1.17", features = ["serde", "v3", "v4"] }
|
||||
derive_more = { version = "2.0", features = ["full"] }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ edition.workspace = true
|
||||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
syn = { version = "2.0", features = ["full"] }
|
||||
syn = { version = "2.0", features = ["parsing", "printing", "proc-macro", "derive"] }
|
||||
quote = "1.0"
|
||||
proc-macro2 = "1.0"
|
||||
proc-macro-error2.workspace = true
|
||||
|
||||
@@ -50,7 +50,7 @@ rand = "0.9.1"
|
||||
num_cpus = "1.17.0"
|
||||
|
||||
[dev-dependencies]
|
||||
criterion = { version = "0.6", features = ["html_reports", "async_tokio"] }
|
||||
criterion = { version = "0.6", default-features = false, features = ["html_reports", "async_tokio"] }
|
||||
temp-dir = "0.1.16"
|
||||
# Print log info inside tests when needed
|
||||
env_logger = "0.11.8"
|
||||
|
||||
@@ -54,7 +54,7 @@ rsa = { version = "=0.10.0-rc.1", features = ["sha1"] }
|
||||
rsa-der = "0.3"
|
||||
|
||||
# authentication
|
||||
reqwest = { version = "0.12", features = [
|
||||
ureq = { version = "3.0.12", features = [
|
||||
"json",
|
||||
] }
|
||||
|
||||
@@ -72,8 +72,6 @@ simplelog = { version = "0.12.2", features = ["ansi_term"] }
|
||||
# Remove time in favor of chrono?
|
||||
time = "0.3"
|
||||
|
||||
chrono = { version = "0.4", features = ["serde"] }
|
||||
|
||||
# plugins
|
||||
libloading = "0.8"
|
||||
bitflags = "2.9.1"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::net::IpAddr;
|
||||
|
||||
use chrono::{DateTime, FixedOffset, Local};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use time::OffsetDateTime;
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::net::GameProfile;
|
||||
@@ -11,10 +11,10 @@ pub struct BannedPlayerEntry {
|
||||
pub uuid: Uuid,
|
||||
pub name: String,
|
||||
#[serde(with = "format::date")]
|
||||
pub created: DateTime<FixedOffset>,
|
||||
pub created: time::OffsetDateTime,
|
||||
pub source: String,
|
||||
#[serde(with = "format::option_date")]
|
||||
pub expires: Option<DateTime<FixedOffset>>,
|
||||
pub expires: Option<time::OffsetDateTime>,
|
||||
pub reason: String,
|
||||
}
|
||||
|
||||
@@ -23,13 +23,13 @@ impl BannedPlayerEntry {
|
||||
pub fn new(
|
||||
profile: &GameProfile,
|
||||
source: String,
|
||||
expires: Option<DateTime<FixedOffset>>,
|
||||
expires: Option<time::OffsetDateTime>,
|
||||
reason: String,
|
||||
) -> Self {
|
||||
Self {
|
||||
uuid: profile.id,
|
||||
name: profile.name.clone(),
|
||||
created: Local::now().fixed_offset(),
|
||||
created: OffsetDateTime::now_utc(),
|
||||
source,
|
||||
expires,
|
||||
reason,
|
||||
@@ -41,10 +41,10 @@ impl BannedPlayerEntry {
|
||||
pub struct BannedIpEntry {
|
||||
pub ip: IpAddr,
|
||||
#[serde(with = "format::date")]
|
||||
pub created: DateTime<FixedOffset>,
|
||||
pub created: time::OffsetDateTime,
|
||||
pub source: String,
|
||||
#[serde(with = "format::option_date")]
|
||||
pub expires: Option<DateTime<FixedOffset>>,
|
||||
pub expires: Option<time::OffsetDateTime>,
|
||||
pub reason: String,
|
||||
}
|
||||
|
||||
@@ -53,12 +53,12 @@ impl BannedIpEntry {
|
||||
pub fn new(
|
||||
ip: IpAddr,
|
||||
source: String,
|
||||
expires: Option<DateTime<FixedOffset>>,
|
||||
expires: Option<time::OffsetDateTime>,
|
||||
reason: String,
|
||||
) -> Self {
|
||||
Self {
|
||||
ip,
|
||||
created: Local::now().fixed_offset(),
|
||||
created: OffsetDateTime::now_utc(),
|
||||
source,
|
||||
expires,
|
||||
reason,
|
||||
@@ -67,56 +67,55 @@ impl BannedIpEntry {
|
||||
}
|
||||
|
||||
mod format {
|
||||
const FORMAT: &str = "%Y-%m-%d %H:%M:%S %z";
|
||||
use simplelog::FormatItem;
|
||||
|
||||
const DATE_FORMAT: &[FormatItem<'static>] = time::macros::format_description!(
|
||||
"[year]-[month]-[day] [hour]:[minute]:[second][offset_hour sign:mandatory]:[offset_minute]"
|
||||
);
|
||||
|
||||
pub mod date {
|
||||
use chrono::{DateTime, FixedOffset};
|
||||
use serde::{self, Deserialize, Deserializer, Serializer};
|
||||
use time::OffsetDateTime;
|
||||
|
||||
use super::FORMAT;
|
||||
use super::DATE_FORMAT;
|
||||
|
||||
pub fn serialize<S>(date: &DateTime<FixedOffset>, serializer: S) -> Result<S::Ok, S::Error>
|
||||
pub fn serialize<S>(date: &OffsetDateTime, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
let s = date.format(FORMAT).to_string();
|
||||
let s = date.format(DATE_FORMAT).unwrap().to_string();
|
||||
serializer.serialize_str(&s)
|
||||
}
|
||||
|
||||
pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<FixedOffset>, D::Error>
|
||||
pub fn deserialize<'de, D>(deserializer: D) -> Result<OffsetDateTime, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let s = String::deserialize(deserializer)?;
|
||||
DateTime::parse_from_str(&s, FORMAT).map_err(serde::de::Error::custom)
|
||||
OffsetDateTime::parse(&s, DATE_FORMAT).map_err(serde::de::Error::custom)
|
||||
}
|
||||
}
|
||||
|
||||
pub mod option_date {
|
||||
use chrono::{DateTime, FixedOffset};
|
||||
use serde::{self, Deserialize, Deserializer, Serializer};
|
||||
use time::OffsetDateTime;
|
||||
|
||||
use super::FORMAT;
|
||||
use crate::data::banlist_serializer::format::DATE_FORMAT;
|
||||
|
||||
#[allow(clippy::ref_option)]
|
||||
pub fn serialize<S>(
|
||||
date: &Option<DateTime<FixedOffset>>,
|
||||
serializer: S,
|
||||
) -> Result<S::Ok, S::Error>
|
||||
pub fn serialize<S>(date: &Option<OffsetDateTime>, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
if let Some(date) = date {
|
||||
let s = date.format(FORMAT).to_string();
|
||||
let s = date.format(DATE_FORMAT).unwrap().to_string();
|
||||
serializer.serialize_str(&s)
|
||||
} else {
|
||||
serializer.serialize_str("forever")
|
||||
}
|
||||
}
|
||||
|
||||
pub fn deserialize<'de, D>(
|
||||
deserializer: D,
|
||||
) -> Result<Option<DateTime<FixedOffset>>, D::Error>
|
||||
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<OffsetDateTime>, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
@@ -124,7 +123,7 @@ mod format {
|
||||
if s == "forever" {
|
||||
Ok(None)
|
||||
} else {
|
||||
DateTime::parse_from_str(&s, FORMAT)
|
||||
OffsetDateTime::parse(&s, DATE_FORMAT)
|
||||
.map(Some)
|
||||
.map_err(serde::de::Error::custom)
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::{net::IpAddr, path::Path, sync::LazyLock};
|
||||
|
||||
use chrono::Local;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use time::OffsetDateTime;
|
||||
|
||||
use super::{LoadJSONConfiguration, SaveJSONConfiguration, banlist_serializer::BannedIpEntry};
|
||||
|
||||
@@ -24,8 +24,11 @@ impl BannedIpList {
|
||||
fn remove_invalid_entries(&mut self) {
|
||||
let original_len = self.banned_ips.len();
|
||||
|
||||
self.banned_ips
|
||||
.retain(|entry| entry.expires.is_none_or(|expires| expires >= Local::now()));
|
||||
self.banned_ips.retain(|entry| {
|
||||
entry
|
||||
.expires
|
||||
.is_none_or(|expires| expires >= OffsetDateTime::now_utc())
|
||||
});
|
||||
|
||||
if original_len != self.banned_ips.len() {
|
||||
self.save();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::{path::Path, sync::LazyLock};
|
||||
|
||||
use chrono::Local;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use time::OffsetDateTime;
|
||||
|
||||
use crate::net::GameProfile;
|
||||
|
||||
@@ -28,8 +28,11 @@ impl BannedPlayerList {
|
||||
fn remove_invalid_entries(&mut self) {
|
||||
let original_len = self.banned_players.len();
|
||||
|
||||
self.banned_players
|
||||
.retain(|entry| entry.expires.is_none_or(|expires| expires >= Local::now()));
|
||||
self.banned_players.retain(|entry| {
|
||||
entry
|
||||
.expires
|
||||
.is_none_or(|expires| expires >= OffsetDateTime::now_utc())
|
||||
});
|
||||
|
||||
if original_len != self.banned_players.len() {
|
||||
self.save();
|
||||
|
||||
@@ -226,9 +226,7 @@ impl PumpkinServer {
|
||||
}
|
||||
|
||||
if BASIC_CONFIG.allow_chat_reports {
|
||||
let mojang_public_keys = fetch_mojang_public_keys(server.auth_client.as_ref().unwrap())
|
||||
.await
|
||||
.unwrap();
|
||||
let mojang_public_keys = fetch_mojang_public_keys().unwrap();
|
||||
*server.mojang_public_keys.lock().await = mojang_public_keys;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@ use std::{collections::HashMap, net::IpAddr};
|
||||
use base64::{Engine, engine::general_purpose};
|
||||
use pumpkin_config::{advanced_config, networking::auth::TextureConfig};
|
||||
use pumpkin_protocol::Property;
|
||||
use reqwest::{StatusCode, Url};
|
||||
use rsa::RsaPublicKey;
|
||||
use rsa::pkcs8::DecodePublicKey;
|
||||
use serde::Deserialize;
|
||||
use thiserror::Error;
|
||||
use ureq::http::{StatusCode, Uri};
|
||||
use uuid::Uuid;
|
||||
|
||||
use super::GameProfile;
|
||||
@@ -60,11 +60,10 @@ const MOJANG_SERVICES_URL: &str = "https://api.minecraftservices.com/";
|
||||
/// 3. Now our server will send a Request to the Session servers and check if the Player has joined the Session Server .
|
||||
///
|
||||
/// See <https://pumpkinmc.org/developer/networking/authentication>
|
||||
pub async fn authenticate(
|
||||
pub fn authenticate(
|
||||
username: &str,
|
||||
server_hash: &str,
|
||||
ip: &IpAddr,
|
||||
auth_client: &reqwest::Client,
|
||||
) -> Result<GameProfile, AuthError> {
|
||||
let address = if advanced_config()
|
||||
.networking
|
||||
@@ -95,17 +94,18 @@ pub async fn authenticate(
|
||||
.replace("{server_hash}", server_hash)
|
||||
};
|
||||
|
||||
let response = auth_client
|
||||
.get(address)
|
||||
.send()
|
||||
.await
|
||||
let mut response = ureq::get(address)
|
||||
.call()
|
||||
.map_err(|_| AuthError::FailedResponse)?;
|
||||
match response.status() {
|
||||
StatusCode::OK => {}
|
||||
StatusCode::NO_CONTENT => Err(AuthError::UnverifiedUsername)?,
|
||||
other => Err(AuthError::UnknownStatusCode(other))?,
|
||||
}
|
||||
let profile: GameProfile = response.json().await.map_err(|_| AuthError::FailedParse)?;
|
||||
let profile: GameProfile = response
|
||||
.body_mut()
|
||||
.read_json()
|
||||
.map_err(|_| AuthError::FailedParse)?;
|
||||
Ok(profile)
|
||||
}
|
||||
|
||||
@@ -116,36 +116,37 @@ pub fn validate_textures(property: &Property, config: &TextureConfig) -> Result<
|
||||
let textures: ProfileTextures =
|
||||
serde_json::from_slice(&from64).map_err(|e| TextureError::JSONError(e.to_string()))?;
|
||||
for texture in textures.textures {
|
||||
let url =
|
||||
Url::parse(&texture.1.url).map_err(|e| TextureError::InvalidURL(e.to_string()))?;
|
||||
let url = texture
|
||||
.1
|
||||
.url
|
||||
.parse()
|
||||
.map_err(|_| TextureError::InvalidURL)?;
|
||||
is_texture_url_valid(&url, config)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn is_texture_url_valid(url: &Url, config: &TextureConfig) -> Result<(), TextureError> {
|
||||
let scheme = url.scheme();
|
||||
pub fn is_texture_url_valid(url: &Uri, config: &TextureConfig) -> Result<(), TextureError> {
|
||||
let scheme = url.scheme().unwrap();
|
||||
if !config
|
||||
.allowed_url_schemes
|
||||
.iter()
|
||||
.any(|allowed_scheme| scheme.ends_with(allowed_scheme))
|
||||
.any(|allowed_scheme| scheme.as_str().ends_with(allowed_scheme))
|
||||
{
|
||||
return Err(TextureError::DisallowedUrlScheme(scheme.to_string()));
|
||||
}
|
||||
let domain = url.domain().unwrap_or("");
|
||||
let domain = url.authority().unwrap();
|
||||
if !config
|
||||
.allowed_url_domains
|
||||
.iter()
|
||||
.any(|allowed_domain| domain.ends_with(allowed_domain))
|
||||
.any(|allowed_domain| domain.as_str().ends_with(allowed_domain))
|
||||
{
|
||||
return Err(TextureError::DisallowedUrlDomain(domain.to_string()));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn fetch_mojang_public_keys(
|
||||
auth_client: &reqwest::Client,
|
||||
) -> Result<Vec<RsaPublicKey>, AuthError> {
|
||||
pub fn fetch_mojang_public_keys() -> Result<Vec<RsaPublicKey>, AuthError> {
|
||||
let services_url = advanced_config()
|
||||
.networking
|
||||
.authentication
|
||||
@@ -155,10 +156,8 @@ pub async fn fetch_mojang_public_keys(
|
||||
|
||||
let url = format!("{services_url}/publickeys");
|
||||
|
||||
let response = auth_client
|
||||
.get(url)
|
||||
.send()
|
||||
.await
|
||||
let mut response = ureq::get(url)
|
||||
.call()
|
||||
.map_err(|_| AuthError::FailedResponse)?;
|
||||
|
||||
match response.status() {
|
||||
@@ -167,8 +166,10 @@ pub async fn fetch_mojang_public_keys(
|
||||
other => Err(AuthError::UnknownStatusCode(other))?,
|
||||
}
|
||||
|
||||
let public_keys: MojangPublicKeys =
|
||||
response.json().await.map_err(|_| AuthError::FailedParse)?;
|
||||
let public_keys: MojangPublicKeys = response
|
||||
.body_mut()
|
||||
.read_json()
|
||||
.map_err(|_| AuthError::FailedParse)?;
|
||||
|
||||
let as_rsa_keys = public_keys
|
||||
.player_certificate_keys
|
||||
@@ -186,8 +187,6 @@ pub async fn fetch_mojang_public_keys(
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
pub enum AuthError {
|
||||
#[error("Missing auth client")]
|
||||
MissingAuthClient,
|
||||
#[error("Authentication servers are down")]
|
||||
FailedResponse,
|
||||
#[error("Failed to verify username")]
|
||||
@@ -206,8 +205,8 @@ pub enum AuthError {
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
pub enum TextureError {
|
||||
#[error("Invalid URL {0}")]
|
||||
InvalidURL(String),
|
||||
#[error("Invalid URL")]
|
||||
InvalidURL,
|
||||
#[error("Invalid URL scheme for player texture: {0}")]
|
||||
DisallowedUrlScheme(String),
|
||||
#[error("Invalid URL domain for player texture: {0}")]
|
||||
|
||||
@@ -265,47 +265,44 @@ impl JavaClientPlatform {
|
||||
shared_secret: &[u8],
|
||||
username: &str,
|
||||
) -> Result<GameProfile, AuthError> {
|
||||
if let Some(auth_client) = &server.auth_client {
|
||||
let hash = server.digest_secret(shared_secret);
|
||||
let ip = self.address.lock().await.ip();
|
||||
let profile = authentication::authenticate(username, &hash, &ip, auth_client).await?;
|
||||
let hash = server.digest_secret(shared_secret);
|
||||
let ip = self.address.lock().await.ip();
|
||||
let profile = authentication::authenticate(username, &hash, &ip)?;
|
||||
|
||||
// Check if the player should join
|
||||
if let Some(actions) = &profile.profile_actions {
|
||||
if advanced_config()
|
||||
// Check if the player should join
|
||||
if let Some(actions) = &profile.profile_actions {
|
||||
if advanced_config()
|
||||
.networking
|
||||
.authentication
|
||||
.player_profile
|
||||
.allow_banned_players
|
||||
{
|
||||
for allowed in &advanced_config()
|
||||
.networking
|
||||
.authentication
|
||||
.player_profile
|
||||
.allow_banned_players
|
||||
.allowed_actions
|
||||
{
|
||||
for allowed in &advanced_config()
|
||||
.networking
|
||||
.authentication
|
||||
.player_profile
|
||||
.allowed_actions
|
||||
{
|
||||
if !actions.contains(allowed) {
|
||||
return Err(AuthError::DisallowedAction);
|
||||
}
|
||||
if !actions.contains(allowed) {
|
||||
return Err(AuthError::DisallowedAction);
|
||||
}
|
||||
if !actions.is_empty() {
|
||||
return Err(AuthError::Banned);
|
||||
}
|
||||
} else if !actions.is_empty() {
|
||||
}
|
||||
if !actions.is_empty() {
|
||||
return Err(AuthError::Banned);
|
||||
}
|
||||
} else if !actions.is_empty() {
|
||||
return Err(AuthError::Banned);
|
||||
}
|
||||
// Validate textures
|
||||
for property in &profile.properties {
|
||||
authentication::validate_textures(
|
||||
property,
|
||||
&advanced_config().networking.authentication.textures,
|
||||
)
|
||||
.map_err(AuthError::TextureError)?;
|
||||
}
|
||||
return Ok(profile);
|
||||
}
|
||||
Err(AuthError::MissingAuthClient)
|
||||
// Validate textures
|
||||
for property in &profile.properties {
|
||||
authentication::validate_textures(
|
||||
property,
|
||||
&advanced_config().networking.authentication.textures,
|
||||
)
|
||||
.map_err(AuthError::TextureError)?;
|
||||
}
|
||||
Ok(profile)
|
||||
}
|
||||
|
||||
pub fn handle_login_cookie_response(&self, packet: &SLoginCookieResponse) {
|
||||
|
||||
@@ -19,6 +19,7 @@ use pumpkin_util::{ProfileAction, text::TextComponent};
|
||||
use serde::Deserialize;
|
||||
use sha1::Digest;
|
||||
use sha2::Sha256;
|
||||
use simplelog::FormatItem;
|
||||
use tokio::task::JoinHandle;
|
||||
|
||||
use thiserror::Error;
|
||||
@@ -173,6 +174,10 @@ pub async fn can_not_join(
|
||||
address: &SocketAddr,
|
||||
server: &Server,
|
||||
) -> Option<TextComponent> {
|
||||
const FORMAT_DESCRIPTION: &[FormatItem<'_>] = time::macros::format_description!(
|
||||
"[year]-[month]-[day] at [hour]:[minute]:[second] [offset_hour sign:mandatory]:[offset_minute]"
|
||||
);
|
||||
|
||||
let mut banned_players = BANNED_PLAYER_LIST.write().await;
|
||||
if let Some(entry) = banned_players.get_entry(profile) {
|
||||
let text = TextComponent::translate(
|
||||
@@ -183,7 +188,7 @@ pub async fn can_not_join(
|
||||
Some(expires) => text.add_child(TextComponent::translate(
|
||||
"multiplayer.disconnect.banned.expiration",
|
||||
[TextComponent::text(
|
||||
expires.format("%F at %T %Z").to_string(),
|
||||
expires.format(FORMAT_DESCRIPTION).unwrap().to_string(),
|
||||
)],
|
||||
)),
|
||||
None => text,
|
||||
@@ -213,7 +218,7 @@ pub async fn can_not_join(
|
||||
Some(expires) => text.add_child(TextComponent::translate(
|
||||
"multiplayer.disconnect.banned_ip.expiration",
|
||||
[TextComponent::text(
|
||||
expires.format("%F at %T %Z").to_string(),
|
||||
expires.format(FORMAT_DESCRIPTION).unwrap().to_string(),
|
||||
)],
|
||||
)),
|
||||
None => text,
|
||||
|
||||
@@ -74,8 +74,6 @@ pub struct Server {
|
||||
pub cached_registry: Vec<Registry>,
|
||||
/// Assigns unique IDs to containers.
|
||||
container_id: AtomicU32,
|
||||
/// Manages authentication with an authentication server, if enabled.
|
||||
pub auth_client: Option<reqwest::Client>,
|
||||
/// Mojang's public keys, used for chat session signing
|
||||
/// Pulled from Mojang API on startup
|
||||
pub mojang_public_keys: Mutex<Vec<RsaPublicKey>>,
|
||||
@@ -111,18 +109,6 @@ impl Server {
|
||||
#[allow(clippy::new_without_default)]
|
||||
#[must_use]
|
||||
pub async fn new() -> Self {
|
||||
let auth_client = BASIC_CONFIG.online_mode.then(|| {
|
||||
reqwest::Client::builder()
|
||||
.connect_timeout(Duration::from_millis(u64::from(
|
||||
advanced_config().networking.authentication.connect_timeout,
|
||||
)))
|
||||
.read_timeout(Duration::from_millis(u64::from(
|
||||
advanced_config().networking.authentication.read_timeout,
|
||||
)))
|
||||
.build()
|
||||
.expect("Failed to to make reqwest client")
|
||||
});
|
||||
|
||||
// First register the default commands. After that, plugins can put in their own.
|
||||
let command_dispatcher = RwLock::new(default_dispatcher().await);
|
||||
let world_path = BASIC_CONFIG.get_world_path();
|
||||
@@ -194,7 +180,6 @@ impl Server {
|
||||
command_dispatcher,
|
||||
block_registry,
|
||||
item_registry: super::item::items::default_registry(),
|
||||
auth_client,
|
||||
key_store: KeyStore::new(),
|
||||
listing: Mutex::new(CachedStatus::new()),
|
||||
branding: CachedBranding::new(),
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
use chrono::{Datelike, Local};
|
||||
use pumpkin_config::advanced_config;
|
||||
use rand::{rng, seq::SliceRandom};
|
||||
use time::{Month, OffsetDateTime};
|
||||
|
||||
// In fact Mojang also has some Seasonal Events, so we can use that later to match Vanilla :D
|
||||
|
||||
#[must_use]
|
||||
pub fn is_april() -> bool {
|
||||
let data = Local::now();
|
||||
data.day() == 1 && data.month() == 4
|
||||
let data = OffsetDateTime::now_utc();
|
||||
data.day() == 1 && data.month() == Month::April
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
|
||||
Reference in New Issue
Block a user