Skip to content

Commit

Permalink
v0.8.3
Browse files Browse the repository at this point in the history
  • Loading branch information
zyxkad committed Feb 7, 2025
1 parent 5cef427 commit db202ae
Show file tree
Hide file tree
Showing 7 changed files with 409 additions and 241 deletions.
1 change: 1 addition & 0 deletions loginproxy/configs.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class proxy_addr(JSONObject):
'whitelist.ip': 'Your ip is not in the whitelist',
}

allow_transfer: bool = True
enable_packet_proxy: bool = False
online_mode: bool = False

Expand Down
2 changes: 2 additions & 0 deletions loginproxy/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
'ON_CONNECT', 'ON_DISCONNECT',
'ON_PING',
'ON_LOGIN', 'ON_PRE_LOGIN', 'ON_POST_LOGIN', 'ON_LOGOFF',
'ON_PLAY',
]

ON_CONNECT = MCDR.LiteralEvent('login_proxy.on.connect')
Expand All @@ -17,3 +18,4 @@
ON_PRE_LOGIN = MCDR.LiteralEvent('login_proxy.on.login.pre')
ON_POST_LOGIN = MCDR.LiteralEvent('login_proxy.on.login.post')
ON_LOGOFF = MCDR.LiteralEvent('login_proxy.on.logoff')
ON_PLAY = MCDR.LiteralEvent('login_proxy.on.play')
40 changes: 20 additions & 20 deletions loginproxy/encoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,89 +253,89 @@ def __init__(self):
def data(self) -> bytes:
return self._data

def write(self, data: bytes):
def write(self, data: bytes) -> Self:
self._data += data
return self

def write_byte(self, v: int):
def write_byte(self, v: int) -> Self:
self._data += ByteStruct.pack(v)
return self

def write_ubyte(self, v: int):
def write_ubyte(self, v: int) -> Self:
self._data += UByteStruct.pack(v)
return self

def write_short(self, v: int):
def write_short(self, v: int) -> Self:
self._data += ShortStruct.pack(v)
return self

def write_ushort(self, v: int):
def write_ushort(self, v: int) -> Self:
self._data += UShortStruct.pack(v)
return self

def write_int(self, v: int):
def write_int(self, v: int) -> Self:
self._data += IntStruct.pack(v)
return self

def write_uint(self, v: int):
def write_uint(self, v: int) -> Self:
self._data += UIntStruct.pack(v)
return self

def write_long(self, v: int):
def write_long(self, v: int) -> Self:
self._data += LongStruct.pack(v)
return self

def write_ulong(self, v: int):
def write_ulong(self, v: int) -> Self:
self._data += ULongStruct.pack(v)
return self

def write_float(self, v :float):
def write_float(self, v :float) -> Self:
self._data += FloatStruct.pack(v)
return self

def write_double(self, v :float):
def write_double(self, v :float) -> Self:
self._data += DoubleStruct.pack(v)
return self

def write_bool(self, v: bool):
def write_bool(self, v: bool) -> Self:
self._data += encode_bool(v)
return self

def write_varint(self, v: int):
def write_varint(self, v: int) -> Self:
assert v >> 32 == 0 and v >= 0, f'{hex(v)} is not in range'
self._data += encode_varint(v)
return self

def write_varlong(self, v: int):
def write_varlong(self, v: int) -> Self:
assert v >> 64 == 0 and v >= 0, f'{hex(v)} is not in range'
self._data += encode_varint(v)
return self

def write_pos_1_8(self, v: tuple[int, int, int]):
def write_pos_1_8(self, v: tuple[int, int, int]) -> Self:
x, y, z = v
self.write_long(((x & 0x3ffffff) << 38) | ((y & 0xfff) << 26) | (z & 0x3ffffff))
return self

def write_pos_1_14(self, v: tuple[int, int, int]):
def write_pos_1_14(self, v: tuple[int, int, int]) -> Self:
x, y, z = v
self.write_long(((x & 0x3ffffff) << 38) | ((z & 0x3ffffff) << 12) | (y & 0xfff))
return self

def write_string(self, v: str):
def write_string(self, v: str) -> Self:
b = v.encode('utf8')
self.write_varint(len(b)).write(b)
return self

def write_json(self, v: dict):
def write_json(self, v: dict) -> Self:
b = json.dumps(v).encode('utf8')
self.write_varint(len(b)).write(b)
return self

def write_uuid(self, v: uuid.UUID):
def write_uuid(self, v: uuid.UUID) -> Self:
self.write(v.bytes)
return self

def write_bytearray(self, v: bytes):
def write_bytearray(self, v: bytes) -> Self:
self.write_varint(len(v)).write(v)
return self

Expand Down
60 changes: 60 additions & 0 deletions loginproxy/packet_patcher.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# This package apply fixes for proxied data packets in specific minecraft versions

import time
import uuid
from typing import Callable

try:
import packet_parser
except ImportError:
raise ImportError('packet_parser plugin required')

from .server import *
from .protocols import Protocol
from .utils import *

__all__ = [
'patch_connection',
]

patchers: dict[int, Callable[[Conn], None]] = {}

def patch_connection(conn: Conn):
patcher = patchers.get(conn.protocol, None)
if patcher is not None:
debug(f'applying patcher {patcher} for {conn}')
patcher(conn)

#### VERSIONS ####

def patch_v1_21_1(conn: Conn):
conn.register_packet('play_player_session', patch_play_player_session, priority=-100)

patchers[Protocol.V1_21_1] = patch_v1_21_1

#### PACKETS ####

class PlayerSession:
def __init__(self, session_id: uuid.UUID, expires_at: float, public_key: bytes):
self.id = session_id
self.expires_at = expires_at
self.public_key = public_key

def patch_play_player_session(event: PacketEvent):
event.cancel()

packet = event.reader
session_id = packet.read_uuid()
expires_at = packet.read_long() / 1000
public_key = packet.read_bytearray()
key_signature = packet.read_bytearray()

if expires_at < time.time():
event.conn.kick('public key expired')
return
# TODO: verify signature

debug('session_id:', session_id)
debug('public_key:', repr(public_key))
event.conn._custom_data['player_session'] = PlayerSession(session_id, expires_at, public_key)

Loading

0 comments on commit db202ae

Please sign in to comment.