1
0
mirror of https://github.com/Luzifer/password.git synced 2024-09-19 18:32:57 +00:00
password/cmdServe.go

73 lines
1.8 KiB
Go

package main
import (
"fmt"
"log"
"net/http"
"strconv"
"github.com/gorilla/mux"
"github.com/spf13/cobra"
)
func getCmdServe() *cobra.Command {
cmd := cobra.Command{
Use: "serve",
Short: "start an API server to request passwords",
Run: actionCmdServe,
}
cmd.Flags().IntVar(&flags.Server.Port, "port", 3000, "port to listen on")
return &cmd
}
func actionCmdServe(cmd *cobra.Command, args []string) {
r := mux.NewRouter()
r.HandleFunc("/", handleFrontend).Methods("GET")
r.PathPrefix("/assets").HandlerFunc(handleAssets).Methods("GET")
r.HandleFunc("/v1/getPassword", handleAPIGetPasswordv1).Methods("GET")
http.Handle("/", r)
http.ListenAndServe(fmt.Sprintf(":%d", flags.Server.Port), nil)
}
func handleAPIGetPasswordv1(res http.ResponseWriter, r *http.Request) {
length, err := strconv.Atoi(r.URL.Query().Get("length"))
if err != nil {
length = 20
}
special := r.URL.Query().Get("special") == "true"
if length > 128 || length < 4 {
http.Error(res, "Please do not use length with more than 128 or fewer than 4 characters!", http.StatusNotAcceptable)
return
}
password, err := pwd.GeneratePassword(length, special)
res.Header().Add("Content-Type", "text/plain")
res.Header().Add("Cache-Control", "no-cache")
res.Write([]byte(password))
}
func handleFrontend(res http.ResponseWriter, r *http.Request) {
res.Header().Add("Content-Type", "text/html")
buf, err := Asset("frontend/index.html")
if err != nil {
http.Error(res, "Unable to load interface", http.StatusInternalServerError)
log.Println(err)
return
}
res.Write(buf)
}
func handleAssets(res http.ResponseWriter, r *http.Request) {
buf, err := Asset(fmt.Sprintf("frontend%s", r.URL.Path))
if err != nil {
http.Error(res, "Unable to load interface", http.StatusInternalServerError)
return
}
res.Write(buf)
}