2021-03-04 14:09:14 +00:00
|
|
|
package handlers
|
|
|
|
|
|
|
|
import (
|
2021-03-09 17:27:44 +00:00
|
|
|
"encoding/base64"
|
2021-03-04 14:09:14 +00:00
|
|
|
"errors"
|
2021-03-09 17:27:44 +00:00
|
|
|
"fmt"
|
2021-03-04 14:09:14 +00:00
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"go.mindeco.de/http/render"
|
2021-03-05 10:15:36 +00:00
|
|
|
"go.mindeco.de/logging"
|
2021-03-09 17:27:44 +00:00
|
|
|
"golang.org/x/crypto/ed25519"
|
2021-03-04 14:09:14 +00:00
|
|
|
|
2021-03-05 10:15:36 +00:00
|
|
|
"github.com/go-kit/kit/log/level"
|
2021-03-04 14:09:14 +00:00
|
|
|
"github.com/gorilla/csrf"
|
|
|
|
"github.com/ssb-ngi-pointer/go-ssb-room/admindb"
|
|
|
|
weberrors "github.com/ssb-ngi-pointer/go-ssb-room/web/errors"
|
|
|
|
refs "go.mindeco.de/ssb-refs"
|
|
|
|
)
|
|
|
|
|
|
|
|
type inviteHandler struct {
|
|
|
|
r *render.Renderer
|
|
|
|
|
|
|
|
invites admindb.InviteService
|
|
|
|
alaises admindb.AliasService
|
2021-03-09 17:27:44 +00:00
|
|
|
|
|
|
|
muxrpcHostAndPort string
|
|
|
|
roomPubKey ed25519.PublicKey
|
2021-03-04 14:09:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (h inviteHandler) acceptForm(rw http.ResponseWriter, req *http.Request) (interface{}, error) {
|
2021-03-05 10:15:36 +00:00
|
|
|
token := req.URL.Query().Get("token")
|
|
|
|
|
|
|
|
inv, err := h.invites.GetByToken(req.Context(), token)
|
2021-03-04 14:09:14 +00:00
|
|
|
if err != nil {
|
|
|
|
if errors.Is(err, admindb.ErrNotFound) {
|
|
|
|
return nil, weberrors.ErrNotFound{What: "invite"}
|
|
|
|
}
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return map[string]interface{}{
|
2021-03-05 10:15:36 +00:00
|
|
|
"Token": token,
|
|
|
|
"Invite": inv,
|
|
|
|
|
2021-03-04 14:09:14 +00:00
|
|
|
csrf.TemplateTag: csrf.TemplateField(req),
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h inviteHandler) consume(rw http.ResponseWriter, req *http.Request) (interface{}, error) {
|
|
|
|
if err := req.ParseForm(); err != nil {
|
|
|
|
return nil, weberrors.ErrBadRequest{Where: "form data", Details: err}
|
|
|
|
}
|
|
|
|
|
2021-03-05 10:15:36 +00:00
|
|
|
alias := req.FormValue("alias")
|
|
|
|
|
2021-03-04 14:09:14 +00:00
|
|
|
token := req.FormValue("token")
|
|
|
|
|
|
|
|
newMember, err := refs.ParseFeedRef(req.FormValue("new_member"))
|
|
|
|
if err != nil {
|
|
|
|
return nil, weberrors.ErrBadRequest{Where: "form data", Details: err}
|
|
|
|
}
|
|
|
|
|
|
|
|
inv, err := h.invites.Consume(req.Context(), token, *newMember)
|
|
|
|
if err != nil {
|
|
|
|
if errors.Is(err, admindb.ErrNotFound) {
|
|
|
|
return nil, weberrors.ErrNotFound{What: "invite"}
|
|
|
|
}
|
|
|
|
return nil, err
|
|
|
|
}
|
2021-03-05 10:15:36 +00:00
|
|
|
log := logging.FromContext(req.Context())
|
|
|
|
level.Info(log).Log("event", "invite consumed", "id", inv.ID, "ref", newMember.ShortRef())
|
|
|
|
|
|
|
|
if alias != "" {
|
|
|
|
level.Warn(log).Log(
|
|
|
|
"TODO", "invite registration",
|
|
|
|
"alias", alias,
|
|
|
|
)
|
|
|
|
}
|
2021-03-04 14:09:14 +00:00
|
|
|
|
2021-03-09 17:27:44 +00:00
|
|
|
// TODO: hardcoded here just to be replaced soon with next version of ssb-uri
|
|
|
|
roomPubKey := base64.StdEncoding.EncodeToString(h.roomPubKey)
|
|
|
|
roomAddr := fmt.Sprintf("net:%s~shs:%s:SSB+Room+PSK3TLYC2T86EHQCUHBUHASCASE18JBV24=", h.muxrpcHostAndPort, roomPubKey)
|
|
|
|
|
2021-03-04 14:09:14 +00:00
|
|
|
return map[string]interface{}{
|
2021-03-09 17:27:44 +00:00
|
|
|
"RoomAddress": roomAddr,
|
2021-03-04 14:09:14 +00:00
|
|
|
}, nil
|
|
|
|
}
|