Files
open-im-server/internal/msg_gateway/gate/validate.go
T

256 lines
10 KiB
Go
Raw Normal View History

2021-05-26 19:24:25 +08:00
/*
** description("").
** copyright('Open_IM,www.Open_IM.io').
** author("fg,Gordon@tuoyun.net").
** time(2021/5/21 15:29).
*/
package gate
import (
2022-03-14 16:04:49 +08:00
"Open_IM/internal/msg_gateway/gate/open_im_media"
"Open_IM/pkg/common/constant"
"Open_IM/pkg/common/log"
open_im_sdk "Open_IM/pkg/proto/sdk_ws"
2022-03-14 16:04:49 +08:00
"Open_IM/pkg/utils"
"errors"
"github.com/golang/protobuf/proto"
2021-05-26 19:24:25 +08:00
)
type Req struct {
ReqIdentifier int32 `json:"reqIdentifier" validate:"required"`
Token string `json:"token" `
SendID string `json:"sendID" validate:"required"`
OperationID string `json:"operationID" validate:"required"`
MsgIncr string `json:"msgIncr" validate:"required"`
Data []byte `json:"data"`
2021-05-26 19:24:25 +08:00
}
type Resp struct {
ReqIdentifier int32 `json:"reqIdentifier"`
MsgIncr string `json:"msgIncr"`
OperationID string `json:"operationID"`
ErrCode int32 `json:"errCode"`
ErrMsg string `json:"errMsg"`
Data []byte `json:"data"`
}
2021-05-26 19:24:25 +08:00
type SeqData struct {
SeqBegin int64 `mapstructure:"seqBegin" validate:"required"`
SeqEnd int64 `mapstructure:"seqEnd" validate:"required"`
}
type MsgData struct {
PlatformID int32 `mapstructure:"platformID" validate:"required"`
SessionType int32 `mapstructure:"sessionType" validate:"required"`
MsgFrom int32 `mapstructure:"msgFrom" validate:"required"`
ContentType int32 `mapstructure:"contentType" validate:"required"`
RecvID string `mapstructure:"recvID" validate:"required"`
ForceList []string `mapstructure:"forceList"`
2021-05-26 19:24:25 +08:00
Content string `mapstructure:"content" validate:"required"`
Options map[string]interface{} `mapstructure:"options" validate:"required"`
ClientMsgID string `mapstructure:"clientMsgID" validate:"required"`
OfflineInfo map[string]interface{} `mapstructure:"offlineInfo" validate:"required"`
Ext map[string]interface{} `mapstructure:"ext"`
}
type MaxSeqResp struct {
MaxSeq int64 `json:"maxSeq"`
}
type PullMessageResp struct {
}
type SeqListData struct {
SeqList []int64 `mapstructure:"seqList" validate:"required"`
}
2021-05-26 19:24:25 +08:00
func (ws *WServer) argsValidate(m *Req, r int32) (isPass bool, errCode int32, errMsg string, returnData interface{}) {
2021-05-26 19:24:25 +08:00
switch r {
2022-03-14 10:00:28 +08:00
case constant.WSSendMsg:
data := open_im_sdk.MsgData{}
if err := proto.Unmarshal(m.Data, &data); err != nil {
log.ErrorByKv("Decode Data struct err", "", "err", err.Error(), "reqIdentifier", r)
return false, 203, err.Error(), nil
}
if err := validate.Struct(data); err != nil {
log.ErrorByKv("data args validate err", "", "err", err.Error(), "reqIdentifier", r)
return false, 204, err.Error(), nil
}
return true, 0, "", data
case constant.WSSendSignalMsg:
2022-03-14 16:04:49 +08:00
data := open_im_sdk.SignalReq{}
if err := proto.Unmarshal(m.Data, &data); err != nil {
log.ErrorByKv("Decode Data struct err", "", "err", err.Error(), "reqIdentifier", r)
return false, 203, err.Error(), nil
}
if err := validate.Struct(data); err != nil {
log.ErrorByKv("data args validate err", "", "err", err.Error(), "reqIdentifier", r)
return false, 204, err.Error(), nil
}
2022-03-14 18:19:03 +08:00
return true, 0, "", &data
case constant.WSPullMsgBySeqList:
data := open_im_sdk.PullMessageBySeqListReq{}
if err := proto.Unmarshal(m.Data, &data); err != nil {
log.ErrorByKv("Decode Data struct err", "", "err", err.Error(), "reqIdentifier", r)
return false, 203, err.Error(), nil
}
if err := validate.Struct(data); err != nil {
log.ErrorByKv("data args validate err", "", "err", err.Error(), "reqIdentifier", r)
return false, 204, err.Error(), nil
}
2021-05-26 19:24:25 +08:00
return true, 0, "", data
default:
2021-05-26 19:24:25 +08:00
}
return false, 204, "args err", nil
//b := bytes.NewBuffer(m.Data)
//dec := gob.NewDecoder(b)
//err := dec.Decode(&data)
//if err != nil {
// log.ErrorByKv("Decode Data struct err", "", "err", err.Error(), "reqIdentifier", r)
// return false, 203, err.Error(), nil
//}
//if err := mapstructure.WeakDecode(m.Data, &data); err != nil {
// log.ErrorByKv("map to Data struct err", "", "err", err.Error(), "reqIdentifier", r)
// return false, 203, err.Error(), nil
//} else
2021-05-26 19:24:25 +08:00
}
2022-03-14 16:04:49 +08:00
2022-03-15 10:53:56 +08:00
func (ws *WServer) signalMessageAssemble(s *open_im_sdk.SignalReq, operationID string) (isPass bool, errCode int32, errMsg string, r *open_im_sdk.SignalResp, msgData *open_im_sdk.MsgData) {
2022-03-14 16:04:49 +08:00
var msg open_im_sdk.MsgData
var resp open_im_sdk.SignalResp
media := open_im_media.NewMedia()
msg.MsgFrom = constant.UserMsgType
msg.ContentType = constant.SignalingNotification
reqData, e := proto.Marshal(s)
if e != nil {
return false, 201, e.Error(), nil, nil
}
msg.Content = reqData
msg.CreateTime = utils.GetCurrentTimestampByMill()
options := make(map[string]bool, 6)
utils.SetSwitchFromOptions(options, constant.IsHistory, false)
utils.SetSwitchFromOptions(options, constant.IsPersistent, false)
2022-03-18 20:06:52 +08:00
utils.SetSwitchFromOptions(options, constant.IsSenderSync, true)
2022-03-14 16:04:49 +08:00
utils.SetSwitchFromOptions(options, constant.IsConversationUpdate, false)
2022-03-28 18:30:12 +08:00
utils.SetSwitchFromOptions(options, constant.IsSenderConversationUpdate, false)
2022-03-14 16:04:49 +08:00
utils.SetSwitchFromOptions(options, constant.IsUnreadCount, false)
utils.SetSwitchFromOptions(options, constant.IsOfflinePush, true)
msg.Options = options
switch payload := s.Payload.(type) {
case *open_im_sdk.SignalReq_Invite:
2022-03-17 10:41:34 +08:00
token, liveURL, err2 := media.GetJoinToken(payload.Invite.Invitation.RoomID, payload.Invite.Invitation.InviterUserID, operationID, payload.Invite.Participant)
2022-03-14 16:04:49 +08:00
if err2 != nil {
2022-03-16 16:09:39 +08:00
return false, 202, err2.Error(), nil, nil
2022-03-14 16:04:49 +08:00
}
invite := open_im_sdk.SignalResp_Invite{&open_im_sdk.SignalInviteReply{
Token: token,
2022-03-15 10:03:39 +08:00
RoomID: payload.Invite.Invitation.RoomID,
2022-03-17 10:41:34 +08:00
LiveURL: liveURL,
2022-03-14 16:04:49 +08:00
}}
resp.Payload = &invite
msg.SenderPlatformID = payload.Invite.Invitation.PlatformID
msg.SessionType = payload.Invite.Invitation.SessionType
msg.OfflinePushInfo = payload.Invite.OfflinePushInfo
msg.SendID = payload.Invite.Invitation.InviterUserID
if len(payload.Invite.Invitation.InviteeUserIDList) > 0 {
msg.RecvID = payload.Invite.Invitation.InviteeUserIDList[0]
} else {
2022-03-16 16:09:39 +08:00
return false, 203, errors.New("InviteeUserIDList is null").Error(), nil, nil
2022-03-14 16:04:49 +08:00
}
msg.ClientMsgID = utils.GetMsgID(payload.Invite.Invitation.InviterUserID)
return true, 0, "", &resp, &msg
case *open_im_sdk.SignalReq_InviteInGroup:
2022-03-17 10:41:34 +08:00
token, liveURL, err2 := media.GetJoinToken(payload.InviteInGroup.Invitation.RoomID, payload.InviteInGroup.Invitation.InviterUserID, operationID, payload.InviteInGroup.Participant)
2022-03-14 16:04:49 +08:00
if err2 != nil {
2022-03-16 16:09:39 +08:00
return false, 204, err2.Error(), nil, nil
2022-03-14 16:04:49 +08:00
}
inviteGroup := open_im_sdk.SignalResp_InviteInGroup{&open_im_sdk.SignalInviteInGroupReply{
RoomID: payload.InviteInGroup.Invitation.RoomID,
Token: token,
2022-03-17 10:41:34 +08:00
LiveURL: liveURL,
2022-03-14 16:04:49 +08:00
}}
resp.Payload = &inviteGroup
msg.SenderPlatformID = payload.InviteInGroup.Invitation.PlatformID
msg.SessionType = payload.InviteInGroup.Invitation.SessionType
msg.OfflinePushInfo = payload.InviteInGroup.OfflinePushInfo
msg.SendID = payload.InviteInGroup.Invitation.InviterUserID
if len(payload.InviteInGroup.Invitation.InviteeUserIDList) > 0 {
msg.GroupID = payload.InviteInGroup.Invitation.GroupID
} else {
2022-03-16 16:09:39 +08:00
return false, 205, errors.New("InviteeUserIDList is null").Error(), nil, nil
2022-03-14 16:04:49 +08:00
}
msg.ClientMsgID = utils.GetMsgID(payload.InviteInGroup.Invitation.InviterUserID)
return true, 0, "", &resp, &msg
case *open_im_sdk.SignalReq_Cancel:
2022-03-14 16:33:59 +08:00
cancel := open_im_sdk.SignalResp_Cancel{&open_im_sdk.SignalCancelReply{}}
resp.Payload = &cancel
2022-03-14 19:46:01 +08:00
msg.OfflinePushInfo = payload.Cancel.OfflinePushInfo
msg.SendID = payload.Cancel.Invitation.InviterUserID
msg.SenderPlatformID = payload.Cancel.Invitation.PlatformID
msg.SessionType = payload.Cancel.Invitation.SessionType
if len(payload.Cancel.Invitation.InviteeUserIDList) > 0 {
switch payload.Cancel.Invitation.SessionType {
2022-03-14 16:33:59 +08:00
case constant.SingleChatType:
2022-03-14 19:46:01 +08:00
msg.RecvID = payload.Cancel.Invitation.InviteeUserIDList[0]
2022-03-14 16:33:59 +08:00
case constant.GroupChatType:
2022-03-14 19:46:01 +08:00
msg.GroupID = payload.Cancel.Invitation.GroupID
2022-03-14 16:33:59 +08:00
}
} else {
2022-03-16 16:09:39 +08:00
return false, 206, errors.New("InviteeUserIDList is null").Error(), nil, nil
2022-03-14 16:33:59 +08:00
}
2022-03-15 09:50:37 +08:00
msg.ClientMsgID = utils.GetMsgID(payload.Cancel.OpUserID)
2022-03-14 16:33:59 +08:00
return true, 0, "", &resp, &msg
case *open_im_sdk.SignalReq_Accept:
2022-03-17 10:41:34 +08:00
token, liveURL, err2 := media.GetJoinToken(payload.Accept.Invitation.RoomID, payload.Accept.OpUserID, operationID, payload.Accept.Participant)
2022-03-14 16:33:59 +08:00
if err2 != nil {
2022-03-16 16:09:39 +08:00
return false, 207, err2.Error(), nil, nil
2022-03-14 16:33:59 +08:00
}
2022-03-15 10:17:24 +08:00
accept := open_im_sdk.SignalResp_Accept{&open_im_sdk.SignalAcceptReply{
2022-03-14 16:33:59 +08:00
Token: token,
2022-03-17 10:41:34 +08:00
LiveURL: liveURL,
2022-03-14 19:46:01 +08:00
RoomID: payload.Accept.Invitation.RoomID,
2022-03-14 16:33:59 +08:00
}}
2022-03-15 10:17:24 +08:00
resp.Payload = &accept
2022-03-14 19:46:01 +08:00
msg.OfflinePushInfo = payload.Accept.OfflinePushInfo
2022-03-15 09:50:37 +08:00
msg.SendID = payload.Accept.OpUserID
2022-03-14 19:46:01 +08:00
msg.SenderPlatformID = payload.Accept.Invitation.PlatformID
msg.SessionType = payload.Accept.Invitation.SessionType
if len(payload.Accept.Invitation.InviteeUserIDList) > 0 {
switch payload.Accept.Invitation.SessionType {
2022-03-14 16:33:59 +08:00
case constant.SingleChatType:
2022-03-14 19:46:01 +08:00
msg.RecvID = payload.Accept.Invitation.InviterUserID
2022-03-14 16:33:59 +08:00
case constant.GroupChatType:
2022-03-14 19:46:01 +08:00
msg.GroupID = payload.Accept.Invitation.GroupID
2022-03-14 16:33:59 +08:00
}
} else {
2022-03-16 16:09:39 +08:00
return false, 208, errors.New("InviteeUserIDList is null").Error(), nil, nil
2022-03-14 16:33:59 +08:00
}
2022-03-15 09:50:37 +08:00
msg.ClientMsgID = utils.GetMsgID(payload.Accept.OpUserID)
2022-03-14 16:33:59 +08:00
return true, 0, "", &resp, &msg
2022-03-14 16:04:49 +08:00
case *open_im_sdk.SignalReq_HungUp:
case *open_im_sdk.SignalReq_Reject:
2022-03-15 10:17:24 +08:00
reject := open_im_sdk.SignalResp_Reject{&open_im_sdk.SignalRejectReply{}}
resp.Payload = &reject
2022-03-14 19:46:01 +08:00
msg.OfflinePushInfo = payload.Reject.OfflinePushInfo
2022-03-15 10:17:24 +08:00
msg.SendID = payload.Reject.OpUserID
2022-03-14 19:46:01 +08:00
msg.SenderPlatformID = payload.Reject.Invitation.PlatformID
msg.SessionType = payload.Reject.Invitation.SessionType
if len(payload.Reject.Invitation.InviteeUserIDList) > 0 {
switch payload.Reject.Invitation.SessionType {
2022-03-14 16:33:59 +08:00
case constant.SingleChatType:
2022-03-14 19:46:01 +08:00
msg.RecvID = payload.Reject.Invitation.InviterUserID
2022-03-14 16:33:59 +08:00
case constant.GroupChatType:
2022-03-14 19:46:01 +08:00
msg.GroupID = payload.Reject.Invitation.GroupID
2022-03-14 16:33:59 +08:00
}
} else {
2022-03-16 16:09:39 +08:00
return false, 209, errors.New("InviteeUserIDList is null").Error(), nil, nil
2022-03-14 16:33:59 +08:00
}
2022-03-15 10:17:24 +08:00
msg.ClientMsgID = utils.GetMsgID(payload.Reject.OpUserID)
2022-03-14 16:33:59 +08:00
return true, 0, "", &resp, &msg
2022-03-14 16:04:49 +08:00
}
2022-03-16 16:09:39 +08:00
return false, 210, errors.New("InviteeUserIDList is null").Error(), nil, nil
2022-03-14 16:04:49 +08:00
}