Skip to content
Snippets Groups Projects
Commit 62235260 authored by Benjamin Wenger's avatar Benjamin Wenger
Browse files

finsihed logging

parent 9e8ae93a
No related branches found
No related tags found
3 merge requests!510Release,!427Modify send code to use a debug tag that includes a msgDigest. This is set by...,!340Project/channels
......@@ -9,6 +9,7 @@ package channels
import (
"crypto/ed25519"
"encoding/base64"
"errors"
"fmt"
"github.com/golang/protobuf/proto"
......@@ -297,6 +298,10 @@ func (e *events) receiveTextMessage(channelID *id.ID,
if len(txt.ReplyMessageID) == cryptoChannel.MessageIDLen {
var replyTo cryptoChannel.MessageID
copy(replyTo[:], txt.ReplyMessageID)
tag := makeChaDebugTag(channelID, pubKey, content, SendReplyTag)
jww.INFO.Printf("[%s]UserListener - Received reply from %s "+
"to %s", tag, base64.StdEncoding.EncodeToString(pubKey),
base64.StdEncoding.EncodeToString(txt.ReplyMessageID))
return e.model.ReceiveReply(channelID, messageID, replyTo,
nickname, txt.Text, pubKey, codeset, timestamp, lease, round, Text, status)
......@@ -311,6 +316,11 @@ func (e *events) receiveTextMessage(channelID *id.ID,
}
}
tag := makeChaDebugTag(channelID, pubKey, content, SendMessageTag)
jww.INFO.Printf("[%s]UserListener - Received message from %s "+
"to %s", tag, base64.StdEncoding.EncodeToString(pubKey),
base64.StdEncoding.EncodeToString(txt.ReplyMessageID))
return e.model.ReceiveMessage(channelID, messageID, nickname, txt.Text, pubKey, codeset,
timestamp, lease, round, Text, status)
}
......@@ -349,6 +359,12 @@ func (e *events) receiveReaction(channelID *id.ID,
if react.ReactionMessageID != nil && len(react.ReactionMessageID) == cryptoChannel.MessageIDLen {
var reactTo cryptoChannel.MessageID
copy(reactTo[:], react.ReactionMessageID)
tag := makeChaDebugTag(channelID, pubKey, content, SendReactionTag)
jww.INFO.Printf("[%s]UserListener - Received reaction from %s "+
"to %s", tag, base64.StdEncoding.EncodeToString(pubKey),
base64.StdEncoding.EncodeToString(react.ReactionMessageID))
return e.model.ReceiveReaction(channelID, messageID, reactTo, nickname,
react.Reaction, pubKey, codeset, timestamp, lease, round, Reaction, status)
} else {
......
......@@ -55,8 +55,7 @@ type Manager interface {
// it will always be possible to send a payload of 802 bytes at minimum
// Them meaning of validUntil depends on the use case.
SendGeneric(channelID *id.ID, messageType MessageType,
msg []byte, validUntil time.Duration, msgDigest string,
params cmix.CMIXParams) (
msg []byte, validUntil time.Duration, params cmix.CMIXParams) (
cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error)
// SendAdminGeneric is used to send a raw message over a channel encrypted
......@@ -66,7 +65,7 @@ type Manager interface {
// return an error. The message must be at most 510 bytes long.
SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID,
messageType MessageType, msg []byte, validUntil time.Duration,
msgDigest string, params cmix.CMIXParams) (cryptoChannel.MessageID,
params cmix.CMIXParams) (cryptoChannel.MessageID,
rounds.Round, ephemeral.Id, error)
// SendMessage is used to send a formatted message over a channel.
......
......@@ -89,6 +89,8 @@ func NewManager(identity cryptoChannel.PrivateIdentity, kv *versioned.KV,
// Prefix the kv with the username so multiple can be run
storageTag := getStorageTag(identity.PubKey)
jww.INFO.Printf("NewManager(ID:%s-%s, tag:%s)", identity.Codename,
identity.PubKey, storageTag)
kv = kv.Prefix(storageTag)
if err := storeIdentity(kv, identity); err != nil {
......@@ -110,6 +112,8 @@ func NewManager(identity cryptoChannel.PrivateIdentity, kv *versioned.KV,
func LoadManager(storageTag string, kv *versioned.KV, net Client,
rng *fastRNG.StreamGenerator, modelBuilder EventModelBuilder) (Manager, error) {
jww.INFO.Printf("LoadManager(tag:%s)", storageTag)
// Prefix the kv with the username so multiple can be run
kv = kv.Prefix(storageTag)
......@@ -155,6 +159,7 @@ func setupManager(identity cryptoChannel.PrivateIdentity, kv *versioned.KV,
// JoinChannel joins the given channel. It will fail if the channel has already
// been joined.
func (m *manager) JoinChannel(channel *cryptoBroadcast.Channel) error {
jww.INFO.Printf("JoinChannel(%s[%s])", channel.Name, channel.ReceptionID)
err := m.addChannel(channel)
if err != nil {
return err
......@@ -168,6 +173,7 @@ func (m *manager) JoinChannel(channel *cryptoBroadcast.Channel) error {
// LeaveChannel leaves the given channel. It will return an error if the channel
// was not previously joined.
func (m *manager) LeaveChannel(channelID *id.ID) error {
jww.INFO.Printf("LeaveChannel(%s)", channelID)
err := m.removeChannel(channelID)
if err != nil {
return err
......@@ -188,6 +194,7 @@ func (m *manager) GetChannels() []*id.ID {
// GetChannel returns the underlying cryptographic structure for a given channel.
func (m *manager) GetChannel(chID *id.ID) (*cryptoBroadcast.Channel, error) {
jww.INFO.Printf("GetChannel %s", chID)
jc, err := m.getChannel(chID)
if err != nil {
return nil, err
......@@ -202,7 +209,7 @@ func (m *manager) GetChannel(chID *id.ID) (*cryptoBroadcast.Channel, error) {
// underlying state tracking for message pickup for the channel, causing all
// messages to be re-retrieved from the network
func (m *manager) ReplayChannel(chID *id.ID) error {
jww.INFO.Printf("Replaying messages on channel %s", chID)
jww.INFO.Printf("ReplayChannel(%s)", chID)
m.mux.RLock()
defer m.mux.RUnlock()
......@@ -243,6 +250,7 @@ func (m *manager) GetIdentity() cryptoChannel.Identity {
// ExportPrivateIdentity encrypts and exports the private identity to a portable
// string.
func (m *manager) ExportPrivateIdentity(password string) ([]byte, error) {
jww.INFO.Printf("ExportPrivateIdentity()")
rng := m.rng.GetStream()
defer rng.Close()
return m.me.Export(password, rng)
......
......@@ -29,6 +29,9 @@ import (
const (
cmixChannelTextVersion = 0
cmixChannelReactionVersion = 0
SendMessageTag = "ChMessage"
SendReplyTag = "ChReply"
SendReactionTag = "ChReaction"
)
// The size of the nonce used in the message ID.
......@@ -41,15 +44,14 @@ const messageNonceSize = 4
// possible to define the largest payload that can be sent, but
// it will always be possible to send a payload of 802 bytes at minimum
func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType,
msg []byte, validUntil time.Duration, msgDigest string,
params cmix.CMIXParams) (
msg []byte, validUntil time.Duration, params cmix.CMIXParams) (
cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) {
// Note: We log sends on exit, and append what happened to the message
// this cuts down on clutter in the log.
sendPrint := fmt.Sprintf("[ChanSend] Sending %s ch %s type %d at %s - "+
"contentsHash %d", msgDigest, channelID, messageType,
netTime.Now(), hashMsg(msg))
sendPrint := fmt.Sprintf("[%s] Sending ch %s type %d at %s",
params.DebugTag, channelID, messageType,
netTime.Now())
defer jww.INFO.Println(sendPrint)
//find the channel
......@@ -144,8 +146,6 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType,
}
sendPrint += fmt.Sprintf(", broadcasting message %s", netTime.Now())
params.DebugTag = fmt.Sprintf("%s-ChanSend-%s", params.DebugTag,
msgDigest)
r, ephid, err := ch.broadcast.BroadcastWithAssembler(assemble, params)
if err != nil {
sendPrint += fmt.Sprintf(", broadcast failed %s, %s",
......@@ -174,8 +174,15 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType,
// return an error. The message must be at most 510 bytes long.
func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID,
messageType MessageType, msg []byte, validUntil time.Duration,
msgDigest string, params cmix.CMIXParams) (cryptoChannel.MessageID,
rounds.Round, ephemeral.Id, error) {
params cmix.CMIXParams) (cryptoChannel.MessageID, rounds.Round,
ephemeral.Id, error) {
// Note: We log sends on exit, and append what happened to the message
// this cuts down on clutter in the log.
sendPrint := fmt.Sprintf("[%s] Admin sending ch %s type %d at %s",
params.DebugTag, channelID, messageType,
netTime.Now())
defer jww.INFO.Println(sendPrint)
//find the channel
ch, err := m.getChannel(channelID)
......@@ -232,27 +239,34 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID,
return chMsgSerial, nil
}
sendPrint += fmt.Sprintf(", pending send %s", netTime.Now())
uuid, err := m.st.denotePendingAdminSend(channelID, chMsg)
if err != nil {
sendPrint += fmt.Sprintf(", pending send failed %s",
err.Error())
return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
}
params.DebugTag = fmt.Sprintf("%s-ChanSendAdmin-%s", params.DebugTag,
msgDigest)
sendPrint += fmt.Sprintf(", broadcasting message %s", netTime.Now())
r, ephid, err := ch.broadcast.BroadcastRSAToPublicWithAssembler(privKey,
assemble, params)
if err != nil {
sendPrint += fmt.Sprintf(", broadcast failed %s, %s",
netTime.Now(), err.Error())
errDenote := m.st.failedSend(uuid)
if errDenote != nil {
sendPrint += fmt.Sprintf(", failed to denote failed "+
"broadcast: %s", err.Error())
jww.ERROR.Printf("Failed to update for a failed send to "+
"%s: %+v", channelID, err)
}
return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
}
sendPrint += fmt.Sprintf(", broadcast succeeded %s, success!",
netTime.Now())
err = m.st.send(uuid, msgId, r)
if err != nil {
return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
sendPrint += fmt.Sprintf(", broadcast failed: %s ", err.Error())
}
return msgId, r, ephid, err
}
......@@ -264,8 +278,8 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID,
func (m *manager) SendMessage(channelID *id.ID, msg string,
validUntil time.Duration, params cmix.CMIXParams) (
cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) {
msgDigest := MakeChanMsgDigest(channelID, Text, []byte(msg))
jww.INFO.Printf("SendMessage(%s)", msgDigest)
tag := makeChaDebugTag(channelID, m.me.PubKey, []byte(msg), SendMessageTag)
jww.INFO.Printf("[%s]SendMessage(%s)", tag, channelID)
txt := &CMIXChannelText{
Version: cmixChannelTextVersion,
......@@ -273,13 +287,15 @@ func (m *manager) SendMessage(channelID *id.ID, msg string,
ReplyMessageID: nil,
}
params = params.SetDebugTag(tag)
txtMarshaled, err := proto.Marshal(txt)
if err != nil {
return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
}
return m.SendGeneric(channelID, Text, txtMarshaled, validUntil,
msgDigest, params)
params)
}
// SendReply is used to send a formatted message over a channel.
......@@ -292,21 +308,23 @@ func (m *manager) SendReply(channelID *id.ID, msg string,
replyTo cryptoChannel.MessageID, validUntil time.Duration,
params cmix.CMIXParams) (cryptoChannel.MessageID, rounds.Round,
ephemeral.Id, error) {
msgDigest := MakeChanMsgDigest(channelID, Text, []byte(msg))
jww.INFO.Printf("SendReply(%s to %s)", msgDigest, replyTo)
tag := makeChaDebugTag(channelID, m.me.PubKey, []byte(msg), SendReplyTag)
jww.INFO.Printf("[%s]SendReply(%s, to %s)", tag, channelID, replyTo)
txt := &CMIXChannelText{
Version: cmixChannelTextVersion,
Text: msg,
ReplyMessageID: replyTo[:],
}
params = params.SetDebugTag(tag)
txtMarshaled, err := proto.Marshal(txt)
if err != nil {
return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
}
return m.SendGeneric(channelID, Text, txtMarshaled, validUntil,
msgDigest, params)
params)
}
// SendReaction is used to send a reaction to a message over a channel.
......@@ -316,8 +334,8 @@ func (m *manager) SendReply(channelID *id.ID, msg string,
func (m *manager) SendReaction(channelID *id.ID, reaction string,
reactTo cryptoChannel.MessageID, params cmix.CMIXParams) (
cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) {
msgDigest := MakeChanMsgDigest(channelID, Reaction, []byte(reaction))
jww.INFO.Printf("SendReaction(%s, to %s)", msgDigest, reactTo)
tag := makeChaDebugTag(channelID, m.me.PubKey, []byte(reaction), SendReactionTag)
jww.INFO.Printf("[%s]SendReply(%s, to %s)", tag, channelID, reactTo)
if err := ValidateReaction(reaction); err != nil {
return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
......@@ -329,28 +347,28 @@ func (m *manager) SendReaction(channelID *id.ID, reaction string,
ReactionMessageID: reactTo[:],
}
params = params.SetDebugTag(tag)
reactMarshaled, err := proto.Marshal(react)
if err != nil {
return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err
}
return m.SendGeneric(channelID, Reaction, reactMarshaled, ValidForever,
msgDigest, params)
params)
}
func hashMsg(msg []byte) []byte {
h, _ := blake2b.New256(nil)
h.Write(msg)
return h.Sum(nil)
}
// makeMsgdDigest is a debug helper that creates non-unique msg identifier
// makeChaDebugTag is a debug helper that creates non-unique msg identifier
// This is set as the debug tag on messages and enables some level
// of tracing a message (if it's contents/chan/type are unique)
func MakeChanMsgDigest(channelID *id.ID, messageType MessageType,
msg []byte) string {
data := fmt.Sprintf("ChanSend_%s-%s-%s", channelID, messageType, msg)
func makeChaDebugTag(channelID *id.ID, id ed25519.PublicKey,
msg []byte, baseTag string) string {
h, _ := blake2b.New256(nil)
h.Write([]byte(data))
return base64.RawStdEncoding.EncodeToString(h.Sum(nil))
h.Write(channelID[:])
h.Write(msg)
h.Write(id)
tripcode := base64.RawStdEncoding.EncodeToString(h.Sum(nil))[:12]
return fmt.Sprintf("%s-%s", baseTag, tripcode)
}
......@@ -196,7 +196,6 @@ func TestSendGeneric(t *testing.T) {
messageType,
msg,
validUntil,
"",
*params)
if err != nil {
t.Logf("ERROR %v", err)
......@@ -287,7 +286,7 @@ func TestAdminGeneric(t *testing.T) {
}
messageId, roundId, ephemeralId, err := m.SendAdminGeneric(priv,
ch.ReceptionID, messageType, msg, validUntil, "",
ch.ReceptionID, messageType, msg, validUntil,
cmix.GetDefaultCMIXParams())
if err != nil {
t.Fatalf("Failed to SendAdminGeneric: %v", err)
......
......@@ -10,6 +10,7 @@ package cmix
import (
"encoding/base64"
"encoding/json"
"fmt"
"time"
"gitlab.com/elixxir/client/cmix/message"
......@@ -300,6 +301,18 @@ func (p *CMIXParams) UnmarshalJSON(data []byte) error {
return nil
}
// SetDebugTag appends the debug tag if one already exists,
// otherwise it just used the new debug tag
func (p CMIXParams) SetDebugTag(newTag string) CMIXParams {
if p.DebugTag != DefaultDebugTag {
p.DebugTag = fmt.Sprintf("%s-%s", p.DebugTag, newTag)
} else {
p.DebugTag = newTag
}
return p
}
// NodeMap represents a map of nodes and whether they have been
// blacklisted. This is designed for use with CMIXParams.BlacklistedNodes
type NodeMap map[id.ID]bool
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment