ssh-manager/controller/stfp.go

115 lines
2.8 KiB
Go
Raw Normal View History

2020-12-18 14:35:58 +08:00
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 sftpReq struct {
2020-12-18 14:35:58 +08:00
Type string `json:"type"`
Token string `json:"token"`
}
type sftpResp struct {
2020-12-18 14:35:58 +08:00
Code int `json:"code"`
Type string `json:"type"`
Msg string `json:"msg"`
Data string `json:"data"`
}
func SftpSsh(c *gin.Context) {
2020-12-18 14:35:58 +08:00
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()
2020-12-18 14:35:58 +08:00
return
}
for {
_, wsData, err := wsConn.ReadMessage()
if err != nil {
log.Println(err.Error())
_ = wsConn.Close()
2020-12-18 14:35:58 +08:00
//logrus.WithError(err).Error("reading webSocket message failed")
return
}
//unmashal bytes into struct
msgObj := sftpReq{}
2020-12-18 14:35:58 +08:00
if err := json.Unmarshal(wsData, &msgObj); err != nil {
log.Println("Auth : unmarshal websocket message failed:", string(wsData))
continue
}
respMsg := sftpResp{}
2020-12-18 14:35:58 +08:00
token := msgObj.Token
claims, err := common.ParseToken(token)
valid := claims.Valid()
if valid != nil || err != nil {
respMsg.Code = errcode.S_auth_fmt_err
respMsg.Msg = "身份令牌校验不通过"
respMsg.Data = err.Error()
msg, _ := json.Marshal(respMsg)
2020-12-18 14:35:58 +08:00
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp token fmt err:", err)
}
_ = wsConn.Close()
2020-12-18 14:35:58 +08:00
return
}
if claims.Userid != sftp_clients.Client.C[auth.Sid].Uid { //身份与缓存不符合
respMsg.Code = errcode.S_auth_fmt_err
respMsg.Msg = "用户权限不通过"
respMsg.Data = err.Error()
msg, _ := json.Marshal(respMsg)
2020-12-18 14:35:58 +08:00
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp server_user err:", err)
}
_ = wsConn.Close()
2020-12-18 14:35:58 +08:00
return
}
path, err := sftp_clients.Client.C[auth.Sid].Sftp.Getwd()
if err != nil {
respMsg.Code = errcode.S_send_err
respMsg.Type = "connect"
respMsg.Msg = "SFTP连接失败"
msg, _ := json.Marshal(respMsg)
2020-12-18 14:35:58 +08:00
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp connect err:", err)
}
return
}
respMsg.Code = 200
respMsg.Type = "connect"
respMsg.Msg = "连接成功"
respMsg.Data = path
msg, _ := json.Marshal(respMsg)
2020-12-18 14:35:58 +08:00
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")
}