Files
meowlib/endtoend_test.go

209 lines
6.3 KiB
Go
Raw Normal View History

2022-09-06 09:30:45 +02:00
package meowlib_test
2022-01-15 22:19:29 +01:00
import (
"encoding/json"
"fmt"
2022-12-19 12:15:10 +01:00
"os"
2022-01-15 22:19:29 +01:00
"testing"
2022-09-06 09:30:45 +02:00
"forge.redroom.link/yves/meowlib"
"forge.redroom.link/yves/meowlib/client"
2022-09-25 10:16:39 +02:00
"forge.redroom.link/yves/meowlib/server"
2022-01-15 22:19:29 +01:00
)
func TestEndToEnd(t *testing.T) {
//
// Create my own identity
//
fmt.Println("Trying to load identity from file.")
Me, err := client.LoadIdentity("id.enc", "Test")
2022-01-15 22:19:29 +01:00
if err != nil {
fmt.Println("Failed : creating New identity...")
///////////////////////////
// Creating New Identity //
///////////////////////////
2024-03-29 19:31:48 +01:00
Me, err = client.CreateIdentity("myname")
2024-02-08 22:17:16 +01:00
2022-01-15 22:19:29 +01:00
// define my preferences (servers)
2024-02-08 22:17:16 +01:00
srv := client.Server{Name: "MyServer", Url: "http://127.0.0.1/meow/"}
Me.MessageServers.StoreServer(&srv)
srv = client.Server{Name: "MyServer", Url: "mqtt://127.0.0.1"}
Me.MessageServers.StoreServer(&srv)
srv = client.Server{Name: "MyServer", Url: "meow://127.0.0.1"}
Me.MessageServers.StoreServer(&srv)
////////////////////////////////////////////////////////////////////////////
2026-04-02 18:50:04 +02:00
// STEP_1: Create an invitation — only a temp keypair, no full ContactCard //
////////////////////////////////////////////////////////////////////////////
2022-01-15 22:19:29 +01:00
fmt.Println("Creating an invitation for the first friend...")
2026-04-02 18:50:04 +02:00
initPayload, peer, err := Me.InvitationStep1("Bender", "myfirstfriend", []string{"http://127.0.0.1/meow/", "mqtt://127.0.0.1"}, "welcome, it's me!")
if err != nil {
println(err)
}
2023-11-14 16:32:50 +01:00
println(peer.Name)
2026-04-02 18:50:04 +02:00
a, _ := json.Marshal(initPayload)
fmt.Println("InvitationInitPayload:", string(a))
data, err := initPayload.Compress()
if err != nil {
println(err)
}
2026-04-02 18:50:04 +02:00
initPayload.WriteQr("qrcode.png")
println("Compressed init payload :", len(data))
2022-09-02 12:07:21 +02:00
2026-04-02 18:50:04 +02:00
///////////////////////////////////////////////////////
// STEP_2: Simulate friend receiving the payload and answering //
///////////////////////////////////////////////////////
fmt.Println("Simulating first friend answer (STEP_2)...")
friendMe, err := client.CreateIdentity("friendname")
if err != nil {
t.Fatal(err)
}
2026-04-02 18:50:04 +02:00
friendPeer, err := friendMe.InvitationStep2("FriendNick", "Bender", []string{}, initPayload)
if err != nil {
t.Fatal(err)
}
2026-04-02 18:50:04 +02:00
friendCC := friendPeer.GetMyContact()
FriendServer1KP, err := meowlib.NewKeyPair()
if err != nil {
t.Fatal(err)
}
2023-11-27 00:31:43 +01:00
FriendServer1 := meowlib.ServerCard{Name: "FriendServer1", Url: "http://myfriend.org/meow/", PublicKey: FriendServer1KP.Public, Description: "Fancy description"}
2026-04-02 18:50:04 +02:00
friendCC.PullServers = append(friendCC.PullServers, &FriendServer1)
2022-09-02 12:07:21 +02:00
2026-04-02 18:50:04 +02:00
//////////////////////////////////////////////////////////////////
// STEP_3: Initiator receives friend's CC, generates full keypairs //
//////////////////////////////////////////////////////////////////
myCC, _, err := Me.InvitationStep3(friendCC)
if err != nil {
t.Fatal(err)
}
fmt.Println("Initiator ContactCard ready:", myCC.ContactPublicKey != "")
////////////////////////////////////////////////////
// STEP_4: Friend finalizes initiator's ContactCard //
////////////////////////////////////////////////////
err = friendMe.InvitationStep4(myCC)
if err != nil {
t.Fatal(err)
}
err = Me.Save()
2022-01-15 22:19:29 +01:00
if err != nil {
t.Fatal(err)
}
2022-09-06 17:07:35 +02:00
a, _ = json.Marshal(Me)
2022-12-19 12:15:10 +01:00
os.WriteFile("id.json", a, 0644)
2022-01-15 22:19:29 +01:00
fmt.Println(string(a))
/////////////////////////////////////
// Create a message to that friend //
/////////////////////////////////////
peers, _ := Me.Peers.GetPeers()
MyFirstFriend := peers[0]
textmessage := "Hello friend!"
// Creating User message
usermessage, err := MyFirstFriend.BuildSimpleUserMessage([]byte(textmessage))
if err != nil {
t.Fatal(err)
}
serializedMessage, err := MyFirstFriend.SerializeUserMessage(usermessage)
if err != nil {
t.Fatal(err)
}
// Encrypting it
enc, err := MyFirstFriend.AsymEncryptMessage(serializedMessage)
2022-09-02 12:07:21 +02:00
if err != nil {
t.Fatal(err)
2022-09-02 12:07:21 +02:00
}
// Packing it
packedMsg := MyFirstFriend.PackUserMessage(enc.Data, enc.Signature)
2024-02-08 22:17:16 +01:00
intS1, err := Me.MessageServers.LoadServer("http://127.0.0.1/meow/")
if err != nil {
t.Fatal(err)
2024-02-08 22:17:16 +01:00
}
// Creating Server message for transporting the user message
2022-12-03 00:05:28 +01:00
toServerMessage, err := intS1.BuildMessageSendingMessage(packedMsg)
if err != nil {
t.Fatal(err)
}
2022-09-19 13:26:27 +02:00
// Encrypting it
encToServer, err := intS1.AsymEncryptMessage(toServerMessage)
if err != nil {
t.Fatal(err)
}
2022-09-19 13:26:27 +02:00
// Packing it
protoPackedServerMsg, err := intS1.PackServerMessage(encToServer.Data, encToServer.Signature)
if err != nil {
t.Fatal(err)
}
///////////////////////
// Sending to server //
///////////////////////
//=> fake action (network protocol transfer are not part of meowlib)
2022-09-19 13:26:27 +02:00
// You have to implement the netwok layer
// Just FYI printing final byte array size. Those bytes will be sent over the network.
2022-09-19 13:26:27 +02:00
println(len(protoPackedServerMsg))
///////////////////////////////////////
// Simulating server side processing //
///////////////////////////////////////
2022-09-25 10:16:39 +02:00
var server1 server.Identity
server1.ServerName = intS1.Name
2022-09-25 10:16:39 +02:00
server1.ServerKp = FriendServer1KP
server1.ServerDesc = intS1.Description
2022-09-25 10:16:39 +02:00
// Unpack
srv_from, srv_encmsg, srv_signature, err := server1.UnpackReceived(protoPackedServerMsg)
if err != nil {
t.Fatal(err)
}
2022-09-25 10:16:39 +02:00
// Decrypt
srv_clear, err := server1.AsymDecryptMessage(srv_from, srv_encmsg, srv_signature)
if err != nil {
t.Fatal(err)
}
2022-09-25 10:16:39 +02:00
// Decode msg
srv_msg, err := server1.DeserializeToServerMessage(srv_clear)
if err != nil {
t.Fatal(err)
}
2022-09-25 10:16:39 +02:00
// Response : Ack received message
srv_fromServerMessage, err := server1.BuildSimpleAckResponseMessage(srv_msg.Uuid)
if err != nil {
t.Fatal(err)
}
encoded_srv_fromServerMessage, err := server1.SerializeFromServerMessage(srv_fromServerMessage)
if err != nil {
t.Fatal(err)
}
srv_resp, err := server1.AsymEncryptMessage(srv_from, encoded_srv_fromServerMessage)
if err != nil {
t.Fatal(err)
}
resp, err := server1.PackForSending(srv_resp.Data, srv_resp.Signature)
if err != nil {
t.Fatal(err)
}
2022-10-15 09:14:13 +02:00
print(resp)
//////////////////////////////////////////////
// Back to client, decoding server response //
//////////////////////////////////////////////
2022-09-19 13:26:27 +02:00
2022-09-25 10:16:39 +02:00
// server unpack
// server decrypt
// server decode protobuf
// user unpack
// user decrypt
2023-01-11 21:42:14 +01:00
/*decMess, err2 := MyFirstFriend.AsymDecryptMessage([]byte(enc.Data), enc.Signature)
2022-09-02 12:07:21 +02:00
if err2 != nil {
fmt.Println(err2.Error())
}
2023-01-11 21:42:14 +01:00
fmt.Println(decMess)*/
2022-09-25 10:16:39 +02:00
// user decode protobuf
2022-09-06 17:07:35 +02:00
2022-09-02 12:07:21 +02:00
}
2022-01-15 22:19:29 +01:00
}