From 33b7db0e985ecc5d04961d137a9de5120b9c6268 Mon Sep 17 00:00:00 2001 From: Keeboy99 <67620144+Keeboy99@users.noreply.github.com> Date: Sat, 31 May 2025 20:04:28 +1200 Subject: [PATCH] Added support for multiple Allnet Lite keys + extras --- core/allnet.py | 42 +++++++++++++++++++++++++++----------- core/config.py | 6 +++--- docs/config.md | 12 +++++++++++ docs/game_specific_info.md | 1 + titles/chuni/index.py | 3 +++ 5 files changed, 49 insertions(+), 15 deletions(-) diff --git a/core/allnet.py b/core/allnet.py index 96c5631..7cd9b43 100644 --- a/core/allnet.py +++ b/core/allnet.py @@ -139,17 +139,26 @@ class AllnetServlet: useragent_header = request.headers.get('User-Agent', "") is_dfi = pragma_header == "DFI" is_lite = useragent_header[5:] == "Windows/Lite" + lite_id = useragent_header[:4] 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) + if not self.config.allnet.allnet_lite_keys and is_lite: + self.logger.error("!!!LITE KEYS NOT SET!!!") + raise AllnetRequestException() + elif is_lite: + for gameids, key in self.config.allnet.allnet_lite_keys.items(): + if gameids == lite_id: + litekey = key + + if is_lite and "litekey" not in locals(): + self.logger.error("!!!UNIQUE LITE KEY NOT FOUND!!!") + raise AllnetRequestException() try: if is_dfi: req_urlencode = self.from_dfi(data) elif is_lite: - req_urlencode = self.dec_lite(self.config.allnet.allnet_lite_key, data[:16], data) + req_urlencode = self.dec_lite(litekey, data[:16], data) else: req_urlencode = data @@ -348,7 +357,7 @@ class AllnetServlet: ) 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_str)) + return PlainTextResponse(content=self.enc_lite(litekey, iv, resp_str)) return PlainTextResponse(resp_str) @@ -358,17 +367,26 @@ class AllnetServlet: useragent_header = request.headers.get('User-Agent', "") is_dfi = pragma_header == "DFI" is_lite = useragent_header[5:] == "Windows/Lite" + lite_id = useragent_header[:4] 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) + if not self.config.allnet.allnet_lite_keys and is_lite: + self.logger.error("!!!LITE KEYS NOT SET!!!") + raise AllnetRequestException() + elif is_lite: + for gameids, key in self.config.allnet.allnet_lite_keys.items(): + if gameids == lite_id: + litekey = key + + if is_lite and "litekey" not in locals(): + self.logger.error("!!!UNIQUE LITE KEY NOT FOUND!!!") + raise AllnetRequestException() try: if is_dfi: req_urlencode = self.from_dfi(data) elif is_lite: - req_urlencode = self.dec_lite(self.config.allnet.allnet_lite_key, data[:16], data) + req_urlencode = self.dec_lite(litekey, data[:16], data) else: req_urlencode = data.decode() @@ -412,7 +430,7 @@ class AllnetServlet: ) 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(content=self.enc_lite(litekey, iv, resp)) return PlainTextResponse(resp) else: @@ -425,7 +443,7 @@ class AllnetServlet: ) 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(content=self.enc_lite(litekey, iv, resp)) return PlainTextResponse(resp) if path.exists( @@ -457,7 +475,7 @@ class AllnetServlet: ) 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(content=self.enc_lite(litekey, iv, res_str)) return PlainTextResponse(res_str) diff --git a/core/config.py b/core/config.py index 2b45ed6..f79d6c0 100644 --- a/core/config.py +++ b/core/config.py @@ -1,7 +1,7 @@ import logging import os import ssl -from typing import Any, Union +from typing import Any, Union, Dict from typing_extensions import Optional @@ -379,9 +379,9 @@ class AllnetConfig: self.__config, "core", "allnet", "save_billing", default=False ) @property - def allnet_lite_key(self) -> bool: + def allnet_lite_keys(self) -> Dict: return CoreConfig.get_config_field( - self.__config, "core", "allnet", "allnet_lite_key", default=[] + self.__config, "core", "allnet", "allnet_lite_keys", default={} ) class BillingConfig: diff --git a/docs/config.md b/docs/config.md index f85e8e7..6cf2482 100644 --- a/docs/config.md +++ b/docs/config.md @@ -41,6 +41,13 @@ - `loglevel`: Logging level for the allnet server. Default `info` - `allow_online_updates`: Allow allnet to distribute online updates via DownloadOrders. This system is currently non-functional, so leave it disabled. Default `False` - `update_cfg_folder`: Folder where delivery INI files will be checked for. Ignored if `allow_online_updates` is `False`. Default `""` +- `allnet_lite_keys:` Allnet Lite (Chinese Allnet) PowerOn/DownloadOrder unique keys. Default ` ` +```yaml + allnet_lite_keys: + "SDJJ": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] + "SDHJ": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] + "SDGB": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] +``` ## Billing - `standalone`: Whether the billing server should launch it's own servlet on it's own port, or be part of the main servlet on the default port. Setting this to `True` requires that you have `ssl_key` and `ssl_cert` set. Default `False` - `loglevel`: Logging level for the billing server. Default `info` @@ -56,3 +63,8 @@ - `key`: Key to encrypt/decrypt aimedb requests and responses. MUST be set or the server will not start. If set incorrectly, your server will not properly handle aimedb requests. Default `""` - `id_secret`: Base64-encoded JWT secret for Sega Auth IDs. Leaving this blank disables this feature. Default `""` - `id_lifetime_seconds`: Number of secons a JWT generated should be valid for. Default `86400` (1 day) +## Chimedb +- `enable`: Whether or not chimedb should run. Default `False` +- `loglevel`: Logging level for the chimedb server. Default `info` +- `key`: Key to hash chimedb requests and responses. MUST be set or the server will not start. If set incorrectly, your server will not properly handle chimedb requests. Default `""` + diff --git a/docs/game_specific_info.md b/docs/game_specific_info.md index 7121478..0903979 100644 --- a/docs/game_specific_info.md +++ b/docs/game_specific_info.md @@ -108,6 +108,7 @@ crypto: keys: 13: ["0000000000000000000000000000000000000000000000000000000000000000", "00000000000000000000000000000000", "0000000000000000"] "13_int": ["0000000000000000000000000000000000000000000000000000000000000000", "00000000000000000000000000000000", "0000000000000000", 42] + "13_chn": ["0000000000000000000000000000000000000000000000000000000000000000", "00000000000000000000000000000000", "0000000000000000", 8] ``` ### Database upgrade diff --git a/titles/chuni/index.py b/titles/chuni/index.py index 7e72650..ad51bb0 100644 --- a/titles/chuni/index.py +++ b/titles/chuni/index.py @@ -101,14 +101,17 @@ class ChuniServlet(BaseServlet): f"{ChuniConstants.VER_CHUNITHM_PARADISE}_int": 51, # SUPERSTAR PLUS ChuniConstants.VER_CHUNITHM_NEW: 54, f"{ChuniConstants.VER_CHUNITHM_NEW}_int": 49, + f"{ChuniConstants.VER_CHUNITHM_NEW}_chn": 37, ChuniConstants.VER_CHUNITHM_NEW_PLUS: 25, f"{ChuniConstants.VER_CHUNITHM_NEW_PLUS}_int": 31, + f"{ChuniConstants.VER_CHUNITHM_NEW_PLUS}_chn": 35, ChuniConstants.VER_CHUNITHM_SUN: 70, f"{ChuniConstants.VER_CHUNITHM_SUN}_int": 35, ChuniConstants.VER_CHUNITHM_SUN_PLUS: 36, f"{ChuniConstants.VER_CHUNITHM_SUN_PLUS}_int": 36, ChuniConstants.VER_CHUNITHM_LUMINOUS: 8, f"{ChuniConstants.VER_CHUNITHM_LUMINOUS}_int": 8, + f"{ChuniConstants.VER_CHUNITHM_LUMINOUS}_chn": 8, ChuniConstants.VER_CHUNITHM_LUMINOUS_PLUS: 56, }