package main import ( "bufio" "math/rand" "net/http" "os" "regexp" "strconv" "github.com/gin-gonic/gin" ) // devolve un array co listado de palabros do arquivo palabras.txt func read_words() []string { readFile, err := os.Open("palabras.txt") if err != nil { panic(err) } defer readFile.Close() fileScanner := bufio.NewScanner(readFile) fileScanner.Split(bufio.ScanLines) var fileLines []string for fileScanner.Scan() { fileLines = append(fileLines, fileScanner.Text()) } return fileLines } // devolve unha palabra random func random_word(list []string) string { return list[rand.Intn(len(list))] } // monta a frase a usar como contrasinal func generate_password(list []string, cantidade int, separator string) string { phrase := "" for i := range cantidade { if i == cantidade-1 { // ultimo elemento phrase = phrase + random_word(list) } else { phrase = phrase + random_word(list) + separator } } return phrase } // xenera resposta type resposta struct { code int chave string valor string } func generate_response(c *gin.Context, listado []string) resposta { resp := resposta{} num := c.Query("num") sep := c.Query("sep") if num == "" { num = "4" // cantidade por defecto } if sep == "" { sep = " " // separador por defecto } isNumber := regexp.MustCompile(`^\d*$`) if !isNumber.MatchString(num) { resp.code = 400 resp.chave = "error" resp.valor = "O parĂ¡metro 'num' ten que ser un nĂºmero." } else { // xenera unha frase de 'num' palabras n, _ := strconv.Atoi(num) // o erro non fai falta, foi comprobado no regexp if n >= 128 { // limitase a sacho n = 128 } resp.code = 200 resp.chave = "password" resp.valor = generate_password(listado, n, sep) } // resp.code sera o 200 e logo chave e valor o JSON do gin.H // c.JSON(200, gin.H{ // "password": generate_password(listado, n, sep), // }) return resp } func main() { // lemos a memoria o arquivo de palabras listado := read_words() // arrancamos gin r := gin.Default() r.LoadHTMLGlob("templates/*") r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) // /pass?num=4&sep=- r.GET("/pass", func(c *gin.Context) { resp := generate_response(c, listado) c.JSON(resp.code, gin.H{ resp.chave: resp.valor, }) }) r.GET("/", func(c *gin.Context) { resp := generate_response(c, listado) c.HTML(http.StatusOK, "index.tmpl", gin.H{ resp.chave: resp.valor, }) }) r.Run() //listen and serve on 0.0.0.0:8080 }