diff --git a/app/api/meta.py b/app/api/meta.py index 2e16373..8a3710e 100644 --- a/app/api/meta.py +++ b/app/api/meta.py @@ -4,15 +4,29 @@ router = APIRouter(tags=["Meta"]) @router.get("/") def api_root(): - return { - "meta": { - "serverName": "Your Auth Server", - "implementationName": "FastAPI", - "implementationVersion": "1.0.0", - "links": { - "homepage": "https://your-server.com" + # Читаем публичный ключ из файла + public_key_path = "app/keys/public_key.pem" + + try: + with open(public_key_path, "r") as f: + public_key = f.read().strip() + + return { + "meta": { + "serverName": "Popa Auth Server", + "implementationName": "FastAPI", + "implementationVersion": "1.0.0", + "links": { + "homepage": "https://popa-popa.ru" + } }, - }, - "skinDomains": ["147.78.65.214"], - "capeDomains": ["147.78.65.214"] - } + "skinDomains": ["147.78.65.214"], + "capeDomains": ["147.78.65.214"], + # Важно - возвращаем ключ как есть, без дополнительной обработки + "signaturePublickey": public_key + } + except Exception as e: + return { + "error": str(e), + "traceback": str(e) + } diff --git a/private_key.pem b/app/keys/private_key.pem similarity index 100% rename from private_key.pem rename to app/keys/private_key.pem diff --git a/public_key.pem b/app/keys/public_key.pem similarity index 100% rename from public_key.pem rename to app/keys/public_key.pem diff --git a/app/services/auth.py b/app/services/auth.py index e6543f5..2faf691 100644 --- a/app/services/auth.py +++ b/app/services/auth.py @@ -108,7 +108,7 @@ class AuthService: textures = { "timestamp": int(datetime.now().timestamp() * 1000), - "profileId": user["uuid"], # UUID с дефисами + "profileId": user["uuid"].replace("-", ""), "profileName": user["username"], "textures": {} } @@ -124,29 +124,67 @@ class AuthService: textures_json = json.dumps(textures).encode() base64_textures = base64.b64encode(textures_json).decode() - - # Подписываем текстуры - with open("private_key.pem", "rb") as key_file: - private_key = serialization.load_pem_private_key( - key_file.read(), - password=None - ) - signature = private_key.sign( - textures_json, - padding.PKCS1v15(), - hashes.SHA1() - ) + try: + # Подписываем текстуры + private_key_path = "app/keys/private_key.pem" + with open(private_key_path, "rb") as key_file: + private_key = serialization.load_pem_private_key( + key_file.read(), + password=None + ) + + signature = private_key.sign( + base64.b64encode(textures_json), + padding.PKCS1v15(), + hashes.SHA1() + ) + + signature_base64 = base64.b64encode(signature).decode() + + return { + "id": user["uuid"].replace("-", ""), + "name": user["username"], + "properties": [{ + "name": "textures", + "value": base64_textures, + "signature": signature_base64 + }] + } + except Exception as e: + print(f"Error signing textures: {e}") + # В случае ошибки возвращаем текстуры без подписи + return { + "id": user["uuid"].replace("-", ""), + "name": user["username"], + "properties": [{ + "name": "textures", + "value": base64_textures + }] + } - return JSONResponse({ - "id": user["uuid"].replace("-", ""), # Уберите дефисы - "name": user["username"], - "properties": [{ - "name": "textures", - "value": base64_textures, - "signature": base64.b64encode(signature).decode() - }] - }) + # # Подписываем текстуры + # with open("private_key.pem", "rb") as key_file: + # private_key = serialization.load_pem_private_key( + # key_file.read(), + # password=None + # ) + + # signature = private_key.sign( + # textures_json, + # padding.PKCS1v15(), + # hashes.SHA1() + # ) + + # return JSONResponse({ + # "id": user["uuid"].replace("-", ""), # Уберите дефисы + # "name": user["username"], + # "properties": [{ + # "name": "textures", + # "value": base64_textures, + # # "signature": base64.b64encode(signature).decode() + # }] + # }) async def join_server(self, request_data: dict): access_token = request_data.get("accessToken") @@ -186,24 +224,59 @@ class AuthService: if not session: raise HTTPException(status_code=403, detail="Not joined this server") - textures = {} - if user.get("skin_url"): - textures["SKIN"] = {"url": user["skin_url"]} - if user.get("cloak_url"): - textures["CAPE"] = {"url": user["cloak_url"]} - - textures_value = base64.b64encode(json.dumps({ - "timestamp": int(datetime.now().timestamp()), - "profileId": user["uuid"].replace("-", ""), # UUID без дефисов - "profileName": username, - "textures": textures - }).encode()).decode() - - return { - "id": user["uuid"].replace("-", ""), # UUID без дефисов - "name": username, - "properties": [{ - "name": "textures", - "value": textures_value - }] if textures else [] + textures = { + "timestamp": int(datetime.now().timestamp() * 1000), + "profileId": user["uuid"].replace("-", ""), + "profileName": user["username"], + "textures": {} } + + if user.get("skin_url"): + textures["textures"]["SKIN"] = { + "url": user["skin_url"], + "metadata": {"model": user.get("skin_model", "classic")} + } + + if user.get("cloak_url"): + textures["textures"]["CAPE"] = {"url": user["cloak_url"]} + + textures_json = json.dumps(textures).encode() + base64_textures = base64.b64encode(textures_json).decode() + + try: + # Подписываем текстуры + private_key_path = "app/keys/private_key.pem" + with open(private_key_path, "rb") as key_file: + private_key = serialization.load_pem_private_key( + key_file.read(), + password=None + ) + + signature = private_key.sign( + base64.b64encode(textures_json), + padding.PKCS1v15(), + hashes.SHA1() + ) + + signature_base64 = base64.b64encode(signature).decode() + + return { + "id": user["uuid"].replace("-", ""), + "name": user["username"], + "properties": [{ + "name": "textures", + "value": base64_textures, + "signature": signature_base64 + }] + } + except Exception as e: + print(f"Error signing textures: {e}") + # В случае ошибки возвращаем текстуры без подписи + return { + "id": user["uuid"].replace("-", ""), + "name": user["username"], + "properties": [{ + "name": "textures", + "value": base64_textures + }] + } diff --git a/app/static/capes_store/store_cape_5a522894-02be-4221-be1c-09ec1ff50665.png b/app/static/capes_store/store_cape_5a522894-02be-4221-be1c-09ec1ff50665.png new file mode 100644 index 0000000..9ef4574 Binary files /dev/null and b/app/static/capes_store/store_cape_5a522894-02be-4221-be1c-09ec1ff50665.png differ