diff --git a/cmd/lash/main.go b/cmd/lash/main.go new file mode 100644 index 0000000..b91de7d --- /dev/null +++ b/cmd/lash/main.go @@ -0,0 +1,20 @@ +package main + +import ( + _ "embed" + "lash" + "lash/internal/app" + "lash/internal/errx" + "net/http" +) + +func main() { + srv := app.New() + + errx.Log("Your token is \033[1;92m%s\033[0m", lash.Token) + + errx.Log("starting server at http://127.0.0.1:1337") + if err := http.ListenAndServe(":1337", srv); err != nil { + errx.FatalPerror(err) + } +} diff --git a/internal/app/filePath.go b/internal/app/filePath.go new file mode 100644 index 0000000..3b42355 --- /dev/null +++ b/internal/app/filePath.go @@ -0,0 +1,19 @@ +package app + +import ( + "errors" + "os" + "strings" +) + +func GetFilePath() (string, error) { + fp := "" + + for _, v := range os.Args[1:] { + if !strings.HasPrefix(v, "-") { + fp = v + return fp, nil + } + } + return "", errors.New("not enough arguments") +} diff --git a/internal/app/routes.go b/internal/app/routes.go new file mode 100644 index 0000000..0e3e5e3 --- /dev/null +++ b/internal/app/routes.go @@ -0,0 +1,29 @@ +package app + +import ( + "lash" + "lash/internal/errx" + "lash/internal/handlers" + "net/http" +) + +func New() http.Handler { + mux := http.NewServeMux() + + fp, err := GetFilePath() + if err != nil { + errx.FatalPerror(err) + } + + share := handlers.ShareData{ + Version: lash.Version, + FileName: fp, + } + + file := handlers.FileData{} + + mux.HandleFunc("/", share.Handler) + mux.HandleFunc("/api/receive-token", file.APIHandler) + + return mux +} diff --git a/internal/errx/error.go b/internal/errx/error.go new file mode 100644 index 0000000..48c1bcc --- /dev/null +++ b/internal/errx/error.go @@ -0,0 +1,7 @@ +package errx + +import "fmt" + +func Error(err string) { + fmt.Println("error:", "lash:", err) +} diff --git a/internal/errx/perror.go b/internal/errx/perror.go new file mode 100644 index 0000000..9f6a669 --- /dev/null +++ b/internal/errx/perror.go @@ -0,0 +1,15 @@ +package errx + +import ( + "fmt" + "os" +) + +func Perror(err error) { + fmt.Println("error:", "lash:", err) +} + +func FatalPerror(err error) { + Perror(err) + os.Exit(1) +} diff --git a/internal/errx/print.go b/internal/errx/print.go new file mode 100644 index 0000000..06a5d47 --- /dev/null +++ b/internal/errx/print.go @@ -0,0 +1,7 @@ +package errx + +import "fmt" + +func Log(msg string, k... any) { + fmt.Printf("lash: " + msg + "\n", k...) +} diff --git a/internal/handlers/file.go b/internal/handlers/file.go new file mode 100644 index 0000000..1c40337 --- /dev/null +++ b/internal/handlers/file.go @@ -0,0 +1,35 @@ +package handlers + +import ( + "encoding/json" + "lash" + "lash/internal/errx" + "net/http" +) + +type FileData struct { + Contents []byte +} + +type ValidateRequest struct { + Token string +} + +func (h FileData) APIHandler(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + var t ValidateRequest + err := decoder.Decode(&t) + if err != nil { + errx.FatalPerror(err) + } + + if t.Token == lash.Token { + errx.Log("Got token") + } else { + errx.Log("No Token") + } +} + +func (h FileData) DownloadHandler(w http.ResponseWriter, r *http.Request) { + w.Write(h.Contents) +} diff --git a/internal/handlers/share.go b/internal/handlers/share.go new file mode 100644 index 0000000..57d1757 --- /dev/null +++ b/internal/handlers/share.go @@ -0,0 +1,17 @@ +package handlers + +import ( + "html/template" + "lash" + "net/http" +) + +type ShareData struct { + Version string + FileName string +} + +func (h ShareData) Handler(w http.ResponseWriter, r *http.Request) { + tmpl := template.Must(template.ParseFS(lash.Templates, "share.html")) + tmpl.ExecuteTemplate(w, "share.html", h) +} diff --git a/lash b/lash new file mode 100755 index 0000000..a928bc9 Binary files /dev/null and b/lash differ diff --git a/lash.go b/lash.go new file mode 100644 index 0000000..56612b9 --- /dev/null +++ b/lash.go @@ -0,0 +1,11 @@ +package lash + +import "embed" + +//go:embed templates/* +var Templates embed.FS + +//go:embed version +var Version string + +var Token string = "SICK-COOL-TOKEN" diff --git a/main.go b/main.go deleted file mode 100644 index 5b851e8..0000000 --- a/main.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - _ "embed" - "errors" - "fmt" - "html/template" - "log" - "net/http" - "os" - "github.com/google/uuid" -) - -//go:embed version -var version string - -var fp string -var read []byte -var id string = uuid.New().String() - -type Data struct { - Version string - FileName string - Contents []byte - UUID string -} - -func main() { - if len(os.Args) < 2 { - fmt.Println("error: lash: not enough arguments") - return - } - fp = os.Args[1] - var err error - read, err = os.ReadFile(fp) - if err != nil { - if errors.Is(err, os.ErrNotExist) { - fmt.Printf("error: lash: file `%s` does not exist", fp) - } else { - panic(err) - } - } - - - http.HandleFunc("/", shareHandler) - http.HandleFunc(fmt.Sprintf("/%s", id), fileHandler) - fmt.Println("lash: starting server at http://127.0.0.1:1337") - log.Fatal(http.ListenAndServe("127.0.0.1:1337", nil)) -} - -func shareHandler(w http.ResponseWriter, r *http.Request) { - tmpl := template.Must(template.ParseFiles("templates/share.html")) - - data := Data{ - Version: version, - FileName: fp, - UUID: id, - } - - tmpl.ExecuteTemplate(w, "share.html", data) -} - -func fileHandler(w http.ResponseWriter, r *http.Request) { - w.Write(read) -} diff --git a/templates/share.html b/templates/share.html index ce7b99e..c664116 100644 --- a/templates/share.html +++ b/templates/share.html @@ -7,6 +7,20 @@ -

{{.FileName}}

+ +
+ + +
+ + + +