ssh-manager/controller/stfp.go
2020-12-18 14:35:58 +08:00

115 lines
2.8 KiB
Go

package controller
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"log"
"ssh_manage/common"
"ssh_manage/common/core"
"ssh_manage/common/sftp_clients"
"ssh_manage/errcode"
"ssh_manage/model/Apiform"
)
type sftp_req struct {
Type string `json:"type"`
Token string `json:"token"`
}
type sftp_resp struct {
Code int `json:"code"`
Type string `json:"type"`
Msg string `json:"msg"`
Data string `json:"data"`
}
func Sftp_ssh(c *gin.Context) {
wsConn, err := upGrader.Upgrade(c.Writer, c.Request, nil)
if core.HandleError(c, err) {
return
}
defer wsConn.Close()
var auth Apiform.WsAuth
if c.ShouldBindUri(&auth) != nil {
wsConn.WriteMessage(websocket.TextMessage, []byte("参数错误\r\n"))
wsConn.Close()
return
}
for {
_, wsData, err := wsConn.ReadMessage()
if err != nil {
log.Println(err.Error())
wsConn.Close()
//logrus.WithError(err).Error("reading webSocket message failed")
return
}
//unmashal bytes into struct
msgObj := sftp_req{}
if err := json.Unmarshal(wsData, &msgObj); err != nil {
log.Println("Auth : unmarshal websocket message failed:", string(wsData))
continue
}
resp_msg := sftp_resp{}
token := msgObj.Token
claims, err := common.ParseToken(token)
valid := claims.Valid()
if valid != nil || err != nil {
resp_msg.Code = errcode.S_auth_fmt_err
resp_msg.Msg = "身份令牌校验不通过"
resp_msg.Data = err.Error()
msg, _ := json.Marshal(resp_msg)
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp token fmt err:", err)
}
wsConn.Close()
return
}
if claims.Userid != sftp_clients.Client.C[auth.Sid].Uid { //身份与缓存不符合
resp_msg.Code = errcode.S_auth_fmt_err
resp_msg.Msg = "用户权限不通过"
resp_msg.Data = err.Error()
msg, _ := json.Marshal(resp_msg)
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp server_user err:", err)
}
wsConn.Close()
return
}
path, err := sftp_clients.Client.C[auth.Sid].Sftp.Getwd()
if err != nil {
resp_msg.Code = errcode.S_send_err
resp_msg.Type = "connect"
resp_msg.Msg = "SFTP连接失败"
msg, _ := json.Marshal(resp_msg)
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp connect err:", err)
}
return
}
resp_msg.Code = 200
resp_msg.Type = "connect"
resp_msg.Msg = "连接成功"
resp_msg.Data = path
msg, _ := json.Marshal(resp_msg)
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp return err:", err)
return
}
break
//break
}
quitChan := make(chan bool, 2)
go sftp_clients.Client.C[auth.Sid].ReceiveWsMsg(wsConn, quitChan)
<-quitChan //任意协程退出则结束
fmt.Println("Sftp Exit")
log.Println("sftp websocket finished")
}