52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package server
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"forge.redroom.link/yves/meowlib/client"
|
|
)
|
|
|
|
// Step3PostCard builds and returns the packed server messages that send the
|
|
// initiator's full ContactCard to the invitee through the invitee's servers.
|
|
// Step 3 must NOT use DR or sym layers: the invitee hasn't received those keys yet
|
|
// (they are carried inside this very message). Plain asym encryption is used.
|
|
func Step3PostCard(invitationId string) ([][]byte, error) {
|
|
id := client.GetConfig().GetIdentity()
|
|
peer := id.Peers.GetFromInvitationId(invitationId)
|
|
if peer == nil {
|
|
return nil, errors.New("no peer for invitation id " + invitationId)
|
|
}
|
|
|
|
step3msg, err := peer.BuildInvitationStep3Message(peer.GetMyContact())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
serialized, err := peer.SerializeUserMessage(step3msg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
enc, err := peer.AsymEncryptMessage(serialized)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
packedMsg := peer.PackUserMessage(enc.Data, enc.Signature)
|
|
|
|
var results [][]byte
|
|
for _, srvUid := range peer.ContactPullServers {
|
|
srv, err := id.MessageServers.LoadServer(srvUid)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
toSrvMsg := srv.BuildToServerMessageFromUserMessage(packedMsg)
|
|
bytemsg, err := srv.ProcessOutboundMessage(toSrvMsg)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
results = append(results, bytemsg)
|
|
}
|
|
if len(results) == 0 {
|
|
return nil, errors.New("could not build message for any invitee server")
|
|
}
|
|
return results, nil
|
|
}
|