diff --git a/cmix/interface.go b/cmix/interface.go index a232d41674ccfca262545ee1357ba47c8a4b8de5..c8673e02b8b74efe0e50521dfeb52ab599f2f970 100644 --- a/cmix/interface.go +++ b/cmix/interface.go @@ -84,7 +84,7 @@ type Client interface { // Will return an error if the network is unhealthy or if it fails to send // (along with the reason). Blocks until successful send or err. // WARNING: Do not roll your own crypto. - SendMany(recipients []*id.ID, messages []TargetedCmixMessage, + SendMany(messages []TargetedCmixMessage, params CMIXParams) (rounds.Round, []ephemeral.Id, error) // SendWithAssembler sends a variable cmix payload to the provided recipient. diff --git a/cmix/sendCmixUtils.go b/cmix/sendCmixUtils.go index 748b6eee3a8073b39d06ed42b98f7844b343169a..e0d32153955435d39ab9cb4167b1d239953ba48b 100644 --- a/cmix/sendCmixUtils.go +++ b/cmix/sendCmixUtils.go @@ -219,7 +219,17 @@ func recipientsToStrings(recipients []*id.ID) string { } return strings.Join(idStrings, ", ") +} + +// recipientsFromTargetedMessage extracts the list of recipients from a +// list of TargetedCmixMessage. +func recipientsFromTargetedMessage(msgs []TargetedCmixMessage) []*id.ID { + idStrings := make([]*id.ID, 0, len(msgs)) + for _, msg := range msgs { + idStrings = append(idStrings, msg.Recipient) + } + return idStrings } // messagesToDigestString serializes a list of cMix messages into a string of diff --git a/cmix/sendManyCmix.go b/cmix/sendManyCmix.go index cd84cb156259d906db7f82dc27c4da7070cdc0c0..0b2fc3dac65824ebd65668ce774f734b5df2272a 100644 --- a/cmix/sendManyCmix.go +++ b/cmix/sendManyCmix.go @@ -70,14 +70,14 @@ type TargetedCmixMessage struct { // Will return an error if the network is unhealthy or if it fails to send // (along with the reason). Blocks until successful send or err. // WARNING: Do not roll your own crypto -func (c *client) SendMany(recipients []*id.ID, - messages []TargetedCmixMessage, +func (c *client) SendMany(messages []TargetedCmixMessage, params CMIXParams) (rounds.Round, []ephemeral.Id, error) { if !c.Monitor.IsHealthy() { return rounds.Round{}, []ephemeral.Id{}, errors.New( "Cannot send cMix message when the network is not healthy") } + recipients := recipientsFromTargetedMessage(messages) assembler := func(rid id.Round) ([]TargetedCmixMessage, error) { return messages, nil } diff --git a/fileTransfer/manager.go b/fileTransfer/manager.go index 3d8b56f5acd7298e75fda418de3b8136c5f0866b..dc65222b3730a23e0364ef77510925b32d505886 100644 --- a/fileTransfer/manager.go +++ b/fileTransfer/manager.go @@ -146,7 +146,7 @@ type FtE2e interface { // transfer manager for easier testing. type Cmix interface { GetMaxMessageLength() int - SendMany(recipients []*id.ID, messages []cmix.TargetedCmixMessage, + SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error) AddFingerprint(identity *id.ID, fingerprint format.Fingerprint, mp message.Processor) error diff --git a/fileTransfer/send.go b/fileTransfer/send.go index 8066259d8f34f55a34138f4ff96ef0c8e5db526e..3237754159f63ea15cee9d1fe5479794a833fd42 100644 --- a/fileTransfer/send.go +++ b/fileTransfer/send.go @@ -156,7 +156,7 @@ func (m *manager) sendCmix(packet []store.Part) { jww.DEBUG.Printf("[FT] Sending %d file parts via SendManyCMIX", len(messages)) - rid, _, err := m.cmix.SendMany(recipients, messages, m.params.Cmix) + rid, _, err := m.cmix.SendMany(messages, m.params.Cmix) if err != nil { jww.WARN.Printf("[FT] Failed to send %d file parts via "+ "SendManyCMIX: %+v", len(messages), err) diff --git a/groupChat/interface.go b/groupChat/interface.go index a84c4e34a6eeaed563148bc1017a44ddb7e6e43a..563efdc08583cb7051ecbc52d6dcec58582635ed 100644 --- a/groupChat/interface.go +++ b/groupChat/interface.go @@ -114,7 +114,7 @@ type groupE2e interface { // groupCmix is a subset of the cmix.Client interface containing only the // methods needed by GroupChat type groupCmix interface { - SendMany(recipients []*id.ID, messages []cmix.TargetedCmixMessage, + SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error) AddService( clientID *id.ID, newService message.Service, response message.Processor) diff --git a/groupChat/send.go b/groupChat/send.go index 1f716bbf9c3593e6808306bd8d2c83d7bbcc2c96..0e49a1aebf5678c18c9d96eeae9a4f21e1fe59d2 100644 --- a/groupChat/send.go +++ b/groupChat/send.go @@ -62,7 +62,7 @@ func (m *manager) Send(groupID *id.ID, tag string, message []byte) ( timeNow := netTime.Now().Round(0) // Create a cMix message for each group member - groupMessages, recipients, msgId, err := m.newMessages(g, tag, message, timeNow) + groupMessages, msgId, err := m.newMessages(g, tag, message, timeNow) if err != nil { return rounds.Round{}, time.Time{}, group.MessageID{}, errors.Errorf(newCmixMsgErr, g.Name, g.ID, err) @@ -71,7 +71,7 @@ func (m *manager) Send(groupID *id.ID, tag string, message []byte) ( // Send all the groupMessages param := cmix.GetDefaultCMIXParams() param.DebugTag = "group.Message" - rid, _, err := m.getCMix().SendMany(recipients, groupMessages, param) + rid, _, err := m.getCMix().SendMany(groupMessages, param) if err != nil { return rounds.Round{}, time.Time{}, group.MessageID{}, errors.Errorf(sendManyCmixErr, m.getReceptionIdentity().ID, g.Name, @@ -85,8 +85,7 @@ func (m *manager) Send(groupID *id.ID, tag string, message []byte) ( // newMessages builds a list of messages, one for each group chat member. func (m *manager) newMessages(g gs.Group, tag string, msg []byte, - timestamp time.Time) ([]cmix.TargetedCmixMessage, []*id.ID, - group.MessageID, error) { + timestamp time.Time) ([]cmix.TargetedCmixMessage, group.MessageID, error) { rng := m.getRng().GetStream() defer rng.Close() @@ -97,18 +96,18 @@ func (m *manager) newMessages(g gs.Group, tag string, msg []byte, // Generate public message to determine what length internal message can be pubMsg, err := newPublicMsg(maxCmixMessageLength) if err != nil { - return nil, nil, group.MessageID{}, errors.Errorf(newPublicMsgErr, err) + return nil, group.MessageID{}, errors.Errorf(newPublicMsgErr, err) } // Generate internal message intlMsg, err := newInternalMsg(pubMsg.GetPayloadSize()) if err != nil { - return nil, nil, group.MessageID{}, errors.Errorf(newInternalMsgErr, err) + return nil, group.MessageID{}, errors.Errorf(newInternalMsgErr, err) } // Return an error if the message is too large to fit in the payload if intlMsg.GetPayloadMaxSize() < len(msg) { - return nil, nil, group.MessageID{}, errors.Errorf( + return nil, group.MessageID{}, errors.Errorf( messageLenErr, len(msg), intlMsg.GetPayloadMaxSize()) } @@ -118,7 +117,6 @@ func (m *manager) newMessages(g gs.Group, tag string, msg []byte, // Create cMix messages messages := make([]cmix.TargetedCmixMessage, len(g.Members)) - recipients := make([]*id.ID, len(g.Members)) for i, member := range g.Members { // Do not send to the sender if m.getReceptionIdentity().ID.Cmp(member.ID) { @@ -129,14 +127,12 @@ func (m *manager) newMessages(g gs.Group, tag string, msg []byte, cMixMsg, err := newCmixMsg(g, tag, timestamp, member, rng, maxCmixMessageLength, internalMessagePayload) if err != nil { - return nil, nil, group.MessageID{}, err + return nil, group.MessageID{}, err } messages[i] = cMixMsg - recipients[i] = g.ID } - return messages, recipients, - group.NewMessageID(g.ID, internalMessagePayload), nil + return messages, group.NewMessageID(g.ID, internalMessagePayload), nil } // newCmixMsg generates a new cmix.TargetedCmixMessage for the given group