package server import ( "errors" "math/rand" "time" "github.com/go-redis/redis" ) func (r *RedisRouter) CreateInvitation(invitation []byte, timeout int, password string, serverTimeout int, urlLen int) (string, time.Time) { id := r.createShortId(urlLen) if timeout > serverTimeout { timeout = serverTimeout } r.Client.Set("mwiv:"+id, invitation, time.Duration(timeout*1000000)) if len(password) > 0 { r.Client.Set("mwpw:"+id, password, time.Duration(timeout*1000000)) } return id, time.Now().Add(time.Duration(timeout * 1000000)).UTC() } func (r *RedisRouter) GetInvitation(id string, password string) ([]byte, error) { passRequired := false expectedpass, err := r.Client.Get("mwpw:" + id).Result() if err != nil { passRequired = false } else { passRequired = true } if passRequired && password != expectedpass { return nil, errors.New("auth failed") } mwiv, err := r.Client.Get("mwiv:" + id).Result() if err != nil { return nil, err } return []byte(mwiv), nil } func (r *RedisRouter) AnswerInvitation(id string, timeout int, invitation []byte, serverTimeout int) time.Time { if timeout > serverTimeout { timeout = serverTimeout } r.Client.Set("mwan:"+id, invitation, time.Duration(timeout*1000000)) return time.Now().Add(time.Duration(timeout * 1000000)).UTC() } func (r *RedisRouter) GetInvitationAnswer(id string) ([]byte, error) { mwan, err := r.Client.Get("mwiv:" + id).Result() if err != nil { return nil, err } return []byte(mwan), nil } func (r *RedisRouter) createShortId(length int) string { id := "" alphabet := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" // for not in redis for { for i := 1; i <= length; i++ { id += string(alphabet[rand.Intn(61)]) } if r.Client.Get("mwiv:"+id).Err() == redis.Nil { break } } return id }