matriochka start send and route + doc upt

This commit is contained in:
ycc 2022-12-27 16:59:52 +01:00
parent 1912f89cc6
commit 52ae52ca9f
7 changed files with 434 additions and 132 deletions

View File

@ -15,6 +15,8 @@ type Identity struct {
RootKp meowlib.KeyPair `json:"id_kp,omitempty"` RootKp meowlib.KeyPair `json:"id_kp,omitempty"`
Status string `json:"status,omitempty"` Status string `json:"status,omitempty"`
Peers PeerList `json:"peers,omitempty"` Peers PeerList `json:"peers,omitempty"`
HiddenPeers [][]byte `json:"hiddend_peers,omitempty"`
Device meowlib.KeyPair `json:"device,omitempty"`
KnownServers InternalServerList `json:"known_servers,omitempty"` KnownServers InternalServerList `json:"known_servers,omitempty"`
MessageServers InternalServerList `json:"message_servers,omitempty"` MessageServers InternalServerList `json:"message_servers,omitempty"`
ArchiveServers InternalServerList `json:"archive_servers,omitempty"` ArchiveServers InternalServerList `json:"archive_servers,omitempty"`
@ -22,6 +24,8 @@ type Identity struct {
DefaultDbPassword string `json:"default_db_password,omitempty"` DefaultDbPassword string `json:"default_db_password,omitempty"`
DbPasswordStore bool `json:"db_password_store,omitempty"` DbPasswordStore bool `json:"db_password_store,omitempty"`
OwnedDevices PeerList `json:"owned_devices,omitempty"` OwnedDevices PeerList `json:"owned_devices,omitempty"`
StaticMtkServerPaths []InternalServerList `json:"static_mtk_server_paths,omitempty"`
DynamicMtkServeRules []string `json:"dynamic_mtk_serve_rules,omitempty"`
} }
func CreateIdentity(nickname string) *Identity { func CreateIdentity(nickname string) *Identity {

51
client/matriochka.go Normal file
View File

@ -0,0 +1,51 @@
package client
import (
"forge.redroom.link/yves/meowlib"
"github.com/google/uuid"
)
func ProcessForOutput(usermessage *meowlib.UserMessage, peer *Peer, servers *InternalServerList, trackingLookupKey string) ([]byte, error) {
lastIdx := len(servers.Servers) - 1
// LAST SERVER : Message delivery as usual
srv := &servers.Servers[lastIdx]
// Prepare cyphered + packed user message
packedMsg, err := peer.ProcessOutboundUserMessage(usermessage)
if err != nil {
return nil, err
}
// Creating Server message for transporting the user message
toServerMessage := srv.BuildToServerMessageFromUserMessage(packedMsg)
lastmsg, err := srv.ProcessOutboundMessage(toServerMessage)
if err != nil {
return nil, err
}
lastuuid := uuid.NewString()
// ALL PREVIOUS SERVERS
for i := lastIdx - 1; i >= 0; i-- {
srv = &servers.Servers[i]
var toServerMessage meowlib.ToServerMessage
toServerMessage.MatriochkaMessage.Data = lastmsg
toServerMessage.MatriochkaMessage.Next.Url = servers.Servers[i+1].ServerData.Url
toServerMessage.MatriochkaMessage.Next.PublicKey = servers.Servers[i+1].ServerData.PublicKey
toServerMessage.MatriochkaMessage.Next.Delay = int32(servers.Servers[i+1].AllowedDelay)
if trackingLookupKey != "" {
toServerMessage.MatriochkaMessage.Next.Uuid = lastuuid // change tracking uuid at each server
if i > 0 {
toServerMessage.MatriochkaMessage.Prev.Url = servers.Servers[i-1].ServerData.Url
toServerMessage.MatriochkaMessage.Prev.PublicKey = servers.Servers[i+1].ServerData.PublicKey
toServerMessage.MatriochkaMessage.Prev.Delay = int32(servers.Servers[i-1].AllowedDelay)
toServerMessage.MatriochkaMessage.Prev.Uuid = uuid.NewString()
lastuuid = toServerMessage.MatriochkaMessage.Prev.Uuid
} else { // for first message, no previous tracking but a lookupkey to stack the tracking messages
toServerMessage.MatriochkaMessage.LookupKey = trackingLookupKey
}
}
lastmsg, err = srv.ProcessOutboundMessage(&toServerMessage)
if err != nil {
return nil, err
}
}
return lastmsg, nil
}

View File

@ -17,6 +17,8 @@ type InternalServer struct {
Login string `json:"login,omitempty"` Login string `json:"login,omitempty"`
Password string `json:"password,omitempty"` Password string `json:"password,omitempty"`
Me meowlib.KeyPair `json:"me,omitempty"` Me meowlib.KeyPair `json:"me,omitempty"`
Country string `json:"country,omitempty"`
AllowedDelay int `json:"allowed_delay,omitempty"`
} }
type InternalServerList struct { type InternalServerList struct {

View File

@ -35,14 +35,15 @@ No phone number or email check will be performed, unlike main instant messaging
\subsubsection{Trustable server based communication} \subsubsection{Trustable server based communication}
Like most widely available messaging softwares, (Whatsapp, Signal, Viber, Telegram...), \textffm{Meow} provides a simple server based messaging. Like most widely available messaging softwares, (Whatsapp, Signal, Viber, Telegram...), \textffm{Meow} provides a simple server based messaging.
The main difference is it allows to explicitly choose which server you want to use. The main difference is that \textffm{Meow} allows you to explicitly choose which server you want to use.
The server code being open source, we strongly encourage you to run your own server at home or in your company. The server code being open source, we strongly encourage you to run your own server at home or in your company.
The server requires very few ressources and will run on any low cost single board computer. The server requires very few ressources and will run on any low cost single board computer.
\subsubsection{Anonymized message transfer} \subsubsection{Anonymized message transfer}
\textffm{Meow} also provides an anonymizing transfer services very similar to the Tor Onion protocol, we call it the Matriochka protocol. \textffm{Meow} also provides an anonymizing transfer service very similar to the Tor Onion protocol, we call it the Matriochka protocol.
Any server can be used for building the transfer chain. Any server can be used for building the transfer chain.
Some of them might be marked as trusted. Some of them might be marked as trusted.
Random delays might be set for each forwarding step, making the overall message tracking much more difficult, even with a global network audit.
It is strongly advised to use trusted servers as your first node and message server (the one that holds your incoming messages). It is strongly advised to use trusted servers as your first node and message server (the one that holds your incoming messages).
\subsubsection{Presence protocol for direct messaging} \subsubsection{Presence protocol for direct messaging}
@ -58,6 +59,22 @@ You might define specific communication privacy preferences for each of your con
\item required matriochka protocol for Edward, first node is one of my trusted servers, my message node is my own server, randomly switch from trusted server lists for others. \item required matriochka protocol for Edward, first node is one of my trusted servers, my message node is my own server, randomly switch from trusted server lists for others.
\item ... \item ...
\end{itemize} \end{itemize}
\subsubsection{Resistance to device requisition}
All your contact information and discussion are encrypted on the device and password protected.
Password shall be asked on application startup and allows your identity file and contact decrytion.
That password is not recoverable, so you can't forget it, or you'll loose your whole configuration and identity.
Real security implies some constraints.
You might configure the app to save your password, but that is a security flaw.
In many authoritarian countries, you are required by law to provide your device passwords to authorities.
In a \textffm{Meow} device, you might set a special password for specific contacts.
Those contacts won't be visible when entering your main identity password.
You'll have to type their specific password in order to make them visible.
The \textffm{Meow} application will by default create a random set of fake hidden contacts and conversations.
Even in case of device storage analysis, authorities won't be able to differentiate a real hidden contact from an normal fake generated one.
It could be argued that this feature puts every user at risk, because authorities might think you're hiding something, even if you're not.
As every \textffm{Meow} user has the same constraint, users are not responsible for that. Moreover solidarity is also a requirement for real security.
\subsection{Multiple devices support} \subsection{Multiple devices support}
\textffm{Meow} allows you to be connected from multiple devices and offers chat synchronization capability. \textffm{Meow} allows you to be connected from multiple devices and offers chat synchronization capability.
A device might be revoqued anytime from any other one. Proof of your identity (password or other) shall be provided in order to grant device revocation. A device might be revoqued anytime from any other one. Proof of your identity (password or other) shall be provided in order to grant device revocation.
@ -84,7 +101,6 @@ A local (server based) emergency broadcast service will be provided. It will pro
\textffm{Meow} may run without Internet connection, either on an isolated wifi access point, or on a meshed network of wifi routers or even via serial IOT transport layers (LoRa,...) \textffm{Meow} may run without Internet connection, either on an isolated wifi access point, or on a meshed network of wifi routers or even via serial IOT transport layers (LoRa,...)
\subsection{User directory service} \subsection{User directory service}
This service allows to restore a lost functionality of Internet historic chat services (like ICQ). You could simply set a "Free for chat" status that would allow other people to contact you, either randomly or based on a short description that you might provide. This service allows to restore a lost functionality of Internet historic chat services (like ICQ). You could simply set a "Free for chat" status that would allow other people to contact you, either randomly or based on a short description that you might provide.
Why providing that service while the internet is suffocating due to the abundance of social networks ?\\ Why providing that service while the internet is suffocating due to the abundance of social networks ?\\
@ -94,7 +110,7 @@ Well, that option offers a few advantages :
\item no social network algorithm will select people that think/behave/vote/eat... just like you. Diversity makes a better world; \item no social network algorithm will select people that think/behave/vote/eat... just like you. Diversity makes a better world;
\item a smaller community of users, skilled enough to operate a \textffm{Meow} chat app... that might provide a first filter; \item a smaller community of users, skilled enough to operate a \textffm{Meow} chat app... that might provide a first filter;
It's a bit like in the old times, when people had to be able to start a win98 computer, connect it to internet, then download and install ICQ... It's a bit like in the old times, when people had to be able to start a win98 computer, connect it to internet, then download and install ICQ...
If you lost some time in social networks, and experienced ICQ in the 2000's, you know what I mean. If you lost some time in social networks, and experienced ICQ in the 2000's, you'll understand.
\end{itemize} \end{itemize}
\section{Identities and keys} \section{Identities and keys}

View File

@ -96,7 +96,8 @@ type ToServerMessage struct {
PullRequest []*ToServerMessage_ConversationRequest `protobuf:"bytes,4,rep,name=pullRequest,proto3" json:"pullRequest,omitempty"` PullRequest []*ToServerMessage_ConversationRequest `protobuf:"bytes,4,rep,name=pullRequest,proto3" json:"pullRequest,omitempty"`
Messages []*PackedUserMessage `protobuf:"bytes,5,rep,name=messages,proto3" json:"messages,omitempty"` Messages []*PackedUserMessage `protobuf:"bytes,5,rep,name=messages,proto3" json:"messages,omitempty"`
KnownServers []*Server `protobuf:"bytes,6,rep,name=knownServers,proto3" json:"knownServers,omitempty"` KnownServers []*Server `protobuf:"bytes,6,rep,name=knownServers,proto3" json:"knownServers,omitempty"`
Uuid string `protobuf:"bytes,7,opt,name=uuid,proto3" json:"uuid,omitempty"` MatriochkaMessage *Matriochka `protobuf:"bytes,7,opt,name=matriochkaMessage,proto3" json:"matriochkaMessage,omitempty"`
Uuid string `protobuf:"bytes,8,opt,name=uuid,proto3" json:"uuid,omitempty"`
} }
func (x *ToServerMessage) Reset() { func (x *ToServerMessage) Reset() {
@ -173,6 +174,13 @@ func (x *ToServerMessage) GetKnownServers() []*Server {
return nil return nil
} }
func (x *ToServerMessage) GetMatriochkaMessage() *Matriochka {
if x != nil {
return x.MatriochkaMessage
}
return nil
}
func (x *ToServerMessage) GetUuid() string { func (x *ToServerMessage) GetUuid() string {
if x != nil { if x != nil {
return x.Uuid return x.Uuid
@ -276,6 +284,148 @@ func (x *FromServerMessage) GetKnownServers() []*Server {
return nil return nil
} }
type MatriochkaServer struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` // Server Url
PublicKey string `protobuf:"bytes,2,opt,name=publicKey,proto3" json:"publicKey,omitempty"` // Server Public Key
Uuid string `protobuf:"bytes,3,opt,name=uuid,proto3" json:"uuid,omitempty"` // Optional, uuid for delivery confirmation
Delay int32 `protobuf:"varint,4,opt,name=delay,proto3" json:"delay,omitempty"` // Max delay requested for message forwarding or delivery tracking
}
func (x *MatriochkaServer) Reset() {
*x = MatriochkaServer{}
if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *MatriochkaServer) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*MatriochkaServer) ProtoMessage() {}
func (x *MatriochkaServer) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use MatriochkaServer.ProtoReflect.Descriptor instead.
func (*MatriochkaServer) Descriptor() ([]byte, []int) {
return file_messages_proto_rawDescGZIP(), []int{3}
}
func (x *MatriochkaServer) GetUrl() string {
if x != nil {
return x.Url
}
return ""
}
func (x *MatriochkaServer) GetPublicKey() string {
if x != nil {
return x.PublicKey
}
return ""
}
func (x *MatriochkaServer) GetUuid() string {
if x != nil {
return x.Uuid
}
return ""
}
func (x *MatriochkaServer) GetDelay() int32 {
if x != nil {
return x.Delay
}
return 0
}
type Matriochka struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
LookupKey string `protobuf:"bytes,1,opt,name=lookupKey,proto3" json:"lookupKey,omitempty"` // Optional, only if you want delivery tracking, less stealth
Prev *MatriochkaServer `protobuf:"bytes,2,opt,name=prev,proto3" json:"prev,omitempty"` // Optional, like above
Next *MatriochkaServer `protobuf:"bytes,3,opt,name=next,proto3" json:"next,omitempty"` // Next server to deliver the message to
Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` // Matriochka data
}
func (x *Matriochka) Reset() {
*x = Matriochka{}
if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Matriochka) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Matriochka) ProtoMessage() {}
func (x *Matriochka) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Matriochka.ProtoReflect.Descriptor instead.
func (*Matriochka) Descriptor() ([]byte, []int) {
return file_messages_proto_rawDescGZIP(), []int{4}
}
func (x *Matriochka) GetLookupKey() string {
if x != nil {
return x.LookupKey
}
return ""
}
func (x *Matriochka) GetPrev() *MatriochkaServer {
if x != nil {
return x.Prev
}
return nil
}
func (x *Matriochka) GetNext() *MatriochkaServer {
if x != nil {
return x.Next
}
return nil
}
func (x *Matriochka) GetData() []byte {
if x != nil {
return x.Data
}
return nil
}
// structure describing required server attributes // structure describing required server attributes
type Server struct { type Server struct {
state protoimpl.MessageState state protoimpl.MessageState
@ -287,14 +437,14 @@ type Server struct {
PublicKey string `protobuf:"bytes,3,opt,name=publicKey,proto3" json:"publicKey,omitempty"` PublicKey string `protobuf:"bytes,3,opt,name=publicKey,proto3" json:"publicKey,omitempty"`
Url string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"` Url string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"`
Publish bool `protobuf:"varint,5,opt,name=publish,proto3" json:"publish,omitempty"` // publish this server when asked for a list by server Publish bool `protobuf:"varint,5,opt,name=publish,proto3" json:"publish,omitempty"` // publish this server when asked for a list by server
Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` // signature of all previous field by the server itself Signature []byte `protobuf:"bytes,6,opt,name=signature,proto3" json:"signature,omitempty"` // signature of all previous fields by the server itself
ConfidenceLevel int32 `protobuf:"varint,7,opt,name=confidenceLevel,proto3" json:"confidenceLevel,omitempty"` // additional info from the user ConfidenceLevel int32 `protobuf:"varint,7,opt,name=confidenceLevel,proto3" json:"confidenceLevel,omitempty"` // additional info from the user
} }
func (x *Server) Reset() { func (x *Server) Reset() {
*x = Server{} *x = Server{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[3] mi := &file_messages_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -307,7 +457,7 @@ func (x *Server) String() string {
func (*Server) ProtoMessage() {} func (*Server) ProtoMessage() {}
func (x *Server) ProtoReflect() protoreflect.Message { func (x *Server) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[3] mi := &file_messages_proto_msgTypes[5]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -320,7 +470,7 @@ func (x *Server) ProtoReflect() protoreflect.Message {
// Deprecated: Use Server.ProtoReflect.Descriptor instead. // Deprecated: Use Server.ProtoReflect.Descriptor instead.
func (*Server) Descriptor() ([]byte, []int) { func (*Server) Descriptor() ([]byte, []int) {
return file_messages_proto_rawDescGZIP(), []int{3} return file_messages_proto_rawDescGZIP(), []int{5}
} }
func (x *Server) GetName() string { func (x *Server) GetName() string {
@ -390,7 +540,7 @@ type ContactCard struct {
func (x *ContactCard) Reset() { func (x *ContactCard) Reset() {
*x = ContactCard{} *x = ContactCard{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[4] mi := &file_messages_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -403,7 +553,7 @@ func (x *ContactCard) String() string {
func (*ContactCard) ProtoMessage() {} func (*ContactCard) ProtoMessage() {}
func (x *ContactCard) ProtoReflect() protoreflect.Message { func (x *ContactCard) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[4] mi := &file_messages_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -416,7 +566,7 @@ func (x *ContactCard) ProtoReflect() protoreflect.Message {
// Deprecated: Use ContactCard.ProtoReflect.Descriptor instead. // Deprecated: Use ContactCard.ProtoReflect.Descriptor instead.
func (*ContactCard) Descriptor() ([]byte, []int) { func (*ContactCard) Descriptor() ([]byte, []int) {
return file_messages_proto_rawDescGZIP(), []int{4} return file_messages_proto_rawDescGZIP(), []int{6}
} }
func (x *ContactCard) GetName() string { func (x *ContactCard) GetName() string {
@ -483,7 +633,7 @@ type PackedUserMessage struct {
func (x *PackedUserMessage) Reset() { func (x *PackedUserMessage) Reset() {
*x = PackedUserMessage{} *x = PackedUserMessage{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[5] mi := &file_messages_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -496,7 +646,7 @@ func (x *PackedUserMessage) String() string {
func (*PackedUserMessage) ProtoMessage() {} func (*PackedUserMessage) ProtoMessage() {}
func (x *PackedUserMessage) ProtoReflect() protoreflect.Message { func (x *PackedUserMessage) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[5] mi := &file_messages_proto_msgTypes[7]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -509,7 +659,7 @@ func (x *PackedUserMessage) ProtoReflect() protoreflect.Message {
// Deprecated: Use PackedUserMessage.ProtoReflect.Descriptor instead. // Deprecated: Use PackedUserMessage.ProtoReflect.Descriptor instead.
func (*PackedUserMessage) Descriptor() ([]byte, []int) { func (*PackedUserMessage) Descriptor() ([]byte, []int) {
return file_messages_proto_rawDescGZIP(), []int{5} return file_messages_proto_rawDescGZIP(), []int{7}
} }
func (x *PackedUserMessage) GetDestination() string { func (x *PackedUserMessage) GetDestination() string {
@ -560,7 +710,7 @@ type UserMessage struct {
func (x *UserMessage) Reset() { func (x *UserMessage) Reset() {
*x = UserMessage{} *x = UserMessage{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[6] mi := &file_messages_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -573,7 +723,7 @@ func (x *UserMessage) String() string {
func (*UserMessage) ProtoMessage() {} func (*UserMessage) ProtoMessage() {}
func (x *UserMessage) ProtoReflect() protoreflect.Message { func (x *UserMessage) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[6] mi := &file_messages_proto_msgTypes[8]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -586,7 +736,7 @@ func (x *UserMessage) ProtoReflect() protoreflect.Message {
// Deprecated: Use UserMessage.ProtoReflect.Descriptor instead. // Deprecated: Use UserMessage.ProtoReflect.Descriptor instead.
func (*UserMessage) Descriptor() ([]byte, []int) { func (*UserMessage) Descriptor() ([]byte, []int) {
return file_messages_proto_rawDescGZIP(), []int{6} return file_messages_proto_rawDescGZIP(), []int{8}
} }
func (x *UserMessage) GetDestination() string { func (x *UserMessage) GetDestination() string {
@ -666,7 +816,7 @@ type File struct {
func (x *File) Reset() { func (x *File) Reset() {
*x = File{} *x = File{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[7] mi := &file_messages_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -679,7 +829,7 @@ func (x *File) String() string {
func (*File) ProtoMessage() {} func (*File) ProtoMessage() {}
func (x *File) ProtoReflect() protoreflect.Message { func (x *File) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[7] mi := &file_messages_proto_msgTypes[9]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -692,7 +842,7 @@ func (x *File) ProtoReflect() protoreflect.Message {
// Deprecated: Use File.ProtoReflect.Descriptor instead. // Deprecated: Use File.ProtoReflect.Descriptor instead.
func (*File) Descriptor() ([]byte, []int) { func (*File) Descriptor() ([]byte, []int) {
return file_messages_proto_rawDescGZIP(), []int{7} return file_messages_proto_rawDescGZIP(), []int{9}
} }
func (x *File) GetFilename() string { func (x *File) GetFilename() string {
@ -738,7 +888,7 @@ type ToServerMessage_ConversationRequest struct {
func (x *ToServerMessage_ConversationRequest) Reset() { func (x *ToServerMessage_ConversationRequest) Reset() {
*x = ToServerMessage_ConversationRequest{} *x = ToServerMessage_ConversationRequest{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[8] mi := &file_messages_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -751,7 +901,7 @@ func (x *ToServerMessage_ConversationRequest) String() string {
func (*ToServerMessage_ConversationRequest) ProtoMessage() {} func (*ToServerMessage_ConversationRequest) ProtoMessage() {}
func (x *ToServerMessage_ConversationRequest) ProtoReflect() protoreflect.Message { func (x *ToServerMessage_ConversationRequest) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[8] mi := &file_messages_proto_msgTypes[10]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -806,7 +956,7 @@ type FromServerMessage_ConversationResponse struct {
func (x *FromServerMessage_ConversationResponse) Reset() { func (x *FromServerMessage_ConversationResponse) Reset() {
*x = FromServerMessage_ConversationResponse{} *x = FromServerMessage_ConversationResponse{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[9] mi := &file_messages_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -819,7 +969,7 @@ func (x *FromServerMessage_ConversationResponse) String() string {
func (*FromServerMessage_ConversationResponse) ProtoMessage() {} func (*FromServerMessage_ConversationResponse) ProtoMessage() {}
func (x *FromServerMessage_ConversationResponse) ProtoReflect() protoreflect.Message { func (x *FromServerMessage_ConversationResponse) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[9] mi := &file_messages_proto_msgTypes[11]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -853,13 +1003,13 @@ type UserMessage_ConversationStatus struct {
Received uint64 `protobuf:"varint,4,opt,name=received,proto3" json:"received,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"` Processed uint64 `protobuf:"varint,5,opt,name=processed,proto3" json:"processed,omitempty"`
MyNextIdentity *ContactCard `protobuf:"bytes,6,opt,name=myNextIdentity,proto3" json:"myNextIdentity,omitempty"` MyNextIdentity *ContactCard `protobuf:"bytes,6,opt,name=myNextIdentity,proto3" json:"myNextIdentity,omitempty"`
PeerNextIdentityAck int32 `protobuf:"varint,7,opt,name=peerNextIdentityAck,proto3" json:"peerNextIdentityAck,omitempty"` // version of the new peed accepted id PeerNextIdentityAck int32 `protobuf:"varint,7,opt,name=peerNextIdentityAck,proto3" json:"peerNextIdentityAck,omitempty"` // version of the new peer accepted id
} }
func (x *UserMessage_ConversationStatus) Reset() { func (x *UserMessage_ConversationStatus) Reset() {
*x = UserMessage_ConversationStatus{} *x = UserMessage_ConversationStatus{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[10] mi := &file_messages_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -872,7 +1022,7 @@ func (x *UserMessage_ConversationStatus) String() string {
func (*UserMessage_ConversationStatus) ProtoMessage() {} func (*UserMessage_ConversationStatus) ProtoMessage() {}
func (x *UserMessage_ConversationStatus) ProtoReflect() protoreflect.Message { func (x *UserMessage_ConversationStatus) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[10] mi := &file_messages_proto_msgTypes[12]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -885,7 +1035,7 @@ func (x *UserMessage_ConversationStatus) ProtoReflect() protoreflect.Message {
// Deprecated: Use UserMessage_ConversationStatus.ProtoReflect.Descriptor instead. // Deprecated: Use UserMessage_ConversationStatus.ProtoReflect.Descriptor instead.
func (*UserMessage_ConversationStatus) Descriptor() ([]byte, []int) { func (*UserMessage_ConversationStatus) Descriptor() ([]byte, []int) {
return file_messages_proto_rawDescGZIP(), []int{6, 0} return file_messages_proto_rawDescGZIP(), []int{8, 0}
} }
func (x *UserMessage_ConversationStatus) GetLocalUuid() string { func (x *UserMessage_ConversationStatus) GetLocalUuid() string {
@ -949,7 +1099,7 @@ type UserMessage_Group struct {
func (x *UserMessage_Group) Reset() { func (x *UserMessage_Group) Reset() {
*x = UserMessage_Group{} *x = UserMessage_Group{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_messages_proto_msgTypes[11] mi := &file_messages_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -962,7 +1112,7 @@ func (x *UserMessage_Group) String() string {
func (*UserMessage_Group) ProtoMessage() {} func (*UserMessage_Group) ProtoMessage() {}
func (x *UserMessage_Group) ProtoReflect() protoreflect.Message { func (x *UserMessage_Group) ProtoReflect() protoreflect.Message {
mi := &file_messages_proto_msgTypes[11] mi := &file_messages_proto_msgTypes[13]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -975,7 +1125,7 @@ func (x *UserMessage_Group) ProtoReflect() protoreflect.Message {
// Deprecated: Use UserMessage_Group.ProtoReflect.Descriptor instead. // Deprecated: Use UserMessage_Group.ProtoReflect.Descriptor instead.
func (*UserMessage_Group) Descriptor() ([]byte, []int) { func (*UserMessage_Group) Descriptor() ([]byte, []int) {
return file_messages_proto_rawDescGZIP(), []int{6, 1} return file_messages_proto_rawDescGZIP(), []int{8, 1}
} }
func (x *UserMessage_Group) GetName() string { func (x *UserMessage_Group) GetName() string {
@ -1002,7 +1152,7 @@ var file_messages_proto_rawDesc = []byte{
0x66, 0x72, 0x6f, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 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, 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, 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, 0xd6, 0x03, 0x0a, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x99, 0x04, 0x0a,
0x0f, 0x54, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x0f, 0x54, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01,
@ -1020,39 +1170,60 @@ var file_messages_proto_rawDesc = []byte{
0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x0f, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x32, 0x0f, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65,
0x72, 0x52, 0x0c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x72, 0x52, 0x0c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12,
0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x41, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x6f, 0x63, 0x68, 0x6b, 0x61, 0x4d, 0x65, 0x73,
0x75, 0x69, 0x64, 0x1a, 0xaf, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x65, 0x6f,
0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x6f, 0x63, 0x68, 0x6b, 0x61, 0x52,
0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x11, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x6f, 0x63, 0x68, 0x6b, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61,
0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x4f, 0x4b, 0x18, 0x02, 0x20, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x1a, 0xaf, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x76, 0x65,
0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c,
0x75, 0x69, 0x64, 0x4f, 0x4b, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x0a, 0x09, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x70, 0x75, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10,
0x62, 0x6c, 0x69, 0x73, 0x68, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x4f, 0x4b,
0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76,
0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x4f, 0x4b, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6c,
0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc6, 0x02, 0x0a, 0x11, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x69, 0x73, 0x68, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x0d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x28,
0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72,
0x28, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x53,
0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xc6, 0x02, 0x0a, 0x11, 0x46, 0x72, 0x6f,
0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12,
0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79,
0x6f, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x75, 0x69, 0x64, 0x41, 0x63, 0x6b, 0x18, 0x04, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c,
0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x75, 0x69, 0x64, 0x41, 0x63, 0x6b, 0x12, 0x1e, 0x0a, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x72,
0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07,
0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70,
0x04, 0x63, 0x68, 0x61, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x75, 0x69, 0x64, 0x41, 0x63,
0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x75, 0x69, 0x64, 0x41, 0x63, 0x6b,
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x63, 0x68, 0x61, 0x74, 0x12, 0x33, 0x0a, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64, 0x18, 0x05,
0x0c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x75, 0x69, 0x64,
0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x53, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x63, 0x68, 0x61, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a,
0x72, 0x76, 0x65, 0x72, 0x52, 0x0c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x55,
0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x63, 0x68, 0x61, 0x74,
0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x0c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73,
0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x69, 0x62,
0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0xd0, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x0c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65,
0x72, 0x76, 0x65, 0x72, 0x73, 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, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20,
0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x75, 0x69, 0x64,
0x73, 0x22, 0x6c, 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x6f, 0x63, 0x68, 0x6b, 0x61, 0x53,
0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 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, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20,
0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6c,
0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x22,
0x9c, 0x01, 0x0a, 0x0a, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x6f, 0x63, 0x68, 0x6b, 0x61, 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, 0x2d, 0x0a, 0x04,
0x70, 0x72, 0x65, 0x76, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6f,
0x77, 0x6c, 0x69, 0x62, 0x2e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x6f, 0x63, 0x68, 0x6b, 0x61, 0x53,
0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x04, 0x70, 0x72, 0x65, 0x76, 0x12, 0x2d, 0x0a, 0x04, 0x6e,
0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6f, 0x77,
0x6c, 0x69, 0x62, 0x2e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x6f, 0x63, 0x68, 0x6b, 0x61, 0x53, 0x65,
0x72, 0x76, 0x65, 0x72, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61,
0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd0,
0x01, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a,
0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
@ -1162,40 +1333,45 @@ func file_messages_proto_rawDescGZIP() []byte {
return file_messages_proto_rawDescData return file_messages_proto_rawDescData
} }
var file_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
var file_messages_proto_goTypes = []interface{}{ var file_messages_proto_goTypes = []interface{}{
(*PackedServerMessage)(nil), // 0: meowlib.PackedServerMessage (*PackedServerMessage)(nil), // 0: meowlib.PackedServerMessage
(*ToServerMessage)(nil), // 1: meowlib.ToServerMessage (*ToServerMessage)(nil), // 1: meowlib.ToServerMessage
(*FromServerMessage)(nil), // 2: meowlib.FromServerMessage (*FromServerMessage)(nil), // 2: meowlib.FromServerMessage
(*Server)(nil), // 3: meowlib.Server (*MatriochkaServer)(nil), // 3: meowlib.MatriochkaServer
(*ContactCard)(nil), // 4: meowlib.ContactCard (*Matriochka)(nil), // 4: meowlib.Matriochka
(*PackedUserMessage)(nil), // 5: meowlib.PackedUserMessage (*Server)(nil), // 5: meowlib.Server
(*UserMessage)(nil), // 6: meowlib.UserMessage (*ContactCard)(nil), // 6: meowlib.ContactCard
(*File)(nil), // 7: meowlib.File (*PackedUserMessage)(nil), // 7: meowlib.PackedUserMessage
(*ToServerMessage_ConversationRequest)(nil), // 8: meowlib.ToServerMessage.ConversationRequest (*UserMessage)(nil), // 8: meowlib.UserMessage
(*FromServerMessage_ConversationResponse)(nil), // 9: meowlib.FromServerMessage.ConversationResponse (*File)(nil), // 9: meowlib.File
(*UserMessage_ConversationStatus)(nil), // 10: meowlib.UserMessage.ConversationStatus (*ToServerMessage_ConversationRequest)(nil), // 10: meowlib.ToServerMessage.ConversationRequest
(*UserMessage_Group)(nil), // 11: meowlib.UserMessage.Group (*FromServerMessage_ConversationResponse)(nil), // 11: meowlib.FromServerMessage.ConversationResponse
(*UserMessage_ConversationStatus)(nil), // 12: meowlib.UserMessage.ConversationStatus
(*UserMessage_Group)(nil), // 13: meowlib.UserMessage.Group
} }
var file_messages_proto_depIdxs = []int32{ var file_messages_proto_depIdxs = []int32{
8, // 0: meowlib.ToServerMessage.pullRequest:type_name -> meowlib.ToServerMessage.ConversationRequest 10, // 0: meowlib.ToServerMessage.pullRequest:type_name -> meowlib.ToServerMessage.ConversationRequest
5, // 1: meowlib.ToServerMessage.messages:type_name -> meowlib.PackedUserMessage 7, // 1: meowlib.ToServerMessage.messages:type_name -> meowlib.PackedUserMessage
3, // 2: meowlib.ToServerMessage.knownServers:type_name -> meowlib.Server 5, // 2: meowlib.ToServerMessage.knownServers:type_name -> meowlib.Server
5, // 3: meowlib.FromServerMessage.chat:type_name -> meowlib.PackedUserMessage 4, // 3: meowlib.ToServerMessage.matriochkaMessage:type_name -> meowlib.Matriochka
3, // 4: meowlib.FromServerMessage.knownServers:type_name -> meowlib.Server 7, // 4: meowlib.FromServerMessage.chat:type_name -> meowlib.PackedUserMessage
3, // 5: meowlib.ContactCard.pullServers:type_name -> meowlib.Server 5, // 5: meowlib.FromServerMessage.knownServers:type_name -> meowlib.Server
10, // 6: meowlib.UserMessage.Status:type_name -> meowlib.UserMessage.ConversationStatus 3, // 6: meowlib.Matriochka.prev:type_name -> meowlib.MatriochkaServer
4, // 7: meowlib.UserMessage.contact:type_name -> meowlib.ContactCard 3, // 7: meowlib.Matriochka.next:type_name -> meowlib.MatriochkaServer
3, // 8: meowlib.UserMessage.knownServers:type_name -> meowlib.Server 5, // 8: meowlib.ContactCard.pullServers:type_name -> meowlib.Server
11, // 9: meowlib.UserMessage.group:type_name -> meowlib.UserMessage.Group 12, // 9: meowlib.UserMessage.Status:type_name -> meowlib.UserMessage.ConversationStatus
7, // 10: meowlib.UserMessage.files:type_name -> meowlib.File 6, // 10: meowlib.UserMessage.contact:type_name -> meowlib.ContactCard
4, // 11: meowlib.UserMessage.ConversationStatus.myNextIdentity:type_name -> meowlib.ContactCard 5, // 11: meowlib.UserMessage.knownServers:type_name -> meowlib.Server
4, // 12: meowlib.UserMessage.Group.members:type_name -> meowlib.ContactCard 13, // 12: meowlib.UserMessage.group:type_name -> meowlib.UserMessage.Group
13, // [13:13] is the sub-list for method output_type 9, // 13: meowlib.UserMessage.files:type_name -> meowlib.File
13, // [13:13] is the sub-list for method input_type 6, // 14: meowlib.UserMessage.ConversationStatus.myNextIdentity:type_name -> meowlib.ContactCard
13, // [13:13] is the sub-list for extension type_name 6, // 15: meowlib.UserMessage.Group.members:type_name -> meowlib.ContactCard
13, // [13:13] is the sub-list for extension extendee 16, // [16:16] is the sub-list for method output_type
0, // [0:13] is the sub-list for field type_name 16, // [16:16] is the sub-list for method input_type
16, // [16:16] is the sub-list for extension type_name
16, // [16:16] is the sub-list for extension extendee
0, // [0:16] is the sub-list for field type_name
} }
func init() { file_messages_proto_init() } func init() { file_messages_proto_init() }
@ -1241,7 +1417,7 @@ func file_messages_proto_init() {
} }
} }
file_messages_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { file_messages_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Server); i { switch v := v.(*MatriochkaServer); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1253,7 +1429,7 @@ func file_messages_proto_init() {
} }
} }
file_messages_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { file_messages_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ContactCard); i { switch v := v.(*Matriochka); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1265,7 +1441,7 @@ func file_messages_proto_init() {
} }
} }
file_messages_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { file_messages_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PackedUserMessage); i { switch v := v.(*Server); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1277,7 +1453,7 @@ func file_messages_proto_init() {
} }
} }
file_messages_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { file_messages_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UserMessage); i { switch v := v.(*ContactCard); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1289,7 +1465,7 @@ func file_messages_proto_init() {
} }
} }
file_messages_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { file_messages_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*File); i { switch v := v.(*PackedUserMessage); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1301,7 +1477,7 @@ func file_messages_proto_init() {
} }
} }
file_messages_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { file_messages_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ToServerMessage_ConversationRequest); i { switch v := v.(*UserMessage); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1313,7 +1489,7 @@ func file_messages_proto_init() {
} }
} }
file_messages_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { file_messages_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FromServerMessage_ConversationResponse); i { switch v := v.(*File); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1325,7 +1501,7 @@ func file_messages_proto_init() {
} }
} }
file_messages_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { file_messages_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UserMessage_ConversationStatus); i { switch v := v.(*ToServerMessage_ConversationRequest); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -1337,6 +1513,30 @@ func file_messages_proto_init() {
} }
} }
file_messages_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { file_messages_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*FromServerMessage_ConversationResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_messages_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UserMessage_ConversationStatus); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_messages_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UserMessage_Group); i { switch v := v.(*UserMessage_Group); i {
case 0: case 0:
return &v.state return &v.state
@ -1355,7 +1555,7 @@ func file_messages_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_messages_proto_rawDesc, RawDescriptor: file_messages_proto_rawDesc,
NumEnums: 0, NumEnums: 0,
NumMessages: 12, NumMessages: 14,
NumExtensions: 0, NumExtensions: 0,
NumServices: 0, NumServices: 0,
}, },

View File

@ -29,7 +29,9 @@ message ToServerMessage {
repeated Server knownServers = 6; repeated Server knownServers = 6;
string uuid = 7; Matriochka matriochkaMessage = 7;
string uuid = 8;
} }
@ -45,13 +47,26 @@ message FromServerMessage {
repeated string messageUuids = 1; repeated string messageUuids = 1;
} }
repeated PackedUserMessage chat = 6; repeated PackedUserMessage chat = 6;
repeated Server knownServers = 7; repeated Server knownServers = 7;
} }
message MatriochkaServer {
string url = 1; // Server Url
string publicKey = 2; // Server Public Key
string uuid = 3 ; // Optional, uuid for delivery confirmation
int32 delay = 4; // Max delay requested for message forwarding or delivery tracking
}
message Matriochka {
string lookupKey = 1; // Optional, only if you want delivery tracking, less stealth
MatriochkaServer prev = 2; // Optional, like above
MatriochkaServer next = 3; // Next server to deliver the message to
bytes data = 4; // Matriochka data
}
// structure describing required server attributes // structure describing required server attributes
message Server { message Server {
string name = 1; string name = 1;
@ -59,7 +74,7 @@ message Server {
string publicKey = 3; string publicKey = 3;
string url = 4; string url = 4;
bool publish = 5; // publish this server when asked for a list by server bool publish = 5; // publish this server when asked for a list by server
bytes signature = 6; // signature of all previous field by the server itself bytes signature = 6; // signature of all previous fields by the server itself
int32 confidenceLevel = 7; // additional info from the user int32 confidenceLevel = 7; // additional info from the user
} }
@ -82,6 +97,7 @@ message PackedUserMessage {
repeated int64 serverTimestamp=4; // server time stamp, might be several in matriochka mode repeated int64 serverTimestamp=4; // server time stamp, might be several in matriochka mode
} }
// structure defining information that might be exchanged between two peers. // structure defining information that might be exchanged between two peers.
message UserMessage { message UserMessage {
string destination = 1; // Lookupkey string destination = 1; // Lookupkey
@ -95,7 +111,7 @@ message UserMessage {
uint64 received = 4; uint64 received = 4;
uint64 processed = 5; uint64 processed = 5;
ContactCard myNextIdentity = 6; ContactCard myNextIdentity = 6;
int32 peerNextIdentityAck = 7; // version of the new peed accepted id int32 peerNextIdentityAck = 7; // version of the new peer accepted id
} }
ConversationStatus Status = 5; ConversationStatus Status = 5;

View File

@ -38,7 +38,7 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
if err != nil { if err != nil {
return nil, err return nil, err
} }
r.Client.ZAdd(usrmsg.Destination, redis.Z{float64(time.Now().Unix()), out}) r.Client.ZAdd(usrmsg.Destination, redis.Z{Score: float64(time.Now().Unix()), Member: out})
} }
from_server.UuidAck = msg.Uuid from_server.UuidAck = msg.Uuid
} }
@ -69,6 +69,19 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
} }
} }
if msg.MatriochkaMessage != nil {
out, err := proto.Marshal(msg)
if err != nil {
return nil, err
}
r.Client.ZAdd("mtk", redis.Z{Score: float64(time.Now().Unix()), Member: out})
if msg.MatriochkaMessage.LookupKey != "" {
//r.Client.ZAdd("trk:" + msg.MatriochkaMessage.Next.Uuid,{})
}
from_server.UuidAck = msg.Uuid
}
if len(msg.KnownServers) > 0 { if len(msg.KnownServers) > 0 {
} }