Simple Download Order implementation for Allnet Lite

This commit is contained in:
Keeboy99
2025-05-31 08:44:51 +12:00
parent 5e5365d22b
commit 1e4cb0b380
2 changed files with 39 additions and 2 deletions

View File

@ -355,12 +355,20 @@ class AllnetServlet:
async def handle_dlorder(self, request: Request): async def handle_dlorder(self, request: Request):
request_ip = Utils.get_ip_addr(request) request_ip = Utils.get_ip_addr(request)
pragma_header = request.headers.get('Pragma', "") pragma_header = request.headers.get('Pragma', "")
useragent_header = request.headers.get('User-Agent', "")
is_dfi = pragma_header == "DFI" is_dfi = pragma_header == "DFI"
is_lite = useragent_header[5:] == "Windows/Lite"
data = await request.body() data = await request.body()
if not self.config.allnet.allnet_lite_key and is_lite:
self.logger.error("!!!LITE KEY NOT SET!!!")
os._exit(1)
try: try:
if is_dfi: if is_dfi:
req_urlencode = self.from_dfi(data) req_urlencode = self.from_dfi(data)
elif is_lite:
req_urlencode = self.dec_lite(self.config.allnet.allnet_lite_key, data[:16], data)
else: else:
req_urlencode = data.decode() req_urlencode = data.decode()
@ -368,7 +376,10 @@ class AllnetServlet:
if req_dict is None: if req_dict is None:
raise AllnetRequestException() raise AllnetRequestException()
req = AllnetDownloadOrderRequest(req_dict[0]) if is_lite:
req = AllnetDownloadOrderRequestLite(req_dict[0])
else:
req = AllnetDownloadOrderRequest(req_dict[0])
# Validate the request. Currently we only validate the fields we plan on using # Validate the request. Currently we only validate the fields we plan on using
if not req.game_id or not req.ver or not req.serial: if not req.game_id or not req.ver or not req.serial:
@ -384,7 +395,11 @@ class AllnetServlet:
self.logger.info( self.logger.info(
f"DownloadOrder from {request_ip} -> {req.game_id} v{req.ver} serial {req.serial}" f"DownloadOrder from {request_ip} -> {req.game_id} v{req.ver} serial {req.serial}"
) )
resp = AllnetDownloadOrderResponse(serial=req.serial)
if is_lite:
resp = AllnetDownloadOrderResponseLite()
else:
resp = AllnetDownloadOrderResponse(serial=req.serial)
if ( if (
not self.config.allnet.allow_online_updates not self.config.allnet.allow_online_updates
@ -395,6 +410,9 @@ class AllnetServlet:
return PlainTextResponse( return PlainTextResponse(
self.to_dfi(resp) + b"\r\n", headers={ "Pragma": "DFI" } self.to_dfi(resp) + b"\r\n", headers={ "Pragma": "DFI" }
) )
elif is_lite:
iv = bytes([random.randint(2, 255) for _ in range(16)])
return PlainTextResponse(content=self.enc_lite(self.config.allnet.allnet_lite_key, iv, resp))
return PlainTextResponse(resp) return PlainTextResponse(resp)
else: else:
@ -405,6 +423,9 @@ class AllnetServlet:
return PlainTextResponse( return PlainTextResponse(
self.to_dfi(resp) + b"\r\n", headers={ "Pragma": "DFI" } self.to_dfi(resp) + b"\r\n", headers={ "Pragma": "DFI" }
) )
elif is_lite:
iv = bytes([random.randint(2, 255) for _ in range(16)])
return PlainTextResponse(content=self.enc_lite(self.config.allnet.allnet_lite_key, iv, resp))
return PlainTextResponse(resp) return PlainTextResponse(resp)
if path.exists( if path.exists(
@ -434,6 +455,9 @@ class AllnetServlet:
"Pragma": "DFI", "Pragma": "DFI",
}, },
) )
elif is_lite:
iv = bytes([random.randint(2, 255) for _ in range(16)])
return PlainTextResponse(content=self.enc_lite(self.config.allnet.allnet_lite_key, iv, res_str))
return PlainTextResponse(res_str) return PlainTextResponse(res_str)
@ -896,12 +920,23 @@ class AllnetDownloadOrderRequest:
self.serial = req.get("serial", "") self.serial = req.get("serial", "")
self.encode = req.get("encode", "") self.encode = req.get("encode", "")
class AllnetDownloadOrderRequestLite:
def __init__(self, req: Dict) -> None:
self.game_id = req.get("title_id", "")
self.ver = req.get("title_ver", "")
self.serial = req.get("client_id", "")
class AllnetDownloadOrderResponse: class AllnetDownloadOrderResponse:
def __init__(self, stat: int = 1, serial: str = "", uri: str = "null") -> None: def __init__(self, stat: int = 1, serial: str = "", uri: str = "null") -> None:
self.stat = stat self.stat = stat
self.serial = serial self.serial = serial
self.uri = uri self.uri = uri
class AllnetDownloadOrderResponseLite:
def __init__(self, result: int = 1, uri: str = "null") -> None:
self.result = result
self.uri = uri
class TraceDataType(Enum): class TraceDataType(Enum):
CHARGE = 0 CHARGE = 0
EVENT = 1 EVENT = 1
@ -1155,6 +1190,7 @@ route_lst = [
Route("/sys/servlet/PowerOn", allnet.handle_poweron, methods=["GET", "POST"]), Route("/sys/servlet/PowerOn", allnet.handle_poweron, methods=["GET", "POST"]),
Route("/net/initialize", allnet.handle_poweron, methods=["GET", "POST"]), Route("/net/initialize", allnet.handle_poweron, methods=["GET", "POST"]),
Route("/sys/servlet/DownloadOrder", allnet.handle_dlorder, methods=["GET", "POST"]), Route("/sys/servlet/DownloadOrder", allnet.handle_dlorder, methods=["GET", "POST"]),
Route("/net/delivery/instruction", allnet.handle_dlorder, methods=["GET", "POST"]),
Route("/sys/servlet/LoaderStateRecorder", allnet.handle_loaderstaterecorder, methods=["GET", "POST"]), Route("/sys/servlet/LoaderStateRecorder", allnet.handle_loaderstaterecorder, methods=["GET", "POST"]),
Route("/sys/servlet/Alive", allnet.handle_alive, methods=["GET", "POST"]), Route("/sys/servlet/Alive", allnet.handle_alive, methods=["GET", "POST"]),
Route("/naomitest.html", allnet.handle_naomitest), Route("/naomitest.html", allnet.handle_naomitest),

View File

@ -77,6 +77,7 @@ if not cfg.allnet.standalone:
Route("/sys/servlet/PowerOn", allnet.handle_poweron, methods=["GET", "POST"]), Route("/sys/servlet/PowerOn", allnet.handle_poweron, methods=["GET", "POST"]),
Route("/net/initialize", allnet.handle_poweron, methods=["GET", "POST"]), Route("/net/initialize", allnet.handle_poweron, methods=["GET", "POST"]),
Route("/sys/servlet/DownloadOrder", allnet.handle_dlorder, methods=["GET", "POST"]), Route("/sys/servlet/DownloadOrder", allnet.handle_dlorder, methods=["GET", "POST"]),
Route("/net/delivery/instruction", allnet.handle_dlorder, methods=["GET", "POST"]),
Route("/sys/servlet/LoaderStateRecorder", allnet.handle_loaderstaterecorder, methods=["GET", "POST"]), Route("/sys/servlet/LoaderStateRecorder", allnet.handle_loaderstaterecorder, methods=["GET", "POST"]),
Route("/sys/servlet/Alive", allnet.handle_alive, methods=["GET", "POST"]), Route("/sys/servlet/Alive", allnet.handle_alive, methods=["GET", "POST"]),
Route("/naomitest.html", allnet.handle_naomitest), Route("/naomitest.html", allnet.handle_naomitest),