Skip to content

Commit e26d171

Browse files
feat: Added support_1_19 config [issue #1]
1 parent 03dd8a3 commit e26d171

File tree

7 files changed

+42
-21
lines changed

7 files changed

+42
-21
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ timeout = 10
9292
# This is necessary to prevent proxy bypass or spoofing.
9393
server_ip = "localhost"
9494

95+
# Enable partial support of 1.19-1.19.2 clients
96+
# https://github.com/Andcool-Systems/mc-oauth-rs/issues/1
97+
support_1_19 = false
98+
9599
[server.config]
96100
# Minecraft server name
97101
server_name = "mc-oauth-rs"

config.example.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ addr = "0.0.0.0"
99
port = 25565
1010
timeout = 20
1111
server_ip = "localhost" # Change or remove before production use!
12+
support_1_19 = false # READ: https://github.com/Andcool-Systems/mc-oauth-rs/issues/1
1213

1314
[server.config]
1415
server_name = "mc-oauth-rs"

src/byte_buf_utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ pub fn try_get_uuid(buf: &mut BytesMut) -> anyhow::Result<Uuid> {
8989
return Err(Error::msg("Not enough data"));
9090
}
9191

92-
if len > 16 && read_varint(buf)? == 0 {
93-
return Err(Error::msg("No UUID in packet"));
92+
if len > 16 {
93+
buf.advance(len - 16); // Normalize uuid length
9494
}
9595

9696
let mut bytes = [0u8; 16];

src/config/types.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ pub struct Server {
5050

5151
/// Proxy address (optional)
5252
pub server_ip: Option<String>,
53+
54+
/// Enable partial support of 1.19 servers
55+
pub support_1_19: bool,
5356
}
5457

5558
#[derive(Deserialize, Debug)]

src/handlers/encryption_response.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,26 @@ impl MinecraftServer {
1010
Check verify tokens and set up the cipher
1111
*/
1212
pub fn handle_encryption(&mut self) -> Result<()> {
13-
let response = EncryptionResponsePacket::parse(&mut self.buffer)?;
13+
let response = EncryptionResponsePacket::parse(self)?;
1414

1515
// Decrypt client's keys
1616
let decrypted_secret = self
1717
.keys
1818
.decrypt(Pkcs1v15Encrypt, &response.shared_secret)?;
19-
let decrypted_verify = self.keys.decrypt(Pkcs1v15Encrypt, &response.verify_token)?;
2019

21-
// Check tokens equality
22-
if decrypted_verify
23-
.iter()
24-
.zip(&self.session.verify_token)
25-
.filter(|&(a, b)| a == b)
26-
.count()
27-
!= decrypted_verify.len()
28-
{
29-
return Err(Error::msg("Verify tokens didn't match!"));
20+
if response.has_verify {
21+
let decrypted_verify = self.keys.decrypt(Pkcs1v15Encrypt, &response.verify_token)?;
22+
23+
// Check tokens equality
24+
if decrypted_verify
25+
.iter()
26+
.zip(&self.session.verify_token)
27+
.filter(|&(a, b)| a == b)
28+
.count()
29+
!= decrypted_verify.len()
30+
{
31+
return Err(Error::msg("Verify tokens didn't match!"));
32+
}
3033
}
3134

3235
// Set up client cipher

src/handlers/login_start.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ impl MinecraftServer {
1010
self.session.nickname = Some(packet.name);
1111
self.session.uuid = packet.uuid;
1212

13-
if self.session.proto_ver >= 759 && self.session.proto_ver <= 762 {
13+
if self.session.proto_ver >= 759
14+
&& self.session.proto_ver <= 760
15+
&& !self.config.server.support_1_19
16+
{
1417
self.send_disconnect(
15-
"Sorry, Minecraft 1.19.* clients not supported yet.\nTry using another version of client."
18+
"§cSorry, Minecraft 1.19-1.19.2 clients not supported yet.\nTry using another version of client."
1619
.to_string(),
1720
)
1821
.await?;

src/packets/encryption_response.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
1-
use crate::byte_buf_utils::read_varint;
1+
use crate::{byte_buf_utils::read_varint, server::MinecraftServer};
22
use anyhow::Result;
33
use bytes::BytesMut;
44

55
pub struct EncryptionResponsePacket {
66
pub shared_secret: Vec<u8>,
77
pub verify_token: Vec<u8>,
8+
pub has_verify: bool,
89
}
910

1011
impl EncryptionResponsePacket {
11-
pub fn parse(buff: &mut BytesMut) -> Result<Self> {
12-
let shared_secret_length = read_varint(buff)?;
13-
let shared_secret = buff.split_to(shared_secret_length);
12+
pub fn parse(server: &mut MinecraftServer) -> Result<Self> {
13+
let shared_secret_length = read_varint(&mut server.buffer)?;
14+
let shared_secret = server.buffer.split_to(shared_secret_length);
1415

15-
let verify_token_length = read_varint(buff)?;
16-
let verify_token = buff.split_to(verify_token_length);
16+
let mut has_verify = false;
17+
let mut verify_token = BytesMut::new();
18+
if !(server.session.proto_ver >= 759 && server.session.proto_ver <= 760) {
19+
let verify_token_length = read_varint(&mut server.buffer)?;
20+
verify_token = server.buffer.split_to(verify_token_length);
21+
has_verify = true;
22+
}
1723

1824
Ok(Self {
1925
shared_secret: shared_secret.to_vec(),
2026
verify_token: verify_token.to_vec(),
27+
has_verify,
2128
})
2229
}
2330
}

0 commit comments

Comments
 (0)