refactor invitation
This commit is contained in:
61
client/invitation/server/step1.go
Normal file
61
client/invitation/server/step1.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"forge.redroom.link/yves/meowlib"
|
||||
"forge.redroom.link/yves/meowlib/client"
|
||||
)
|
||||
|
||||
// Step1Post builds and returns the packed server message that posts the
|
||||
// InvitationInitPayload to the invitation server.
|
||||
func Step1Post(invitationId string, invitationServerUid string, timeOut int, urlLen int, password string) ([]byte, error) {
|
||||
peer := client.GetConfig().GetIdentity().Peers.GetFromInvitationId(invitationId)
|
||||
if peer == nil {
|
||||
return nil, nil
|
||||
}
|
||||
if peer.InvitationKp == nil {
|
||||
return nil, nil
|
||||
}
|
||||
initPayload := &meowlib.InvitationInitPayload{
|
||||
Uuid: peer.InvitationId,
|
||||
Name: peer.MyName,
|
||||
PublicKey: peer.InvitationKp.Public,
|
||||
InvitationMessage: peer.InvitationMessage,
|
||||
}
|
||||
invitationServer, err := client.GetConfig().GetIdentity().MessageServers.LoadServer(invitationServerUid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
msg, err := invitationServer.BuildToServerMessageInvitationStep1(initPayload, password, timeOut, urlLen)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return invitationServer.ProcessOutboundMessage(msg)
|
||||
}
|
||||
|
||||
// Step1ReadResponse reads the server response to a Step1 post and returns the
|
||||
// shortcode URL and expiry wrapped in an Invitation.
|
||||
func Step1ReadResponse(invitationServerUid string, invitationResponse []byte) (*meowlib.Invitation, error) {
|
||||
srv, err := client.GetConfig().GetIdentity().MessageServers.LoadServer(invitationServerUid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
serverMsg, err := srv.ProcessInboundServerResponse(invitationResponse)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return serverMsg.Invitation, nil
|
||||
}
|
||||
|
||||
// SetUrlInfo stores the shortcode URL and expiry on the pending peer.
|
||||
func SetUrlInfo(invitationId string, url string, expiry int64) {
|
||||
id := client.GetConfig().GetIdentity()
|
||||
peer := id.Peers.GetFromInvitationId(invitationId)
|
||||
if peer == nil {
|
||||
return
|
||||
}
|
||||
peer.InvitationUrl = url
|
||||
peer.InvitationExpiry = time.Unix(expiry, 0)
|
||||
id.Peers.StorePeer(peer)
|
||||
}
|
||||
107
client/invitation/server/step2.go
Normal file
107
client/invitation/server/step2.go
Normal 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
|
||||
}
|
||||
51
client/invitation/server/step3.go
Normal file
51
client/invitation/server/step3.go
Normal file
@@ -0,0 +1,51 @@
|
||||
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
|
||||
}
|
||||
44
client/invitation/server/step4.go
Normal file
44
client/invitation/server/step4.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"forge.redroom.link/yves/meowlib/client"
|
||||
)
|
||||
|
||||
// Step4PostConfirmation builds and returns the packed server messages that send the
|
||||
// invitee's confirmation to the initiator through the initiator's servers.
|
||||
func Step4PostConfirmation(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)
|
||||
}
|
||||
|
||||
step4msg, err := peer.BuildInvitationStep4Message()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
packedMsg, err := peer.ProcessOutboundUserMessage(step4msg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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 initiator server")
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
Reference in New Issue
Block a user