@@ -0,0 +1,21 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"honoka-chan/config"
|
||||
"honoka-chan/resp"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func AnnounceIndexHandler(ctx *gin.Context) {
|
||||
ctx.String(http.StatusOK, "Hello, world!")
|
||||
}
|
||||
|
||||
func AnnounceCheckStateHandler(ctx *gin.Context) {
|
||||
ctx.Header("Server-Version", config.Conf.Server.VersionNumber)
|
||||
ctx.Header("user_id", "5802913")
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678640534&version=1.1&token=bS5G6TKTsw0aGxVQz8JWJTx8Tf73H0bF9Bq1PEw3UaxoEoUG8GcrrzaEbjOwEQJTrThgHpBlbwnMRl9ITGw1&nonce=11&requestTimeStamp=1678640534")
|
||||
ctx.Header("X-Message-Sign", "vP/1uPKsGnArUaIL7lPDgZC4lGPjwVZDvFWiGXFfxrRzq6wQ8Veq3623KCl05/2hTTQnOm3L6bNu377s//R/7SieeQ7L7FNWLptTHoyyqgjZe16CJzyqFGbmm9pxxZDttJ74zkuBO1astYBPxh2+qws4LduZUS0c0VklzP5nNoY=")
|
||||
ctx.String(http.StatusOK, resp.AnnounceState)
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"honoka-chan/model"
|
||||
"honoka-chan/resp"
|
||||
"honoka-chan/utils"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func ApiHandler(ctx *gin.Context) {
|
||||
// fmt.Println(c.PostForm("request_data"))
|
||||
var formdata []model.SifApi
|
||||
err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &formdata)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
v1 := false
|
||||
for _, v := range formdata {
|
||||
// fmt.Println(v)
|
||||
if v.Module == "live" {
|
||||
v1 = true
|
||||
break
|
||||
}
|
||||
}
|
||||
ctx.Header("Server-Version", "97.4.6")
|
||||
ctx.Header("user_id", "5802913")
|
||||
if v1 {
|
||||
// 登录后第一次请求API
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678640521&version=1.1&token=bS5G6TKTsw0aGxVQz8JWJTx8Tf73H0bF9Bq1PEw3UaxoEoUG8GcrrzaEbjOwEQJTrThgHpBlbwnMRl9ITGw1&nonce=9&requestTimeStamp=1678640521")
|
||||
// ctx.Header("X-Message-Sign", "bNuSClKqt20FoGduZJI4pB1Y8xUwrrarvfsq0soqU5U97x7kGLESNoXSQVZcFfa1Eo4kgntEktokmDHzCbxpsYFvrD1mhbn++UOmcwXXCQRdxbbfhTt7MVfXbcqXAuFKAfkE37n9dkn1U0RnNt5U4m3mbRhLYT5B16ZcPGIPn/E=")
|
||||
ctx.String(http.StatusOK, utils.ReadAllText("data/test2.json"))
|
||||
} else {
|
||||
// 登录后第二次请求API
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678640523&version=1.1&token=bS5G6TKTsw0aGxVQz8JWJTx8Tf73H0bF9Bq1PEw3UaxoEoUG8GcrrzaEbjOwEQJTrThgHpBlbwnMRl9ITGw1&nonce=10&requestTimeStamp=1678640523")
|
||||
// ctx.Header("X-Message-Sign", "w6+DlFx4DcmaoNXoLu71PH9sOOQeGFX/x0aDayt0qpHa+Uw+MeA0EJossW3/OgZvZgcFxBK2tKrHZJxRrguwCp0lpaI6/onWrYhK9xZeAW33nrsuWWT52v4wyNPY236xGecrDrs9R0nmTOuxElQEKqdFeZYL/JZiuuxvUbwxMy8=")
|
||||
ctx.String(http.StatusOK, resp.Api2)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"honoka-chan/resp"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func DownloadEventHandler(ctx *gin.Context) {
|
||||
ctx.Header("user_id", "5802913")
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678640521&version=1.1&token=bS5G6TKTsw0aGxVQz8JWJTx8Tf73H0bF9Bq1PEw3UaxoEoUG8GcrrzaEbjOwEQJTrThgHpBlbwnMRl9ITGw1&nonce=7&requestTimeStamp=1678640521")
|
||||
ctx.Header("X-Message-Sign", "anBqaPYp7nEprAbxhOouwx8e1dCn1PbmXNplSVtGT3QWNvS+bcMYnqr8QxluM5SIGi3esO8tzHsDzn+Z7tdohFtpkT1zdYQ5qK07eZ8VtyckaRnmx5QLzn7MMflFWr3P/HONS04QwLakoeZyNDCBmxjqOy6QzNsf6e4o9D+21AM=")
|
||||
ctx.String(http.StatusOK, resp.Event)
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"honoka-chan/resp"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func GdprHandler(ctx *gin.Context) {
|
||||
ctx.Header("Server-Version", "97.4.6")
|
||||
ctx.Header("user_id", "5802913")
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678640520&version=1.1&token=bS5G6TKTsw0aGxVQz8JWJTx8Tf73H0bF9Bq1PEw3UaxoEoUG8GcrrzaEbjOwEQJTrThgHpBlbwnMRl9ITGw1&nonce=4&requestTimeStamp=1678640520")
|
||||
ctx.Header("X-Message-Sign", "nGH0cQ34z9D3QnTGFDe2r2WMBGfTzYx+5oaJJbvYCqMESTDAQWlxq8X73OBLgdCkEIMuIAiRyF0z+0MQEVohDL4l6nDgcVDDJztCXP/W5ZXZh1wNgGhHZIDrwboNjsg1acq0+phBAiBEQQt6HipEdGRQh5fhAhhA717ns/C4iUI=")
|
||||
ctx.String(http.StatusOK, resp.Gdpr)
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"context"
|
||||
"honoka-chan/config"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
var (
|
||||
nonce = 0
|
||||
|
||||
redisCli *redis.Client
|
||||
redisCtx = context.Background()
|
||||
)
|
||||
|
||||
func init() {
|
||||
redisCli = redis.NewClient(&redis.Options{
|
||||
Addr: config.Conf.Redis.Host + ":" + config.Conf.Redis.Port,
|
||||
Password: config.Conf.Redis.Pass,
|
||||
DB: config.Conf.Redis.Db,
|
||||
})
|
||||
|
||||
_, err := redisCli.Ping(redisCtx).Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"honoka-chan/resp"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func LBonusExecuteHandler(ctx *gin.Context) {
|
||||
ctx.Header("Server-Version", "97.4.6")
|
||||
ctx.Header("user_id", "5802913")
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678640521&version=1.1&token=bS5G6TKTsw0aGxVQz8JWJTx8Tf73H0bF9Bq1PEw3UaxoEoUG8GcrrzaEbjOwEQJTrThgHpBlbwnMRl9ITGw1&nonce=8&requestTimeStamp=1678640521")
|
||||
ctx.Header("X-Message-Sign", "2UDMPncUOcUnQdLPCSuZIrRWK9yRgASUzCL3YiMpox/IUDNrHn7BRr/eo6iMQ1TlDTnNqzHj/ZP/8m4rpgvlDFHg16nlPUQJe0hqF9Ck3tjeHfT7wbwV75deoqIlPNONS5u3eCI8ZlhRf9VeDUBxRoVDRiq4xqiwjOILvmPAb1w=")
|
||||
ctx.String(http.StatusOK, resp.LBonus)
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"honoka-chan/encrypt"
|
||||
"honoka-chan/model"
|
||||
"honoka-chan/utils"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func AuthKeyHandler(ctx *gin.Context) {
|
||||
reqTime := time.Now().Unix()
|
||||
authReq := model.AuthKeyReq{}
|
||||
err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &authReq)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
dummyToken64, err := base64.StdEncoding.DecodeString(authReq.DummyToken)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
dummyTokenDecrypted := encrypt.RSA_Decrypt(dummyToken64, "privatekey.pem")
|
||||
clientToken := base64.RawStdEncoding.EncodeToString(dummyTokenDecrypted)
|
||||
aesKey := dummyTokenDecrypted[0:16]
|
||||
data64, err := base64.StdEncoding.DecodeString(authReq.AuthData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
dataDecrypted := utils.Sub16(encrypt.AES_CBC_Decrypt(data64, aesKey))
|
||||
fmt.Println(string(dataDecrypted))
|
||||
|
||||
mRandStr := utils.RandomStr(32)
|
||||
serverToken := base64.RawStdEncoding.EncodeToString([]byte(mRandStr))
|
||||
|
||||
authorizeToken := utils.RandomBase64Token(32)
|
||||
|
||||
nonce++
|
||||
|
||||
authData := map[string]interface{}{
|
||||
"client_token": clientToken,
|
||||
"server_token": serverToken,
|
||||
"nonce": nonce,
|
||||
}
|
||||
_, err = redisCli.HSet(redisCtx, authorizeToken, authData).Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
authResp := model.AuthKeyResp{}
|
||||
authResp.ResponseData.DummyToken = serverToken
|
||||
authResp.ResponseData.AuthorizeToken = authorizeToken
|
||||
authResp.StatusCode = 200
|
||||
resp, err := json.Marshal(authResp)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println(string(resp))
|
||||
|
||||
respTime := time.Now().Unix()
|
||||
authorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&nonce=%d&requestTimeStamp=%d", respTime, nonce, reqTime)
|
||||
fmt.Println(authorizeStr)
|
||||
|
||||
xms := encrypt.RSA_Sign_SHA1(resp, "privatekey.pem")
|
||||
xms64 := base64.RawStdEncoding.EncodeToString(xms)
|
||||
|
||||
ctx.Header("user_id", "")
|
||||
ctx.Header("authorize", authorizeStr)
|
||||
ctx.Header("X-Message-Sign", xms64)
|
||||
ctx.JSON(http.StatusOK, authResp)
|
||||
}
|
||||
|
||||
func LoginHandler(ctx *gin.Context) {
|
||||
reqTime := time.Now().Unix()
|
||||
authorizeStr := ctx.Request.Header["Authorize"]
|
||||
if len(authorizeStr) == 0 {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
fmt.Println(authorizeStr[0])
|
||||
urlParams, err := url.ParseQuery(authorizeStr[0])
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println(urlParams)
|
||||
authToken := urlParams["token"]
|
||||
if len(authToken) == 0 {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
authData, err := redisCli.HGetAll(redisCtx, authToken[0]).Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println(authData)
|
||||
clientToken, serverToken, clientNonce := authData["client_token"], authData["server_token"], authData["nonce"]
|
||||
fmt.Println(clientToken)
|
||||
clientToken64, err := base64.RawStdEncoding.DecodeString(clientToken)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
serverToken64, err := base64.RawStdEncoding.DecodeString(serverToken)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
xmcKey := utils.SliceXor([]byte(clientToken64), []byte(serverToken64))
|
||||
fmt.Println(xmcKey)
|
||||
aesKey := xmcKey[0:16]
|
||||
loginReq := model.LoginReq{}
|
||||
err = json.Unmarshal([]byte(ctx.PostForm("request_data")), &loginReq)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
key64, err := base64.StdEncoding.DecodeString(loginReq.LoginKey)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
pass64, err := base64.StdEncoding.DecodeString(loginReq.LoginPasswd)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
keyDescrypted := utils.Sub16(encrypt.AES_CBC_Decrypt(key64, aesKey))
|
||||
fmt.Println(string(keyDescrypted))
|
||||
passDescrypted := utils.Sub16(encrypt.AES_CBC_Decrypt(pass64, aesKey))
|
||||
fmt.Println(string(passDescrypted))
|
||||
|
||||
nonce, _ = strconv.Atoi(clientNonce)
|
||||
nonce++
|
||||
|
||||
authorizeToken := utils.RandomBase64Token(32)
|
||||
uid, err := redisCli.HGet(redisCtx, "login_key_uid", string(keyDescrypted)).Result()
|
||||
if err != nil {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
userId, _ := strconv.Atoi(uid)
|
||||
|
||||
loginResp := model.LoginResp{}
|
||||
loginResp.ResponseData.AuthorizeToken = authorizeToken
|
||||
loginResp.ResponseData.UserId = userId
|
||||
loginResp.ResponseData.ServerTimestamp = time.Now().Unix()
|
||||
loginResp.ResponseData.AdultFlag = 2
|
||||
loginResp.StatusCode = 200
|
||||
resp, err := json.Marshal(loginResp)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println(string(resp))
|
||||
|
||||
respTime := time.Now().Unix()
|
||||
newAuthorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&token=%s&nonce=%d&user_id=%d&requestTimeStamp=%d", respTime, authorizeToken, nonce, userId, reqTime)
|
||||
fmt.Println(newAuthorizeStr)
|
||||
|
||||
xms := encrypt.RSA_Sign_SHA1(resp, "privatekey.pem")
|
||||
xms64 := base64.RawStdEncoding.EncodeToString(xms)
|
||||
|
||||
ctx.Header("user_id", "")
|
||||
ctx.Header("authorize", newAuthorizeStr)
|
||||
ctx.Header("X-Message-Sign", xms64)
|
||||
ctx.JSON(http.StatusOK, loginResp)
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"honoka-chan/resp"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func PersonalNoticeHandler(ctx *gin.Context) {
|
||||
ctx.Header("Server-Version", "97.4.6")
|
||||
ctx.Header("user_id", "5802913")
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678640520&version=1.1&token=bS5G6TKTsw0aGxVQz8JWJTx8Tf73H0bF9Bq1PEw3UaxoEoUG8GcrrzaEbjOwEQJTrThgHpBlbwnMRl9ITGw1&nonce=5&requestTimeStamp=1678640520")
|
||||
ctx.Header("X-Message-Sign", "c/J6CJPZZeGk44VLWkgCfamhFFKlLheu4e2ga2KrEl6DkVyotQTDte39RGMJS+kd5qRg/nSh/QdRGEfMLIeXB2xj3TT/UB1a03wV6slr39B+Xd2ip8BiuDKxmqpw3ESdK25WdlY+fMXbXc4RkkrleqElME7jw+VZ2SiwIgiedNg=")
|
||||
ctx.String(http.StatusOK, resp.Gdpr)
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func ScenarioStartupHandler(ctx *gin.Context) {
|
||||
ctx.Header("Content-Type", "application/json")
|
||||
ctx.Header("X-Powered-By", "KLab Native APP Platform")
|
||||
ctx.Header("server_version", "20120129")
|
||||
ctx.Header("Server-Version", "97.4.6")
|
||||
ctx.Header("user_id", "5802913")
|
||||
ctx.Header("version_up", "0")
|
||||
ctx.Header("status_code", "200")
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678786443&version=1.1&token=2gjbstqCHAlIv600Pk0AJN5uvfPYgLvfSKB418sMIoclOy1M9UP7LUC1CG14tPicVzOq2MBOXLvpmNRwyWIi9Qf&nonce=17&requestTimeStamp=1678786443")
|
||||
ctx.Header("X-Message-Sign", "L+cK2fiaDxkRwJCmT6lpMu9RM/emmUye32RtS8C36I7OpBhGiZLbiPN30dPXITWDIUjUyPsVCqvLVzEy484Q+NHvQfDEUuS5SnKOtoNxW9Zk6kjyckjJKFIbsdH61cbb4pfzmSptcaByZ6ieNIpbHTzsvpu54JFOXb84g859Pxs=")
|
||||
|
||||
res := `{"response_data":{"scenario_id":1,"scenario_adjustment":50,"server_timestamp":1678785161},"release_info":[],"status_code":200}`
|
||||
ctx.String(http.StatusOK, res)
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"honoka-chan/resp"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func TosCheckHandler(ctx *gin.Context) {
|
||||
ctx.Header("user_id", "5802913")
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678640520&version=1.1&token=bS5G6TKTsw0aGxVQz8JWJTx8Tf73H0bF9Bq1PEw3UaxoEoUG8GcrrzaEbjOwEQJTrThgHpBlbwnMRl9ITGw1&nonce=6&requestTimeStamp=1678640520")
|
||||
ctx.Header("X-Message-Sign", "lHGAUrSt27AAUkeB+WJCSLjs9xZdyNnDRlZVZ0VRXFhqDnVBag0lwSQEUQoedh3/FyIHazbfjuTJw9REsgSJwX05I7GW7KoqPIYNoRLiLgjM6Y7MOZWrpVdipWl0q7IPS3mKyL8ye6sRZ8TfWx8cFfnohp3U7FnvrAEWdh1h71I=")
|
||||
ctx.String(http.StatusOK, resp.TosCheck)
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"honoka-chan/resp"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func SetNotificationTokenHandler(ctx *gin.Context) {
|
||||
ctx.Header("Server-Version", "97.4.6")
|
||||
ctx.Header("user_id", "5802913")
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678891478&version=1.1&token=cTMEyAfIDErcKUyCgBM6ZuJv8UBRgSzG4z4MfqYhR7xSHBYhIA9ofaVKtSefeiP2LTKIfbnCfE5dppYw8Af&nonce=18&requestTimeStamp=1678891478")
|
||||
ctx.Header("X-Message-Sign", "bNZj/YjRADDccb5vcF/NHI9Kin3bkM3ECBQdxttXvCBqzoSBX6yWuEn9Fsjx+Yp3g2D9CcONZzqJlAvXbatGHJkbClSXuomLXVOcNmQYgidjyUvC7CceoSvCbL8U4Ge12tyGd8V2EMHVZfxqPKdHsJSGaOFbUpmo7wAhKVfuEjg=")
|
||||
ctx.String(http.StatusOK, resp.NotificationToken)
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"honoka-chan/resp"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func UserInfoHandler(ctx *gin.Context) {
|
||||
ctx.Header("Server-Version", "97.4.6")
|
||||
ctx.Header("user_id", "5802913")
|
||||
ctx.Header("authorize", "consumerKey=lovelive_test&timeStamp=1678640520&version=1.1&token=bS5G6TKTsw0aGxVQz8JWJTx8Tf73H0bF9Bq1PEw3UaxoEoUG8GcrrzaEbjOwEQJTrThgHpBlbwnMRl9ITGw1&nonce=3&requestTimeStamp=1678640520")
|
||||
ctx.Header("X-Message-Sign", "oa9sisoLJILWOKto4CAfb1jJwzoozpkpIAhnXl3s6m5jy75Zyb8tM+Jds6rqytnJt/labC/hFH0dhna/qqGbnTeLq6zUwHrTf8crz4uwtVi8qOBwvSbtA1dgbiKJr9raAflgJOQj6cft7XGP4bdkYfbuNxPS9gFhK+MG7b8S3Z8=")
|
||||
ctx.String(http.StatusOK, resp.UserInfo)
|
||||
}
|
||||
Reference in New Issue
Block a user