115 lines
2.8 KiB
Go
115 lines
2.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"net/url"
|
|
|
|
"amnezia-share/internal/models"
|
|
"amnezia-share/internal/web"
|
|
)
|
|
|
|
type configRow struct {
|
|
models.ShareCreation
|
|
LinkID int
|
|
LinkToken string
|
|
}
|
|
|
|
type adminConfigsView struct {
|
|
adminLayout
|
|
Rows []configRow
|
|
LinkIDFilter int
|
|
ServerIDFilter int
|
|
Truncated bool
|
|
}
|
|
|
|
const adminConfigsMax = 300
|
|
|
|
// AdminConfigsGet lists guest-created panel connections (optionally scoped to
|
|
// one link or server) with a delete action (admin/server_configs.php).
|
|
func AdminConfigsGet(a *web.App) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
ok, errText := flashFromQuery(r)
|
|
view := adminConfigsView{
|
|
adminLayout: newAdminLayout(a, r, "configs"),
|
|
LinkIDFilter: queryInt(r, "link_id", 0),
|
|
ServerIDFilter: queryInt(r, "server_id", 0),
|
|
}
|
|
view.OK, view.Error = ok, errText
|
|
|
|
add := func(linkID int, token string, creations []models.ShareCreation) {
|
|
for _, c := range creations {
|
|
if view.ServerIDFilter > 0 && c.ServerID != view.ServerIDFilter {
|
|
continue
|
|
}
|
|
if len(view.Rows) >= adminConfigsMax {
|
|
view.Truncated = true
|
|
return
|
|
}
|
|
view.Rows = append(view.Rows, configRow{ShareCreation: c, LinkID: linkID, LinkToken: token})
|
|
}
|
|
}
|
|
|
|
if view.LinkIDFilter > 0 {
|
|
if link, err := a.Share.LinkByID(ctx, view.LinkIDFilter); err == nil && link != nil {
|
|
creations, _ := a.Share.ListCreationsForLink(ctx, link.ID)
|
|
add(link.ID, link.Token, creations)
|
|
}
|
|
} else {
|
|
links, err := a.Share.ListLinks(ctx, 1, 50, "")
|
|
if err != nil {
|
|
view.Error = err.Error()
|
|
}
|
|
for _, l := range links {
|
|
creations, _ := a.Share.ListCreationsForLink(ctx, l.ID)
|
|
add(l.ID, l.Token, creations)
|
|
if view.Truncated {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
a.Render(w, r, "page_admin_configs", view)
|
|
}
|
|
}
|
|
|
|
// AdminConfigsPost deletes a single guest connection (from the panel, then the
|
|
// DB).
|
|
func AdminConfigsPost(a *web.App) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
var err error
|
|
var okMsg string
|
|
|
|
switch r.FormValue("action") {
|
|
case "delete_creation":
|
|
linkID := formInt(r, "link_id", 0)
|
|
creationID := formInt64(r, "creation_id", 0)
|
|
err = a.Share.SoftDeleteCreation(ctx, a.Panel, a.Settings, linkID, creationID)
|
|
if err == nil {
|
|
okMsg = "Конфигурация удалена."
|
|
}
|
|
default:
|
|
err = errUnknownAction
|
|
}
|
|
|
|
back := "admin/configs"
|
|
q := url.Values{}
|
|
if v := r.FormValue("link_id"); v != "" {
|
|
q.Set("link_id", v)
|
|
}
|
|
if v := r.FormValue("server_id_filter"); v != "" {
|
|
q.Set("server_id", v)
|
|
}
|
|
if len(q) > 0 {
|
|
back += "?" + q.Encode()
|
|
}
|
|
|
|
errText := ""
|
|
if err != nil {
|
|
errText = err.Error()
|
|
}
|
|
redirectWithFlash(w, r, a, back, okMsg, errText)
|
|
}
|
|
}
|