forked from Hay1tsme/artemis
begin move
This commit is contained in:
@ -1,5 +1,7 @@
|
||||
from typing import Tuple, Dict, List
|
||||
from twisted.web.http import Request
|
||||
from starlette.requests import Request
|
||||
from starlette.responses import Response
|
||||
from starlette.routing import Route
|
||||
import yaml
|
||||
import logging, coloredlogs
|
||||
from logging.handlers import TimedRotatingFileHandler
|
||||
@ -55,11 +57,10 @@ class SaoServlet(BaseServlet):
|
||||
if self.game_cfg.hash.verify_hash:
|
||||
self.static_hash = md5(self.game_cfg.hash.hash_base.encode()).digest() # Greate hashing guys, really validates the data
|
||||
|
||||
def get_endpoint_matchers(self) -> Tuple[List[Tuple[str, str, Dict]], List[Tuple[str, str, Dict]]]:
|
||||
return (
|
||||
[],
|
||||
[("render_POST", "/{datecode}/proto/if/{category}/{endpoint}", {})]
|
||||
)
|
||||
def get_routes(self) -> List[Route]:
|
||||
return [
|
||||
Route("/{datecode:int}/proto/if/{category:str}/{endpoint:str}", self.render_POST, methods=['POST'])
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def is_game_enabled(cls, game_code: str, core_cfg: CoreConfig, cfg_dir: str) -> bool:
|
||||
@ -86,30 +87,29 @@ class SaoServlet(BaseServlet):
|
||||
proto = "https"
|
||||
port = f":{port_ssl}" if not self.core_cfg.server.is_using_proxy and port_ssl != 443 else ""
|
||||
|
||||
return (f"{proto}://{self.core_cfg.title.hostname}{port}/", "")
|
||||
return (f"{proto}://{self.core_cfg.server.hostname}{port}/", "")
|
||||
|
||||
def get_mucha_info(self, core_cfg: CoreConfig, cfg_dir: str) -> Tuple[bool, str]:
|
||||
if not self.game_cfg.server.enable:
|
||||
return (False, "")
|
||||
return (False, [], [])
|
||||
|
||||
return (True, "SAO1")
|
||||
return (True, SaoConstants.GAME_CDS, SaoConstants.NETID_PREFIX)
|
||||
|
||||
def render_POST(self, request: Request, game_code: str, matchers: Dict) -> bytes:
|
||||
endpoint = matchers.get('endpoint', '')
|
||||
request.responseHeaders.addRawHeader(b"content-type", b"text/html; charset=utf-8")
|
||||
async def render_POST(self, request: Request) -> bytes:
|
||||
endpoint = request.path_params.get('endpoint', '')
|
||||
iv = b""
|
||||
|
||||
req_raw = request.content.read()
|
||||
req_raw = await request.body()
|
||||
if len(req_raw) < 40:
|
||||
self.logger.warn(f"Malformed request to {endpoint} - {req_raw.hex()}")
|
||||
return b""
|
||||
return Response()
|
||||
req_header = SaoRequestHeader(req_raw)
|
||||
|
||||
cmd_str = f"{req_header.cmd:04x}"
|
||||
|
||||
if self.game_cfg.hash.verify_hash and self.static_hash != req_header.hash:
|
||||
self.logger.error(f"Hash mismatch! Expecting {self.static_hash} but recieved {req_header.hash}")
|
||||
return b""
|
||||
return Response()
|
||||
|
||||
if self.game_cfg.crypt.enable:
|
||||
iv = req_raw[40:48]
|
||||
@ -124,7 +124,7 @@ class SaoServlet(BaseServlet):
|
||||
handler = getattr(self.base, f"handle_{cmd_str}", self.base.handle_noop)
|
||||
self.logger.info(f"{endpoint} - {cmd_str} request")
|
||||
self.logger.debug(f"Request: {req_raw.hex()}")
|
||||
resp = handler(req_header, req_data)
|
||||
resp = await handler(req_header, req_data)
|
||||
|
||||
if resp is None:
|
||||
resp = SaoNoopResponse(req_header.cmd + 1).make()
|
||||
@ -137,7 +137,7 @@ class SaoServlet(BaseServlet):
|
||||
|
||||
else:
|
||||
self.logger.error(f"Unknown response type {type(resp)}")
|
||||
return b""
|
||||
return Response()
|
||||
|
||||
self.logger.debug(f"Response: {resp.hex()}")
|
||||
|
||||
@ -153,5 +153,6 @@ class SaoServlet(BaseServlet):
|
||||
tmp = struct.pack("!I", crypt_data_len) # does it want the length of the encrypted response??
|
||||
resp = resp[:20] + tmp + iv + data_crypt
|
||||
self.logger.debug(f"Encrypted Response: {resp.hex()}")
|
||||
|
||||
return resp
|
||||
|
||||
|
||||
return Response(resp, media_type="text/html; charset=utf-8")
|
Reference in New Issue
Block a user