forked from Hay1tsme/artemis
Simple Download Order implementation for Allnet Lite
This commit is contained in:
@ -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),
|
||||||
|
@ -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),
|
||||||
|
Reference in New Issue
Block a user