2023-09-24 20:57:56 +00:00
|
|
|
// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
2023-09-21 18:03:21 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"embed"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
"net/url"
|
|
|
|
"strings"
|
|
|
|
"text/template"
|
|
|
|
)
|
|
|
|
|
|
|
|
//go:embed static
|
|
|
|
var fs embed.FS
|
|
|
|
|
|
|
|
func rootHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
|
req <- struct{}{}
|
|
|
|
data := <-res
|
|
|
|
tmpl := template.Must(template.ParseFS(fs, "static/home.html"))
|
|
|
|
if err := tmpl.Execute(w, data); err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func newHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
|
params := r.URL.Query()
|
|
|
|
action := bmStrict.Sanitize(params.Get("action"))
|
|
|
|
if r.Method == http.MethodGet {
|
|
|
|
if action == "" {
|
|
|
|
tmpl := template.Must(template.ParseFS(fs, "static/new.html"))
|
|
|
|
if err := tmpl.Execute(w, nil); err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
} else if action != "delete" {
|
2023-09-26 20:13:45 +00:00
|
|
|
submittedURL := bmStrict.Sanitize(params.Get("submittedURL"))
|
|
|
|
if submittedURL == "" {
|
2023-09-21 18:03:21 +00:00
|
|
|
w.WriteHeader(http.StatusBadRequest)
|
2023-09-24 21:08:00 +00:00
|
|
|
_, err := w.Write([]byte("No URL provided"))
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
2023-09-21 18:03:21 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
forge := bmStrict.Sanitize(params.Get("forge"))
|
|
|
|
if forge == "" {
|
|
|
|
w.WriteHeader(http.StatusBadRequest)
|
2023-09-24 21:08:00 +00:00
|
|
|
_, err := w.Write([]byte("No forge provided"))
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
2023-09-21 18:03:21 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
name := bmStrict.Sanitize(params.Get("name"))
|
|
|
|
if name == "" {
|
|
|
|
w.WriteHeader(http.StatusBadRequest)
|
2023-09-24 21:08:00 +00:00
|
|
|
_, err := w.Write([]byte("No name provided"))
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
|
|
|
|
}
|
2023-09-21 18:03:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
proj := project{
|
2023-09-26 20:13:45 +00:00
|
|
|
URL: submittedURL,
|
2023-09-21 18:03:21 +00:00
|
|
|
Name: name,
|
|
|
|
Forge: forge,
|
|
|
|
}
|
|
|
|
proj, err := getReleases(proj)
|
|
|
|
if err != nil {
|
|
|
|
w.WriteHeader(http.StatusBadRequest)
|
2023-09-24 21:08:00 +00:00
|
|
|
_, err := w.Write([]byte(fmt.Sprintf("Error getting releases: %s", err)))
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
|
|
|
|
}
|
2023-09-21 18:03:21 +00:00
|
|
|
}
|
|
|
|
tmpl := template.Must(template.ParseFS(fs, "static/select-release.html"))
|
|
|
|
if err := tmpl.Execute(w, proj); err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
} else if action == "delete" {
|
2023-09-26 20:13:45 +00:00
|
|
|
submittedURL := params.Get("submittedURL")
|
|
|
|
if submittedURL == "" {
|
2023-09-21 18:03:21 +00:00
|
|
|
w.WriteHeader(http.StatusBadRequest)
|
2023-09-24 21:08:00 +00:00
|
|
|
_, err := w.Write([]byte("No URL provided"))
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
|
|
|
|
}
|
2023-09-21 18:03:21 +00:00
|
|
|
}
|
|
|
|
|
2023-09-26 20:13:45 +00:00
|
|
|
untrack(submittedURL)
|
2023-09-21 18:03:21 +00:00
|
|
|
http.Redirect(w, r, "/", http.StatusSeeOther)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if r.Method == http.MethodPost {
|
2023-09-24 21:08:00 +00:00
|
|
|
err := r.ParseForm()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
2023-09-21 18:03:21 +00:00
|
|
|
nameValue := bmStrict.Sanitize(r.FormValue("name"))
|
|
|
|
urlValue := bmStrict.Sanitize(r.FormValue("url"))
|
|
|
|
forgeValue := bmStrict.Sanitize(r.FormValue("forge"))
|
|
|
|
releaseValue := bmStrict.Sanitize(r.FormValue("release"))
|
|
|
|
|
|
|
|
if nameValue != "" && urlValue != "" && forgeValue != "" && releaseValue != "" {
|
|
|
|
track(nameValue, urlValue, forgeValue, releaseValue)
|
|
|
|
http.Redirect(w, r, "/", http.StatusSeeOther)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if nameValue != "" && urlValue != "" && forgeValue != "" && releaseValue == "" {
|
|
|
|
http.Redirect(w, r, "/new?action=yoink&name="+url.QueryEscape(nameValue)+"&url="+url.QueryEscape(urlValue)+"&forge="+url.QueryEscape(forgeValue), http.StatusSeeOther)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if nameValue == "" && urlValue == "" && forgeValue == "" && releaseValue == "" {
|
|
|
|
w.WriteHeader(http.StatusBadRequest)
|
2023-09-24 21:08:00 +00:00
|
|
|
_, err := w.Write([]byte("No data provided"))
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
|
|
|
|
}
|
2023-09-21 18:03:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func staticHandler(writer http.ResponseWriter, request *http.Request) {
|
|
|
|
resource := strings.TrimPrefix(request.URL.Path, "/")
|
|
|
|
// if path ends in .css, set content type to text/css
|
|
|
|
if strings.HasSuffix(resource, ".css") {
|
|
|
|
writer.Header().Set("Content-Type", "text/css")
|
|
|
|
} else if strings.HasSuffix(resource, ".js") {
|
|
|
|
writer.Header().Set("Content-Type", "text/javascript")
|
|
|
|
}
|
|
|
|
home, err := fs.ReadFile(resource)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
if _, err = io.WriteString(writer, string(home)); err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
}
|