File tree Expand file tree Collapse file tree 7 files changed +42
-21
lines changed Expand file tree Collapse file tree 7 files changed +42
-21
lines changed Original file line number Diff line number Diff line change @@ -92,6 +92,10 @@ timeout = 10
92
92
# This is necessary to prevent proxy bypass or spoofing.
93
93
server_ip = " localhost"
94
94
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
+
95
99
[server .config ]
96
100
# Minecraft server name
97
101
server_name = " mc-oauth-rs"
Original file line number Diff line number Diff line change @@ -9,6 +9,7 @@ addr = "0.0.0.0"
9
9
port = 25565
10
10
timeout = 20
11
11
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
12
13
13
14
[server .config ]
14
15
server_name = " mc-oauth-rs"
Original file line number Diff line number Diff line change @@ -89,8 +89,8 @@ pub fn try_get_uuid(buf: &mut BytesMut) -> anyhow::Result<Uuid> {
89
89
return Err ( Error :: msg ( "Not enough data" ) ) ;
90
90
}
91
91
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
94
94
}
95
95
96
96
let mut bytes = [ 0u8 ; 16 ] ;
Original file line number Diff line number Diff line change @@ -50,6 +50,9 @@ pub struct Server {
50
50
51
51
/// Proxy address (optional)
52
52
pub server_ip : Option < String > ,
53
+
54
+ /// Enable partial support of 1.19 servers
55
+ pub support_1_19 : bool ,
53
56
}
54
57
55
58
#[ derive( Deserialize , Debug ) ]
Original file line number Diff line number Diff line change @@ -10,23 +10,26 @@ impl MinecraftServer {
10
10
Check verify tokens and set up the cipher
11
11
*/
12
12
pub fn handle_encryption ( & mut self ) -> Result < ( ) > {
13
- let response = EncryptionResponsePacket :: parse ( & mut self . buffer ) ?;
13
+ let response = EncryptionResponsePacket :: parse ( self ) ?;
14
14
15
15
// Decrypt client's keys
16
16
let decrypted_secret = self
17
17
. keys
18
18
. decrypt ( Pkcs1v15Encrypt , & response. shared_secret ) ?;
19
- let decrypted_verify = self . keys . decrypt ( Pkcs1v15Encrypt , & response. verify_token ) ?;
20
19
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
+ }
30
33
}
31
34
32
35
// Set up client cipher
Original file line number Diff line number Diff line change @@ -10,9 +10,12 @@ impl MinecraftServer {
10
10
self . session . nickname = Some ( packet. name ) ;
11
11
self . session . uuid = packet. uuid ;
12
12
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
+ {
14
17
self . send_disconnect (
15
- "Sorry , Minecraft 1.19.* clients not supported yet.\n Try using another version of client."
18
+ "§cSorry , Minecraft 1.19-1.19.2 clients not supported yet.\n Try using another version of client."
16
19
. to_string ( ) ,
17
20
)
18
21
. await ?;
Original file line number Diff line number Diff line change 1
- use crate :: byte_buf_utils:: read_varint;
1
+ use crate :: { byte_buf_utils:: read_varint, server :: MinecraftServer } ;
2
2
use anyhow:: Result ;
3
3
use bytes:: BytesMut ;
4
4
5
5
pub struct EncryptionResponsePacket {
6
6
pub shared_secret : Vec < u8 > ,
7
7
pub verify_token : Vec < u8 > ,
8
+ pub has_verify : bool ,
8
9
}
9
10
10
11
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) ;
14
15
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
+ }
17
23
18
24
Ok ( Self {
19
25
shared_secret : shared_secret. to_vec ( ) ,
20
26
verify_token : verify_token. to_vec ( ) ,
27
+ has_verify,
21
28
} )
22
29
}
23
30
}
You can’t perform that action at this time.
0 commit comments