@@ -0,0 +1,60 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"honoka-chan/internal/router"
|
||||
"honoka-chan/internal/schema/ghome"
|
||||
"honoka-chan/internal/session"
|
||||
"honoka-chan/pkg/db"
|
||||
"honoka-chan/pkg/encrypt"
|
||||
honokautils "honoka-chan/pkg/utils"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/go-think/openssl"
|
||||
)
|
||||
|
||||
func handshake(ctx *gin.Context) {
|
||||
ss := session.New(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, _ := url.ParseQuery(string(decryptedData))
|
||||
|
||||
randKey := []byte(params.Get("randkey"))
|
||||
deviceID := ss.GetDeviceID()
|
||||
|
||||
err = db.Ldb.Set([]byte(deviceID), randKey)
|
||||
if ss.CheckErr(err) {
|
||||
return
|
||||
}
|
||||
|
||||
token := fmt.Sprintf(`{"message":"ok","result":0,"token":"%s"}`, strings.ToUpper(honokautils.RandomStr(33)))
|
||||
encryptedToken, err := openssl.Des3ECBEncrypt([]byte(token), randKey[0:24], openssl.PKCS7_PADDING)
|
||||
if ss.CheckErr(err) {
|
||||
return
|
||||
}
|
||||
|
||||
ss.Respond(ghome.HandshakeResp{
|
||||
Code: 0,
|
||||
Msg: "ok",
|
||||
Data: base64.StdEncoding.EncodeToString(encryptedToken),
|
||||
})
|
||||
}
|
||||
|
||||
func init() {
|
||||
router.AddHandler("v1", "POST", "/basic/handshake", handshake)
|
||||
}
|
||||
Reference in New Issue
Block a user