package addon import ( "bytes" "log" "net/http" "strings" "github.com/ponzu-cms/ponzu/system/admin" "github.com/ponzu-cms/ponzu/system/db" "github.com/ponzu-cms/ponzu/system/item" "github.com/tidwall/gjson" ) func addonsHandler(res http.ResponseWriter, req *http.Request) { switch req.Method { case http.MethodGet: all := db.AddonAll() list := &bytes.Buffer{} for i := range all { v := adminAddonListItem(all[i]) _, err := list.Write(v) if err != nil { log.Println("Error writing bytes to addon list view:", err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { log.Println(err) return } res.Write(errView) return } } html := &bytes.Buffer{} open := `
No addons available.
`) if err != nil { log.Println("Error writing default addon html to admin view:", err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { log.Println(err) return } res.Write(errView) return } } view, err := admin.Admin(html.Bytes()) if err != nil { log.Println("Error writing addon html to admin view:", err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { log.Println(err) return } res.Write(errView) return } res.Write(view) case http.MethodPost: err := req.ParseMultipartForm(1024 * 1024 * 4) // maxMemory 4MB if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { return } res.Write(errView) return } id := req.PostFormValue("id") action := strings.ToLower(req.PostFormValue("action")) _, err = db.Addon(id) if err == db.ErrNoAddonExists { log.Println(err) res.WriteHeader(http.StatusNotFound) errView, err := admin.Error404() if err != nil { return } res.Write(errView) return } if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { return } res.Write(errView) return } switch action { case "enable": err := Enable(id) if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { return } res.Write(errView) return } case "disable": err := Disable(id) if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { return } res.Write(errView) return } default: res.WriteHeader(http.StatusBadRequest) errView, err := admin.Error400() if err != nil { return } res.Write(errView) return } http.Redirect(res, req, req.URL.String(), http.StatusFound) default: res.WriteHeader(http.StatusBadRequest) errView, err := admin.Error400() if err != nil { log.Println(err) return } res.Write(errView) return } } func addonHandler(res http.ResponseWriter, req *http.Request) { switch req.Method { case http.MethodGet: id := req.FormValue("id") data, err := db.Addon(id) if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { return } res.Write(errView) return } _, ok := Types[id] if !ok { log.Println("Addon: ", id, "is not found in addon.Types map") res.WriteHeader(http.StatusNotFound) errView, err := admin.Error404() if err != nil { return } res.Write(errView) return } m, err := Manage(data, id) if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { return } res.Write(errView) return } addonView, err := admin.Admin(m) if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) return } res.Header().Set("Content-Type", "text/html") res.Write(addonView) case http.MethodPost: // save req.Form err := req.ParseMultipartForm(1024 * 1024 * 4) // maxMemory 4MB if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { return } res.Write(errView) return } name := req.FormValue("addon_name") id := req.FormValue("addon_reverse_dns") at, ok := Types[id] if !ok { log.Println("Error: addon", name, "has no record in addon.Types map at", id) res.WriteHeader(http.StatusBadRequest) errView, err := admin.Error400() if err != nil { return } res.Write(errView) return } // if Hookable, call BeforeSave prior to saving h, ok := at().(item.Hookable) if ok { err := h.BeforeSave(req) if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { return } res.Write(errView) return } } err = db.SetAddon(req.Form, at()) if err != nil { log.Println("Error saving addon:", name, err) res.WriteHeader(http.StatusInternalServerError) errView, err := admin.Error500() if err != nil { return } res.Write(errView) return } http.Redirect(res, req, "/admin/addon?id="+id, http.StatusFound) default: res.WriteHeader(http.StatusBadRequest) errView, err := admin.Error405() if err != nil { log.Println(err) return } res.Write(errView) return } } func adminAddonListItem(data []byte) []byte { id := gjson.GetBytes(data, "addon_reverse_dns").String() status := gjson.GetBytes(data, "addon_status").String() name := gjson.GetBytes(data, "addon_name").String() var action string var buttonClass string if status != StatusEnabled { action = "Enable" buttonClass = "green" } else { action = "Disable" buttonClass = "red" } a := `