Files
meowlib/client/invitation/messages/step3.go
T

63 lines
1.9 KiB
Go
Raw Normal View History

2026-04-11 22:05:30 +02:00
package messages
import (
"errors"
"forge.redroom.link/yves/meowlib"
"forge.redroom.link/yves/meowlib/client"
"google.golang.org/protobuf/proto"
)
2026-04-14 19:12:09 +02:00
// Step3InitiatorFinalizesInviteeAndCreatesContactCard is called by the initiator when the
// step-2 answer (serialized Invitation bytes) arrives. It decrypts the invitee's ContactCard,
// upgrades the pending peer with the invitee's real keys, and returns a serialized Invitation
// (step=3) whose Payload is the initiator's ContactCard, ready to be consumed directly by
// Step4InviteeFinalizesInitiator on the invitee side.
func Step3InitiatorFinalizesInviteeAndCreatesContactCard(invitationBytes []byte) ([]byte, error) {
var invitation meowlib.Invitation
if err := proto.Unmarshal(invitationBytes, &invitation); err != nil {
return nil, err
}
2026-04-11 22:05:30 +02:00
var invitationAnswer meowlib.PackedUserMessage
if err := proto.Unmarshal(invitation.Payload, &invitationAnswer); err != nil {
2026-04-14 19:12:09 +02:00
return nil, err
2026-04-11 22:05:30 +02:00
}
peer := client.GetConfig().GetIdentity().Peers.GetFromInvitationId(invitation.Uuid)
if peer == nil {
2026-04-14 19:12:09 +02:00
return nil, errors.New("no peer for invitation uuid " + invitation.Uuid)
2026-04-11 22:05:30 +02:00
}
// Guard against duplicate delivery (e.g., same answer from multiple servers).
if peer.InvitationKp == nil {
2026-04-14 19:12:09 +02:00
return nil, nil
2026-04-11 22:05:30 +02:00
}
usermsg, err := peer.ProcessInboundStep2UserMessage(&invitationAnswer, invitation.From)
if err != nil {
2026-04-14 19:12:09 +02:00
return nil, err
2026-04-11 22:05:30 +02:00
}
var inviteeCC meowlib.ContactCard
if err := proto.Unmarshal(usermsg.Invitation.Payload, &inviteeCC); err != nil {
2026-04-14 19:12:09 +02:00
return nil, err
2026-04-11 22:05:30 +02:00
}
2026-04-14 19:12:09 +02:00
myCC, _, err := client.GetConfig().GetIdentity().InvitationStep3(&inviteeCC)
2026-04-11 22:05:30 +02:00
if err != nil {
2026-04-14 19:12:09 +02:00
return nil, err
2026-04-11 22:05:30 +02:00
}
client.GetConfig().GetIdentity().Save()
2026-04-14 19:12:09 +02:00
ccBytes, err := proto.Marshal(myCC)
if err != nil {
return nil, err
}
inv := &meowlib.Invitation{
Uuid: myCC.InvitationId,
Step: 3,
Payload: ccBytes,
}
return proto.Marshal(inv)
2026-04-11 22:05:30 +02:00
}