File: readline-pass-strength.go

package info (click to toggle)
golang-github-ergochat-readline 0.1.3-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 336 kB
  • sloc: makefile: 17
file content (95 lines) | stat: -rw-r--r-- 2,214 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// This is a small example using readline to read a password
// and check it's strength while typing using the zxcvbn library.
// Depending on the strength the prompt is colored nicely to indicate strength.
//
// This file is licensed under the WTFPL:
//
//	       DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
//	                   Version 2, December 2004
//
//	Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
//
//	Everyone is permitted to copy and distribute verbatim or modified
//	copies of this license document, and changing it is allowed as long
//	as the name is changed.
//
//	           DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
//	  TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
//
//	 0. You just DO WHAT THE FUCK YOU WANT TO.
package main

import (
	"fmt"

	"github.com/ergochat/readline"
)

const (
	Cyan          = 36
	Green         = 32
	Magenta       = 35
	Red           = 31
	Yellow        = 33
	BackgroundRed = 41
)

// Reset sequence
var ColorResetEscape = "\033[0m"

// ColorResetEscape translates a ANSI color number to a color escape.
func ColorEscape(color int) string {
	return fmt.Sprintf("\033[0;%dm", color)
}

// Colorize the msg using ANSI color escapes
func Colorize(msg string, color int) string {
	return ColorEscape(color) + msg + ColorResetEscape
}

func createStrengthPrompt(password []rune) string {
	symbol, color := "", Red

	switch {
	case len(password) <= 1:
		symbol = "✗"
		color = Red
	case len(password) <= 3:
		symbol = "⚡"
		color = Magenta
	case len(password) <= 5:
		symbol = "⚠"
		color = Yellow
	default:
		symbol = "✔"
		color = Green
	}

	prompt := Colorize(symbol, color)
	prompt += Colorize(" ENT", Cyan)

	prompt += Colorize(" New Password: ", color)
	return prompt
}

func main() {
	rl, err := readline.New("")
	if err != nil {
		return
	}
	defer rl.Close()

	setPasswordCfg := rl.GeneratePasswordConfig()
	setPasswordCfg.Listener = func(line []rune, pos int, key rune) (newLine []rune, newPos int, ok bool) {
		rl.SetPrompt(createStrengthPrompt(line))
		rl.Refresh()
		return nil, 0, false
	}

	pswd, err := rl.ReadLineWithConfig(setPasswordCfg)
	if err != nil {
		return
	}

	fmt.Println("Your password was:", string(pswd))
}