diff --git a/groupChat/group.go b/groupChat/group.go index 8878a62cdf750823bd4c886fbfbfdca1ac81c13d..c9c408e0d9afe2dfe8bf5be22b3e86eea15730ed 100644 --- a/groupChat/group.go +++ b/groupChat/group.go @@ -20,6 +20,7 @@ package groupChat import ( + "gitlab.com/elixxir/client/cmix/message" gs "gitlab.com/elixxir/client/groupChat/groupStore" "gitlab.com/xx_network/primitives/id" "time" @@ -63,6 +64,15 @@ type GroupChat interface { // NumGroups returns the number of groups the user is a part of. NumGroups() int + + /* ===== Services ======================================================= */ + + // AddService adds a service for all group chat partners of the given tag, + // which will call back on the given processor. + AddService(tag string, processor message.Processor) error + + // RemoveService removes all services for the given tag. + RemoveService(tag string) error } // RequestCallback is called when a GroupChat request is received. diff --git a/groupChat/groupStore/group.go b/groupChat/groupStore/group.go index 28b9555e367cf7f761dd437de792bac97fc6789b..2c7d3e91739af0494f74316fac517b937cd86e86 100644 --- a/groupChat/groupStore/group.go +++ b/groupChat/groupStore/group.go @@ -244,17 +244,17 @@ func (g Group) GoString() string { idString = g.ID.String() } - str := make([]string, 9) - - str[0] = "Name:" + fmt.Sprintf("%q", g.Name) - str[1] = "ID:" + idString - str[2] = "Key:" + g.Key.String() - str[3] = "IdPreimage:" + g.IdPreimage.String() - str[4] = "KeyPreimage:" + g.KeyPreimage.String() - str[5] = "InitMessage:" + fmt.Sprintf("%q", g.InitMessage) - str[6] = "Created:" + g.Created.String() - str[7] = "Members:" + g.Members.String() - str[8] = "DhKeys:" + g.DhKeys.GoString() + str := []string{ + "Name:" + fmt.Sprintf("%q", g.Name), + "ID:" + idString, + "Key:" + g.Key.String(), + "IdPreimage:" + g.IdPreimage.String(), + "KeyPreimage:" + g.KeyPreimage.String(), + "InitMessage:" + fmt.Sprintf("%q", g.InitMessage), + "Created:" + g.Created.String(), + "Members:" + g.Members.String(), + "DhKeys:" + g.DhKeys.GoString(), + } return "{" + strings.Join(str, ", ") + "}" } diff --git a/groupChat/groupStore/group_test.go b/groupChat/groupStore/group_test.go index 2da1e2868991259142ec74cef049f9e9acd1035f..047df74bc3981ef0b3f7b107c5c57fe87dac3ed6 100644 --- a/groupChat/groupStore/group_test.go +++ b/groupChat/groupStore/group_test.go @@ -104,7 +104,7 @@ func TestGroup_DeepCopy(t *testing.T) { // Unit test of Group.store. func TestGroup_store(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) g := createTestGroup(rand.New(rand.NewSource(42)), t) err := g.store(kv) @@ -130,7 +130,7 @@ func TestGroup_store(t *testing.T) { // Unit test of Group.loadGroup. func Test_loadGroup(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) g := createTestGroup(rand.New(rand.NewSource(42)), t) err := g.store(kv) @@ -151,7 +151,7 @@ func Test_loadGroup(t *testing.T) { // Error path: an error is returned when no group with the ID exists in storage. func Test_loadGroup_InvalidGroupIdError(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) g := createTestGroup(rand.New(rand.NewSource(42)), t) expectedErr := strings.SplitN(kvGetGroupErr, "%", 2)[0] @@ -164,7 +164,7 @@ func Test_loadGroup_InvalidGroupIdError(t *testing.T) { // Unit test of Group.removeGroup. func Test_removeGroup(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) g := createTestGroup(rand.New(rand.NewSource(42)), t) err := g.store(kv) diff --git a/groupChat/groupStore/store_test.go b/groupChat/groupStore/store_test.go index e19b3928bd26eeffa17c040b973965f64927dfa5..2f52d9a3106b9b032f48bee5815ca422241cac3a 100644 --- a/groupChat/groupStore/store_test.go +++ b/groupChat/groupStore/store_test.go @@ -24,7 +24,7 @@ import ( // Unit test of NewStore. func TestNewStore(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) expectedStore := &Store{ @@ -90,7 +90,7 @@ func TestNewStore(t *testing.T) { func TestNewOrLoadStore(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) store, err := NewOrLoadStore(kv, user) @@ -126,7 +126,7 @@ func TestNewOrLoadStore(t *testing.T) { // Unit test of LoadStore. func TestLoadStore(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) store, err := NewStore(kv, user) @@ -162,7 +162,7 @@ func TestLoadStore(t *testing.T) { // Error path: show that LoadStore returns an error when no group store can be // found in storage. func TestLoadStore_GetError(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(rand.New(rand.NewSource(42))) expectedErr := strings.SplitN(kvGetGroupListErr, "%", 2)[0] @@ -177,7 +177,7 @@ func TestLoadStore_GetError(t *testing.T) { // Error path: show that loadStore returns an error when no group can be found // in storage. func Test_loadStore_GetGroupError(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(rand.New(rand.NewSource(42))) var idList []byte for i := 0; i < 10; i++ { @@ -249,7 +249,7 @@ func TestStore_Len(t *testing.T) { // Unit test of Store.Add. func TestStore_Add(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) store, err := NewStore(kv, user) @@ -281,7 +281,7 @@ func TestStore_Add(t *testing.T) { // groups. func TestStore_Add_MapFullError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) expectedErr := strings.SplitN(maxGroupsErr, "%", 2)[0] @@ -309,7 +309,7 @@ func TestStore_Add_MapFullError(t *testing.T) { // that is already in the map. func TestStore_Add_GroupExistsError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) expectedErr := strings.SplitN(groupExistsErr, "%", 2)[0] @@ -334,7 +334,7 @@ func TestStore_Add_GroupExistsError(t *testing.T) { // Unit test of Store.Remove. func TestStore_Remove(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) store, err := NewStore(kv, user) @@ -374,7 +374,7 @@ func TestStore_Remove(t *testing.T) { // given ID is found in the map. func TestStore_Remove_RemoveGroupNotInMemoryError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) expectedErr := strings.SplitN(groupRemoveErr, "%", 2)[0] @@ -423,7 +423,7 @@ func TestStore_GroupIDs(t *testing.T) { // Unit test of Store.Get. func TestStore_Get(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) store, err := NewStore(kv, user) @@ -451,7 +451,7 @@ func TestStore_Get(t *testing.T) { // Error path: shows that Store.Get return false if no group is found. func TestStore_Get_NoGroupError(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(rand.New(rand.NewSource(42))) store, err := NewStore(kv, user) @@ -469,7 +469,7 @@ func TestStore_Get_NoGroupError(t *testing.T) { // Unit test of Store.GetByKeyFp. func TestStore_GetByKeyFp(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) store, err := NewStore(kv, user) @@ -502,7 +502,7 @@ func TestStore_GetByKeyFp(t *testing.T) { // Error path: shows that Store.GetByKeyFp return false if no group is found. func TestStore_GetByKeyFp_NoGroupError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(prng) store, err := NewStore(kv, user) @@ -523,7 +523,7 @@ func TestStore_GetByKeyFp_NoGroupError(t *testing.T) { // Unit test of Store.GetUser. func TestStore_GetUser(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := randMember(rand.New(rand.NewSource(42))) store, err := NewStore(kv, user) @@ -539,7 +539,7 @@ func TestStore_GetUser(t *testing.T) { // Unit test of Store.SetUser. func TestStore_SetUser(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) prng := rand.New(rand.NewSource(42)) oldUser := randMember(prng) newUser := randMember(prng) diff --git a/groupChat/makeGroup.go b/groupChat/makeGroup.go index 32be2b8318562da54cf0841cdda018aa411db58d..dbf78d21d2b2286f2fa290c370d6693506d6393e 100644 --- a/groupChat/makeGroup.go +++ b/groupChat/makeGroup.go @@ -81,7 +81,7 @@ func (m Manager) MakeGroup(membership []*id.ID, name, msg []byte) (gs.Group, g := gs.NewGroup( name, groupID, groupKey, idPreimage, keyPreimage, msg, created, mem, dkl) - jww.DEBUG.Printf("Created new group %q with ID %s and %d members %s", + jww.DEBUG.Printf("[GC] Created new group %q with ID %s and %d members %s", g.Name, g.ID, len(g.Members), g.Members) // Send all group requests diff --git a/groupChat/manager.go b/groupChat/manager.go index 19c4de8bbca37c62fb7284e9c52701b865f7abba..a2572b0f9e9362a1a7e1698d783b1b71ba9972de 100644 --- a/groupChat/manager.go +++ b/groupChat/manager.go @@ -104,7 +104,8 @@ func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID, } // Register listener for incoming e2e group chat requests - e2e.RegisterListener(&id.ZeroUser, catalog.GroupCreationRequest, &requestListener{m: m}) + e2e.RegisterListener( + &id.ZeroUser, catalog.GroupCreationRequest, &requestListener{m}) // Register notifications listener for incoming e2e group chat requests err = e2e.AddService(catalog.GroupRq, nil) @@ -116,7 +117,7 @@ func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID, for _, gId := range m.GetGroups() { g, exists := m.GetGroup(gId) if !exists { - jww.WARN.Printf("Unexpected failure to locate GroupID %s", gId.String()) + jww.WARN.Printf("[GC] Unexpected failure to locate GroupID %s", gId) continue } @@ -135,7 +136,7 @@ func (m Manager) JoinGroup(g gs.Group) error { } m.joinGroup(g) - jww.DEBUG.Printf("Joined group %q with ID %s.", g.Name, g.ID) + jww.INFO.Printf("[GC] Joined group %q with ID %s.", g.Name, g.ID) return nil } @@ -146,7 +147,7 @@ func (m Manager) joinGroup(g gs.Group) { Tag: catalog.Group, Metadata: g.ID[:], } - m.services.AddService(m.receptionId, newService, &receptionProcessor{m: &m, g: g}) + m.services.AddService(m.receptionId, newService, &receptionProcessor{&m, g}) } // LeaveGroup removes a group from a list of groups the user is a part of. @@ -161,20 +162,20 @@ func (m Manager) LeaveGroup(groupID *id.ID) error { } m.services.DeleteService(m.receptionId, delService, nil) - jww.DEBUG.Printf("Left group with ID %s.", groupID) + jww.INFO.Printf("[GC] Left group with ID %s.", groupID) return nil } // GetGroups returns a list of all registered groupChat IDs. func (m Manager) GetGroups() []*id.ID { - jww.DEBUG.Print("Getting list of all groups.") + jww.DEBUG.Print("[GC] Getting list of all groups.") return m.gs.GroupIDs() } // GetGroup returns the group with the matching ID or returns false if none // exist. func (m Manager) GetGroup(groupID *id.ID) (gs.Group, bool) { - jww.DEBUG.Printf("Getting group with ID %s.", groupID) + jww.DEBUG.Printf("[GC] Getting group with ID %s.", groupID) return m.gs.Get(groupID) } diff --git a/groupChat/manager_test.go b/groupChat/manager_test.go index db891b387280540bf2d27b2a4f4c7e25da41d98e..95eb620337bc040dd53543c809b2d005211b4490 100644 --- a/groupChat/manager_test.go +++ b/groupChat/manager_test.go @@ -22,7 +22,7 @@ import ( // Unit test of Manager.newManager. func Test_newManager(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := group.Member{ ID: id.NewIdFromString("userID", id.User, t), DhKey: randCycInt(rand.New(rand.NewSource(42))), @@ -66,7 +66,7 @@ func Test_newManager(t *testing.T) { // Tests that Manager.newManager loads a group storage when it exists. func Test_newManager_LoadStorage(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := group.Member{ ID: id.NewIdFromString("userID", id.User, t), DhKey: randCycInt(rand.New(rand.NewSource(42))), @@ -98,7 +98,7 @@ func Test_newManager_LoadStorage(t *testing.T) { // Error path: an error is returned when a group cannot be loaded from storage. func Test_newManager_LoadError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) user := group.Member{ ID: id.NewIdFromString("userID", id.User, t), DhKey: randCycInt(rand.New(rand.NewSource(42))), diff --git a/groupChat/messageReceive.go b/groupChat/messageReceive.go index e607e7f01fcd1aa2e6bb4cee11356e3ea71814f5..fa883e73e052ea5c54d9ce0d9af5082073debe95 100644 --- a/groupChat/messageReceive.go +++ b/groupChat/messageReceive.go @@ -31,7 +31,7 @@ type MessageReceive struct { RoundTimestamp time.Time } -// String returns the MessageReceive as readable text. This functions satisfies +// String returns the MessageReceive as readable text. This functions adheres to // the fmt.Stringer interface. func (mr MessageReceive) String() string { groupID := "<nil>" @@ -54,16 +54,17 @@ func (mr MessageReceive) String() string { recipientID = mr.RecipientID.String() } - str := make([]string, 0, 9) - str = append(str, "GroupID:"+groupID) - str = append(str, "ID:"+mr.ID.String()) - str = append(str, "Payload:"+payload) - str = append(str, "SenderID:"+senderID) - str = append(str, "RecipientID:"+recipientID) - str = append(str, "EphemeralID:"+strconv.FormatInt(mr.EphemeralID.Int64(), 10)) - str = append(str, "Timestamp:"+mr.Timestamp.String()) - str = append(str, "RoundID:"+strconv.FormatUint(uint64(mr.RoundID), 10)) - str = append(str, "RoundTimestamp:"+mr.RoundTimestamp.String()) + str := []string{ + "GroupID:" + groupID, + "ID:" + mr.ID.String(), + "Payload:" + payload, + "SenderID:" + senderID, + "RecipientID:" + recipientID, + "EphemeralID:" + strconv.FormatInt(mr.EphemeralID.Int64(), 10), + "Timestamp:" + mr.Timestamp.String(), + "RoundID:" + strconv.FormatUint(uint64(mr.RoundID), 10), + "RoundTimestamp:" + mr.RoundTimestamp.String(), + } return "{" + strings.Join(str, " ") + "}" } diff --git a/groupChat/receive.go b/groupChat/receive.go index 244883cc33dd95d2164196adeaffaf6f03b71833..e9682b119b72b9f25c67358323a051cafe1d7835 100644 --- a/groupChat/receive.go +++ b/groupChat/receive.go @@ -26,7 +26,7 @@ const ( newDecryptKeyErr = "failed to generate key for decrypting group payload: %+v" unmarshalInternalMsgErr = "failed to unmarshal group internal message: %+v" unmarshalSenderIdErr = "failed to unmarshal sender ID: %+v" - unmarshalPublicMsgErr = "failed to unmarshal group cMix message contents: %+v" + unmarshalPublicMsgErr = "[GC] Failed to unmarshal group cMix message contents: %+v" genCryptKeyMacErr = "failed to generate encryption key for group " + "cMix message because MAC verification failed (epoch %d could be off)" ) @@ -38,29 +38,30 @@ type receptionProcessor struct { } // Process incoming group chat messages -func (p *receptionProcessor) Process(message format.Message, receptionID receptionID.EphemeralIdentity, round rounds.Round) { - jww.TRACE.Print("Group message reception received cMix message.") +func (p *receptionProcessor) Process(message format.Message, + receptionID receptionID.EphemeralIdentity, round rounds.Round) { + jww.TRACE.Print("[GC] Group message reception received cMix message.") // Attempt to read the message roundTimestamp := round.Timestamps[states.QUEUED] // Unmarshal cMix message contents to get public message format pubMsg, err := unmarshalPublicMsg(message.GetContents()) if err != nil { - jww.WARN.Printf("Failed to unmarshal: %+v", errors.Errorf(unmarshalPublicMsgErr, err)) + jww.WARN.Printf(unmarshalPublicMsgErr, err) } // Obtain the cryptKey for the public message key, err := getCryptKey(p.g.Key, pubMsg.GetSalt(), message.GetMac(), pubMsg.GetPayload(), p.g.DhKeys, roundTimestamp) if err != nil { - jww.WARN.Printf("Unable to getCryptKey: %+v", err) + jww.WARN.Printf("[GC] Unable to getCryptKey: %+v", err) return } // Decrypt the message payload using the cryptKey result, err := decryptMessage(p.g, message.GetKeyFP(), key, pubMsg.GetPayload()) if err != nil { - jww.WARN.Printf("Group message reception failed to read "+ + jww.WARN.Printf("[GC] Group message reception failed to read "+ "cMix message: %+v", err) return } @@ -71,9 +72,9 @@ func (p *receptionProcessor) Process(message format.Message, receptionID recepti result.RoundID = round.ID result.RoundTimestamp = roundTimestamp - jww.DEBUG.Printf("Received group message with ID %s from sender "+ - "%s in group %s with ID %s at %s.", result.ID, result.SenderID, p.g.Name, - p.g.ID, result.Timestamp) + jww.DEBUG.Printf("[GC] Received group message with ID %s from sender "+ + "%s in group %s with ID %s at %s.", result.ID, result.SenderID, + p.g.Name, p.g.ID, result.Timestamp) // If the message was read correctly, send it to the callback p.m.receiveFunc(result) @@ -85,8 +86,8 @@ func (p *receptionProcessor) String() string { // decryptMessage decrypts the group message payload and returns its message ID, // timestamp, sender ID, and message contents. -func decryptMessage(g gs.Group, fingerprint format.Fingerprint, key group.CryptKey, payload []byte) ( - MessageReceive, error) { +func decryptMessage(g gs.Group, fingerprint format.Fingerprint, + key group.CryptKey, payload []byte) (MessageReceive, error) { // Decrypt internal message decryptedPayload := group.Decrypt(key, fingerprint, payload) diff --git a/groupChat/receiveRequest.go b/groupChat/receiveRequest.go index 0d2224cbbcba375da4f440224c16b9d03e507eb5..a2e648d8befc6ecb242743828cd374c99b67fd20 100644 --- a/groupChat/receiveRequest.go +++ b/groupChat/receiveRequest.go @@ -32,20 +32,21 @@ type requestListener struct { // Hear waits for new group requests to arrive func (l *requestListener) Hear(item receive.Message) { - jww.DEBUG.Print("Group message request received message.") + jww.DEBUG.Print("[GC] Group message request received message.") // Generate the group from the request message g, err := l.m.readRequest(item) if err != nil { - jww.WARN.Printf("Failed to read message as group request: %+v", err) + jww.WARN.Printf( + "[GC] Failed to read message as group request: %+v", err) return } // Call request callback with the new group if it does not already // exist if _, exists := l.m.GetGroup(g.ID); !exists { - jww.DEBUG.Printf("Received group request for "+ - "group %s with ID %s.", g.Name, g.ID) + jww.INFO.Printf( + "[GC] Received group request for group %s with ID %s.", g.Name, g.ID) l.m.requestFunc(g) } diff --git a/groupChat/send.go b/groupChat/send.go index 64796dd35111424ff438b5ce2b6d7f721cb2083d..95dc2bb2b9f9c690c004c6f5780ecfedd685d2f2 100644 --- a/groupChat/send.go +++ b/groupChat/send.go @@ -36,9 +36,10 @@ const ( saltReadLengthErr = "length of generated salt %d != %d required" ) -// Send sends a message to all group members using Client.SendManyCMIX. +// Send sends a message to all group members using Client.SendMany. // The send fails if the message is too long. -func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, group.MessageID, error) { +func (m *Manager) Send(groupID *id.ID, message []byte) ( + id.Round, time.Time, group.MessageID, error) { // Get the relevant group g, exists := m.GetGroup(groupID) @@ -47,17 +48,19 @@ func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, gro errors.Errorf(newNoGroupErr, groupID) } - // get the current time stripped of the monotonic clock + // Get the current time stripped of the monotonic clock timeNow := netTime.Now().Round(0) // Create a cMix message for each group member groupMessages, err := m.newMessages(g, message, timeNow) if err != nil { - return 0, time.Time{}, group.MessageID{}, errors.Errorf(newCmixMsgErr, err) + return 0, time.Time{}, group.MessageID{}, + errors.Errorf(newCmixMsgErr, err) } // Obtain message ID - msgId, err := getGroupMessageId(m.grp, groupID, m.receptionId, timeNow, message) + msgId, err := getGroupMessageId( + m.grp, groupID, m.receptionId, timeNow, message) if err != nil { return 0, time.Time{}, group.MessageID{}, err } @@ -71,12 +74,13 @@ func (m *Manager) Send(groupID *id.ID, message []byte) (id.Round, time.Time, gro errors.Errorf(sendManyCmixErr, m.receptionId, groupID, err) } - jww.DEBUG.Printf("Sent message to %d members in group %s at %s.", + jww.DEBUG.Printf("[GC] Sent message to %d members in group %s at %s.", len(groupMessages), groupID, timeNow) return rid, timeNow, msgId, nil } -// newMessages quickly builds messages for all group chat members in multiple threads +// newMessages quickly builds messages for all group chat members in multiple +// threads. func (m *Manager) newMessages(g gs.Group, msg []byte, timestamp time.Time) ( []cmix.TargetedCmixMessage, error) { @@ -93,7 +97,8 @@ func (m *Manager) newMessages(g gs.Group, msg []byte, timestamp time.Time) ( } // Add cMix message to list - cMixMsg, err := newCmixMsg(g, msg, timestamp, member, rng, m.receptionId, m.services.GetMaxMessageLength()) + cMixMsg, err := newCmixMsg(g, msg, timestamp, member, rng, + m.receptionId, m.services.GetMaxMessageLength()) if err != nil { return nil, err } @@ -104,8 +109,9 @@ func (m *Manager) newMessages(g gs.Group, msg []byte, timestamp time.Time) ( } // newCmixMsg generates a new cMix message to be sent to a group member. -func newCmixMsg(g gs.Group, msg []byte, timestamp time.Time, - mem group.Member, rng io.Reader, senderId *id.ID, maxCmixMessageSize int) (cmix.TargetedCmixMessage, error) { +func newCmixMsg(g gs.Group, msg []byte, timestamp time.Time, mem group.Member, + rng io.Reader, senderId *id.ID, maxCmixMessageSize int) ( + cmix.TargetedCmixMessage, error) { // Initialize targeted message cmixMsg := cmix.TargetedCmixMessage{ @@ -160,13 +166,16 @@ func newCmixMsg(g gs.Group, msg []byte, timestamp time.Time, } // Build the group message ID -func getGroupMessageId(grp *cyclic.Group, groupId, senderId *id.ID, timestamp time.Time, msg []byte) (group.MessageID, error) { +func getGroupMessageId(grp *cyclic.Group, groupId, senderId *id.ID, + timestamp time.Time, msg []byte) (group.MessageID, error) { cmixMsg := format.NewMessage(grp.GetP().ByteLen()) _, intlMsg, err := newMessageParts(cmixMsg.ContentsSize()) if err != nil { - return group.MessageID{}, errors.WithMessage(err, "Failed to make message parts for message ID") + return group.MessageID{}, errors.WithMessage(err, + "Failed to make message parts for message ID") } - return group.NewMessageID(groupId, setInternalPayload(intlMsg, timestamp, senderId, msg)), nil + return group.NewMessageID(groupId, + setInternalPayload(intlMsg, timestamp, senderId, msg)), nil } // newMessageParts generates a public payload message and the internal payload diff --git a/groupChat/sendRequests.go b/groupChat/sendRequests.go index dba1231cde58c38d7159daadce4f7589369c2a0a..1d31cf837ff179f24bad6a7c31e3db3b9300e76b 100644 --- a/groupChat/sendRequests.go +++ b/groupChat/sendRequests.go @@ -36,7 +36,7 @@ func (m Manager) ResendRequest(groupID *id.ID) ([]id.Round, RequestStatus, error return nil, NotSent, errors.Errorf(resendGroupIdErr, groupID) } - jww.DEBUG.Printf("Resending group requests for group %s.", groupID) + jww.INFO.Printf("[GC] Resending group requests for group %s.", groupID) return m.sendRequests(g) } @@ -106,7 +106,8 @@ func (m Manager) sendRequests(g gs.Group) ([]id.Round, RequestStatus, error) { strings.Join(errs, "\n")) } - jww.DEBUG.Printf("Sent group request to %d members in group %q with ID %s.", + jww.DEBUG.Printf( + "[GC] Sent group request to %d members in group %q with ID %s.", len(g.Members), g.Name, g.ID) // If all sends succeeded, return a list of roundIDs @@ -119,7 +120,8 @@ func (m Manager) sendRequest(memberID *id.ID, request []byte) ([]id.Round, error p.LastServiceTag = catalog.GroupRq p.DebugTag = "group.Request" - rounds, _, _, err := m.e2e.SendE2E(catalog.GroupCreationRequest, memberID, request, p) + rounds, _, _, err := m.e2e.SendE2E( + catalog.GroupCreationRequest, memberID, request, p) if err != nil { return nil, errors.Errorf(sendE2eErr, memberID, err) } diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go index 002dbb17f28fb5170d511b66126b926280beeb53..371d03ba3d87adbbbab9be9b64d12be99006ef7c 100644 --- a/groupChat/utils_test.go +++ b/groupChat/utils_test.go @@ -57,7 +57,7 @@ func newTestManager(rng *rand.Rand, t *testing.T) (*Manager, gs.Group) { g := newTestGroupWithUser(m.grp, user.ID, user.DhKey, m.e2e.GetHistoricalDHPrivkey(), rng, t) - gStore, err := gs.NewStore(versioned.NewKV(make(ekv.Memstore)), user) + gStore, err := gs.NewStore(versioned.NewKV(ekv.MakeMemstore()), user) if err != nil { t.Fatalf("Failed to create new group store: %+v", err) } @@ -92,7 +92,7 @@ func newTestManagerWithStore(rng *rand.Rand, numGroups int, sendErr int, DhKey: m.e2e.GetHistoricalDHPubkey(), } - gStore, err := gs.NewStore(versioned.NewKV(make(ekv.Memstore)), user) + gStore, err := gs.NewStore(versioned.NewKV(ekv.MakeMemstore()), user) if err != nil { t.Fatalf("Failed to create new group store: %+v", err) }