in internal/accounts/accounts_windows.go [181:242]
func GeneratePassword(userPwLgth int) (string, error) {
var pwLgth int
minPwLgth := 15
maxPwLgth := 255
lower := []byte("abcdefghijklmnopqrstuvwxyz")
upper := []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
numbers := []byte("0123456789")
special := []byte(`~!@#$%^&*_-+=|\(){}[]:;<>,.?/`)
chars := bytes.Join([][]byte{lower, upper, numbers, special}, nil)
pwLgth = minPwLgth
if userPwLgth > minPwLgth {
pwLgth = userPwLgth
}
if userPwLgth > maxPwLgth {
pwLgth = maxPwLgth
}
var pwd []byte
// Get one of each character type.
// Get a lowercase letter.
lowerIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(lower))))
if err != nil {
return "", fmt.Errorf("failed to generate password: %v", err)
}
pwd = append(pwd, lower[lowerIndex.Int64()])
// Get an uppercase letter.
upperIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(upper))))
if err != nil {
return "", fmt.Errorf("failed to generate password: %v", err)
}
pwd = append(pwd, upper[upperIndex.Int64()])
// Get a number.
numbersIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(numbers))))
if err != nil {
return "", fmt.Errorf("failed to generate password: %v", err)
}
pwd = append(pwd, numbers[numbersIndex.Int64()])
// Get a special character.
specialIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(special))))
if err != nil {
return "", fmt.Errorf("failed to generate password: %v", err)
}
pwd = append(pwd, special[specialIndex.Int64()])
// Fill the rest with random characters.
for i := 0; i < pwLgth-4; i++ {
// Get a random character.
randomIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(chars))))
if err != nil {
return "", fmt.Errorf("failed to generate password: %v", err)
}
pwd = append(pwd, chars[randomIndex.Int64()])
}
// Shuffle the password.
mathRand.Shuffle(len(pwd), func(i, j int) { pwd[i], pwd[j] = pwd[j], pwd[i] })
return string(pwd), nil
}