diff --git a/asymcrypt.go b/asymcrypt.go index e39790f..3f520a5 100644 --- a/asymcrypt.go +++ b/asymcrypt.go @@ -37,8 +37,8 @@ func NewKeyPair() KeyPair { return kp } -func (keyPair *KeyPair) GetCryptoKeyObject() *crypto.Key { - priv, err := base64.StdEncoding.DecodeString(keyPair.Private) +func (Kp *KeyPair) GetCryptoKeyObject() *crypto.Key { + priv, err := base64.StdEncoding.DecodeString(Kp.Private) if err != nil { log.Error().Msg("Create key from armoured b64 failed") } @@ -49,8 +49,8 @@ func (keyPair *KeyPair) GetCryptoKeyObject() *crypto.Key { return key } -func Encrypt(publicKey string, data []byte) ([]byte, error) { - pub, err := base64.StdEncoding.DecodeString(publicKey) +func Encrypt(PublicKey string, data []byte) ([]byte, error) { + pub, err := base64.StdEncoding.DecodeString(PublicKey) if err != nil { log.Error().Msg("Message encryption b64 failed") } @@ -61,8 +61,8 @@ func Encrypt(publicKey string, data []byte) ([]byte, error) { return []byte(armor), err } -func Decrypt(privateKey string, data []byte) ([]byte, error) { - priv, err := base64.StdEncoding.DecodeString(privateKey) +func Decrypt(PrivateKey string, data []byte) ([]byte, error) { + priv, err := base64.StdEncoding.DecodeString(PrivateKey) if err != nil { log.Error().Msg("Message decryption b64 failed") } @@ -73,12 +73,12 @@ func Decrypt(privateKey string, data []byte) ([]byte, error) { return []byte(decrypted), err } -func EncryptAndSign(publicEncKey string, privateSignKey string, data []byte) ([]byte, []byte, error) { - pub, err := base64.StdEncoding.DecodeString(publicEncKey) +func EncryptAndSign(PublicEncryptionKey string, PrivateSignatureKey string, data []byte) ([]byte, []byte, error) { + pub, err := base64.StdEncoding.DecodeString(PublicEncryptionKey) if err != nil { log.Error().Msg("Message encryption and sign b64 failed") } - priv, err := base64.StdEncoding.DecodeString(privateSignKey) + priv, err := base64.StdEncoding.DecodeString(PrivateSignatureKey) if err != nil { log.Error().Msg("Message encryption and sign b64 failed") } @@ -89,16 +89,16 @@ func EncryptAndSign(publicEncKey string, privateSignKey string, data []byte) ([] return []byte(encrypted), []byte(signature), err } -func DecryptAndCheck(MyPrivateEncryptionKey string, peerContactPublicKey string, data []byte, signature []byte) (DecryptedMessage []byte, err error) { +func DecryptAndCheck(MyPrivateEncryptionKey string, MyContactPublicKey string, data []byte, Signature []byte) (DecryptedMessage []byte, err error) { pub, err := base64.StdEncoding.DecodeString(MyPrivateEncryptionKey) if err != nil { log.Error().Msg("Message decryption and sign b64 failed") } - priv, err := base64.StdEncoding.DecodeString(peerContactPublicKey) + priv, err := base64.StdEncoding.DecodeString(MyContactPublicKey) if err != nil { log.Error().Msg("Message decryption and sign b64 failed") } - DecryptedMessage, err = helper.DecryptVerifyBinaryDetached(string(pub), string(priv), nil, data, string(signature)) + DecryptedMessage, err = helper.DecryptVerifyBinaryDetached(string(pub), string(priv), nil, data, string(Signature)) if err != nil { log.Error().Msg("Message decryption and sign failed") } diff --git a/client/identity.go b/client/identity.go index 73dbb13..f96a4dd 100644 --- a/client/identity.go +++ b/client/identity.go @@ -12,8 +12,7 @@ const key = "3pw0c8#6ZG8{75b5;3?fe80$2" type Identity struct { Nickname string `json:"nickname,omitempty"` - PublicKey string `json:"public_key,omitempty"` - PrivateKey string `json:"private_key,omitempty"` + RootKp meowlib.KeyPair `json:"id_kp,omitempty"` Status string `json:"status,omitempty"` Peers PeerList `json:"peers,omitempty"` KnownServers InternalServerList `json:"known_servers,omitempty"` @@ -23,24 +22,22 @@ type Identity struct { func CreateIdentity(nickname string) *Identity { var id Identity id.Nickname = nickname - kp := meowlib.NewKeyPair() - id.PublicKey = kp.Public - id.PrivateKey = kp.Private + id.RootKp = meowlib.NewKeyPair() return &id } -func (id *Identity) InvitePeer(myName string, contactName string, messageServerIdxs []int) (*Peer, *meowlib.ContactCard) { +func (id *Identity) InvitePeer(MyName string, ContactName string, MessageServerIdxs []int) (*Peer, *meowlib.ContactCard) { var peer Peer var myContactCard meowlib.ContactCard peer.Me = meowlib.NewKeyPair() peer.EncryptionKp = meowlib.NewKeyPair() peer.LookupKp = meowlib.NewKeyPair() - peer.Name = contactName - for _, i := range messageServerIdxs { + peer.Name = ContactName + for _, i := range MessageServerIdxs { srv := id.MessageServers.Servers[i].ServerData myContactCard.PullServers = append(myContactCard.PullServers, &srv) } - myContactCard.Name = myName + myContactCard.Name = MyName myContactCard.ContactPublicKey = peer.Me.Public myContactCard.EncryptionPublicKey = peer.EncryptionKp.Public myContactCard.LookupPublicKey = peer.LookupKp.Public @@ -50,8 +47,8 @@ func (id *Identity) InvitePeer(myName string, contactName string, messageServerI return &id.Peers[len(id.Peers)-1], &myContactCard } -func (*Identity) FinalizeInvitation(peer *Peer, receivedContact *meowlib.ContactCard) { - peer.Contact = *receivedContact +func (*Identity) FinalizeInvitation(peer *Peer, ReceivedContact *meowlib.ContactCard) { + peer.Contact = *ReceivedContact } diff --git a/client/peer.go b/client/peer.go index 0650ece..c799c16 100644 --- a/client/peer.go +++ b/client/peer.go @@ -7,16 +7,6 @@ import ( "forge.redroom.link/yves/meowlib" ) -/* -type ContactCard struct { - Name string `json:"name,omitempty"` - ContactPublicKey string `json:"contact_public_key,omitempty"` - EncryptionPublicKey string `json:"encryption_public_key,omitempty"` - LookupPublicKey string `json:"lookup_public_key,omitempty"` - PullServers []meowlib.Server `json:"pull_servers,omitempty"` -} -*/ - type Peer struct { Name string `json:"name,omitempty"` // Conversation []InternalMessage `json:"conversation,omitempty"` @@ -61,23 +51,23 @@ func (pl *PeerList) GetFromName(name string) *Peer { return nil } -func (p *Peer) AsymEncryptMessage(Message []byte) (lookupK string, EncryptedMsg []byte, Signature []byte, Servers []*meowlib.Server, err error) { - // prepares a message to send to a specific peer contact - EncryptedMsg, Signature, err = meowlib.EncryptAndSign(p.Contact.EncryptionPublicKey, p.Me.Private, Message) +// AsymEncryptMessage prepares a message to send to a specific peer contact +func (p *Peer) AsymEncryptMessage(Message []byte) (LookupPublicKey string, EncryptedMessage []byte, Signature []byte, Servers []*meowlib.Server, err error) { + EncryptedMessage, Signature, err = meowlib.EncryptAndSign(p.Contact.EncryptionPublicKey, p.Me.Private, Message) if err != nil { fmt.Println(err.Error()) return "", nil, nil, nil, err } - return p.LookupKp.Public, EncryptedMsg, Signature, p.Contact.PullServers, err + return p.LookupKp.Public, EncryptedMessage, Signature, p.Contact.PullServers, err } -func (p *Peer) AsymDecryptMessage(Message []byte, Signature []byte) (DecryptedMsg []byte, err error) { - // reads a message from a specific peer contact - DecryptedMsg, err = meowlib.DecryptAndCheck(p.Me.Private, p.Contact.ContactPublicKey, Message, Signature) +// AsymDecryptMessage reads a message from a specific peer contact +func (p *Peer) AsymDecryptMessage(Message []byte, Signature []byte) (DecryptedMessage []byte, err error) { + DecryptedMessage, err = meowlib.DecryptAndCheck(p.Me.Private, p.Contact.ContactPublicKey, Message, Signature) if err != nil { fmt.Println(err.Error()) return nil, err } - return DecryptedMsg, err + return DecryptedMessage, err } diff --git a/client/server.go b/client/server.go index cb2cffb..cb5e247 100644 --- a/client/server.go +++ b/client/server.go @@ -34,22 +34,22 @@ func (sl *InternalServerList) AddUrls(urls []string) { } } -func (ints *InternalServer) AsymEncryptMessage(Message []byte) (EncryptedMsg []byte, Signature []byte, err error) { - // prepares a message to send to a specific internal server - EncryptedMsg, Signature, err = meowlib.EncryptAndSign(ints.ServerData.PublicKey, ints.Me.Private, Message) +// AsymEncryptMessage prepares a message to send to a specific internal server +func (ints *InternalServer) AsymEncryptMessage(Message []byte) (EncryptedMessage []byte, Signature []byte, err error) { + EncryptedMessage, Signature, err = meowlib.EncryptAndSign(ints.ServerData.PublicKey, ints.Me.Private, Message) if err != nil { fmt.Println(err.Error()) return nil, nil, err } - return EncryptedMsg, Signature, err + return EncryptedMessage, Signature, err } -func (ints *InternalServer) AsymDecryptMessage(Message []byte, Signature []byte) (DecryptedMsg []byte, err error) { - // reads a message from a specific internal server - DecryptedMsg, err = meowlib.DecryptAndCheck(ints.Me.Private, ints.ServerData.PublicKey, Message, Signature) +// AsymDecryptMessage reads a message from a specific internal server +func (ints *InternalServer) AsymDecryptMessage(Message []byte, Signature []byte) (DecryptedMessage []byte, err error) { + DecryptedMessage, err = meowlib.DecryptAndCheck(ints.Me.Private, ints.ServerData.PublicKey, Message, Signature) if err != nil { fmt.Println(err.Error()) return nil, err } - return DecryptedMsg, err + return DecryptedMessage, err } diff --git a/contactcard.go b/contactcard.go index b6d7001..65b3f5c 100644 --- a/contactcard.go +++ b/contactcard.go @@ -20,14 +20,14 @@ func ServerFromUrl(url string) *Server { return &s } -func (contact *ContactCard) AddUrls(urls []string) { +func (Contact *ContactCard) AddUrls(urls []string) { for _, url := range urls { - contact.PullServers = append(contact.PullServers, ServerFromUrl(url)) + Contact.PullServers = append(Contact.PullServers, ServerFromUrl(url)) } } -func (contact *ContactCard) WritePng(filename string) { - jsonContact, _ := json.Marshal(contact) +func (Contact *ContactCard) WritePng(filename string) { + jsonContact, _ := json.Marshal(Contact) //imgdata := base64.StdEncoding.EncodeToString(jsonContact) size := int(math.Sqrt(float64(len(jsonContact))/3)) + 1 println(size) @@ -65,8 +65,8 @@ func (contact *ContactCard) WritePng(filename string) { } -func (contact *ContactCard) WriteQr(filename string) { - jsonContact, _ := json.Marshal(contact) +func (Contact *ContactCard) WriteQr(FileName string) { + jsonContact, _ := json.Marshal(Contact) qwriter := qrcode.NewQRCodeWriter() code, err := qwriter.Encode(string(jsonContact), gozxing.BarcodeFormat_QR_CODE, 512, 512, nil) if err != nil { @@ -81,8 +81,8 @@ func (contact *ContactCard) WriteQr(filename string) { } -func ReadQr(fielname string) ContactCard { - var contact ContactCard +func ReadQr(FileName string) ContactCard { + var Contact ContactCard // open and decode image file file, _ := os.Open("qrcode.jpg") img, _, _ := image.Decode(file) @@ -95,5 +95,5 @@ func ReadQr(fielname string) ContactCard { result, _ := qrReader.Decode(bmp, nil) fmt.Println(result) - return contact + return Contact } diff --git a/endtoend_test.go b/endtoend_test.go index 6bc2c1b..dbf66a1 100644 --- a/endtoend_test.go +++ b/endtoend_test.go @@ -15,21 +15,21 @@ func TestEndToEnd(t *testing.T) { // Create my own identity // fmt.Println("Trying to load identity from file.") - me, err := client.LoadIdentity("id.enc") + Me, err := client.LoadIdentity("id.enc") if err != nil { fmt.Println("Failed : creating New identity...") - me = client.CreateIdentity("myname") + Me = client.CreateIdentity("myname") // // define my preferences (servers) // - me.MessageServers.Name = "Message Servers" - me.MessageServers.AddUrls([]string{"http://127.0.0.1/meow/", "mqtt://127.0.0.1", "meow://127.0.0.1"}) + Me.MessageServers.Name = "Message Servers" + Me.MessageServers.AddUrls([]string{"http://127.0.0.1/meow/", "mqtt://127.0.0.1", "meow://127.0.0.1"}) // // create an invitation for a friend, I want him/her to know me as Bender // fmt.Println("Creating an invitation for the first friend...") - myFirstFriend, invitation := me.InvitePeer("Bender", "myfirstfriend", []int{1, 2}) + MyFirstFriend, invitation := Me.InvitePeer("Bender", "myfirstfriend", []int{1, 2}) // print my invitation a, _ := json.Marshal(invitation) fmt.Println(string(a)) @@ -38,17 +38,17 @@ func TestEndToEnd(t *testing.T) { // // Simulate peer invitation response : generate the friend's keypair fmt.Println("Simulating first friend answer...") - var receivedContact meowlib.ContactCard + var ReceivedContact meowlib.ContactCard // Friend simulated invitation - firstFriendContactKp := meowlib.NewKeyPair() - firstFriendEncryptionKp := meowlib.NewKeyPair() - firstFriendLookupKp := meowlib.NewKeyPair() - receivedContact.Name = "I'm the friend" - receivedContact.ContactPublicKey = firstFriendContactKp.Public - receivedContact.EncryptionPublicKey = firstFriendEncryptionKp.Public - receivedContact.LookupPublicKey = firstFriendLookupKp.Public - receivedContact.AddUrls([]string{"http://myfriend.org/meow/"}) + FirstFriendContactKp := meowlib.NewKeyPair() + FirstFriendEncryptionKp := meowlib.NewKeyPair() + FirstFriendLookupKp := meowlib.NewKeyPair() + ReceivedContact.Name = "I'm the friend" + ReceivedContact.ContactPublicKey = FirstFriendContactKp.Public + ReceivedContact.EncryptionPublicKey = FirstFriendEncryptionKp.Public + ReceivedContact.LookupPublicKey = FirstFriendLookupKp.Public + ReceivedContact.AddUrls([]string{"http://myfriend.org/meow/"}) // end Friend simulated invitation // End simulating contact invitation response @@ -57,19 +57,19 @@ func TestEndToEnd(t *testing.T) { // // Finalize the contact with the invitation response // - me.FinalizeInvitation(myFirstFriend, &receivedContact) - err = me.Save("id.enc") + Me.FinalizeInvitation(MyFirstFriend, &ReceivedContact) + err = Me.Save("id.enc") if err != nil { fmt.Println(err.Error()) } - a, _ = json.Marshal(me) + a, _ = json.Marshal(Me) ioutil.WriteFile("id.json", a, 0644) fmt.Println(string(a)) // create message to simulated friend sentmessage := "Hello friend!" - lookupK, EncMsg, MsgSignature, Servers, err := myFirstFriend.CreateMessage([]byte(sentmessage)) + lookupK, EncMsg, Signature, Servers, err := MyFirstFriend.AsymEncryptMessage([]byte(sentmessage)) if err != nil { fmt.Println(err.Error()) } @@ -81,12 +81,33 @@ func TestEndToEnd(t *testing.T) { // simulates if peer can decrypt my message //Message := "toto" //Signature := "test" - decMess, err2 := meowlib.DecryptAndCheck(myFirstFriend.EncryptionKp.Private, myFirstFriend.Contact.EncryptionPublicKey, []byte(EncMsg), MsgSignature) + decMess, err2 := MyFirstFriend.AsymDecryptMessage([]byte(EncMsg), Signature) if err2 != nil { fmt.Println(err2.Error()) } - fmt.Println(decMess) - // + fmt.Println("--- myFriend.decryptedMess = ", string(decMess)) + + // simulates a new server to send a message to + var intS1 client.InternalServer + intS1.ServerData.Name = "IntS1" + intS1.ServerData.Description = "Internal Serveur 1" + intS1.Me = meowlib.NewKeyPair() + intS1.ServerData.Url = "http://myfriend.org/meow/" + KP := meowlib.NewKeyPair() + intS1.ServerData.PublicKey = KP.Public + + // sends a message to server 1 + SrvEncrypted, SrvSign, err3 := intS1.AsymEncryptMessage([]byte(sentmessage)) + if err3 != nil { + fmt.Println(err3.Error()) + } + + // tests simulated server decrypted message + SrvDecrypted, err4 := intS1.AsymDecryptMessage(SrvEncrypted, SrvSign) + if err4 != nil { + fmt.Println(err4.Error()) + } + fmt.Println("--- SrvDecryptedMess = ", string(SrvDecrypted)) } } diff --git a/id.enc b/id.enc index cfa00d5..c5673ab 100644 --- a/id.enc +++ b/id.enc @@ -1,243 +1,243 @@ -----BEGIN PGP MESSAGE----- -Comment: https://gopenpgp.org Version: GopenPGP 2.2.4 +Comment: https://gopenpgp.org -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 -=zCs9 +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 +=ibSW -----END PGP MESSAGE----- \ No newline at end of file diff --git a/id.json b/id.json index cee582d..610207b 100644 --- a/id.json +++ b/id.json @@ -1 +1 @@ -{"nickname":"myname","public_key":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXc0VmR4WUpLd1lCQkFIYVJ3OEJBUWRBT0hkU1JiS1RNZFJlbHJGNjJTL2dISmZkamVMbEhIL1hDWEpDCmNJYjJQOHZOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTU9GWGNKa08wNnJra09obE9jRnFFRWpydHIKbGwvbVplRlJjMEo3N1RxdVNRNkdVNXdDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFMYVVCQUtscgozWm5zUFczVVlIM0g2ZHg5K0hsWGVkMmZXRWVpNFNTWnFGMElLd05oQVA5Mm1XcHIxYjY4ajF1VUpwNksrZFllCldITzlsWlJCSHFSKzZDTGRYQU1WRHM0NEJHTU9GWGNTQ2lzR0FRUUJsMVVCQlFFQkIwRDNXbTF3N0lWZXhwa2gKdXhkUWxaYW9OUHNzbUovWk4yUG1hZXY4aGV5UVZRTUJDZ25DZUFRWUZnZ0FLZ1VDWXc0VmR3bVE3VHF1U1E2RwpVNXdXb1FTT3UydVdYK1psNFZGelFudnRPcTVKRG9aVG5BSWJEQUFBZUxrQSt3ZGkxb3o4c0xqbHBXOGI0eXdOCm9ZVmwxV0lPQUFVK2lveVhoUTlZbXFkMEFQOTVIREVpbVVqYXdnWUJ1YmsreGlTTmRWc1hMNDYxK1ZWM2hGcksKR005SEJnPT0KPVFKeTUKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","private_key":"LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQpWZXJzaW9uOiBHb3BlblBHUCAyLjIuNApDb21tZW50OiBodHRwczovL2dvcGVucGdwLm9yZwoKeFZnRVl3NFZkeFlKS3dZQkJBSGFSdzhCQVFkQU9IZFNSYktUTWRSZWxyRjYyUy9nSEpmZGplTGxISC9YQ1hKQwpjSWIyUDhzQUFQOXRuOTFabEd1UVVxYWNOVkFYYW9jQzRtd3BuaUsyKzlsVmxlRS9aUFphN0JGZXpRdHVZVzFsCklEeHRZV2xzUHNLTUJCTVdDQUErQlFKakRoVjNDWkR0T3E1SkRvWlRuQmFoQkk2N2E1WmY1bVhoVVhOQ2UrMDYKcmtrT2hsT2NBaHNEQWg0QkFoa0JBd3NKQndJVkNBTVdBQUlDSWdFQUFDMmxBUUNwYTkyWjdEMXQxR0I5eCtuYwpmZmg1VjNuZG4xaEhvdUVrbWFoZENDc0RZUUQvZHBscWE5Vyt2STlibENhZWl2bldIbGh6dlpXVVFSNmtmdWdpCjNWd0RGUTdIWFFSakRoVjNFZ29yQmdFRUFaZFZBUVVCQVFkQTkxcHRjT3lGWHNhWklic1hVSldXcURUN0xKaWYKMlRkajVtbnIvSVhza0ZVREFRb0pBQUQvZXFZc3VvdE9taE9TeFpUNlFOTGxacjd6SlN2MUVuQjhzVXNVaFhDbQp4d0FSTThKNEJCZ1dDQUFxQlFKakRoVjNDWkR0T3E1SkRvWlRuQmFoQkk2N2E1WmY1bVhoVVhOQ2UrMDZya2tPCmhsT2NBaHNNQUFCNHVRRDdCMkxXalB5d3VPV2xieHZqTEEyaGhXWFZZZzRBQlQ2S2pKZUZEMWlhcDNRQS8za2MKTVNLWlNOckNCZ0c1dVQ3R0pJMTFXeGN2anJYNVZYZUVXc29ZejBjRwo9MG1QdQotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQ==","peers":[{"name":"myfirstfriend","me":{"public":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXc0VmR4WUpLd1lCQkFIYVJ3OEJBUWRBTlVMTWVnRmk0Z1BMVmdubXp6cWtHYkhGZEtnTzA3RzIzWUVzCjdzOEdOa3ZOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTU9GWGNKa0lZQUN2dnZ0eHlCRnFFRTZVWmMKdDlyRlVRdHdzMUZDaGdBSysrKzNISUVDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUF6SlVBL1JaRApiRTgyZnZBNDlnVnVnOWEydzQyQWFQeTlyVjlkdnZQNDNqV3RQRllYQVA5SHdwY2ZWYlBNOFR6ZGV0cm03L29PCjV1SUdaRTJpb1ArN29tS0x3Nlg4Q000NEJHTU9GWGNTQ2lzR0FRUUJsMVVCQlFFQkIwRDZ4WlJvclpmbmwrYjAKc2IxOVlrWTQrOXhPL2diZG8xa0VQcjJkbXFaOFBnTUJDZ25DZUFRWUZnZ0FLZ1VDWXc0VmR3bVFoZ0FLKysrMwpISUVXb1FUcFJseTMyc1ZSQzNDelVVS0dBQXI3NzdjY2dRSWJEQUFBY2EwQkFLSGh5UklBejhFZjlkVzhOUjRWCkpaci9YREZuTks5Rkp0T3pwSDZxN0FXUEFRRG4yblR6WjR3TjhYaWorMDdpU08xYVBtVkY3K0xlUmxmK1hsTTYKaFZOWkN3PT0KPXNaVzcKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","private":"LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQpWZXJzaW9uOiBHb3BlblBHUCAyLjIuNApDb21tZW50OiBodHRwczovL2dvcGVucGdwLm9yZwoKeFZnRVl3NFZkeFlKS3dZQkJBSGFSdzhCQVFkQU5VTE1lZ0ZpNGdQTFZnbm16enFrR2JIRmRLZ08wN0cyM1lFcwo3czhHTmtzQUFRQ0N6dlcvM3RIeWRwTXQxTzFMMXQwaXN6c3JHVHIyL1ZkWVI5S0lzUkUrc3hJZnpRdHVZVzFsCklEeHRZV2xzUHNLTUJCTVdDQUErQlFKakRoVjNDWkNHQUFyNzc3Y2NnUmFoQk9sR1hMZmF4VkVMY0xOUlFvWUEKQ3Z2dnR4eUJBaHNEQWg0QkFoa0JBd3NKQndJVkNBTVdBQUlDSWdFQUFNeVZBUDBXUTJ4UE5uN3dPUFlGYm9QVwp0c09OZ0dqOHZhMWZYYjd6K040MXJUeFdGd0QvUjhLWEgxV3p6UEU4M1hyYTV1LzZEdWJpQm1STm9xRC91NkppCmk4T2wvQWpIWFFSakRoVjNFZ29yQmdFRUFaZFZBUVVCQVFkQStzV1VhSzJYNTVmbTlMRzlmV0pHT1B2Y1R2NEcKM2FOWkJENjluWnFtZkQ0REFRb0pBQUQvWW9IZ2RvSFY0aERacFRDamtoSjdBQ2VKOG9PQkc5OWl2Y1BML25Jbgowd0FScDhKNEJCZ1dDQUFxQlFKakRoVjNDWkNHQUFyNzc3Y2NnUmFoQk9sR1hMZmF4VkVMY0xOUlFvWUFDdnZ2CnR4eUJBaHNNQUFCeHJRRUFvZUhKRWdEUHdSLzExYncxSGhVbG12OWNNV2MwcjBVbTA3T2tmcXJzQlk4QkFPZmEKZFBObmpBM3hlS1A3VHVKSTdWbytaVVh2NHQ1R1YvNWVVenFGVTFrTAo9SHRSMwotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQ==","generated":"2022-08-30T15:49:43.9615543+02:00"},"contact":{"name":"I'm the friend","contact_public_key":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXc0VmR4WUpLd1lCQkFIYVJ3OEJBUWRBSEtFeEtUWUh1Q1FHUUR6bkNwTHJvcm1FOUROeUN4cXEwM3lpCmxQbkVvemZOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTU9GWGNKa0NNZndzQXN0dTdnRnFFRWdzVEIKL1VPWmZlRmVJNE1wSXgvQ3dDeTI3dUFDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFJZE1CQUpDcApXWU1wVEVNNk5LQk02VWgzQlNudGpxajk1NmtyR1lCOW5xd1VmSTNlQVFEMytsR2txdDlxRDJaMnI3VzRNSHA0CjYyVjc5ejY2d3czb25YWUZxT1JkQ2M0NEJHTU9GWGNTQ2lzR0FRUUJsMVVCQlFFQkIwQnZoN3VZMEJiWEk4N2kKNXFJdGZyMDA5T0VFWThlRjBGNXZ6Vk85UjFNbU13TUJDZ25DZUFRWUZnZ0FLZ1VDWXc0VmR3bVFJeC9Dd0N5Mgo3dUFXb1FTQ3hNSDlRNWw5NFY0amd5a2pIOExBTExidTRBSWJEQUFBaHlFQS9pemxOMEJVUGFSOGZhRTlwdFlvClR4SnhYdGp0MFlLNm5qT0x3NnZ4dGVDMkFRRHlhQUtiRk5zK3Y2YWx0UVBjMk5yZXMwSmsvOTBTWVpLV2t4VkwKd1lVQUF3PT0KPU1EK0wKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","encryption_public_key":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXc0VmR4WUpLd1lCQkFIYVJ3OEJBUWRBMEFERXNKV1RnbEFqQ3RMRnpVaU5PaFcvcFc3c0lKMWV3S0J2ClN2N0RmZkROQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTU9GWGNKa082UzdHRmpjd0xORnFFRVVQUVgKUC9BTndqQUlwK292N3BMc1lXTnpBczBDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFCVFVCQUpldgo0UHMxd3RGdVhwU3RidDdGKzVYelNwNU44Q2IyeXowNlRLakZIV3BLQVFELytOQzRaWit4YW84clRESG9nWTJlCjRCYlplTzBwcnBvSkdocktuTkhRQzg0NEJHTU9GWGNTQ2lzR0FRUUJsMVVCQlFFQkIwQ2RVTU9oTFYxeWVaSjcKRFIzOXdYU2FhaDY4TE80aytSdW9tTVN0SnFydEZBTUJDZ25DZUFRWUZnZ0FLZ1VDWXc0VmR3bVE3cExzWVdOegpBczBXb1FSUTlCYy84QTNDTUFpbjZpL3VrdXhoWTNNQ3pRSWJEQUFBUTlnQkFMd1lCb3RpU2hXR3lacHB6TWExCko4T0FRd3ZETWRhUjRmM280YTFxOFYwVUFQOXIwdXEwTDBqRm5QVHJOaER5bUZGRkJEdlhuSTg1ZGpVWnZ5aEMKV1AwYUF3PT0KPTlEOEgKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","lookup_public_key":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXc0VmR4WUpLd1lCQkFIYVJ3OEJBUWRBajdBcVM5ck1BUzdQVEVZS05NUWtHTlpVM1ROZ0U2bVhLRXRxClV4dDl0cEhOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTU9GWGNKa1BZQzlVc2pneSs0RnFFRTF4WkMKb1hRNThJVkJST0tyOWdMMVN5T0RMN2dDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUF6WFFCQVB3TQp1ZmtJZnZZMkIxVUhGMDVSZzNrWkY0VXZWSkxyajV1eTBUWUxrSklkQVFETFNBZ0ZJcExRT1o2a25LK1o3cEs5Ckh4Q0l2elIrWEV1em43K2VDT3ZyQ2M0NEJHTU9GWGNTQ2lzR0FRUUJsMVVCQlFFQkIwQloxTzVFaWVYZC85bVkKWlA3bjR6Tmg1TWRGSk1pU0tCWmlaeDM2UzFROFl3TUJDZ25DZUFRWUZnZ0FLZ1VDWXc0VmR3bVE5Z0wxU3lPRApMN2dXb1FUWEZrS2hkRG53aFVGRTRxdjJBdlZMSTRNdnVBSWJEQUFBM29jQkFNOUgzclV4OVdsV3JJMEo5UHZjCm1vSmJtMFA4L0lLeE4rbGZjUHpQdWllNEFRQ0dsemM4T3ZQK0oxSjZORnV2NDlyQ3Q4QVNvSys4cWRHOGdZYm4KZFJSYUR3PT0KPUpIUUcKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","pull_servers":[{"Url":"http://myfriend.org/meow/"}]},"last_message":"0001-01-01T00:00:00Z","conversation_kp":{"public":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXc0VmR4WUpLd1lCQkFIYVJ3OEJBUWRBZlRvNnBSbVhPSTBFUTZ6UGZWeExxNDI3YThTVzhNMS9WLzdVCm9Oa3B2MmZOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTU9GWGNKa0hNcG9TQm0rbG1RRnFFRVNHTFMKQkloRzFiVmRMWFkxY3ltaElHYjZXWkFDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUEwN2NBLzExZwp4ZXR5dUtnNXdGV1p1cEtoZmhMV2MvaGdyQ1R6bk9SN3BvUXBoTkQwQVB3S1JrVldQSEFrYUtMbzJ4NVVVVVJ6CnM4SG4ra2ZiNjhWT2R4M3RDckp3QTg0NEJHTU9GWGNTQ2lzR0FRUUJsMVVCQlFFQkIwQXB6bmZxYUMzMWVEd04KbHN4c2dYL0lNQW1McTJZeFZqOGRlK2VMb1J1SFBRTUJDZ25DZUFRWUZnZ0FLZ1VDWXc0VmR3bVFjeW1oSUdiNgpXWkFXb1FSSVl0SUVpRWJWdFYwdGRqVnpLYUVnWnZwWmtBSWJEQUFBeUNrQS8zeEszZ1RGU1VmcW1RVVcrN1RNCkkwcFVFR3BsNU81elF1NDZ5RDZ0cW1YNkFQd0xGK2NpQ2V4Z1JPOG5HeFYwQWlibkRoMkNRSHV0bXpxSU1iY1UKcklIdkN3PT0KPUlWVzkKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","private":"LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQpWZXJzaW9uOiBHb3BlblBHUCAyLjIuNApDb21tZW50OiBodHRwczovL2dvcGVucGdwLm9yZwoKeFZnRVl3NFZkeFlKS3dZQkJBSGFSdzhCQVFkQWZUbzZwUm1YT0kwRVE2elBmVnhMcTQyN2E4U1c4TTEvVi83VQpvTmtwdjJjQUFRRGFmZ2ovWlZCck8yNXM1bkNWRzVQenhuMzJUclhQYVN3SWhmN05FaUZNc2hCS3pRdHVZVzFsCklEeHRZV2xzUHNLTUJCTVdDQUErQlFKakRoVjNDWkJ6S2FFZ1p2cFprQmFoQkVoaTBnU0lSdFcxWFMxMk5YTXAKb1NCbStsbVFBaHNEQWg0QkFoa0JBd3NKQndJVkNBTVdBQUlDSWdFQUFOTzNBUDlkWU1YcmNyaW9PY0JWbWJxUwpvWDRTMW5QNFlLd2s4NXprZTZhRUtZVFE5QUQ4Q2taRlZqeHdKR2lpNk5zZVZGRkVjN1BCNS9wSDIrdkZUbmNkCjdRcXljQVBIWFFSakRoVjNFZ29yQmdFRUFaZFZBUVVCQVFkQUtjNTM2bWd0OVhnOERaYk1iSUYveURBSmk2dG0KTVZZL0hYdm5pNkViaHowREFRb0pBQUQvVG1iU2xBUDV1eTYxckJ0dTNpL1ozWkRqS2dDOWlCZXVsRmZWcjBKMwpVZ0FRek1KNEJCZ1dDQUFxQlFKakRoVjNDWkJ6S2FFZ1p2cFprQmFoQkVoaTBnU0lSdFcxWFMxMk5YTXBvU0JtCitsbVFBaHNNQUFESUtRRC9mRXJlQk1WSlIrcVpCUmI3dE13alNsUVFhbVhrN25OQzdqcklQcTJxWmZvQS9Bc1gKNXlJSjdHQkU3eWNiRlhRQ0p1Y09IWUpBZTYyYk9vZ3h0eFNzZ2U4TAo9enFsbQotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQ==","generated":"2022-08-30T15:49:43.9620978+02:00"},"lookup_kp":{"public":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXc0VmR4WUpLd1lCQkFIYVJ3OEJBUWRBYXIwWmUrT3NpSk50cDd2d1RHQ3BIZ0tIaEVhRDF5bW9tUXFDCkNGTmc2OHpOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTU9GWGNKa05SUzJUUVkwanJQRnFFRS8ydFIKemllc0RJZEJNOWtBMUZMWk5CalNPczhDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFPSWdBLzNVTwpQL1djL2VSTmhnMXJCb2xEU3VBckEyeTF0NUR0K1BEMlR2U010M2Q5QVFDQ2hJQVRNVDJyUkZueDJ4VlJ0bkQyCk50cWdFVE1jS0dPQ0Q5Wjk4bmRXQ000NEJHTU9GWGNTQ2lzR0FRUUJsMVVCQlFFQkIwRGg3UnBQMC9LQ2VlaUUKaVFIT1hlQzVoclhmYXFlck00b2lENFA4K2IyOEhBTUJDZ25DZUFRWUZnZ0FLZ1VDWXc0VmR3bVExRkxaTkJqUwpPczhXb1FUL2ExSE9KNndNaDBFejJRRFVVdGswR05JNnp3SWJEQUFBcWJRQkFKdjV5U0c4VDVEZUdCMWxMV0d1CkRDTFpjNDRRODFMSmxrT1AvSkhQc0s5SEFQOWVqK3dsTnZXVU5MVWFicWNGUDFtV3FwNDBTUVBtWWs3R010QTQKZHdIREFnPT0KPUcyWFAKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","private":"LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQpWZXJzaW9uOiBHb3BlblBHUCAyLjIuNApDb21tZW50OiBodHRwczovL2dvcGVucGdwLm9yZwoKeFZnRVl3NFZkeFlKS3dZQkJBSGFSdzhCQVFkQWFyMFplK09zaUpOdHA3dndUR0NwSGdLSGhFYUQxeW1vbVFxQwpDRk5nNjh3QUFRRFhyMllFZTkxTWJHRTRHRFRPSnk2dWFGbTFlczRPdzBCeld3OWNTWU1zV0EwUHpRdHVZVzFsCklEeHRZV2xzUHNLTUJCTVdDQUErQlFKakRoVjNDWkRVVXRrMEdOSTZ6eGFoQlA5clVjNG5yQXlIUVRQWkFOUlMKMlRRWTBqclBBaHNEQWg0QkFoa0JBd3NKQndJVkNBTVdBQUlDSWdFQUFEaUlBUDkxRGovMW5QM2tUWVlOYXdhSgpRMHJnS3dOc3RiZVE3Zmp3OWs3MGpMZDNmUUVBZ29TQUV6RTlxMFJaOGRzVlViWnc5amJhb0JFekhDaGpnZy9XCmZmSjNWZ2pIWFFSakRoVjNFZ29yQmdFRUFaZFZBUVVCQVFkQTRlMGFUOVB5Z25ub2hJa0J6bDNndVlhMTMycW4KcXpPS0lnK0QvUG05dkJ3REFRb0pBQUQvYy9qVzJGdUg1cHNTcGZKVyttUlFxVGZla3BOcWR4V1VOSTNlTzN4Nwpnd2dSOGNKNEJCZ1dDQUFxQlFKakRoVjNDWkRVVXRrMEdOSTZ6eGFoQlA5clVjNG5yQXlIUVRQWkFOUlMyVFFZCjBqclBBaHNNQUFDcHRBRUFtL25KSWJ4UGtONFlIV1V0WWE0TUl0bHpqaER6VXNtV1E0LzhrYyt3cjBjQS8xNlAKN0NVMjlaUTB0UnB1cHdVL1daYXFualJKQStaaVRzWXkwRGgzQWNNQwo9RkFmSQotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQ==","generated":"2022-08-30T15:49:43.9620978+02:00"}}],"known_servers":{"Name":"","Servers":null},"message_servers":{"Name":"Message Servers","Servers":[{"server_data":{"Url":"http://127.0.0.1/meow/"},"last_check":"0001-01-01T00:00:00Z","me":{"generated":"0001-01-01T00:00:00Z"}},{"server_data":{"Url":"mqtt://127.0.0.1"},"last_check":"0001-01-01T00:00:00Z","me":{"generated":"0001-01-01T00:00:00Z"}},{"server_data":{"Url":"meow://127.0.0.1"},"last_check":"0001-01-01T00:00:00Z","me":{"generated":"0001-01-01T00:00:00Z"}}]}} \ No newline at end of file +{"nickname":"myname","public_key":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXhYL3dCWUpLd1lCQkFIYVJ3OEJBUWRBQWlkVTVvZ3R3dnIrOTBUN1BTUEptNmlGVU56ZWZuSmJHRmI0CjdhZjJTeHJOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTVYvOEFKa0ZSVU03SGdLS0xoRnFFRU9NbFkKREJmdk1odWJyM2VJVkZRenNlQW9vdUVDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFCeUFBL2lrbgpIWDdoOC9Ma0pIYzhDVDY3QVkyWUxteEEwZDMrdStuTEpUZitGN1MwQVA5bGRKNTVUYXBKYWU2aFJWWWJsMVgvCnVOMWFLQmYvTDlndVBtZUF2K3B5Q000NEJHTVYvOEFTQ2lzR0FRUUJsMVVCQlFFQkIwRDVtZzB3WjVNNGVydUEKcS92bXp2MjUzWTBRNEkzOXFpUFNsczc1ajZKR05BTUJDZ25DZUFRWUZnZ0FLZ1VDWXhYL3dBbVFWRlF6c2VBbwpvdUVXb1FRNHlWZ01GKzh5RzV1dmQ0aFVWRE94NENpaTRRSWJEQUFBVXJnQkFQcGJkYlV0MnlEQXk5YTBaQ2prCk5zY3NCV2FQaVpTblhEU3JvRTFJaGtBcUFQOURDVnBCV0ppNTRGeXNqcWxRY1ZORlAzckZPZ1JDZHJpRWlmNzIKY1IwaERBPT0KPVdyTncKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","private_key":"LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQpWZXJzaW9uOiBHb3BlblBHUCAyLjIuNApDb21tZW50OiBodHRwczovL2dvcGVucGdwLm9yZwoKeFZnRVl4WC93QllKS3dZQkJBSGFSdzhCQVFkQUFpZFU1b2d0d3ZyKzkwVDdQU1BKbTZpRlVOemVmbkpiR0ZiNAo3YWYyU3hvQUFRRHcrdGJ2M3RWTDJKd2xKUjBJZTd1ZnpQd2k2NWZ2MFlMeGJCMm5ySjJmcUJQRnpRdHVZVzFsCklEeHRZV2xzUHNLTUJCTVdDQUErQlFKakZmL0FDWkJVVkRPeDRDaWk0UmFoQkRqSldBd1g3eklibTY5M2lGUlUKTTdIZ0tLTGhBaHNEQWg0QkFoa0JBd3NKQndJVkNBTVdBQUlDSWdFQUFBY2dBUDRwSngxKzRmUHk1Q1IzUEFrKwp1d0dObUM1c1FOSGQvcnZweXlVMy9oZTB0QUQvWlhTZWVVMnFTV251b1VWV0c1ZFYvN2pkV2lnWC95L1lMajVuCmdML3FjZ2pIWFFSakZmL0FFZ29yQmdFRUFaZFZBUVVCQVFkQStab05NR2VUT0hxN2dLdjc1czc5dWQyTkVPQ04KL2FvajBwYk8rWStpUmpRREFRb0pBQUQvWkJ6V2M1SmdUbGo5Uk5JM0VhZ0dZdys1TWdBcWZiT2F5dlU1REJQbQpMQWdONjhKNEJCZ1dDQUFxQlFKakZmL0FDWkJVVkRPeDRDaWk0UmFoQkRqSldBd1g3eklibTY5M2lGUlVNN0hnCktLTGhBaHNNQUFCU3VBRUErbHQxdFMzYklNREwxclJrS09RMnh5d0ZabytKbEtkY05LdWdUVWlHUUNvQS8wTUoKV2tGWW1MbmdYS3lPcVZCeFUwVS9lc1U2QkVKMnVJU0ovdlp4SFNFTQo9U01GQgotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQ==","peers":[{"name":"myfirstfriend","me":{"public":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXhYL3dCWUpLd1lCQkFIYVJ3OEJBUWRBOHdQM2FZODNZTW0xWnMwNHJQQTJybXFaMnBRdTBiTzZIK0VWCkw4dldsd0hOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTVYvOEFKa0YzVTF2OUxSNDJvRnFFRUVrbE4KQ041bjJlR0pJM2d3WGRUVy8wdEhqYWdDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUF1ZnNCQUl6cwo1VHg3Uldwdm1xR3MyRmR3bGhwVm9lNVc2QXAwNDBJWGZzRXhJUUpBQVA5eXJsbk1DN2hiZnUvTUtsd05XaS9aCkpQSC84TjNXcmZCUzZGTWJheWpXRE00NEJHTVYvOEFTQ2lzR0FRUUJsMVVCQlFFQkIwRDRSaDU1MjArblVVYlkKQ3o5bCtvdW9EODRXaGhZSDcyMm9ucm1uMWYxNGFBTUJDZ25DZUFRWUZnZ0FLZ1VDWXhYL3dBbVFYZFRXLzB0SApqYWdXb1FRU1NVMEkzbWZaNFlramVEQmQxTmIvUzBlTnFBSWJEQUFBRE5VQS8zZFgvenVXaWUvakhJbXYyQzVyCnVISWpSSDZIN2lMV1RqMUo4M2huUXZaRkFRQ2RpWUZEZyt6NVg0cWtuMUpnV3BzU0RZaXJSbGxib3daekVlZ0EKUXRNY0FBPT0KPWtBVHMKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","private":"LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQpWZXJzaW9uOiBHb3BlblBHUCAyLjIuNApDb21tZW50OiBodHRwczovL2dvcGVucGdwLm9yZwoKeFZnRVl4WC93QllKS3dZQkJBSGFSdzhCQVFkQTh3UDNhWTgzWU1tMVpzMDRyUEEycm1xWjJwUXUwYk82SCtFVgpMOHZXbHdFQUFQNHlJY3ZTUzFkZWE1d1RqUlh0QmFyYndMRUcyM29NNVYzTml3eVl0UEdyNGhGcHpRdHVZVzFsCklEeHRZV2xzUHNLTUJCTVdDQUErQlFKakZmL0FDWkJkMU5iL1MwZU5xQmFoQkJKSlRRamVaOW5oaVNONE1GM1UKMXY5TFI0Mm9BaHNEQWg0QkFoa0JBd3NKQndJVkNBTVdBQUlDSWdFQUFMbjdBUUNNN09VOGUwVnFiNXFock5oWApjSllhVmFIdVZ1Z0tkT05DRjM3Qk1TRUNRQUQvY3E1WnpBdTRXMzd2ekNwY0RWb3YyU1R4Ly9EZDFxM3dVdWhUCkcyc28xZ3pIWFFSakZmL0FFZ29yQmdFRUFaZFZBUVVCQVFkQStFWWVlZHRQcDFGRzJBcy9aZnFMcUEvT0ZvWVcKQis5dHFKNjVwOVg5ZUdnREFRb0pBQUQvWEZRYUcwdjgwcFl5TGdGQ0pzVTFVY2RLclB1YU5BSDJxZzBEWmoyTQpMZ0FOTzhKNEJCZ1dDQUFxQlFKakZmL0FDWkJkMU5iL1MwZU5xQmFoQkJKSlRRamVaOW5oaVNONE1GM1UxdjlMClI0Mm9BaHNNQUFBTTFRRC9kMWYvTzVhSjcrTWNpYS9ZTG11NGNpTkVmb2Z1SXRaT1BVbnplR2RDOWtVQkFKMkoKZ1VPRDdQbGZpcVNmVW1CYW14SU5pS3RHV1Z1akJuTVI2QUJDMHh3QQo9elQ4WgotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQ==","generated":"2022-09-05T15:55:12.6250272+02:00"},"conversation_kp":{"public":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXhYL3dCWUpLd1lCQkFIYVJ3OEJBUWRBSWNKR2YxMVB6MDlMcWJLaytmRWRGR2lJVzBRSml5NytPYmZYCkVOcEYwVHJOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTVYvOEFKa0hPbUpZVi9MWkE0RnFFRTBlVTUKaERZVk5YVjdjUGVaYzZZbGhYOHRrRGdDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFCWWNBLzNtRAorMDhlU2hCVDk2S3BaRmxQN0thc3JQcENRUWdBWE9JOVZlMVdiM09yQVB3TnpvWk5SUW05blNoa0EwOXhzZjY2ClZUbnM1SXZYclpBL01MRklySTBSQ2M0NEJHTVYvOEFTQ2lzR0FRUUJsMVVCQlFFQkIwQmJ6RXZSdGIwaFI5L3IKUGZmOHNBRURzMmllRTMxbFZUNFNPVlNnRFdZVVJRTUJDZ25DZUFRWUZnZ0FLZ1VDWXhYL3dBbVFjNllsaFg4dAprRGdXb1FUUjVUbUVOaFUxZFh0dzk1bHpwaVdGZnkyUU9BSWJEQUFBOWJRQkFLaEg1ZnM0T2MrZFRzTEJGaUh4CmpseTVJZ3JSSytsNW9hNjZyTDQrVGh1TkFQOTJqVVh6NVQyTXNMR25DU0Nnc2IveTAzWnhkbnF5NmNpMVVlWUwKMktyaEF3PT0KPVJTWGkKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","private":"LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQpWZXJzaW9uOiBHb3BlblBHUCAyLjIuNApDb21tZW50OiBodHRwczovL2dvcGVucGdwLm9yZwoKeFZnRVl4WC93QllKS3dZQkJBSGFSdzhCQVFkQUljSkdmMTFQejA5THFiS2srZkVkRkdpSVcwUUppeTcrT2JmWApFTnBGMFRvQUFQOWp3Y1c1Y2RyU2J6L1NOQ3k5UWszOWlmV3JpNTBJMG93TDNjU3pCQ2xIeFJJMnpRdHVZVzFsCklEeHRZV2xzUHNLTUJCTVdDQUErQlFKakZmL0FDWkJ6cGlXRmZ5MlFPQmFoQk5IbE9ZUTJGVFYxZTNEM21YT20KSllWL0xaQTRBaHNEQWg0QkFoa0JBd3NKQndJVkNBTVdBQUlDSWdFQUFBV0hBUDk1Zy90UEhrb1FVL2VpcVdSWgpUK3ltckt6NlFrRUlBRnppUFZYdFZtOXpxd0Q4RGM2R1RVVUp2WjBvWkFOUGNiSCt1bFU1N09TTDE2MlFQekN4ClNLeU5FUW5IWFFSakZmL0FFZ29yQmdFRUFaZFZBUVVCQVFkQVc4eEwwYlc5SVVmZjZ6MzMvTEFCQTdOb25oTjkKWlZVK0VqbFVvQTFtRkVVREFRb0pBQUQvVWo4eUpYdnlXT0NvcE9uYkVFL3VKQXVMcXBpdkp4ODg2MzA3OE04bApVZ2dQOThKNEJCZ1dDQUFxQlFKakZmL0FDWkJ6cGlXRmZ5MlFPQmFoQk5IbE9ZUTJGVFYxZTNEM21YT21KWVYvCkxaQTRBaHNNQUFEMXRBRUFxRWZsK3pnNXo1MU93c0VXSWZHT1hMa2lDdEVyNlhtaHJycXN2ajVPRzQwQS8zYU4KUmZQbFBZeXdzYWNKSUtDeHYvTFRkbkYyZXJMcHlMVlI1Z3ZZcXVFRAo9ZlM0aAotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQ==","generated":"2022-09-05T15:55:12.6250272+02:00"},"lookup_kp":{"public":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXhYL3dCWUpLd1lCQkFIYVJ3OEJBUWRBdXE3OEd5Z3hxaDc5amdvcTJ5THo2dE5QZzQ0MGxVRUc3SzFxCkJSRjY2Mm5OQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTVYvOEFKa05SL2x2N2UvaTlGRnFFRUljR0QKc3Q1MWVLVjd0YW9SMUgrVy90NytMMFVDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFERUlBLzFYTwp3aWp5U1RnOU12UXdRMnFBUFlqSGZCS2xsMFp6SjhQNVZBUzI2TnVaQVFDSlpaa0RKb0hDK04yUlU3aHNCbFAxCktCTFcyUHoxNVhoVkJGT2dpaTJ3Qzg0NEJHTVYvOEFTQ2lzR0FRUUJsMVVCQlFFQkIwRFdLWG9DeTE0SWQxcXYKdUY4ZVVPV1lkUU5KWldvdEh1S09WSjdERVdib0pBTUJDZ25DZUFRWUZnZ0FLZ1VDWXhYL3dBbVExSCtXL3Q3KwpMMFVXb1FRaHdZT3kzblY0cFh1MXFoSFVmNWIrM3Y0dlJRSWJEQUFBSURZQkFMVnFhSENzV3QreWJkMUNOZjR5CkMxR0h5VXd1eEJVUW1LbktRRG1vUjNXckFRQ2szTUVKL0hJQ3JTSHFCNkxLOU05UnJtUkdHYUw2bUtrTDlHeDQKcG1yekJ3PT0KPXJSck8KLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","private":"LS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQpDb21tZW50OiBodHRwczovL2dvcGVucGdwLm9yZwpWZXJzaW9uOiBHb3BlblBHUCAyLjIuNAoKeFZnRVl4WC93QllKS3dZQkJBSGFSdzhCQVFkQXVxNzhHeWd4cWg3OWpnb3EyeUx6NnROUGc0NDBsVUVHN0sxcQpCUkY2NjJrQUFRQytOU01XOUtKL1JGby9Sd2U4NzV1QUxpbFFxR1EyemVIWU1kQ1FRWTdxeHcrenpRdHVZVzFsCklEeHRZV2xzUHNLTUJCTVdDQUErQlFKakZmL0FDWkRVZjViKzN2NHZSUmFoQkNIQmc3TGVkWGlsZTdXcUVkUi8KbHY3ZS9pOUZBaHNEQWg0QkFoa0JBd3NKQndJVkNBTVdBQUlDSWdFQUFBeENBUDlWenNJbzhrazRQVEwwTUVOcQpnRDJJeDN3U3BaZEdjeWZEK1ZRRXR1amJtUUVBaVdXWkF5YUJ3dmpka1ZPNGJBWlQ5U2dTMXRqODllVjRWUVJUCm9Jb3RzQXZIWFFSakZmL0FFZ29yQmdFRUFaZFZBUVVCQVFkQTFpbDZBc3RlQ0hkYXI3aGZIbERsbUhVRFNXVnEKTFI3aWpsU2V3eEZtNkNRREFRb0pBQUQvY2JKcW9XSmlIL0JVRXA2YkZCdi85bTBTU3ZZaXNCUjRTdVI5Wjc2NwpHUWdQak1KNEJCZ1dDQUFxQlFKakZmL0FDWkRVZjViKzN2NHZSUmFoQkNIQmc3TGVkWGlsZTdXcUVkUi9sdjdlCi9pOUZBaHNNQUFBZ05nRUF0V3BvY0t4YTM3SnQzVUkxL2pJTFVZZkpUQzdFRlJDWXFjcEFPYWhIZGFzQkFLVGMKd1FuOGNnS3RJZW9Ib3NyMHoxR3VaRVlab3ZxWXFRdjBiSGltYXZNSAo9cXg2YwotLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLQ==","generated":"2022-09-05T15:55:12.6255401+02:00"},"contact":{"name":"I'm the friend","contact_public_key":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXhYL3dCWUpLd1lCQkFIYVJ3OEJBUWRBMFU4L21uOG03UlNCTHZFNDEzeGczSGlwWGxOWTdGUGgwVHhWCnlzUGxOOWZOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTVYvOEFKa09tWlp3L0I0QnpBRnFFRTNrb3oKME1zZVh2WjJmV09LNlpsbkQ4SGdITUFDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFNVWNCQUk3awpwcmY0STF6UGhHTmpOb09IenFsUnVlWlZEYW9zTFc1Mmc5MlU0TGpqQVFDWVZ3N2NDV3VvbEpQVXNxWno0NUNvClFRamVYRzVKOVRESEtsdjJKSXZLQWM0NEJHTVYvOEFTQ2lzR0FRUUJsMVVCQlFFQkIwQ1lOVjRyV3VEbEFMcHYKVVlTWHMwOUtDRDFkUWEwSFl4L3A1TXF4M2krS0dnTUJDZ25DZUFRWUZnZ0FLZ1VDWXhYL3dBbVE2WmxuRDhIZwpITUFXb1FUZVNqUFF5eDVlOW5aOVk0cnBtV2NQd2VBY3dBSWJEQUFBUktrQkFKVWNDcS8wRlREeWNpTE5sOEdECjcvWElySEkwNDVNcWcvTVZLUkVYdWtNYUFRQ0c5UzJ0akQxazBEdmlhcXBjTnhEV0tOUGxaVjFDWXVwWGFIVjUKWVJPY0N3PT0KPWdyaWMKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","encryption_public_key":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXhYL3dCWUpLd1lCQkFIYVJ3OEJBUWRBZk43ZUJsMXdGbkZ6NDQwNVpWUzU4S3BTUEpvQ25jQWd4K1NqClg1OVhOdjdOQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTVYvOEFKa0RIby9BVWZEejd4RnFFRWRXTmgKVm5wME1iMWttYXlRTWVqOEJSOFBQdkVDR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFLdW9BL2ozQwp4V09UQWdhVXNWSDBpTHhuTFcrU1IyQU14alFYbmxHMmJmMU1VNkVVQVA5b2YxTUduaVY0UWtZVVU0cDRwMnpFCmg5bHFrSjRSZUg4TWluWkt1NERWQ2M0NEJHTVYvOEFTQ2lzR0FRUUJsMVVCQlFFQkIwQU8vWTEwRjU1ZWhSTkUKVUt3Z1lidEdXUTBYME9zMFFyQjk2SGFqNUR0R1ZRTUJDZ25DZUFRWUZnZ0FLZ1VDWXhYL3dBbVFNZWo4QlI4UApQdkVXb1FSMVkyRldlblF4dldTWnJKQXg2UHdGSHc4KzhRSWJEQUFBTGlvQS9pVGdZejVUcXprSlA0U1ZobzVECjVoSEN2UFF2WExLdHdGQVZoRW8ycDBaNEFRQ3cwQUtuanZ5RnY0RkRxdzB1QUhCclZheUNPekUxNFpSSGxZSGQKV1hYZkRnPT0KPTArN1YKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","lookup_public_key":"LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tClZlcnNpb246IEdvcGVuUEdQIDIuMi40CkNvbW1lbnQ6IGh0dHBzOi8vZ29wZW5wZ3Aub3JnCgp4ak1FWXhYL3dCWUpLd1lCQkFIYVJ3OEJBUWRBVnB6aVg2cUxlcmMwMDVqcFd1NU9ObDc2ZU1ZWWFtcHhuS1pGCkJvZWg1OG5OQzI1aGJXVWdQRzFoYVd3K3dvd0VFeFlJQUQ0RkFtTVYvOEFKa01YTVBzZTFTMEpqRnFFRXpNajkKWTRyWTR3SUh3enV4eGN3K3g3VkxRbU1DR3dNQ0hnRUNHUUVEQ3drSEFoVUlBeFlBQWdJaUFRQUFMak1CQU95ZgpCb3lOem9WYnc0QlZUL0RTN3ZIQ0c2bHpVSDZjdWswUkhUdWp1VmM2QVFDK1NKWDNhRnJuQVM1VVB5WFVTSWlrCnpZTXJEek9XbHlzNVJRZFF1MW5nQmM0NEJHTVYvOEFTQ2lzR0FRUUJsMVVCQlFFQkIwQ2dLT2NiQXBCeG1xeFAKYTJEb05VWmxFYm9XUUhHNzRUV3JES1c2V0JXNEhRTUJDZ25DZUFRWUZnZ0FLZ1VDWXhYL3dBbVF4Y3creDdWTApRbU1Xb1FUTXlQMWppdGpqQWdmRE83SEZ6RDdIdFV0Q1l3SWJEQUFBd0NvQS8xdTBHb1VmeWZwNUg4L2djL1pPCmt2QVpMOFBBMmdhdG0rVlpiQmxEcXNXRkFQd01PamVZMDFXWkFIdkozVHZpcXNOcll1SGxEU0dIWU1QNGZycUkKc093bkRnPT0KPXQzRVoKLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQ==","pull_servers":[{"Url":"http://myfriend.org/meow/"}]},"last_message":"0001-01-01T00:00:00Z"}],"known_servers":{"Name":"","Servers":null},"message_servers":{"Name":"Message Servers","Servers":[{"server_data":{"Url":"http://127.0.0.1/meow/"},"last_check":"0001-01-01T00:00:00Z","me":{"generated":"0001-01-01T00:00:00Z"}},{"server_data":{"Url":"mqtt://127.0.0.1"},"last_check":"0001-01-01T00:00:00Z","me":{"generated":"0001-01-01T00:00:00Z"}},{"server_data":{"Url":"meow://127.0.0.1"},"last_check":"0001-01-01T00:00:00Z","me":{"generated":"0001-01-01T00:00:00Z"}}]}} \ No newline at end of file diff --git a/messages.pb.go b/messages.pb.go index 6910b85..568d3bf 100644 --- a/messages.pb.go +++ b/messages.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 -// protoc v3.6.1 +// protoc-gen-go v1.28.1 +// protoc v3.21.5 // source: messages.proto package meowlib @@ -26,9 +26,9 @@ type PackedServerMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - From string `protobuf:"bytes,1,opt,name=From,proto3" json:"From,omitempty"` - Payload []byte `protobuf:"bytes,2,opt,name=Payload,proto3" json:"Payload,omitempty"` - Signature []byte `protobuf:"bytes,3,opt,name=Signature,proto3" json:"Signature,omitempty"` + From string `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"` + Payload []byte `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` + Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` } func (x *PackedServerMessage) Reset() { @@ -162,13 +162,13 @@ type ToServerMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"` // Type - ServerPubKey string `protobuf:"bytes,2,opt,name=ServerPubKey,proto3" json:"ServerPubKey,omitempty"` // My pub key for the server to send me an encrypter answer - Payload []byte `protobuf:"bytes,3,opt,name=Payload,proto3" json:"Payload,omitempty"` // optional payload for server - PullRequest []*ToServerMessage_ConversationRequest `protobuf:"bytes,7,rep,name=PullRequest,proto3" json:"PullRequest,omitempty"` - Messages []*ToServerMessage_PostedMessage `protobuf:"bytes,9,rep,name=Messages,proto3" json:"Messages,omitempty"` - NextServerKey string `protobuf:"bytes,10,opt,name=NextServerKey,proto3" json:"NextServerKey,omitempty"` - Url string `protobuf:"bytes,11,opt,name=Url,proto3" json:"Url,omitempty"` + Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"` // Type + ServerPublicKey string `protobuf:"bytes,2,opt,name=ServerPublicKey,proto3" json:"ServerPublicKey,omitempty"` // My pub key for the server to send me an encrypter answer + Payload []byte `protobuf:"bytes,3,opt,name=Payload,proto3" json:"Payload,omitempty"` // optional payload for server + PullRequest []*ToServerMessage_ConversationRequest `protobuf:"bytes,7,rep,name=PullRequest,proto3" json:"PullRequest,omitempty"` + Messages []*ToServerMessage_PostedMessage `protobuf:"bytes,9,rep,name=Messages,proto3" json:"Messages,omitempty"` + NextServerKey string `protobuf:"bytes,10,opt,name=NextServerKey,proto3" json:"NextServerKey,omitempty"` + Url string `protobuf:"bytes,11,opt,name=Url,proto3" json:"Url,omitempty"` } func (x *ToServerMessage) Reset() { @@ -210,9 +210,9 @@ func (x *ToServerMessage) GetType() string { return "" } -func (x *ToServerMessage) GetServerPubKey() string { +func (x *ToServerMessage) GetServerPublicKey() string { if x != nil { - return x.ServerPubKey + return x.ServerPublicKey } return "" } @@ -448,10 +448,10 @@ type ContactCard struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ContactPublicKey string `protobuf:"bytes,2,opt,name=contactPublicKey,proto3" json:"contactPublicKey,omitempty"` - EncryptionPublicKey string `protobuf:"bytes,3,opt,name=encryptionPublicKey,proto3" json:"encryptionPublicKey,omitempty"` - LookupPublicKey string `protobuf:"bytes,4,opt,name=lookupPublicKey,proto3" json:"lookupPublicKey,omitempty"` + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + ContactPublicKey string `protobuf:"bytes,2,opt,name=ContactPublicKey,proto3" json:"ContactPublicKey,omitempty"` + EncryptionPublicKey string `protobuf:"bytes,3,opt,name=EncryptionPublicKey,proto3" json:"EncryptionPublicKey,omitempty"` + LookupPublicKey string `protobuf:"bytes,4,opt,name=LookupPublicKey,proto3" json:"LookupPublicKey,omitempty"` PullServers []*Server `protobuf:"bytes,5,rep,name=PullServers,proto3" json:"PullServers,omitempty"` } @@ -527,8 +527,8 @@ type MinimalContact struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PublicKey string `protobuf:"bytes,2,opt,name=publicKey,proto3" json:"publicKey,omitempty"` + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + PublicKey string `protobuf:"bytes,2,opt,name=PublicKey,proto3" json:"PublicKey,omitempty"` TrustedServers []*Server `protobuf:"bytes,3,rep,name=TrustedServers,proto3" json:"TrustedServers,omitempty"` } @@ -590,13 +590,13 @@ type UserMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Destination string `protobuf:"bytes,1,opt,name=Destination,proto3" json:"Destination,omitempty"` - From string `protobuf:"bytes,2,opt,name=From,proto3" json:"From,omitempty"` - Type string `protobuf:"bytes,3,opt,name=Type,proto3" json:"Type,omitempty"` - Data []byte `protobuf:"bytes,4,opt,name=Data,proto3" json:"Data,omitempty"` - Status *UserMessage_ConversationStatus `protobuf:"bytes,5,opt,name=Status,proto3" json:"Status,omitempty"` - Contact *MinimalContact `protobuf:"bytes,6,opt,name=contact,proto3" json:"contact,omitempty"` - Group *UserMessage_Group `protobuf:"bytes,7,opt,name=group,proto3" json:"group,omitempty"` + Destination string `protobuf:"bytes,1,opt,name=Destination,proto3" json:"Destination,omitempty"` + From string `protobuf:"bytes,2,opt,name=From,proto3" json:"From,omitempty"` + Type string `protobuf:"bytes,3,opt,name=Type,proto3" json:"Type,omitempty"` + Data []byte `protobuf:"bytes,4,opt,name=Data,proto3" json:"Data,omitempty"` + Status *UserMessage_ConversationStatus `protobuf:"bytes,5,opt,name=Status,proto3" json:"Status,omitempty"` + Contact *MinimalContact `protobuf:"bytes,6,opt,name=Contact,proto3" json:"Contact,omitempty"` + DestinationGroup *UserMessage_Group `protobuf:"bytes,7,opt,name=DestinationGroup,proto3" json:"DestinationGroup,omitempty"` } func (x *UserMessage) Reset() { @@ -673,9 +673,9 @@ func (x *UserMessage) GetContact() *MinimalContact { return nil } -func (x *UserMessage) GetGroup() *UserMessage_Group { +func (x *UserMessage) GetDestinationGroup() *UserMessage_Group { if x != nil { - return x.Group + return x.DestinationGroup } return nil } @@ -685,10 +685,10 @@ type ToServerMessage_ConversationRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LookupKey string `protobuf:"bytes,1,opt,name=lookupKey,proto3" json:"lookupKey,omitempty"` // lookup key for a conversation + LookupKey string `protobuf:"bytes,1,opt,name=LookupKey,proto3" json:"LookupKey,omitempty"` // lookup key for a conversation LastServerUuidOK string `protobuf:"bytes,2,opt,name=LastServerUuidOK,proto3" json:"LastServerUuidOK,omitempty"` // Last Server message UUID received (send me all after that one) PublishOnline bool `protobuf:"varint,3,opt,name=PublishOnline,proto3" json:"PublishOnline,omitempty"` // ?? Publish my online status for that contact ? - LookupSignature string `protobuf:"bytes,4,opt,name=lookupSignature,proto3" json:"lookupSignature,omitempty"` // prove that I own the private key by signing that block + LookupSignature string `protobuf:"bytes,4,opt,name=LookupSignature,proto3" json:"LookupSignature,omitempty"` // prove that I own the private key by signing that block } func (x *ToServerMessage_ConversationRequest) Reset() { @@ -756,7 +756,7 @@ type ToServerMessage_PostedMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LookupKey string `protobuf:"bytes,1,opt,name=lookupKey,proto3" json:"lookupKey,omitempty"` + LookupKey string `protobuf:"bytes,1,opt,name=LookupKey,proto3" json:"LookupKey,omitempty"` Messages []*PackedUserMessage `protobuf:"bytes,2,rep,name=Messages,proto3" json:"Messages,omitempty"` } @@ -858,7 +858,7 @@ type FromServerMessage_PostedMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LookupKey string `protobuf:"bytes,1,opt,name=lookupKey,proto3" json:"lookupKey,omitempty"` + LookupKey string `protobuf:"bytes,1,opt,name=LookupKey,proto3" json:"LookupKey,omitempty"` Messages []*PackedUserMessage `protobuf:"bytes,2,rep,name=Messages,proto3" json:"Messages,omitempty"` } @@ -913,17 +913,17 @@ type UserMessage_ConversationStatus struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LocalUuid string `protobuf:"bytes,1,opt,name=LocalUuid,proto3" json:"LocalUuid,omitempty"` - LocalSequence uint64 `protobuf:"varint,2,opt,name=LocalSequence,proto3" json:"LocalSequence,omitempty"` - Sent uint64 `protobuf:"varint,3,opt,name=Sent,proto3" json:"Sent,omitempty"` - Received uint64 `protobuf:"varint,4,opt,name=Received,proto3" json:"Received,omitempty"` - Processed uint64 `protobuf:"varint,5,opt,name=Processed,proto3" json:"Processed,omitempty"` - NextCkey string `protobuf:"bytes,6,opt,name=NextCkey,proto3" json:"NextCkey,omitempty"` // contact key - NextCkeyAck bool `protobuf:"varint,7,opt,name=NextCkeyAck,proto3" json:"NextCkeyAck,omitempty"` // false when proposing a new id, true for accepting it - NextEkey string `protobuf:"bytes,8,opt,name=NextEkey,proto3" json:"NextEkey,omitempty"` // encryption key - NextKeyEkeyAck bool `protobuf:"varint,9,opt,name=NextKeyEkeyAck,proto3" json:"NextKeyEkeyAck,omitempty"` // false when proposing a new key, true for accpeting it - NextLkey string `protobuf:"bytes,10,opt,name=NextLkey,proto3" json:"NextLkey,omitempty"` // lookup key - NextLkeyAck bool `protobuf:"varint,11,opt,name=NextLkeyAck,proto3" json:"NextLkeyAck,omitempty"` // false when proposing a new id, true for accepting it + LocalUuid string `protobuf:"bytes,1,opt,name=LocalUuid,proto3" json:"LocalUuid,omitempty"` + LocalSequence uint64 `protobuf:"varint,2,opt,name=LocalSequence,proto3" json:"LocalSequence,omitempty"` + Sent uint64 `protobuf:"varint,3,opt,name=Sent,proto3" json:"Sent,omitempty"` + Received uint64 `protobuf:"varint,4,opt,name=Received,proto3" json:"Received,omitempty"` + Processed uint64 `protobuf:"varint,5,opt,name=Processed,proto3" json:"Processed,omitempty"` + NextContactKey string `protobuf:"bytes,6,opt,name=NextContactKey,proto3" json:"NextContactKey,omitempty"` // contact key + NextCcontactKeyAck bool `protobuf:"varint,7,opt,name=NextCcontactKeyAck,proto3" json:"NextCcontactKeyAck,omitempty"` // false when proposing a new id, true for accepting it + NextEncryptionKey string `protobuf:"bytes,8,opt,name=NextEncryptionKey,proto3" json:"NextEncryptionKey,omitempty"` // encryption key + NextKeyEncryptionKeyAck bool `protobuf:"varint,9,opt,name=NextKeyEncryptionKeyAck,proto3" json:"NextKeyEncryptionKeyAck,omitempty"` // false when proposing a new key, true for accpeting it + NextLookupKey string `protobuf:"bytes,10,opt,name=NextLookupKey,proto3" json:"NextLookupKey,omitempty"` // lookup key + NextLookupKeyAck bool `protobuf:"varint,11,opt,name=NextLookupKeyAck,proto3" json:"NextLookupKeyAck,omitempty"` // false when proposing a new id, true for accepting it } func (x *UserMessage_ConversationStatus) Reset() { @@ -993,44 +993,44 @@ func (x *UserMessage_ConversationStatus) GetProcessed() uint64 { return 0 } -func (x *UserMessage_ConversationStatus) GetNextCkey() string { +func (x *UserMessage_ConversationStatus) GetNextContactKey() string { if x != nil { - return x.NextCkey + return x.NextContactKey } return "" } -func (x *UserMessage_ConversationStatus) GetNextCkeyAck() bool { +func (x *UserMessage_ConversationStatus) GetNextCcontactKeyAck() bool { if x != nil { - return x.NextCkeyAck + return x.NextCcontactKeyAck } return false } -func (x *UserMessage_ConversationStatus) GetNextEkey() string { +func (x *UserMessage_ConversationStatus) GetNextEncryptionKey() string { if x != nil { - return x.NextEkey + return x.NextEncryptionKey } return "" } -func (x *UserMessage_ConversationStatus) GetNextKeyEkeyAck() bool { +func (x *UserMessage_ConversationStatus) GetNextKeyEncryptionKeyAck() bool { if x != nil { - return x.NextKeyEkeyAck + return x.NextKeyEncryptionKeyAck } return false } -func (x *UserMessage_ConversationStatus) GetNextLkey() string { +func (x *UserMessage_ConversationStatus) GetNextLookupKey() string { if x != nil { - return x.NextLkey + return x.NextLookupKey } return "" } -func (x *UserMessage_ConversationStatus) GetNextLkeyAck() bool { +func (x *UserMessage_ConversationStatus) GetNextLookupKeyAck() bool { if x != nil { - return x.NextLkeyAck + return x.NextLookupKeyAck } return false } @@ -1040,8 +1040,8 @@ type UserMessage_Group struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Members []*MinimalContact `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"` + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + Members []*MinimalContact `protobuf:"bytes,2,rep,name=Members,proto3" json:"Members,omitempty"` } func (x *UserMessage_Group) Reset() { @@ -1096,11 +1096,11 @@ var file_messages_proto_rawDesc = []byte{ 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x22, 0x61, 0x0a, 0x13, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, - 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x81, 0x01, 0x0a, + 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, @@ -1109,163 +1109,170 @@ var file_messages_proto_rawDesc = []byte{ 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x22, 0xc8, 0x04, 0x0a, 0x0f, 0x54, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, + 0x22, 0xce, 0x04, 0x0a, 0x0f, 0x54, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x4e, 0x0a, 0x0b, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x65, - 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x54, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x50, 0x75, 0x6c, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, - 0x69, 0x62, 0x2e, 0x54, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4e, 0x65, - 0x78, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x55, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, - 0x72, 0x6c, 0x1a, 0xaf, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x4c, 0x61, 0x73, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x4f, 0x4b, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, - 0x69, 0x64, 0x4f, 0x4b, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4f, - 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x73, 0x68, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x1a, 0x65, 0x0a, 0x0d, 0x50, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x92, 0x05, 0x0a, 0x11, - 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, - 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x12, 0x50, 0x0a, 0x0c, 0x50, - 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x46, 0x72, 0x6f, 0x6d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x75, - 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, - 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, - 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x4b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x72, 0x6c, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x72, 0x6c, 0x1a, 0x3a, 0x0a, 0x14, 0x43, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x75, - 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x55, 0x75, 0x69, 0x64, 0x73, 0x1a, 0x70, 0x0a, 0x11, 0x50, 0x75, 0x6c, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x45, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, 0x0d, 0x50, 0x6f, 0x73, - 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x08, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6f, - 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, + 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x4e, 0x0a, 0x0b, + 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x54, 0x6f, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x0b, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x08, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x54, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, - 0x22, 0x98, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x12, 0x24, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, + 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x72, 0x6c, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x72, 0x6c, 0x1a, 0xaf, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x2a, + 0x0a, 0x10, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, + 0x4f, 0x4b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x4f, 0x4b, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x1a, 0x65, 0x0a, 0x0d, 0x50, 0x6f, + 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x08, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, + 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x22, 0x92, 0x05, 0x0a, 0x11, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, + 0x64, 0x12, 0x50, 0x0a, 0x0c, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, + 0x62, 0x2e, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, + 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4e, 0x65, 0x78, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x55, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x72, + 0x6c, 0x1a, 0x3a, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x55, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x75, 0x69, 0x64, 0x73, 0x1a, 0x70, 0x0a, + 0x11, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x46, 0x72, + 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x65, 0x0a, 0x0d, 0x50, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x36, + 0x0a, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x55, 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x22, 0xdc, 0x01, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x43, 0x61, 0x72, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x12, 0x30, 0x0a, 0x13, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x31, 0x0a, + 0x0b, 0x50, 0x75, 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x52, 0x0b, 0x50, 0x75, 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, + 0x22, 0x7b, 0x0a, 0x0e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x0e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6d, + 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x0e, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0xb2, 0x06, + 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, + 0x72, 0x6f, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x65, + 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, + 0x46, 0x0a, 0x10, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6f, 0x77, + 0x6c, 0x69, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x10, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0xb8, 0x03, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x55, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x55, 0x75, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x12, 0x26, 0x0a, 0x0e, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x4b, + 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x63, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x4e, 0x65, 0x78, 0x74, + 0x43, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x4b, 0x65, 0x79, 0x41, 0x63, 0x6b, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x63, 0x74, 0x4b, 0x65, 0x79, 0x41, 0x63, 0x6b, 0x12, 0x2c, 0x0a, 0x11, 0x4e, 0x65, 0x78, 0x74, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x4e, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x17, 0x4e, 0x65, 0x78, 0x74, 0x4b, 0x65, + 0x79, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x41, 0x63, + 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x4e, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x41, 0x63, 0x6b, + 0x12, 0x24, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, + 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x4e, 0x65, 0x78, 0x74, 0x4c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x41, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x4e, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x41, + 0x63, 0x6b, 0x1a, 0x4e, 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x55, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x72, - 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0xdc, 0x01, 0x0a, 0x0b, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x43, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x63, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x13, 0x65, - 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, - 0x0f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x0b, 0x50, 0x75, 0x6c, 0x6c, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6d, - 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x0b, 0x50, - 0x75, 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x7b, 0x0a, 0x0e, 0x4d, 0x69, - 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x37, - 0x0a, 0x0e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x0e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0xca, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x72, 0x6f, - 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x12, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, - 0x62, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, - 0x69, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0xe6, 0x02, 0x0a, 0x12, - 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x55, 0x75, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x55, 0x75, 0x69, 0x64, - 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x6b, 0x65, 0x79, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x6b, 0x65, 0x79, - 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x6b, 0x65, 0x79, 0x41, 0x63, 0x6b, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x6b, 0x65, 0x79, 0x41, - 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x4e, 0x65, 0x78, 0x74, 0x45, 0x6b, 0x65, 0x79, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, 0x65, 0x78, 0x74, 0x45, 0x6b, 0x65, 0x79, 0x12, 0x26, - 0x0a, 0x0e, 0x4e, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x45, 0x6b, 0x65, 0x79, 0x41, 0x63, 0x6b, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4e, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x45, - 0x6b, 0x65, 0x79, 0x41, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x4e, 0x65, 0x78, 0x74, 0x4c, 0x6b, - 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4e, 0x65, 0x78, 0x74, 0x4c, 0x6b, - 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x4c, 0x6b, 0x65, 0x79, 0x41, 0x63, - 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x4c, 0x6b, 0x65, - 0x79, 0x41, 0x63, 0x6b, 0x1a, 0x4e, 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x31, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x4d, 0x69, 0x6e, - 0x69, 0x6d, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x42, 0x21, 0x5a, 0x1f, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x2e, 0x72, 0x65, - 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x79, 0x76, 0x65, 0x73, 0x2f, - 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x31, 0x0a, 0x07, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, + 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x42, 0x21, 0x5a, 0x1f, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x64, 0x72, + 0x6f, 0x6f, 0x6d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x79, 0x76, 0x65, 0x73, 0x2f, 0x6d, 0x65, + 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1306,12 +1313,12 @@ var file_messages_proto_depIdxs = []int32{ 4, // 4: meowlib.ContactCard.PullServers:type_name -> meowlib.Server 4, // 5: meowlib.MinimalContact.TrustedServers:type_name -> meowlib.Server 13, // 6: meowlib.UserMessage.Status:type_name -> meowlib.UserMessage.ConversationStatus - 6, // 7: meowlib.UserMessage.contact:type_name -> meowlib.MinimalContact - 14, // 8: meowlib.UserMessage.group:type_name -> meowlib.UserMessage.Group + 6, // 7: meowlib.UserMessage.Contact:type_name -> meowlib.MinimalContact + 14, // 8: meowlib.UserMessage.DestinationGroup:type_name -> meowlib.UserMessage.Group 1, // 9: meowlib.ToServerMessage.PostedMessage.Messages:type_name -> meowlib.PackedUserMessage 10, // 10: meowlib.FromServerMessage.PullResponseEntry.value:type_name -> meowlib.FromServerMessage.ConversationResponse 1, // 11: meowlib.FromServerMessage.PostedMessage.Messages:type_name -> meowlib.PackedUserMessage - 6, // 12: meowlib.UserMessage.Group.members:type_name -> meowlib.MinimalContact + 6, // 12: meowlib.UserMessage.Group.Members:type_name -> meowlib.MinimalContact 13, // [13:13] is the sub-list for method output_type 13, // [13:13] is the sub-list for method input_type 13, // [13:13] is the sub-list for extension type_name diff --git a/server/identity.go b/server/identity.go index 864caf8..ba7ebe5 100644 --- a/server/identity.go +++ b/server/identity.go @@ -1,7 +1,8 @@ -package client +package server import ( "encoding/json" + "fmt" "io/ioutil" "forge.redroom.link/yves/meowlib" @@ -11,27 +12,24 @@ import ( const key = "3pw0c8#6ZG8{75b5;3?fe80$2" type Identity struct { - ServerName string `json:"servername,omitempty"` - ServerDesc string `json:"servername,omitempty"` - PublicKey string `json:"public_key,omitempty"` - PrivateKey string `json:"private_key,omitempty"` - Status string `json:"status,omitempty"` + ServerName string `json:"servername,omitempty"` + ServerDesc string `json:"serverdesc,omitempty"` + ServerKp meowlib.KeyPair `json:"server_kp,omitempty"` + Status string `json:"status,omitempty"` // KnownServers ServerList `json:"known_servers,omitempty"` } -func CreateIdentity(servername string, serverdesc string) *Identity { +func CreateIdentity(ServerName string, ServerDesc string) *Identity { var id Identity - id.ServerName = servername - id.ServerDesc = serverdesc - kp := meowlib.NewKeyPair() - id.PublicKey = kp.Public - id.PrivateKey = kp.Private + id.ServerName = ServerName + id.ServerDesc = ServerDesc + id.ServerKp = meowlib.NewKeyPair() return &id } -func LoadIdentity(file string) (*Identity, error) { +func LoadIdentity(File string) (*Identity, error) { var id Identity - indata, err := ioutil.ReadFile(file) + indata, err := ioutil.ReadFile(File) if err != nil { return nil, err } @@ -52,3 +50,23 @@ func (id *Identity) Save(file string) error { err = ioutil.WriteFile(file, []byte(armor), 0644) return err } + +// AsymEncryptMessage prepares a message to send to a specific client contact +func (id *Identity) AsymEncryptMessage(ClientPublicKey string, Message []byte) (EncryptedMsg []byte, Signature []byte, err error) { + EncryptedMsg, Signature, err = meowlib.EncryptAndSign(ClientPublicKey, id.ServerKp.Private, Message) + if err != nil { + fmt.Println(err.Error()) + return nil, nil, err + } + return EncryptedMsg, Signature, err +} + +// AsymDecryptMessage reads a message from a specific client contact +func (id *Identity) AsymDecryptMessage(ClientPublicKey string, Message []byte, Signature []byte) (DecryptedMsg []byte, err error) { + DecryptedMsg, err = meowlib.DecryptAndCheck(id.ServerKp.Private, ClientPublicKey, Message, Signature) + if err != nil { + fmt.Println(err.Error()) + return nil, err + } + return DecryptedMsg, err +}