feat: domain blocker plugin
This commit is contained in:
parent
c9edb57505
commit
7dd02c0056
25 changed files with 898 additions and 63 deletions
|
@ -98,6 +98,7 @@ func New(cfg *config.Config, database *db.Database, version string) *Admin {
|
|||
"channel_detail.html",
|
||||
"plugin_list.html",
|
||||
"channel_plugins_list.html",
|
||||
"channel_plugin_config.html",
|
||||
}
|
||||
|
||||
for _, tf := range templateFiles {
|
||||
|
@ -143,6 +144,7 @@ func (a *Admin) RegisterRoutes(mux *http.ServeMux) {
|
|||
mux.HandleFunc("/admin/channels", a.handleChannelList)
|
||||
mux.HandleFunc("/admin/channels/", a.handleChannelDetail)
|
||||
mux.HandleFunc("/admin/channelplugins", a.handleChannelPluginList)
|
||||
mux.HandleFunc("/admin/channelplugins/config/", a.handleChannelPluginConfig)
|
||||
mux.HandleFunc("/admin/channelplugins/", a.handleChannelPluginDetailOrDelete)
|
||||
}
|
||||
|
||||
|
@ -628,6 +630,96 @@ func (a *Admin) handleChannelPluginList(w http.ResponseWriter, r *http.Request)
|
|||
})
|
||||
}
|
||||
|
||||
// handleChannelPluginConfig handles the channel plugin configuration route
|
||||
func (a *Admin) handleChannelPluginConfig(w http.ResponseWriter, r *http.Request) {
|
||||
// Check if user is logged in
|
||||
if !a.isLoggedIn(r) {
|
||||
http.Redirect(w, r, "/admin/login", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
|
||||
// Extract channel plugin ID from path
|
||||
path := r.URL.Path
|
||||
channelPluginID := strings.TrimPrefix(path, "/admin/channelplugins/config/")
|
||||
|
||||
// Convert channel plugin ID to int64
|
||||
id, err := strconv.ParseInt(channelPluginID, 10, 64)
|
||||
if err != nil {
|
||||
http.Error(w, "Invalid channel plugin ID", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// Get the channel plugin
|
||||
channelPlugin, err := a.db.GetChannelPluginByID(id)
|
||||
if err != nil {
|
||||
http.Error(w, "Channel plugin not found", http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
// Get the plugin
|
||||
p, err := plugin.Get(channelPlugin.PluginID)
|
||||
if err != nil {
|
||||
http.Error(w, "Plugin not found", http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
// Handle form submission
|
||||
if r.Method == http.MethodPost {
|
||||
// Parse form
|
||||
if err := r.ParseForm(); err != nil {
|
||||
http.Error(w, "Bad request", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// Create config map from form values
|
||||
config := make(map[string]interface{})
|
||||
|
||||
// Process form values based on plugin type
|
||||
if channelPlugin.PluginID == "security.domainblock" {
|
||||
// Get blocked domains from form
|
||||
blockedDomains := r.FormValue("blocked_domains")
|
||||
config["blocked_domains"] = blockedDomains
|
||||
} else {
|
||||
// Generic handling for other plugins
|
||||
for key, values := range r.Form {
|
||||
if key == "form_submitted" {
|
||||
continue
|
||||
}
|
||||
if len(values) == 1 {
|
||||
config[key] = values[0]
|
||||
} else {
|
||||
config[key] = values
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update plugin configuration
|
||||
if err := a.db.UpdateChannelPluginConfig(id, config); err != nil {
|
||||
http.Error(w, "Failed to update plugin configuration", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// Get the channel to redirect back to the channel detail page
|
||||
channel, err := a.db.GetChannelByID(channelPlugin.ChannelID)
|
||||
if err != nil {
|
||||
a.addFlash(w, r, "Plugin configuration updated", "success")
|
||||
http.Redirect(w, r, "/admin/channelplugins", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
|
||||
a.addFlash(w, r, "Plugin configuration updated", "success")
|
||||
http.Redirect(w, r, fmt.Sprintf("/admin/channels/%d", channel.ID), http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
|
||||
// Render template
|
||||
a.render(w, r, "channel_plugin_config.html", TemplateData{
|
||||
Title: "Configure Plugin: " + p.GetName(),
|
||||
ChannelPlugin: channelPlugin,
|
||||
Plugins: map[string]model.Plugin{channelPlugin.PluginID: p},
|
||||
})
|
||||
}
|
||||
|
||||
// handleChannelPluginDetailOrDelete handles the channel plugin detail or delete route
|
||||
func (a *Admin) handleChannelPluginDetailOrDelete(w http.ResponseWriter, r *http.Request) {
|
||||
// Check if user is logged in
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue