2026-04-11 22:05:30 +02:00
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-12 13:38:15 +02:00
|
|
|
// Step2PostAnswer wraps the invitee's already-built PackedUserMessage into a server
|
|
|
|
|
// message and posts it to the invitation server. The packed message is produced by
|
|
|
|
|
// messages.Step2InviteeCreatesInitiatorAndEncryptedContactCard.
|
|
|
|
|
func Step2PostAnswer(invitationId string, packedMsg *meowlib.PackedUserMessage, invitationServerUid string, timeout int) ([]byte, error) {
|
2026-04-11 22:05:30 +02:00
|
|
|
peer := client.GetConfig().GetIdentity().Peers.GetFromInvitationId(invitationId)
|
|
|
|
|
if peer == nil {
|
|
|
|
|
return nil, errors.New("no peer with that invitation id")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
invitationServer, err := client.GetConfig().GetIdentity().MessageServers.LoadServer(invitationServerUid)
|
|
|
|
|
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
|
|
|
|
|
}
|