add Hash for Chat Header
This commit is contained in:
@ -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)
|
||||||
|
@ -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
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
×tamp,
|
×tamp,
|
||||||
(*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,
|
||||||
|
@ -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) {
|
||||||
|
Reference in New Issue
Block a user