Rewrite protocol for communication

This commit is contained in:
qowevisa 2024-05-25 09:19:34 +03:00
parent c108b43cfd
commit 00781f23d2

View File

@ -2,46 +2,59 @@ package communication
import ( import (
"bytes" "bytes"
"crypto/rand"
"encoding/gob" "encoding/gob"
"git.qowevisa.me/Qowevisa/gotell/gmyerr"
) )
const ( // VERSION field
SERVER_COMMAND = 1 + iota
SERVER_MESSAGE
CLIENT_RESPONSE
P2P_MESSAGE
)
const ( const (
V1 = 1 + iota V1 = 1 + iota
) )
// FROM field
const ( const (
NICKNAME = 1 FROM_SERVER = 1 + iota
FROM_CLIENT
FROM_MY_ID
) )
type communicationMessage struct { // FROM_ID is 2 bytes
Type uint8
// TO_ID is 2 bytes
// ACTION field
const (
ACTION_ASK = 1 + iota
ACTION_SEND
)
// ABOUT field
const (
ABOUT_NICKNAME = 1 + iota
ABOUT_ID
ABOUT_LINK
ABOUT_ECDH_PUB_KEY
ABOUT_CBES_SPECS
ABOUT_MKLG_FGPRINT
ABOUT_MESSAGE
)
// DATA_LEN is 2 bytes
type Message struct {
Version uint8
From uint8
FromID uint16
ToID uint16
Action uint8
About uint8
DataLen uint16
Data []byte Data []byte
} }
func AskClientNickname() ([]byte, error) { func (c *Message) Bytes() ([]byte, error) {
c := communicationMessage{
Type: SERVER_COMMAND,
Data: []byte{NICKNAME},
}
return c.Bytes()
}
func JustGetMessage(msg []byte) ([]byte, error) {
c := communicationMessage{
Type: SERVER_MESSAGE,
Data: msg,
}
return c.Bytes()
}
func (c *communicationMessage) Bytes() ([]byte, error) {
var buf bytes.Buffer var buf bytes.Buffer
encoder := gob.NewEncoder(&buf) encoder := gob.NewEncoder(&buf)
err := encoder.Encode(c) err := encoder.Encode(c)
@ -51,14 +64,143 @@ func (c *communicationMessage) Bytes() ([]byte, error) {
return buf.Bytes(), nil return buf.Bytes(), nil
} }
func Decode(serverBytes []byte) (*communicationMessage, error) { func Decode(serverBytes []byte) (*Message, error) {
var c communicationMessage var c Message
buf := bytes.NewBuffer(serverBytes) buf := bytes.NewBuffer(serverBytes)
decoder := gob.NewDecoder(buf) decoder := gob.NewDecoder(buf)
err := decoder.Decode(&c) err := decoder.Decode(&c)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &c, nil return &c, nil
} }
func ServerAskClientAboutNickname() ([]byte, error) {
c := Message{
Version: V1,
From: FROM_SERVER,
FromID: 0,
ToID: 0,
Action: ACTION_ASK,
About: ABOUT_NICKNAME,
DataLen: 0,
Data: []byte{},
}
return c.Bytes()
}
func ClientSendServerNickname(nickname []byte) ([]byte, error) {
c := Message{
Version: V1,
From: FROM_CLIENT,
FromID: 0,
ToID: 0,
Action: ACTION_SEND,
About: ABOUT_NICKNAME,
DataLen: uint16(len(nickname)),
Data: nickname,
}
return c.Bytes()
}
func ServerSendClientHisID(id []byte) ([]byte, error) {
c := Message{
Version: V1,
From: FROM_SERVER,
FromID: 0,
ToID: 0,
Action: ACTION_SEND,
About: ABOUT_ID,
DataLen: uint16(len(id)),
Data: id,
}
return c.Bytes()
}
func (r *RegisteredUser) GenerateLink(count uint32) (Link, error) {
var l Link
buf := make([]byte, LINK_LEN_V1)
_, err := rand.Read(buf)
if err != nil {
return Link{}, err
}
if count == 0 {
return Link{}, ERROR_LINK_ZERO_COUNT
}
l.Status = LINK_STATUS_CREATED
l.Data = buf
l.UseCount = count
return l, nil
}
func (l *Link) Bytes() ([]byte, error) {
var buf bytes.Buffer
encoder := gob.NewEncoder(&buf)
err := encoder.Encode(l)
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func (r *RegisteredUser) GetIDFromLink(l Link) ([]byte, error) {
bb, err := l.Bytes()
if err != nil {
return nil, gmyerr.WrapPrefix("l.Bytes", err)
}
c := Message{
Version: V1,
From: FROM_CLIENT,
FromID: r.ID,
ToID: 0,
Action: ACTION_ASK,
About: ABOUT_LINK,
DataLen: uint16(len(bb)),
Data: bb,
}
return c.Bytes()
}
func ServerSendClientIDFromLink(toID uint16, toName []byte) ([]byte, error) {
c := Message{
Version: V1,
From: FROM_SERVER,
FromID: 0,
ToID: toID,
Action: ACTION_SEND,
About: ABOUT_LINK,
DataLen: uint16(len(toName)),
Data: toName,
}
return c.Bytes()
}
func (r *RegisteredUser) ClientSendThroughServerCBESSpecs(to uint16, data []byte) ([]byte, error) {
c := Message{
Version: V1,
From: FROM_CLIENT,
FromID: r.ID,
ToID: to,
Action: ACTION_SEND,
About: ABOUT_CBES_SPECS,
DataLen: uint16(len(data)),
Data: data,
}
return c.Bytes()
}
func (r *RegisteredUser) SendMessageToID(to uint16, msg []byte) ([]byte, error) {
c := Message{
Version: V1,
From: FROM_CLIENT,
FromID: r.ID,
ToID: to,
Action: ACTION_SEND,
About: ABOUT_MESSAGE,
DataLen: uint16(len(msg)),
Data: msg,
}
return c.Bytes()
}