Server invitation process functions
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
ycc 2023-11-14 16:32:50 +01:00
parent 65f9ee2e07
commit 432f449558
8 changed files with 134 additions and 85 deletions

View File

@ -44,7 +44,8 @@ func CreateIdentity(nickname string) *Identity {
return &id return &id
} }
func (id *Identity) InvitePeer(MyName string, ContactName string, MessageServerIdxs []int) (*meowlib.ContactCard, error) { // Creates an invitation for a peer, returns the peer containing
func (id *Identity) InvitePeer(MyName string, ContactName string, MessageServerIdxs []int) (*Peer, *meowlib.ContactCard, error) {
var peer Peer var peer Peer
var myContactCard meowlib.ContactCard var myContactCard meowlib.ContactCard
peer.MyIdentity = meowlib.NewKeyPair() peer.MyIdentity = meowlib.NewKeyPair()
@ -53,11 +54,11 @@ func (id *Identity) InvitePeer(MyName string, ContactName string, MessageServerI
peer.Name = ContactName peer.Name = ContactName
peer.InvitationId = uuid.New().String() peer.InvitationId = uuid.New().String()
if id.MessageServers.Servers == nil { if id.MessageServers.Servers == nil {
return nil, errors.New("no message servers defined in your identity") return nil, nil, errors.New("no message servers defined in your identity")
} }
for _, i := range MessageServerIdxs { for _, i := range MessageServerIdxs {
if i > len(id.MessageServers.Servers)-1 { if i > len(id.MessageServers.Servers)-1 {
return nil, errors.New("requested server out of range of defined message servers") return nil, nil, errors.New("requested server out of range of defined message servers")
} }
} }
for _, i := range MessageServerIdxs { for _, i := range MessageServerIdxs {
@ -71,7 +72,7 @@ func (id *Identity) InvitePeer(MyName string, ContactName string, MessageServerI
myContactCard.InvitationId = peer.InvitationId myContactCard.InvitationId = peer.InvitationId
id.Peers = append(id.Peers, peer) id.Peers = append(id.Peers, peer)
return &myContactCard, nil return &peer, &myContactCard, nil
} }
func (id *Identity) CheckInvitation(ReceivedContact *meowlib.ContactCard) (isAnswer bool, proposedNick string, receivedNick string) { func (id *Identity) CheckInvitation(ReceivedContact *meowlib.ContactCard) (isAnswer bool, proposedNick string, receivedNick string) {

View File

@ -100,6 +100,23 @@ func (p *Peer) BuildSingleFileMessage(filename string, message []byte) ([]meowli
return msgs, nil return msgs, nil
} }
// Builds an invitation answer user message.
// it takes as input a contactcard generated by Identity.AnswerInvitation
func (p *Peer) BuildInvitationAnswserMessage(myContactCard *meowlib.ContactCard) (*meowlib.UserMessage, error) {
var msg meowlib.UserMessage
var invitation meowlib.Invitation
invitation.Step = 3
out, err := proto.Marshal(myContactCard)
if err != nil {
return nil, err
}
invitation.Payload = out
msg.Destination = p.Contact.LookupPublicKey
msg.From = p.MyIdentity.Public
msg.Type = "1"
return &msg, nil
}
// //
// Messages encryption and packaging // Messages encryption and packaging
// //

View File

@ -97,6 +97,7 @@ func (ints *Server) BuildMessageRequestMessage(lookupKeys []string) ([]byte, err
} }
// BuildToServerMessageInvitation creates an invitation message to server and returns it as a meowlib.ToServerMessage // BuildToServerMessageInvitation creates an invitation message to server and returns it as a meowlib.ToServerMessage
// it takes as input a contactcard generated by Identity.InvitePeer
func (ints *Server) BuildToServerMessageInvitationCreation(invitation *meowlib.ContactCard, password string, timeout int, invitationIdLen int) (*meowlib.ToServerMessage, error) { func (ints *Server) BuildToServerMessageInvitationCreation(invitation *meowlib.ContactCard, password string, timeout int, invitationIdLen int) (*meowlib.ToServerMessage, error) {
var msg meowlib.ToServerMessage var msg meowlib.ToServerMessage
var inv meowlib.Invitation var inv meowlib.Invitation
@ -109,21 +110,21 @@ func (ints *Server) BuildToServerMessageInvitationCreation(invitation *meowlib.C
inv.Step = 1 inv.Step = 1
inv.Password = password inv.Password = password
inv.Timeout = int32(timeout) inv.Timeout = int32(timeout)
inv.Idlen = int32(invitationIdLen) inv.ShortcodeLen = int32(invitationIdLen)
inv.Payload = payload inv.Payload = payload
msg.Invitation = &inv msg.Invitation = &inv
return &msg, nil return &msg, nil
} }
// BuildToServerMessageInvitationRequest requests invitation with provided id from server and returns it as a meowlib.ToServerMessage // BuildToServerMessageInvitationRequest requests invitation with provided id from server and returns it as a meowlib.ToServerMessage
func (ints *Server) BuildToServerMessageInvitationRequest(invitationId string, password string) (*meowlib.ToServerMessage, error) { func (ints *Server) BuildToServerMessageInvitationRequest(shortcode string, password string) (*meowlib.ToServerMessage, error) {
var msg meowlib.ToServerMessage var msg meowlib.ToServerMessage
var inv meowlib.Invitation var inv meowlib.Invitation
msg.Type = "1" msg.Type = "1"
msg.From = ints.Me.Public msg.From = ints.Me.Public
inv.Step = 2 inv.Step = 2
inv.Password = password inv.Password = password
inv.Id = invitationId inv.Shortcode = shortcode
msg.Invitation = &inv msg.Invitation = &inv
return &msg, nil return &msg, nil
} }

View File

@ -30,20 +30,21 @@ func TestEndToEnd(t *testing.T) {
// Create an invitation for a friend, I want him/her to know me as Bender // // Create an invitation for a friend, I want him/her to know me as Bender //
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
fmt.Println("Creating an invitation for the first friend...") fmt.Println("Creating an invitation for the first friend...")
invitation, err := Me.InvitePeer("Bender", "myfirstfriend", []int{1, 2}) peer, myContactCard, err := Me.InvitePeer("Bender", "myfirstfriend", []int{1, 2})
if err != nil { if err != nil {
println(err) println(err)
} }
println(peer.Name)
// print my invitation // print my invitation
a, _ := json.Marshal(invitation) a, _ := json.Marshal(myContactCard)
fmt.Println(string(a)) fmt.Println(string(a))
// TODO : Convert invitation to QR Code // TODO : Convert invitation to QR Code
invitation.WritePng("invitation.png") myContactCard.WritePng("invitation.png")
data, err := invitation.Compress() data, err := myContactCard.Compress()
if err != nil { if err != nil {
println(err) println(err)
} }
invitation.WriteQr("qrcode.png") myContactCard.WriteQr("qrcode.png")
println("Compressed contact card :", len(data)) println("Compressed contact card :", len(data))
/////////////////////////////////////// ///////////////////////////////////////
// Simulate peer invitation response // // Simulate peer invitation response //
@ -59,7 +60,7 @@ func TestEndToEnd(t *testing.T) {
ReceivedContact.ContactPublicKey = FirstFriendContactKp.Public ReceivedContact.ContactPublicKey = FirstFriendContactKp.Public
ReceivedContact.EncryptionPublicKey = FirstFriendEncryptionKp.Public ReceivedContact.EncryptionPublicKey = FirstFriendEncryptionKp.Public
ReceivedContact.LookupPublicKey = FirstFriendLookupKp.Public ReceivedContact.LookupPublicKey = FirstFriendLookupKp.Public
ReceivedContact.InvitationId = invitation.InvitationId ReceivedContact.InvitationId = myContactCard.InvitationId
FriendServer1KP := meowlib.NewKeyPair() FriendServer1KP := meowlib.NewKeyPair()
FriendServer1 := meowlib.ServerCard{Name: "FriendServer1", Url: "http://myfriend.org/meow/", PublicKey: FriendServer1KP.Public, Description: "Fancy description", ConfidenceLevel: 1} FriendServer1 := meowlib.ServerCard{Name: "FriendServer1", Url: "http://myfriend.org/meow/", PublicKey: FriendServer1KP.Public, Description: "Fancy description", ConfidenceLevel: 1}
ReceivedContact.PullServers = append(ReceivedContact.PullServers, &FriendServer1) ReceivedContact.PullServers = append(ReceivedContact.PullServers, &FriendServer1)

View File

@ -13,7 +13,7 @@ func (msg *UserMessage) AddFile(filename string, maxMessageSize int64) error {
return err return err
} }
if fi.Size() > maxMessageSize { if fi.Size() > maxMessageSize {
return errors.New("cannot add file, file bigger than messge size") return errors.New("cannot add file, file bigger than message size")
} }
var totalsize int64 var totalsize int64
totalsize = 0 totalsize = 0

View File

@ -104,11 +104,12 @@ type Invitation struct {
Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` // invitation payload, encrypted after step 2 Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` // invitation payload, encrypted after step 2
Timeout int32 `protobuf:"varint,2,opt,name=timeout,proto3" json:"timeout,omitempty"` // how long do I want the invitation to remain available on the server Timeout int32 `protobuf:"varint,2,opt,name=timeout,proto3" json:"timeout,omitempty"` // how long do I want the invitation to remain available on the server
Idlen int32 `protobuf:"varint,3,opt,name=idlen,proto3" json:"idlen,omitempty"` // len of the id you wish for short url transmission ShortcodeLen int32 `protobuf:"varint,3,opt,name=shortcodeLen,proto3" json:"shortcodeLen,omitempty"` // len of the shortcode you wish for short url transmission
Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` // password tou set for accessin invitation (optional) Shortcode string `protobuf:"bytes,4,opt,name=shortcode,proto3" json:"shortcode,omitempty"` // shortcode that the friend shall request to get the invitation
Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"` // id that the friend shall request to get teh invitation Password string `protobuf:"bytes,5,opt,name=password,proto3" json:"password,omitempty"` // password tou set for accessin invitation (optional)
Expiry int64 `protobuf:"varint,6,opt,name=expiry,proto3" json:"expiry,omitempty"` // the server allowed expiry date, it may be samller than the requested timeout according to server policy Uuid string `protobuf:"bytes,6,opt,name=uuid,proto3" json:"uuid,omitempty"` // id that the friend gave you, that you should include to your reply to get recognized
Step int32 `protobuf:"varint,7,opt,name=step,proto3" json:"step,omitempty"` // progress in the inviattion process : 1=invite friend, 2=friend requests invitation, 3=friend's answer, 4=request answer Expiry int64 `protobuf:"varint,7,opt,name=expiry,proto3" json:"expiry,omitempty"` // the server allowed expiry date, it may be samller than the requested timeout according to server policy
Step int32 `protobuf:"varint,8,opt,name=step,proto3" json:"step,omitempty"` // progress in the inviattion process : 1=invite friend, 2=friend requests invitation, 3=friend's answer
} }
func (x *Invitation) Reset() { func (x *Invitation) Reset() {
@ -157,13 +158,20 @@ func (x *Invitation) GetTimeout() int32 {
return 0 return 0
} }
func (x *Invitation) GetIdlen() int32 { func (x *Invitation) GetShortcodeLen() int32 {
if x != nil { if x != nil {
return x.Idlen return x.ShortcodeLen
} }
return 0 return 0
} }
func (x *Invitation) GetShortcode() string {
if x != nil {
return x.Shortcode
}
return ""
}
func (x *Invitation) GetPassword() string { func (x *Invitation) GetPassword() string {
if x != nil { if x != nil {
return x.Password return x.Password
@ -171,9 +179,9 @@ func (x *Invitation) GetPassword() string {
return "" return ""
} }
func (x *Invitation) GetId() string { func (x *Invitation) GetUuid() string {
if x != nil { if x != nil {
return x.Id return x.Uuid
} }
return "" return ""
} }
@ -278,7 +286,7 @@ type ToServerMessage struct {
KnownServers []*ServerCard `protobuf:"bytes,6,rep,name=knownServers,proto3" json:"knownServers,omitempty"` KnownServers []*ServerCard `protobuf:"bytes,6,rep,name=knownServers,proto3" json:"knownServers,omitempty"`
MatriochkaMessage *Matriochka `protobuf:"bytes,7,opt,name=matriochkaMessage,proto3" json:"matriochkaMessage,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"` Uuid string `protobuf:"bytes,8,opt,name=uuid,proto3" json:"uuid,omitempty"`
Invitation *Invitation `protobuf:"bytes,9,opt,name=invitation,proto3" json:"invitation,omitempty"` Invitation *Invitation `protobuf:"bytes,9,opt,name=invitation,proto3" json:"invitation,omitempty"` // invitation for the 2 first steps of a "through server" invitation process
} }
func (x *ToServerMessage) Reset() { func (x *ToServerMessage) Reset() {
@ -436,7 +444,7 @@ type FromServerMessage struct {
ServerUuid string `protobuf:"bytes,5,opt,name=serverUuid,proto3" json:"serverUuid,omitempty"` // Provides the server uuid that replaced the client uuid ServerUuid string `protobuf:"bytes,5,opt,name=serverUuid,proto3" json:"serverUuid,omitempty"` // Provides the server uuid that replaced the client uuid
Chat []*PackedUserMessage `protobuf:"bytes,6,rep,name=chat,proto3" json:"chat,omitempty"` Chat []*PackedUserMessage `protobuf:"bytes,6,rep,name=chat,proto3" json:"chat,omitempty"`
KnownServers []*ServerCard `protobuf:"bytes,7,rep,name=knownServers,proto3" json:"knownServers,omitempty"` KnownServers []*ServerCard `protobuf:"bytes,7,rep,name=knownServers,proto3" json:"knownServers,omitempty"`
Invitation *Invitation `protobuf:"bytes,8,opt,name=invitation,proto3" json:"invitation,omitempty"` Invitation *Invitation `protobuf:"bytes,8,opt,name=invitation,proto3" json:"invitation,omitempty"` // invitation answer, for the third steps of any invitation
} }
func (x *FromServerMessage) Reset() { func (x *FromServerMessage) Reset() {
@ -1100,6 +1108,7 @@ type UserMessage struct {
Files []*File `protobuf:"bytes,9,rep,name=files,proto3" json:"files,omitempty"` Files []*File `protobuf:"bytes,9,rep,name=files,proto3" json:"files,omitempty"`
CurrentLocation *Location `protobuf:"bytes,10,opt,name=currentLocation,proto3" json:"currentLocation,omitempty"` CurrentLocation *Location `protobuf:"bytes,10,opt,name=currentLocation,proto3" json:"currentLocation,omitempty"`
Appdata []byte `protobuf:"bytes,11,opt,name=appdata,proto3" json:"appdata,omitempty"` Appdata []byte `protobuf:"bytes,11,opt,name=appdata,proto3" json:"appdata,omitempty"`
Invitation *Invitation `protobuf:"bytes,12,opt,name=invitation,proto3" json:"invitation,omitempty"`
} }
func (x *UserMessage) Reset() { func (x *UserMessage) Reset() {
@ -1211,15 +1220,22 @@ func (x *UserMessage) GetAppdata() []byte {
return nil return nil
} }
func (x *UserMessage) GetInvitation() *Invitation {
if x != nil {
return x.Invitation
}
return nil
}
type File struct { type File struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
Filename string `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"` Filename string `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"` // the proposed filename
Size uint64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` Size uint64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` // the file size
Chunk uint32 `protobuf:"varint,3,opt,name=chunk,proto3" json:"chunk,omitempty"` Chunk uint32 `protobuf:"varint,3,opt,name=chunk,proto3" json:"chunk,omitempty"` // the chunk counter if file is sent by chunks
Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` // the file/chunk content
} }
func (x *File) Reset() { func (x *File) Reset() {
@ -1363,18 +1379,21 @@ 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, 0xae, 0x01, 0x0a, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xde, 0x01, 0x0a,
0x0a, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x0a, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70,
0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61,
0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,
0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12,
0x14, 0x0a, 0x05, 0x69, 0x64, 0x6c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x22, 0x0a, 0x0c, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x4c, 0x65, 0x6e, 0x18,
0x69, 0x64, 0x6c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x6f, 0x64, 0x65,
0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x4c, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x6f, 0x64, 0x65,
0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x6f, 0x64,
0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20,
0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x12, 0x0a,
0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69,
0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28,
0x03, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x03, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x74, 0x65,
0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x22, 0xaf, 0x01, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x22, 0xaf, 0x01,
0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 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, 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, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70,
@ -1515,7 +1534,7 @@ var file_messages_proto_rawDesc = []byte{
0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x6d, 0x65, 0x6d,
0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x6f, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x6f,
0x77, 0x6c, 0x69, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x43, 0x61, 0x72, 0x64, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x43, 0x61, 0x72, 0x64,
0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xab, 0x03, 0x0a, 0x0b, 0x55, 0x73, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xe0, 0x03, 0x0a, 0x0b, 0x55, 0x73,
0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73,
0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x66,
@ -1542,23 +1561,26 @@ var file_messages_proto_rawDesc = []byte{
0x6c, 0x69, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x75, 0x6c, 0x69, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x75,
0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a,
0x07, 0x61, 0x70, 0x70, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x07, 0x61, 0x70, 0x70, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07,
0x61, 0x70, 0x70, 0x64, 0x61, 0x74, 0x61, 0x22, 0x60, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x61, 0x70, 0x70, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74,
0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x65,
0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x77, 0x6c, 0x69, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x60, 0x0a, 0x04,
0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65,
0x63, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65,
0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x74, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x03, 0x20,
0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61,
0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x74,
0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69,
0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1a,
0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02,
0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x61, 0x6c, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x42, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f,
0x21, 0x5a, 0x1f, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c,
0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x79, 0x76, 0x65, 0x73, 0x2f, 0x6d, 0x65, 0x6f, 0x77, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x69,
0x69, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x61, 0x6c, 0x74, 0x69,
0x74, 0x75, 0x64, 0x65, 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 ( var (
@ -1612,11 +1634,12 @@ var file_messages_proto_depIdxs = []int32{
12, // 16: meowlib.UserMessage.group:type_name -> meowlib.Group 12, // 16: meowlib.UserMessage.group:type_name -> meowlib.Group
14, // 17: meowlib.UserMessage.files:type_name -> meowlib.File 14, // 17: meowlib.UserMessage.files:type_name -> meowlib.File
15, // 18: meowlib.UserMessage.currentLocation:type_name -> meowlib.Location 15, // 18: meowlib.UserMessage.currentLocation:type_name -> meowlib.Location
19, // [19:19] is the sub-list for method output_type 1, // 19: meowlib.UserMessage.invitation:type_name -> meowlib.Invitation
19, // [19:19] is the sub-list for method input_type 20, // [20:20] is the sub-list for method output_type
19, // [19:19] is the sub-list for extension type_name 20, // [20:20] is the sub-list for method input_type
19, // [19:19] is the sub-list for extension extendee 20, // [20:20] is the sub-list for extension type_name
0, // [0:19] is the sub-list for field type_name 20, // [20:20] is the sub-list for extension extendee
0, // [0:20] is the sub-list for field type_name
} }
func init() { file_messages_proto_init() } func init() { file_messages_proto_init() }

View File

@ -24,11 +24,12 @@ message PackedServerMessage {
message Invitation { message Invitation {
bytes payload = 1; // invitation payload, encrypted after step 2 bytes payload = 1; // invitation payload, encrypted after step 2
int32 timeout = 2; // how long do I want the invitation to remain available on the server int32 timeout = 2; // how long do I want the invitation to remain available on the server
int32 idlen = 3; // len of the id you wish for short url transmission int32 shortcodeLen = 3; // len of the shortcode you wish for short url transmission
string password = 4; // password tou set for accessin invitation (optional) string shortcode = 4; // shortcode that the friend shall request to get the invitation
string id = 5; // id that the friend shall request to get teh invitation string password = 5; // password tou set for accessin invitation (optional)
int64 expiry = 6; // the server allowed expiry date, it may be samller than the requested timeout according to server policy string uuid = 6; // id that the friend gave you, that you should include to your reply to get recognized
int32 step = 7; // progress in the inviattion process : 1=invite friend, 2=friend requests invitation, 3=friend's answer, 4=request answer int64 expiry = 7; // the server allowed expiry date, it may be samller than the requested timeout according to server policy
int32 step = 8; // progress in the inviattion process : 1=invite friend, 2=friend requests invitation, 3=friend's answer
} }
@ -57,7 +58,7 @@ message ToServerMessage {
string uuid = 8; string uuid = 8;
Invitation invitation = 9; Invitation invitation = 9; // invitation for the 2 first steps of a "through server" invitation process
} }
@ -77,7 +78,7 @@ message FromServerMessage {
repeated ServerCard knownServers = 7; repeated ServerCard knownServers = 7;
Invitation invitation = 8; Invitation invitation = 8; // invitation answer, for the third steps of any invitation
} }
@ -160,13 +161,15 @@ message UserMessage {
Location currentLocation = 10; Location currentLocation = 10;
bytes appdata = 11; bytes appdata = 11;
Invitation invitation = 12;
} }
message File { message File {
string filename=1; string filename=1; // the proposed filename
uint64 size=2; uint64 size=2; // the file size
uint32 chunk=3; uint32 chunk=3; // the chunk counter if file is sent by chunks
bytes data=4; bytes data=4; // the file/chunk content
} }
message Location { message Location {

View File

@ -93,11 +93,11 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
if msg.Invitation != nil { if msg.Invitation != nil {
switch msg.Invitation.Step { switch msg.Invitation.Step {
case 1: // create invitation case 1: // create invitation
url, expiry := r.CreateInvitation(msg.Invitation.Payload, int(msg.Invitation.Timeout), msg.Invitation.Password, r.InvitationTimeout, int(msg.Invitation.Idlen)) url, expiry := r.CreateInvitation(msg.Invitation.Payload, int(msg.Invitation.Timeout), msg.Invitation.Password, r.InvitationTimeout, int(msg.Invitation.ShortcodeLen))
from_server.Invitation.Id = url from_server.Invitation.Shortcode = url
from_server.Invitation.Expiry = expiry.UTC().Unix() from_server.Invitation.Expiry = expiry.UTC().Unix()
case 2: // get invitation case 2: // get invitation
invitation, err := r.GetInvitation(msg.Invitation.Id, msg.Invitation.Password) invitation, err := r.GetInvitation(msg.Invitation.Shortcode, msg.Invitation.Password)
if err != nil { if err != nil {
if err.Error() == "auth failed" { if err.Error() == "auth failed" {
from_server.Invitation.Payload = []byte("authentication failure") from_server.Invitation.Payload = []byte("authentication failure")
@ -107,6 +107,8 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
} else { } else {
from_server.Invitation.Payload = invitation from_server.Invitation.Payload = invitation
} }
/* should not happen
case 3: // answer invitation case 3: // answer invitation
expiry := r.AnswerInvitation(msg.Invitation.Id, int(msg.Invitation.Timeout), msg.Invitation.Payload, r.InvitationTimeout) expiry := r.AnswerInvitation(msg.Invitation.Id, int(msg.Invitation.Timeout), msg.Invitation.Payload, r.InvitationTimeout)
from_server.Invitation.Expiry = expiry.UTC().Unix() from_server.Invitation.Expiry = expiry.UTC().Unix()
@ -117,6 +119,7 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
} else { } else {
from_server.Invitation.Payload = answer from_server.Invitation.Payload = answer
} }
*/
} }
} }
/* /*