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 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) { 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 }