You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
1.9 KiB
94 lines
1.9 KiB
4 years ago
|
package main
|
||
|
|
||
|
import (
|
||
|
"flag"
|
||
|
"net/http"
|
||
|
"strconv"
|
||
|
|
||
|
"github.com/labstack/echo"
|
||
|
"github.com/labstack/echo/middleware"
|
||
|
)
|
||
|
|
||
|
type passwordData struct {
|
||
|
Length int
|
||
|
Digits int
|
||
|
Symbols int
|
||
|
NoUpper bool
|
||
|
DenyRepeat bool
|
||
|
Password string
|
||
|
}
|
||
|
|
||
|
var d, defaults passwordData
|
||
|
|
||
|
func generatePassword(c echo.Context) error {
|
||
|
|
||
|
var err error
|
||
|
|
||
|
d.Length, err = strconv.Atoi(c.FormValue("length"))
|
||
|
if err != nil {
|
||
|
d.Length = defaults.Length
|
||
|
}
|
||
|
|
||
|
d.Digits, err = strconv.Atoi(c.FormValue("digits"))
|
||
|
if err != nil {
|
||
|
d.Digits = defaults.Digits
|
||
|
}
|
||
|
|
||
|
d.Symbols, err = strconv.Atoi(c.FormValue("symbols"))
|
||
|
if err != nil {
|
||
|
d.Symbols = defaults.Symbols
|
||
|
}
|
||
|
|
||
|
if c.FormValue("noupper") == "on" {
|
||
|
d.NoUpper = true
|
||
|
}
|
||
|
|
||
|
if c.FormValue("denyrepeat") == "on" {
|
||
|
d.DenyRepeat = true
|
||
|
}
|
||
|
|
||
|
// Generate a password
|
||
|
d.Password, err = generate(d.Length, d.Digits, d.Symbols, d.NoUpper, !d.DenyRepeat)
|
||
|
if err != nil {
|
||
|
d.Password = "Error: " + err.Error()
|
||
|
}
|
||
|
if d.Length == 0 {
|
||
|
d.Password = "Error: password can not have zero length"
|
||
|
}
|
||
|
|
||
|
return c.String(http.StatusOK, d.Password)
|
||
|
}
|
||
|
|
||
|
func checkHealth(c echo.Context) error {
|
||
|
s := `{"status":"OK"}`
|
||
|
return c.String(http.StatusOK, s)
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
|
||
|
// Set defaults
|
||
|
portPtr := flag.Int("listen", 8080, "Specify on which port to listen")
|
||
|
lengthPtr := flag.Int("length", 16, "Specify the password length")
|
||
|
digitsPtr := flag.Int("digits", 2, "Specify the the number of digits in the password")
|
||
|
symbolsPtr := flag.Int("symbols", 2, "Specify the the number of symbols in the password")
|
||
|
flag.Parse()
|
||
|
|
||
|
defaults.Length = *lengthPtr
|
||
|
defaults.Digits = *digitsPtr
|
||
|
defaults.Symbols = *symbolsPtr
|
||
|
|
||
|
e := echo.New()
|
||
|
e.HideBanner = true
|
||
|
|
||
|
// Middleware
|
||
|
e.Use(middleware.Logger())
|
||
|
e.Use(middleware.Recover())
|
||
|
|
||
|
e.GET("/", generatePassword)
|
||
|
e.POST("/", generatePassword)
|
||
|
|
||
|
e.GET("/health", checkHealth)
|
||
|
|
||
|
e.Logger.Fatal(e.Start(":" + strconv.Itoa(*portPtr)))
|
||
|
}
|