mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-09-18 01:06:40 +08:00
157 lines
3.9 KiB
Go
157 lines
3.9 KiB
Go
package tcp
|
|
|
|
import (
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/net/gtcp"
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
"hotgo/internal/consts"
|
|
"hotgo/internal/model/entity"
|
|
"hotgo/internal/model/input/msgin"
|
|
"hotgo/utility/convert"
|
|
)
|
|
|
|
func (server *Server) onServerLogin(args ...interface{}) {
|
|
var (
|
|
in = new(msgin.ServerLogin)
|
|
conn = args[1].(*gtcp.Conn)
|
|
res = new(msgin.ResponseServerLogin)
|
|
models *entity.SysServeLicense
|
|
)
|
|
|
|
if err := gconv.Scan(args[0], &in); err != nil {
|
|
server.Logger.Infof(server.Ctx, "onServerLogin message Scan failed:%+v, args:%+v", err, args)
|
|
return
|
|
}
|
|
server.Logger.Infof(server.Ctx, "onServerLogin in:%+v", *in)
|
|
|
|
err := g.Model("sys_serve_license").
|
|
Ctx(server.Ctx).
|
|
Where("appid = ?", in.AppId).
|
|
Scan(&models)
|
|
|
|
if err != nil {
|
|
res.Code = 1
|
|
res.Message = err.Error()
|
|
server.Write(conn, res)
|
|
return
|
|
}
|
|
|
|
if models == nil {
|
|
res.Code = 2
|
|
res.Message = "授权信息不存在"
|
|
server.Write(conn, res)
|
|
return
|
|
}
|
|
|
|
// 验证签名
|
|
if err = VerifySign(in, models.Appid, models.SecretKey); err != nil {
|
|
res.Code = 3
|
|
res.Message = "签名错误,请联系管理员"
|
|
server.Write(conn, res)
|
|
return
|
|
}
|
|
|
|
if models.Status != consts.StatusEnabled {
|
|
res.Code = 4
|
|
res.Message = "授权已禁用,请联系管理员"
|
|
server.Write(conn, res)
|
|
return
|
|
}
|
|
|
|
if models.Group != in.Group {
|
|
res.Code = 5
|
|
res.Message = "你登录的授权分组未得到授权,请联系管理员"
|
|
server.Write(conn, res)
|
|
return
|
|
}
|
|
|
|
if models.EndAt.Before(gtime.Now()) {
|
|
res.Code = 6
|
|
res.Message = "授权已过期,请联系管理员"
|
|
server.Write(conn, res)
|
|
return
|
|
}
|
|
|
|
allowedIps := convert.IpFilterStrategy(models.AllowedIps)
|
|
if _, ok := allowedIps["*"]; !ok {
|
|
ip := gstr.StrTillEx(conn.RemoteAddr().String(), ":")
|
|
if _, ok2 := allowedIps[ip]; !ok2 {
|
|
res.Code = 7
|
|
res.Message = "IP(" + ip + ")未授权,请联系管理员"
|
|
server.Write(conn, res)
|
|
return
|
|
}
|
|
}
|
|
|
|
// 检查是否存在多地登录,如果连接超出上限,直接将所有已连接断开
|
|
clients := server.getAppIdClients(models.Appid)
|
|
online := len(clients) + 1
|
|
if online > models.OnlineLimit {
|
|
online = 0
|
|
res2 := new(msgin.ResponseServerLogin)
|
|
res2.Code = 8
|
|
res2.Message = "授权登录端超出上限已进行记录。请立即终止操作。如有疑问请联系管理员"
|
|
for _, client := range clients {
|
|
server.Write(client.Conn, res2)
|
|
client.Conn.Close()
|
|
}
|
|
|
|
// 当前连接也踢掉
|
|
server.Write(conn, res2)
|
|
conn.Close()
|
|
return
|
|
}
|
|
|
|
server.mutexConns.Lock()
|
|
server.clients[conn.RemoteAddr().String()] = &ClientConn{
|
|
Conn: conn,
|
|
Auth: &AuthMeta{
|
|
Group: in.Group,
|
|
Name: in.Name,
|
|
AppId: in.AppId,
|
|
SecretKey: models.SecretKey,
|
|
EndAt: models.EndAt,
|
|
},
|
|
heartbeat: gtime.Timestamp(),
|
|
}
|
|
server.mutexConns.Unlock()
|
|
|
|
server.Write(conn, res)
|
|
|
|
_, err = g.Model("sys_serve_license").
|
|
Ctx(server.Ctx).
|
|
Where("id = ?", models.Id).Data(g.Map{
|
|
"online": online,
|
|
"login_times": models.LoginTimes + 1,
|
|
"last_login_at": gtime.Now(),
|
|
"last_active_at": gtime.Now(),
|
|
"remote_addr": conn.RemoteAddr().String(),
|
|
}).Update()
|
|
if err != nil {
|
|
server.Logger.Warningf(server.Ctx, "onServerLogin Update err:%+v", err)
|
|
}
|
|
}
|
|
|
|
func (server *Server) onServerHeartbeat(args ...interface{}) {
|
|
var in *msgin.ServerHeartbeat
|
|
if err := gconv.Scan(args, &in); err != nil {
|
|
server.Logger.Infof(server.Ctx, "onServerHeartbeat message Scan failed:%+v, args:%+v", err, args)
|
|
return
|
|
}
|
|
client := args[1].(*ClientConn)
|
|
client.heartbeat = gtime.Timestamp()
|
|
|
|
server.Write(client.Conn, &msgin.ResponseServerHeartbeat{})
|
|
|
|
_, err := g.Model("sys_serve_license").
|
|
Ctx(server.Ctx).
|
|
Where("appid = ?", client.Auth.AppId).Data(g.Map{
|
|
"last_active_at": gtime.Now(),
|
|
}).Update()
|
|
if err != nil {
|
|
server.Logger.Warningf(server.Ctx, "onServerHeartbeat Update err:%+v", err)
|
|
}
|
|
}
|