add support for Maimai DX CN

This commit is contained in:
Error063 2024-06-12 21:59:04 +08:00
parent 31bb320ffd
commit 70e1de0c61
12 changed files with 119 additions and 16 deletions

View File

@ -1,6 +1,6 @@
from core.config import CoreConfig
from core.allnet import AllnetServlet, BillingServlet
from core.aimedb import AimedbServlette
from core.aimedb import AimedbServlet
from core.title import TitleServlet
from core.utils import Utils
from core.mucha import MuchaServlet

View File

@ -29,6 +29,24 @@ class ADBStatus(Enum):
LOCK_SYS = 9
LOCK_USER = 10
class ChimeDBStatus(Enum):
NONE = 0
READER_SETUP_FAIL = 1
READER_ACCESS_FAIL = 2
READER_INCOMPATIBLE = 3
DB_RESOLVE_FAIL = 4
DB_ACCESS_TIMEOUT = 5
DB_ACCESS_FAIL = 6
AIME_ID_INVALID = 7
NO_BOARD_INFO = 8
LOCK_BAN_SYSTEM_USER = 9
LOCK_BAN_SYSTEM = 10
LOCK_BAN_USER = 11
LOCK_BAN = 12
LOCK_SYSTEM_USER = 13
LOCK_SYSTEM = 14
LOCK_USER = 15
class CompanyCodes(Enum):
NONE = 0
SEGA = 1

View File

@ -9,7 +9,7 @@ from core.utils import create_sega_auth_key
from core.data import Data
from .adb_handlers import *
class AimedbServlette():
class AimedbServlet():
request_list: Dict[int, Tuple[Callable[[bytes, int], Union[ADBBaseResponse, bytes]], int, str]] = {}
def __init__(self, core_cfg: CoreConfig) -> None:
self.config = core_cfg

View File

@ -136,9 +136,9 @@ class AllnetServlet:
data = await request.body()
try:
if is_dfi:
try:
req_urlencode = self.from_dfi(data)
else:
except:
req_urlencode = data
req_dict = self.allnet_req_to_dict(req_urlencode)
@ -179,6 +179,7 @@ class AllnetServlet:
resp_dict = {k: v for k, v in vars(resp).items() if v is not None}
return PlainTextResponse(urllib.parse.unquote(urllib.parse.urlencode(resp_dict)) + "\n")
if machine is not None:
arcade = await self.data.arcade.get_arcade(machine["arcade"])
if self.config.server.check_arcade_ip:
@ -260,6 +261,29 @@ class AllnetServlet:
self.logger.debug(f"Allnet response: {resp_str}")
return PlainTextResponse(resp_str + "\n")
elif self.config.allnet.enable_game_id_whitelist and req.game_id not in self.config.allnet.game_id_whitelist:
if not self.config.server.is_develop:
msg = f"disallowed game {req.game_id} attempted allnet auth from {request_ip}."
await self.data.base.log_event(
"allnet", "ALLNET_AUTH_DISALLOWED_GAME", logging.WARN, msg
)
self.logger.warning(msg)
resp.stat = ALLNET_STAT.bad_game.value
resp_dict = {k: v for k, v in vars(resp).items() if v is not None}
return PlainTextResponse(urllib.parse.unquote(urllib.parse.urlencode(resp_dict)) + "\n")
else:
self.logger.info(
f"Allowed the disallowed game {req.game_id} v{req.ver} to authenticate from {request_ip} due to 'is_develop' being enabled. S/N: {req.serial}"
)
resp.uri = f"http://{self.config.server.hostname}:{self.config.server.port}/{req.game_id}/{req.ver.replace('.', '')}/"
resp.host = f"{self.config.server.hostname}:{self.config.server.port}"
resp_dict = {k: v for k, v in vars(resp).items() if v is not None}
resp_str = urllib.parse.unquote(urllib.parse.urlencode(resp_dict))
self.logger.debug(f"Allnet response: {resp_str}")
return PlainTextResponse(resp_str + "\n")
int_ver = req.ver.replace(".", "")
@ -296,9 +320,9 @@ class AllnetServlet:
data = await request.body()
try:
if is_dfi:
try:
req_urlencode = self.from_dfi(data)
else:
except:
req_urlencode = data.decode()
req_dict = self.allnet_req_to_dict(req_urlencode)

View File

@ -9,7 +9,7 @@ from starlette.responses import PlainTextResponse
from os import environ, path, mkdir, W_OK, access
from typing import List
from core import CoreConfig, TitleServlet, MuchaServlet, AllnetServlet, BillingServlet, AimedbServlette
from core import CoreConfig, TitleServlet, MuchaServlet, AllnetServlet, BillingServlet, AimedbServlet
from core.chimedb import ChimeServlet
from core.frontend import FrontendServlet

View File

@ -8,6 +8,7 @@ import coloredlogs
from starlette.responses import PlainTextResponse
from twisted.web.http import Request
from core.adb_handlers.base import ChimeDBStatus
from core.config import CoreConfig
from core.data import Data
@ -61,7 +62,7 @@ class ChimeServlet:
userId = await self._lookup(access_code)
data = json.dumps({
"userID": userId,
"errorID": 0,
"errorID": await self._lookup_user_status(access_code),
"timestamp": timestamp,
"key": self._hash_key(userId, timestamp)
})
@ -71,7 +72,7 @@ class ChimeServlet:
data = json.dumps({
"userID": -1,
"errorID": 1,
"errorID": ChimeDBStatus.DB_ACCESS_FAIL,
"timestamp": timestamp,
"key": self._hash_key(-1, timestamp)
})
@ -98,6 +99,17 @@ class ChimeServlet:
return user_id
async def _lookup_user_status(self, access_code):
is_banned = await self.data.card.get_card_banned(access_code)
is_locked = await self.data.card.get_card_locked(access_code)
if is_banned and is_locked:
return ChimeDBStatus.LOCK_BAN_SYSTEM_USER
elif is_banned:
return ChimeDBStatus.LOCK_BAN_SYSTEM
elif is_locked:
return ChimeDBStatus.LOCK_USER
async def _register(self, access_code):
user_id = -1

View File

@ -262,6 +262,24 @@ class AllnetConfig:
self.__config, "core", "allnet", "allow_online_updates", default=False
)
@property
def enable_game_id_whitelist(self) -> int:
return CoreConfig.get_config_field(
self.__config, "core", "allnet", "enable_game_id_whitelist", default=False
)
@property
def game_id_whitelist(self) -> list[str]:
"""
in the form of:
internal_version: [key, iv, salt]
key and iv are hex strings
salt is a normal UTF-8 string
"""
return CoreConfig.get_config_field(
self.__config, "core", "allnet", "game_id_whitelist", default=[]
)
@property
def update_cfg_folder(self) -> str:
return CoreConfig.get_config_field(

View File

@ -22,7 +22,7 @@ title:
database:
host: "localhost"
username: "aime"
username: "root"
password: "aime"
name: "aime"
port: 3306
@ -44,6 +44,9 @@ allnet:
loglevel: "info"
allow_online_updates: False
update_cfg_folder: ""
enable_game_id_whitelist: False
game_id_whitelist:
- ""
billing:
standalone: True

View File

@ -6,7 +6,7 @@ import uvicorn
import logging
import asyncio
from core import CoreConfig, AimedbServlette
from core import CoreConfig, AimedbServlet
async def launch_main(cfg: CoreConfig, ssl: bool) -> None:
if ssl:
@ -79,7 +79,7 @@ async def launcher(cfg: CoreConfig, ssl: bool) -> None:
if cfg.allnet.standalone:
task_list.append(asyncio.create_task(launch_allnet(cfg)))
if cfg.aimedb.enable:
AimedbServlette(cfg).start()
AimedbServlet(cfg).start()
done, pending = await asyncio.wait(
task_list,

View File

@ -17,7 +17,15 @@ class Mai2Buddies(Mai2FestivalPlus):
# hardcode lastDataVersion for CardMaker
user_data["lastDataVersion"] = "1.40.00"
return user_data
async def handle_get_game_ng_word_list_api_request(self, data: Dict) -> Dict:
return {
"ngWordExactMatchLength":0,
"ngWordExactMatchList":[],
"ngWordPartialMatchLength":0,
"ngWordPartialMatchList":[]
}
async def handle_get_user_new_item_api_request(self, data: Dict) -> Dict:
# TODO: Added in 1.41, implement this?
user_id = data["userId"]

View File

@ -56,14 +56,30 @@ class Mai2DX(Mai2Base):
"requestInterval": 1800,
"rebootStartTime": reboot_start,
"rebootEndTime": reboot_end,
"rebootInterval": 0,
"movieUploadLimit": 100,
"movieStatus": 1,
"movieStatus": 1 if self.game_config.uploads.movies else 0,
"movieServerUri": "",
"deliverServerUri": "",
"oldServerUri": self.old_server,
"usbDlServerUri": "",
"rebootInterval": 0,
},
"maxCountRivalMusic": 100,
"replicationDelayLimit": 10,
"exclusionStartTime": "00:00:00",
"exclusionEndTime": "00:00:00",
"pingDisable": True,
"packetTimeout": 20000,
"packetTimeoutLong": 60000,
"packetRetryCount": 10,
"userDataDlErrTimeout": 300000,
"userDataDlErrRetryCount": 1000,
"userDataDlErrSamePacketRetryCount": 1000,
"userDataUpSkipTimeout": 0,
"userDataUpSkipRetryCount": 0,
"iconPhotoDisable": not self.game_config.uploads.photos,
"uploadPhotoDisable": not self.game_config.uploads.photos,
"maxCountMusic": 0,
"maxCountItem": 0},
"isAouAccession": False,
}

View File

@ -321,8 +321,12 @@ class Mai2Servlet(BaseServlet):
elif version >= 135 and version < 140: # FESTiVAL PLUS
internal_ver = Mai2Constants.VER_MAIMAI_DX_FESTIVAL_PLUS
elif game_code == "SDGB": # CN
if version < 130: # Maimai DX CN 2023 (FESTiVAL)
internal_ver = Mai2Constants.VER_MAIMAI_DX
if 130 <= version < 135: # Maimai DX CN 2023 (FESTiVAL)
internal_ver = Mai2Constants.VER_MAIMAI_DX_FESTIVAL
if 140 <= version < 145: # Maimai DX CN 2023 (FESTiVAL)
internal_ver = Mai2Constants.VER_MAIMAI_DX_BUDDIES
try:
unzip = zlib.decompress(req_raw)