Files
honoka-chan/internal/handler/ghome/basic/handshake.go
T
YumeMichi e61c07a9a3 Reduce handler request boilerplate
- Add session.Attach to reuse per-request sessions across middleware and ghome handlers
- Make Session finalize/abort paths idempotent to avoid duplicate commit or rollback work
- Move request_data parsing helper to internal/utils
- Expand ParseRequestData usage across api, download, unit, live, multiunit, and subscenario handlers
- Extract download package metadata into internal/handler/download/types.go
- Return explicit errors from selected session lookup helpers and update callers
- Make api action handlers return errors directly instead of calling ss.CheckErr in nested layers

Signed-off-by: Sean Du <do4suki@gmail.com>
2026-06-04 03:05:32 +08:00

63 lines
1.3 KiB
Go

package basic
import (
"encoding/base64"
"errors"
"fmt"
"honoka-chan/internal/router"
ghomeschema "honoka-chan/internal/schema/ghome"
"honoka-chan/internal/session"
"honoka-chan/pkg/encrypt"
"honoka-chan/pkg/utils"
"net/url"
"strings"
"github.com/gin-gonic/gin"
"github.com/go-think/openssl"
)
func handshake(ctx *gin.Context) {
ss := session.Attach(ctx)
defer ss.Finalize()
data, err := ctx.GetRawData()
if ss.CheckErr(err) {
return
}
data, err = base64.StdEncoding.DecodeString(string(data))
if ss.CheckErr(err) {
return
}
decryptedData := encrypt.RSADecrypt(data)
params, err := url.ParseQuery(string(decryptedData))
if ss.CheckErr(err) {
return
}
randKey := params.Get("randkey")
if len(randKey) < 24 {
ss.Abort(errors.New("invalid rand key"))
return
}
ss.SetRandKey(randKey)
token := fmt.Sprintf(`{"message":"ok","result":0,"token":"%s"}`, strings.ToUpper(utils.RandomStr(33)))
encryptedToken, err := openssl.Des3ECBEncrypt([]byte(token), []byte(randKey[:24]), openssl.PKCS7_PADDING)
if ss.CheckErr(err) {
return
}
ss.Respond(ghomeschema.HandshakeResp{
Code: 0,
Msg: "ok",
Data: base64.StdEncoding.EncodeToString(encryptedToken),
})
}
func init() {
router.AddHandler("v1", "POST", "/basic/handshake", handshake)
}