From 404ae115bc1b75ed60761e9797eb8d9089520116 Mon Sep 17 00:00:00 2001 From: Yuan Si Date: Sat, 22 Apr 2023 22:09:40 +0800 Subject: [PATCH] Hack for parsing multipart/form-data from iOS Well I have no idea~ Signed-off-by: Yuan Si --- handler/api.go | 2 +- handler/live.go | 6 +++--- main.go | 30 +++++++++++++++--------------- middleware/common.go | 7 ------- middleware/multipart.go | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 middleware/multipart.go diff --git a/handler/api.go b/handler/api.go index 30a9559..04edef2 100644 --- a/handler/api.go +++ b/handler/api.go @@ -22,7 +22,7 @@ func ApiHandler(ctx *gin.Context) { CheckErr(err) var formdata []model.SifApi - err = json.Unmarshal([]byte(ctx.PostForm("request_data")), &formdata) + err = json.Unmarshal([]byte(ctx.GetString("request_data")), &formdata) if err != nil { fmt.Println(err) return diff --git a/handler/live.go b/handler/live.go index e9bb144..9fb580e 100644 --- a/handler/live.go +++ b/handler/live.go @@ -39,7 +39,7 @@ func PartyListHandler(ctx *gin.Context) { func PlayLiveHandler(ctx *gin.Context) { playReq := model.PlayReq{} - err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &playReq) + err := json.Unmarshal([]byte(ctx.GetString("request_data")), &playReq) CheckErr(err) tDifficultyId := playReq.LiveDifficultyID @@ -459,7 +459,7 @@ func GameOverHandler(ctx *gin.Context) { func PlayScoreHandler(ctx *gin.Context) { playScoreReq := model.PlayScoreReq{} - err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &playScoreReq) + err := json.Unmarshal([]byte(ctx.GetString("request_data")), &playScoreReq) CheckErr(err) tDifficultyId := playScoreReq.LiveDifficultyID @@ -557,7 +557,7 @@ func PlayScoreHandler(ctx *gin.Context) { func PlayRewardHandler(ctx *gin.Context) { playRewardReq := model.PlayRewardReq{} - err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &playRewardReq) + err := json.Unmarshal([]byte(ctx.GetString("request_data")), &playRewardReq) CheckErr(err) difficultyId := playRewardReq.LiveDifficultyID diff --git a/main.go b/main.go index 8327124..7e52720 100644 --- a/main.go +++ b/main.go @@ -49,9 +49,9 @@ func main() { // Server APIs m := r.Group("main.php").Use(middleware.Common) { - m.POST("/album/seriesAll", handler.AlbumSeriesAllHandler) - m.POST("/announce/checkState", handler.AnnounceCheckStateHandler) - m.POST("/api", handler.ApiHandler) + m.POST("/album/seriesAll", middleware.ParseMultipartForm, handler.AlbumSeriesAllHandler) + m.POST("/announce/checkState", middleware.ParseMultipartForm, handler.AnnounceCheckStateHandler) + m.POST("/api", middleware.ParseMultipartForm, handler.ApiHandler) m.POST("/award/set", handler.AwardSet) m.POST("/background/set", handler.BackgroundSet) m.POST("/download/additional", handler.DownloadAdditionalHandler) @@ -59,29 +59,29 @@ func main() { m.POST("/download/event", handler.DownloadEventHandler) m.POST("/download/getUrl", handler.DownloadUrlHandler) m.POST("/download/update", handler.DownloadUpdateHandler) - m.POST("/event/eventList", handler.EventListHandler) - m.POST("/gdpr/get", handler.GdprHandler) + m.POST("/event/eventList", middleware.ParseMultipartForm, handler.EventListHandler) + m.POST("/gdpr/get", middleware.ParseMultipartForm, handler.GdprHandler) m.POST("/lbonus/execute", handler.LBonusExecuteHandler) m.POST("/live/gameover", handler.GameOverHandler) m.POST("/live/partyList", handler.PartyListHandler) - m.POST("/live/play", handler.PlayLiveHandler) - m.POST("/live/preciseScore", handler.PlayScoreHandler) - m.POST("/live/reward", handler.PlayRewardHandler) + m.POST("/live/play", middleware.ParseMultipartForm, handler.PlayLiveHandler) + m.POST("/live/preciseScore", middleware.ParseMultipartForm, handler.PlayScoreHandler) + m.POST("/live/reward", middleware.ParseMultipartForm, handler.PlayRewardHandler) m.POST("/login/authkey", middleware.AuthKey, handler.AuthKey) m.POST("/login/login", middleware.Login, handler.Login) m.POST("/multiunit/scenarioStartup", handler.MultiUnitStartUpHandler) - m.POST("/museum/info", handler.MuseumInfo) - m.POST("/notice/noticeFriendGreeting", handler.NoticeFriendGreetingHandler) - m.POST("/notice/noticeFriendVariety", handler.NoticeFriendVarietyHandler) + m.POST("/museum/info", middleware.ParseMultipartForm, handler.MuseumInfo) + m.POST("/notice/noticeFriendGreeting", middleware.ParseMultipartForm, handler.NoticeFriendGreetingHandler) + m.POST("/notice/noticeFriendVariety", middleware.ParseMultipartForm, handler.NoticeFriendVarietyHandler) m.POST("/notice/noticeUserGreetingHistory", handler.NoticeUserGreetingHandler) - m.POST("/payment/productList", handler.ProductListHandler) - m.POST("/personalnotice/get", handler.PersonalNoticeHandler) + m.POST("/payment/productList", middleware.ParseMultipartForm, handler.ProductListHandler) + m.POST("/personalnotice/get", middleware.ParseMultipartForm, handler.PersonalNoticeHandler) m.POST("/profile/profileRegister", handler.ProfileRegister) m.POST("/scenario/reward", handler.ScenarioRewardHandler) m.POST("/scenario/startup", handler.ScenarioStartupHandler) m.POST("/subscenario/reward", handler.SubScenarioStartupHandler) m.POST("/subscenario/startup", handler.SubScenarioStartupHandler) - m.POST("/tos/tosCheck", handler.TosCheckHandler) + m.POST("/tos/tosCheck", middleware.ParseMultipartForm, handler.TosCheckHandler) m.POST("/unit/deck", handler.SetDeckHandler) m.POST("/unit/deckName", handler.SetDeckNameHandler) m.POST("/unit/favorite", handler.SetDisplayRankHandler) @@ -91,7 +91,7 @@ func main() { m.POST("/user/changeName", handler.ChangeNameHandler) m.POST("/user/changeNavi", handler.ChangeNaviHandler) m.POST("/user/setNotificationToken", handler.SetNotificationTokenHandler) - m.POST("/user/userInfo", handler.UserInfoHandler) + m.POST("/user/userInfo", middleware.ParseMultipartForm, handler.UserInfoHandler) } r.GET("/webview.php/announce/index", handler.AnnounceIndexHandler) // Server APIs diff --git a/middleware/common.go b/middleware/common.go index 609b1e1..cc345c5 100644 --- a/middleware/common.go +++ b/middleware/common.go @@ -24,13 +24,6 @@ func CheckErr(err error) { func Common(ctx *gin.Context) { ctx.Set("req_time", time.Now().Unix()) - ctx.Request.ParseMultipartForm(0) - if len(ctx.PostForm("request_data")) == 0 { - // 弱智iOS客户端经常发些空的表单上来... - fmt.Println("Fuck you, iOS!") - ctx.Abort() - } - authorize := ctx.Request.Header.Get("Authorize") if authorize == "" { ctx.String(http.StatusForbidden, ErrorMsg) diff --git a/middleware/multipart.go b/middleware/multipart.go new file mode 100644 index 0000000..3527c3c --- /dev/null +++ b/middleware/multipart.go @@ -0,0 +1,35 @@ +package middleware + +import ( + "io" + "mime/multipart" + "strings" + + "github.com/gin-gonic/gin" +) + +func ParseMultipartForm(ctx *gin.Context) { + if ctx.Request.Header.Get("OS") != "Android" { + // I don't know why mime.ParseMediaType() is failed + // mime.ParseMediaType(ctx.Request.Header.Get("Content-Type")) + boundary := strings.ReplaceAll(ctx.Request.Header.Get("Content-Type"), "multipart/form-data; boundary=", "") + + var reqData []byte + mReader := multipart.NewReader(ctx.Request.Body, boundary) + for { + part, err := mReader.NextPart() + if err == io.EOF { + break + } + CheckErr(err) + + data, err := io.ReadAll(part) + CheckErr(err) + + reqData = data + } + ctx.Set("request_data", string(reqData)) + } + + ctx.Next() +}