parent
fc9de9ea37
commit
b38d94cf55
@ -1,31 +1,28 @@
|
|||||||
from sanic import Sanic, Request
|
from sanic import Sanic, Request, text
|
||||||
from sanic.response import json
|
|
||||||
from sanic.log import logger
|
from sanic.log import logger
|
||||||
|
|
||||||
from logger import setup_log, S_LOGGING_CONFIG_DEFAULTS
|
from utils.logger import setup_log, S_LOGGING_CONFIG_DEFAULTS
|
||||||
|
|
||||||
from sdo import bp_sdo
|
from sdo import bp_sdo
|
||||||
|
from sif import bp_sif
|
||||||
|
|
||||||
|
|
||||||
setup_log()
|
setup_log()
|
||||||
app = Sanic("kotori", log_config=S_LOGGING_CONFIG_DEFAULTS)
|
app = Sanic("kotori", log_config=S_LOGGING_CONFIG_DEFAULTS)
|
||||||
|
|
||||||
app.blueprint(bp_sdo)
|
app.blueprint(bp_sdo)
|
||||||
|
app.blueprint(bp_sif)
|
||||||
|
|
||||||
app.config["PUBKEY_PATH"] = "./publickey.pem"
|
app.config["PUBKEY_PATH"] = "./publickey.pem"
|
||||||
app.config["PRIVKEY_PATH"] = "./privatekey.pem"
|
app.config["PRIVKEY_PATH"] = "./privatekey.pem"
|
||||||
|
|
||||||
@app.middleware("request")
|
@app.middleware("request")
|
||||||
async def callback_request(request: Request):
|
async def callback_request(request: Request):
|
||||||
logger.info(f"{request.method} - {request.path}")
|
logger.info(f"{request.ip} {request.method} - {request.url}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/')
|
@app.route('/')
|
||||||
async def test(request):
|
async def test(request):
|
||||||
return json({'hello': 'world'})
|
return text("(·8·)")
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(port=8080)
|
app.run(port=8080)
|
@ -0,0 +1,6 @@
|
|||||||
|
from sanic import Blueprint
|
||||||
|
|
||||||
|
from .login import bp_sif_login
|
||||||
|
|
||||||
|
bp_sif = Blueprint.group(bp_sif_login, url_prefix="main.php")
|
||||||
|
|
@ -0,0 +1,100 @@
|
|||||||
|
from sanic import Sanic, Blueprint, Request, json, SanicException
|
||||||
|
from sanic.log import logger
|
||||||
|
|
||||||
|
import json as jsonlib
|
||||||
|
import time
|
||||||
|
import urllib.parse
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
from utils.crypto import base64_decode, base64_encode, xor
|
||||||
|
from utils.crypto import rsa_decrypt, get_rsa_privkey, rsa_sha1_sign
|
||||||
|
from utils.crypto import aes_cbc_decrypt
|
||||||
|
from sdo.model import SdoUser
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bp_sif_login = Blueprint("sif_login", url_prefix="login")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@bp_sif_login.route("authkey", methods=["POST"])
|
||||||
|
async def authkey(request: Request):
|
||||||
|
request_data = jsonlib.loads(request.form.get("request_data", "")) # type: ignore
|
||||||
|
dummy_token = base64_decode(request_data["dummy_token"])
|
||||||
|
client_token = base64_encode(rsa_decrypt(dummy_token, get_rsa_privkey()))
|
||||||
|
server_token = base64_encode(uuid.uuid4().bytes)
|
||||||
|
authorize_token = base64_encode(uuid.uuid4().bytes)
|
||||||
|
logger.debug(f"{client_token=} {server_token=} {authorize_token=}")
|
||||||
|
|
||||||
|
ctx = Sanic.get_app().ctx
|
||||||
|
if not hasattr(ctx, "auth_json"): ctx.auth_json = {}
|
||||||
|
ctx.auth_json[authorize_token] = {
|
||||||
|
"client_token": client_token,
|
||||||
|
"server_token": server_token,
|
||||||
|
}
|
||||||
|
|
||||||
|
# nonce = 0
|
||||||
|
# authorize = (f"consumerKey=lovelive_test&"
|
||||||
|
# f"timeStamp={int(time.time())}&"
|
||||||
|
# f"version=1.1&nonce={nonce}&"
|
||||||
|
# f"requestTimeStamp={int(time.time())}")
|
||||||
|
|
||||||
|
auth_resp = {
|
||||||
|
"response_data": {
|
||||||
|
"authorize_token": authorize_token,
|
||||||
|
"dummy_token": server_token
|
||||||
|
},
|
||||||
|
"release_info": {},
|
||||||
|
"status_code": 200
|
||||||
|
}
|
||||||
|
x_message_sign = base64_encode(
|
||||||
|
rsa_sha1_sign(jsonlib.dumps(auth_resp).encode(), get_rsa_privkey()))
|
||||||
|
logger.debug(f"{auth_resp=} {x_message_sign=}")
|
||||||
|
return json(auth_resp, headers={
|
||||||
|
"X-Message-Sign": x_message_sign
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@bp_sif_login.route("login", methods=["POST"])
|
||||||
|
async def login(request: Request):
|
||||||
|
request_data = jsonlib.loads(request.form.get("request_data", "")) # type: ignore
|
||||||
|
authorize = dict(urllib.parse.parse_qsl(request.headers["authorize"]))
|
||||||
|
logger.debug(f"{request_data=} {authorize=}")
|
||||||
|
|
||||||
|
authorize_token = authorize["token"]
|
||||||
|
tokens = Sanic.get_app().ctx.auth_json[authorize_token]
|
||||||
|
client_token = base64_decode(tokens["client_token"])
|
||||||
|
server_token = base64_decode(tokens["server_token"])
|
||||||
|
aes_key = xor(client_token, server_token)[:16]
|
||||||
|
|
||||||
|
encrypt_login_key = base64_decode(request_data["login_key"])
|
||||||
|
login_key = aes_cbc_decrypt(encrypt_login_key, aes_key)[16:].decode()
|
||||||
|
encrypt_login_passwd = base64_decode(request_data["login_passwd"])
|
||||||
|
login_passwd = aes_cbc_decrypt(encrypt_login_passwd, aes_key)[16:].decode()
|
||||||
|
logger.debug(f"{login_key=} {login_passwd=}")
|
||||||
|
|
||||||
|
user = SdoUser.get_or_none(user_id=login_key, # why not sifkey???
|
||||||
|
ticket=login_passwd)
|
||||||
|
if not user:
|
||||||
|
raise SanicException("Auth failed", status_code=403)
|
||||||
|
|
||||||
|
login_resp = {
|
||||||
|
"response_data": {
|
||||||
|
"authorize_token": authorize_token,
|
||||||
|
"user_id": user.user_id,
|
||||||
|
"review_version": "",
|
||||||
|
"server_timestamp": int(time.time()),
|
||||||
|
"idfa_enabled": False,
|
||||||
|
"skip_login_news": False,
|
||||||
|
"adult_flag": 2
|
||||||
|
},
|
||||||
|
"release_info": {},
|
||||||
|
"status_code": 200
|
||||||
|
}
|
||||||
|
x_message_sign = base64_encode(
|
||||||
|
rsa_sha1_sign(jsonlib.dumps(login_resp).encode(), get_rsa_privkey()))
|
||||||
|
logger.debug(f"{login_resp=} {x_message_sign=}")
|
||||||
|
return json(login_resp, headers={
|
||||||
|
"X-Message-Sign": x_message_sign
|
||||||
|
})
|
Loading…
Reference in new issue