add Hash for Chat Header

This commit is contained in:
Tnze
2022-12-01 01:42:28 +08:00
parent 666f83be80
commit aadf28dde2
3 changed files with 51 additions and 29 deletions

View File

@ -44,10 +44,13 @@ func attachPlayerMsg(c *bot.Client, p *basic.Player, handler func(msg chat.Messa
} }
var content chat.Message var content chat.Message
if message.MessageBody.Message != nil { if message.MessageBody.DecoratedMsg != nil {
content = *message.MessageBody.Message data, _ := message.MessageBody.DecoratedMsg.MarshalJSON()
if err := content.UnmarshalJSON(data); err != nil {
return err
}
} else { } else {
content = chat.Text(message.MessageBody.PlainMessage) content = chat.Text(message.MessageBody.PlainMsg)
} }
ct := p.WorldInfo.RegistryCodec.ChatType.FindByID(chatType.ID) ct := p.WorldInfo.RegistryCodec.ChatType.FindByID(chatType.ID)

View File

@ -2,7 +2,9 @@ package sign
import ( import (
"crypto/rand" "crypto/rand"
"crypto/sha256"
"encoding/binary" "encoding/binary"
"encoding/json"
"io" "io"
"time" "time"
@ -12,18 +14,18 @@ import (
) )
type MessageHeader struct { type MessageHeader struct {
Signature []byte PrevSignature []byte
Sender uuid.UUID Sender uuid.UUID
} }
func (m *MessageHeader) WriteTo(w io.Writer) (n int64, err error) { func (m *MessageHeader) WriteTo(w io.Writer) (n int64, err error) {
hasSignature := pk.Boolean(len(m.Signature) > 0) hasSignature := pk.Boolean(len(m.PrevSignature) > 0)
n, err = hasSignature.WriteTo(w) n, err = hasSignature.WriteTo(w)
if err != nil { if err != nil {
return return
} }
if hasSignature { if hasSignature {
n2, err := pk.ByteArray(m.Signature).WriteTo(w) n2, err := pk.ByteArray(m.PrevSignature).WriteTo(w)
n += n2 n += n2
if err != nil { if err != nil {
return n, err return n, err
@ -40,7 +42,7 @@ func (m *MessageHeader) ReadFrom(r io.Reader) (n int64, err error) {
return return
} }
if hasSignature { if hasSignature {
n2, err := (*pk.ByteArray)(&m.Signature).ReadFrom(r) n2, err := (*pk.ByteArray)(&m.PrevSignature).ReadFrom(r)
n += n2 n += n2
if err != nil { if err != nil {
return n, err return n, err
@ -51,8 +53,8 @@ func (m *MessageHeader) ReadFrom(r io.Reader) (n int64, err error) {
} }
type MessageBody struct { type MessageBody struct {
PlainMessage string PlainMsg string
Message *chat.Message DecoratedMsg json.RawMessage
Timestamp time.Time Timestamp time.Time
Salt int64 Salt int64
History []HistoryMessage History []HistoryMessage
@ -60,11 +62,11 @@ type MessageBody struct {
func (m *MessageBody) WriteTo(w io.Writer) (n int64, err error) { func (m *MessageBody) WriteTo(w io.Writer) (n int64, err error) {
return pk.Tuple{ return pk.Tuple{
pk.String(m.PlainMessage), pk.String(m.PlainMsg),
pk.Boolean(m.Message != nil), pk.Boolean(m.DecoratedMsg != nil),
pk.Opt{ pk.Opt{
Has: m.Message != nil, Has: m.DecoratedMsg != nil,
Field: m.Message, Field: m.DecoratedMsg,
}, },
pk.Long(m.Timestamp.UnixMilli()), pk.Long(m.Timestamp.UnixMilli()),
pk.Long(m.Salt), pk.Long(m.Salt),
@ -76,14 +78,11 @@ func (m *MessageBody) ReadFrom(r io.Reader) (n int64, err error) {
var hasContent pk.Boolean var hasContent pk.Boolean
var timestamp pk.Long var timestamp pk.Long
n, err = pk.Tuple{ n, err = pk.Tuple{
(*pk.String)(&m.PlainMessage), (*pk.String)(&m.PlainMsg),
&hasContent, &hasContent,
pk.Opt{ pk.Opt{
Has: &hasContent, Has: &hasContent,
Field: func() pk.FieldDecoder { Field: (*pk.ByteArray)(&m.DecoratedMsg),
m.Message = new(chat.Message)
return m.Message
},
}, },
&timestamp, &timestamp,
(*pk.Long)(&m.Salt), (*pk.Long)(&m.Salt),
@ -93,6 +92,24 @@ func (m *MessageBody) ReadFrom(r io.Reader) (n int64, err error) {
return return
} }
func (m *MessageBody) Hash() []byte {
hash := sha256.New()
binary.Write(hash, binary.BigEndian, m.Salt)
binary.Write(hash, binary.BigEndian, m.Timestamp.Second())
hash.Write([]byte(m.PlainMsg))
hash.Write([]byte{70})
if m.DecoratedMsg != nil {
decorated, _ := m.DecoratedMsg.MarshalJSON()
hash.Write(decorated)
}
for _, v := range m.History {
hash.Write([]byte{70})
hash.Write(v.Sender[:])
hash.Write(v.Signature)
}
return hash.Sum(nil)
}
type FilterMask struct { type FilterMask struct {
Type byte Type byte
Mask pk.BitSet Mask pk.BitSet
@ -176,13 +193,13 @@ func genSalt() (salt int64) {
func Unsigned(id uuid.UUID, plain string, content *chat.Message) (msg PlayerMessage) { func Unsigned(id uuid.UUID, plain string, content *chat.Message) (msg PlayerMessage) {
return PlayerMessage{ return PlayerMessage{
MessageHeader: MessageHeader{ MessageHeader: MessageHeader{
Signature: nil, PrevSignature: nil,
Sender: id, Sender: id,
}, },
MessageSignature: []byte{}, MessageSignature: []byte{},
MessageBody: MessageBody{ MessageBody: MessageBody{
PlainMessage: plain, PlainMsg: plain,
Message: nil, DecoratedMsg: nil,
Timestamp: time.Now(), Timestamp: time.Now(),
Salt: genSalt(), Salt: genSalt(),
History: nil, History: nil,

View File

@ -460,11 +460,13 @@ func (b *ByteArray) ReadFrom(r io.Reader) (n int64, err error) {
if err != nil { if err != nil {
return n1, err return n1, err
} }
buf := bytes.NewBuffer(*b) if cap(*b) < int(Len) {
buf.Reset() *b = make(ByteArray, Len)
n2, err := io.CopyN(buf, r, int64(Len)) } else {
*b = buf.Bytes() *b = (*b)[:Len]
return n1 + n2, err }
n2, err := io.ReadFull(r, *b)
return n1 + int64(n2), err
} }
func (u UUID) WriteTo(w io.Writer) (n int64, err error) { func (u UUID) WriteTo(w io.Writer) (n int64, err error) {