2021-03-12 13:42:30 +00:00
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
|
|
|
package admin
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"github.com/gorilla/csrf"
|
|
|
|
"go.mindeco.de/http/render"
|
|
|
|
|
2021-05-31 12:50:44 +00:00
|
|
|
"github.com/ssb-ngi-pointer/go-ssb-room/v2/roomdb"
|
|
|
|
weberrors "github.com/ssb-ngi-pointer/go-ssb-room/v2/web/errors"
|
|
|
|
"github.com/ssb-ngi-pointer/go-ssb-room/v2/web/members"
|
2021-03-12 13:42:30 +00:00
|
|
|
)
|
|
|
|
|
2021-03-16 08:10:44 +00:00
|
|
|
// aliasesHandler implements the managment endpoints for aliases (list and revoke),
|
|
|
|
// does light validation of the web arguments and passes them through to the roomdb.
|
2021-03-12 13:42:30 +00:00
|
|
|
type aliasesHandler struct {
|
|
|
|
r *render.Renderer
|
|
|
|
|
2021-04-01 07:04:38 +00:00
|
|
|
flashes *weberrors.FlashHelper
|
|
|
|
|
2021-03-19 09:43:46 +00:00
|
|
|
db roomdb.AliasesService
|
2021-03-12 13:42:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (h aliasesHandler) revokeConfirm(rw http.ResponseWriter, req *http.Request) (interface{}, error) {
|
|
|
|
if req.Method != "GET" {
|
|
|
|
return nil, weberrors.ErrBadRequest{Where: "HTTP Method", Details: fmt.Errorf("expected GET request")}
|
|
|
|
}
|
|
|
|
|
|
|
|
id, err := strconv.ParseInt(req.URL.Query().Get("id"), 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
err = weberrors.ErrBadRequest{Where: "ID", Details: err}
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
entry, err := h.db.GetByID(req.Context(), id)
|
|
|
|
if err != nil {
|
2021-04-05 07:12:05 +00:00
|
|
|
return nil, weberrors.ErrRedirect{
|
2021-04-12 08:50:09 +00:00
|
|
|
Path: redirectToMembers,
|
2021-04-05 07:12:05 +00:00
|
|
|
Reason: err,
|
|
|
|
}
|
2021-03-12 13:42:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return map[string]interface{}{
|
|
|
|
"Entry": entry,
|
|
|
|
csrf.TemplateTag: csrf.TemplateField(req),
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h aliasesHandler) revoke(rw http.ResponseWriter, req *http.Request) {
|
|
|
|
if req.Method != "POST" {
|
|
|
|
err := weberrors.ErrBadRequest{Where: "HTTP Method", Details: fmt.Errorf("expected POST request")}
|
|
|
|
h.r.Error(rw, req, http.StatusMethodNotAllowed, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
err := req.ParseForm()
|
|
|
|
if err != nil {
|
2021-04-12 08:34:20 +00:00
|
|
|
err = weberrors.ErrRedirect{
|
|
|
|
Path: redirectToMembers,
|
|
|
|
Reason: weberrors.ErrBadRequest{Where: "Form data", Details: err},
|
|
|
|
}
|
|
|
|
h.r.Error(rw, req, http.StatusBadRequest, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-05-13 07:57:45 +00:00
|
|
|
defer http.Redirect(rw, req, redirectToMembers, http.StatusSeeOther)
|
|
|
|
|
2021-04-12 08:34:20 +00:00
|
|
|
aliasName := req.FormValue("name")
|
|
|
|
|
|
|
|
ctx := req.Context()
|
|
|
|
|
|
|
|
aliasEntry, err := h.db.Resolve(ctx, aliasName)
|
|
|
|
if err != nil {
|
2021-05-13 07:57:45 +00:00
|
|
|
h.flashes.AddError(rw, req, err)
|
2021-04-12 08:34:20 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// who is doing this request
|
|
|
|
currentMember := members.FromContext(ctx)
|
|
|
|
if currentMember == nil {
|
|
|
|
err := weberrors.ErrForbidden{Details: fmt.Errorf("not an member")}
|
2021-05-13 07:57:45 +00:00
|
|
|
h.flashes.AddError(rw, req, err)
|
2021-04-12 08:34:20 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// ensure own alias or admin
|
|
|
|
if !aliasEntry.Feed.Equal(¤tMember.PubKey) && currentMember.Role != roomdb.RoleAdmin {
|
|
|
|
err := weberrors.ErrForbidden{Details: fmt.Errorf("not your alias or not an admin")}
|
2021-05-13 07:57:45 +00:00
|
|
|
h.flashes.AddError(rw, req, err)
|
2021-03-12 13:42:30 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-04-12 08:34:20 +00:00
|
|
|
err = h.db.Revoke(ctx, aliasName)
|
2021-03-12 13:42:30 +00:00
|
|
|
if err != nil {
|
2021-04-01 07:04:38 +00:00
|
|
|
h.flashes.AddError(rw, req, err)
|
2021-05-13 07:57:45 +00:00
|
|
|
return
|
2021-03-12 13:42:30 +00:00
|
|
|
}
|
|
|
|
|
2021-05-13 07:57:45 +00:00
|
|
|
h.flashes.AddMessage(rw, req, "AdminMemberDetailsAliasRevoked")
|
2021-03-12 13:42:30 +00:00
|
|
|
}
|