Integrate invitation process in router

This commit is contained in:
ycc
2023-08-31 23:38:03 +02:00
parent 5eb06ebcc5
commit d082724432
4 changed files with 234 additions and 190 deletions

View File

@ -29,7 +29,7 @@ func (r *RedisRouter) GetInvitation(id string, password string) ([]byte, error)
passRequired = true
}
if passRequired && password != expectedpass {
return nil, errors.New("invitation get : auth failed, wrong password")
return nil, errors.New("auth failed")
}
mwiv, err := r.Client.Get("mwiv:" + id).Result()
if err != nil {

View File

@ -10,10 +10,11 @@ import (
)
type RedisRouter struct {
Name string
ServerIdentity *Identity
Client *redis.Client
Context context.Context
Name string
ServerIdentity *Identity
Client *redis.Client
InvitationTimeout int
Context context.Context
}
func NewRedisRouter(server *Identity, url string, password string, db int) *RedisRouter {
@ -31,7 +32,8 @@ func NewRedisRouter(server *Identity, url string, password string, db int) *Redi
func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMessage, error) {
var from_server meowlib.FromServerMessage
if len(msg.Messages) > 0 { // user message
// user message
if len(msg.Messages) > 0 {
for _, usrmsg := range msg.Messages {
// serialize the message to store it as byte array into redis
out, err := proto.Marshal(usrmsg)
@ -42,6 +44,7 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
}
from_server.UuidAck = msg.Uuid
}
// check for messages
if len(msg.PullRequest) > 0 {
for _, rq := range msg.PullRequest {
msgcnt, err := r.Client.ZCount(rq.LookupKey, "-inf", "+inf").Result()
@ -69,7 +72,7 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
}
}
// manage Matriochka
if msg.MatriochkaMessage != nil {
out, err := proto.Marshal(msg)
if err != nil {
@ -81,9 +84,39 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
}
from_server.UuidAck = msg.Uuid
}
// Server list exchange
if len(msg.KnownServers) > 0 {
}
// Through server invitation process
if msg.Invitation != nil {
switch msg.Invitation.Step {
case 1: // create invitation
url, expiry := r.CreateInvitation(msg.Invitation.Payload, int(msg.Invitation.Timeout), msg.Invitation.Password, r.InvitationTimeout, int(msg.Invitation.Urllen))
from_server.Invitation.Url = url
from_server.Invitation.Expiry = expiry.UTC().Unix()
case 2: // get invitation
invitation, err := r.GetInvitation(msg.Invitation.Url, msg.Invitation.Password)
if err != nil {
if err.Error() == "auth failed" {
from_server.Invitation.Payload = []byte("authentication failure")
} else {
from_server.Invitation.Payload = []byte("invitation expired")
}
} else {
from_server.Invitation.Payload = invitation
}
case 3: // answer invitation
expiry := r.AnswerInvitation(msg.Invitation.Url, int(msg.Invitation.Timeout), msg.Invitation.Payload, r.InvitationTimeout)
from_server.Invitation.Expiry = expiry.UTC().Unix()
case 4: // get answer
answer, err := r.GetInvitationAnswer(msg.Invitation.Url)
if err != nil {
from_server.Invitation.Payload = []byte("invitation expired")
} else {
from_server.Invitation.Payload = answer
}
}
}
/*