refactor invitation

This commit is contained in:
yc
2026-04-11 22:05:30 +02:00
parent 1906431061
commit 793213b3fb
16 changed files with 465 additions and 436 deletions

View File

@@ -0,0 +1,107 @@
package server
import (
"errors"
"strings"
"forge.redroom.link/yves/meowlib"
"forge.redroom.link/yves/meowlib/client"
)
// Step2Fetch builds and returns the packed server message that retrieves the
// InvitationInitPayload from the server using the shortcode URL.
func Step2Fetch(invitationUrl string, serverPublicKey string, invitationPassword string) ([]byte, error) {
meowurl := strings.Split(invitationUrl, "?")
shortcode := meowurl[1]
srv, err := client.CreateServerFromMeowUrl(meowurl[0])
if err != nil {
return nil, err
}
// Reuse the server entry if already known.
dbsrv, err := client.GetConfig().GetIdentity().MessageServers.LoadServer(srv.Url)
if err != nil {
return nil, err
}
if dbsrv == nil {
srv.PublicKey = serverPublicKey
k, err := meowlib.NewKeyPair()
if err != nil {
return nil, err
}
srv.UserKp = k
if err := client.GetConfig().GetIdentity().MessageServers.StoreServer(srv); err != nil {
return nil, err
}
} else {
if dbsrv.PublicKey != serverPublicKey {
dbsrv.PublicKey = serverPublicKey
}
srv = dbsrv
}
toSrvMsg, err := srv.BuildToServerMessageInvitationRequest(shortcode, invitationPassword)
if err != nil {
return nil, err
}
return srv.ProcessOutboundMessage(toSrvMsg)
}
// Step2ReadResponse decodes the server response to a Step2Fetch and returns
// the InvitationInitPayload sent by the initiator.
func Step2ReadResponse(invitationData []byte, invitationServerUid string) (*meowlib.InvitationInitPayload, error) {
srv, err := client.GetConfig().GetIdentity().MessageServers.LoadServer(invitationServerUid)
if err != nil {
return nil, err
}
serverMsg, err := srv.ProcessInboundServerResponse(invitationData)
if err != nil {
return nil, err
}
return meowlib.NewInvitationInitPayloadFromCompressed(serverMsg.Invitation.Payload)
}
// Step2PostAnswer builds and returns the packed server message that posts the
// invitee's ContactCard (encrypted with the initiator's temp key) to the invitation server.
func Step2PostAnswer(invitationId string, invitationServerUid string, timeout int) ([]byte, error) {
peer := client.GetConfig().GetIdentity().Peers.GetFromInvitationId(invitationId)
if peer == nil {
return nil, errors.New("no peer with that invitation id")
}
answermsg, err := peer.BuildInvitationStep2Message(peer.GetMyContact())
if err != nil {
return nil, err
}
invitationServer, err := client.GetConfig().GetIdentity().MessageServers.LoadServer(invitationServerUid)
if err != nil {
return nil, err
}
packedMsg, err := peer.ProcessOutboundUserMessage(answermsg)
if err != nil {
return nil, err
}
toServerMessage, err := invitationServer.BuildToServerMessageInvitationAnswer(packedMsg, peer.MyIdentity.Public, invitationId, timeout)
if err != nil {
return nil, err
}
return invitationServer.ProcessOutboundMessage(toServerMessage)
}
// Step2PostAnswerReadResponse reads the server acknowledgement of a Step2PostAnswer.
func Step2PostAnswerReadResponse(invitationData []byte, invitationServerUid string) (*meowlib.Invitation, error) {
srv, err := client.GetConfig().GetIdentity().MessageServers.LoadServer(invitationServerUid)
if err != nil {
return nil, err
}
serverMsg, err := srv.ProcessInboundServerResponse(invitationData)
if err != nil {
return nil, err
}
return serverMsg.Invitation, nil
}