ssh-manager/model/Apiform/Api.go

118 lines
3.0 KiB
Go
Raw Normal View History

2020-11-16 16:41:02 +08:00
package Apiform
import (
"encoding/json"
"errors"
"fmt"
"github.com/garyburd/redigo/redis"
"github.com/satori/go.uuid"
"log"
"ssh_manage/common"
"ssh_manage/database"
"ssh_manage/model"
)
type Login struct {
Phone int `form:"phone" binding:"required"`
Code string `form:"code" binding:"required"`
}
type Send struct {
Phone string `form:"phone" binding:"required"`
}
type Slist struct {
Page int `form:"page" binding:"required"`
Limit int `form:"limit" binding:"required"`
}
type List_resp struct {
List []model.Server
Count uint
}
type GetTerm struct {
ID uint `form:"id" binding:"required"`
Password string `form:"setpass" binding:"required"`
}
type WsAuth struct {
Sid string `uri:"sid" binding:"required,uuid"`
}
type Edit struct {
ID uint `form:"id" binding:"required"`
Nickname string `form:"nickname"`
Ip string `form:"ip"`
Port int `form:"port"`
Username string `form:"username"`
}
type EditPass struct {
ID uint `form:"id" binding:"required"`
Password string `form:"password" binding:"required"`
}
type Addser struct {
Nickname string `form:"nickname"`
Ip string `form:"ip" binding:"required"`
Port int `form:"port" binding:"required"`
Username string `form:"username" binding:"required"`
Password string `form:"password" binding:"required"`
}
type SerInfo struct {
ID uint
Ip string
Port int
Username string
Password string
BindUser uint
}
func (s *Send) SendCaptcha(ip string) (err error) {
cache := database.Cache.Get()
defer cache.Close()
ipexists, _ := redis.Bool(cache.Do("EXISTS", ip))
phoneexists, _ := redis.Bool(cache.Do("EXISTS", s.Phone+"_time"))
if ipexists || phoneexists {
err = errors.New("请勿频繁发送验证码")
return
}
cache.Send("MULTI") //开启事务操作
cache.Send("SETEX", s.Phone+"_time", 60*2, nil) //记录手机号与IP防止重复发送
cache.Send("SETEX", ip, 60*2, nil)
capcha, err := common.Sendsms(s.Phone)
if err != nil {
cache.Do("DISCARD") //发送失败则取消事务
log.Println(err.Error())
return
}
cache.Send("SETEX", s.Phone, 60*5, capcha) //延长过期时间,用于校验
cache.Do("EXEC") //提交事务
return
}
func (l *Login) Verify() (key, code string) {
return fmt.Sprintf("%d", l.Phone), l.Code
}
func (t *GetTerm) Decode(server model.Server) (sid string, err error) {
sid = uuid.Must(uuid.NewV4(), nil).String()
//log.Println(server)
s_pass := common.AesDecryptCBC(server.Password, []byte(t.Password))
if s_pass == "" {
return "", errors.New("秘钥验证失败")
} else {
var serinfo = SerInfo{server.ID,server.Ip,server.Port,server.Username,s_pass,server.BindUser}
//server.Password = s_pass //用于建立连接
cache := database.Cache.Get()
defer cache.Close()
s_info, _ := json.Marshal(serinfo)
//log.Println(string(s_info))
cache.Do("SETEX", sid, 10, s_info) //缓存10s用于建立连接和验证权限
//log.Println(sid)
}
return sid, nil
}