mirror of
https://github.com/trufflesecurity/trufflehog.git
synced 2026-06-15 13:24:37 +00:00
* moved Generate random Password func to utils to be used by multiple detectors test. * fixed spelling issue --------- Co-authored-by: Amaan Ullah <aman.ullah.jalal@trufflesec.com>
136 lines
3.6 KiB
Go
136 lines
3.6 KiB
Go
package common
|
|
|
|
import (
|
|
"bufio"
|
|
"crypto/rand"
|
|
"io"
|
|
"math/big"
|
|
mrand "math/rand"
|
|
"strings"
|
|
)
|
|
|
|
func AddStringSliceItem(item string, slice *[]string) {
|
|
for _, i := range *slice {
|
|
if i == item {
|
|
return
|
|
}
|
|
}
|
|
*slice = append(*slice, item)
|
|
}
|
|
|
|
func RemoveStringSliceItem(item string, slice *[]string) {
|
|
for i, listItem := range *slice {
|
|
if item == listItem {
|
|
(*slice)[i] = (*slice)[len(*slice)-1]
|
|
*slice = (*slice)[:len(*slice)-1]
|
|
}
|
|
}
|
|
}
|
|
|
|
func ResponseContainsSubstring(reader io.ReadCloser, target string) (bool, error) {
|
|
scanner := bufio.NewScanner(reader)
|
|
for scanner.Scan() {
|
|
if strings.Contains(scanner.Text(), target) {
|
|
return true, nil
|
|
}
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
return false, err
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
|
|
|
|
// RandomID returns a random string of the given length.
|
|
func RandomID(length int) string {
|
|
b := make([]rune, length)
|
|
for i := range b {
|
|
randInt, _ := rand.Int(rand.Reader, big.NewInt(int64(len(letters))))
|
|
b[i] = letters[randInt.Int64()]
|
|
}
|
|
|
|
return string(b)
|
|
}
|
|
|
|
// SliceContainsString searches a slice to determine if it contains a specified string.
|
|
// Returns the index of the first match in the slice.
|
|
func SliceContainsString(origTargetString string, stringSlice []string, ignoreCase bool) (bool, string, int) {
|
|
targetString := origTargetString
|
|
if ignoreCase {
|
|
targetString = strings.ToLower(origTargetString)
|
|
}
|
|
for i, origStringFromSlice := range stringSlice {
|
|
stringFromSlice := origStringFromSlice
|
|
if ignoreCase {
|
|
stringFromSlice = strings.ToLower(origStringFromSlice)
|
|
}
|
|
if targetString == stringFromSlice {
|
|
return true, targetString, i
|
|
}
|
|
}
|
|
return false, "", 0
|
|
}
|
|
|
|
// GoFakeIt Password generator does not guarantee inclusion of characters.
|
|
// Using a custom random password generator with guaranteed inclusions (atleast) of lower, upper, numeric and special characters
|
|
func GenerateRandomPassword(lower, upper, numeric, special bool, length int) string {
|
|
if length < 1 {
|
|
return ""
|
|
}
|
|
|
|
var password []rune
|
|
var required []rune
|
|
var allowed []rune
|
|
|
|
lowerChars := []rune("abcdefghijklmnopqrstuvwxyz")
|
|
upperChars := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
|
specialChars := []rune("!@#$%^&*()-_=+[]{}|;:',.<>?/")
|
|
numberChars := []rune("0123456789")
|
|
|
|
// Ensure inclusion from each requested category
|
|
if lower {
|
|
rand, _ := rand.Int(rand.Reader, big.NewInt(int64(len(lowerChars))))
|
|
ch := lowerChars[rand.Int64()]
|
|
required = append(required, ch)
|
|
allowed = append(allowed, lowerChars...)
|
|
}
|
|
if upper {
|
|
rand, _ := rand.Int(rand.Reader, big.NewInt(int64(len(upperChars))))
|
|
ch := upperChars[rand.Int64()]
|
|
required = append(required, ch)
|
|
allowed = append(allowed, upperChars...)
|
|
}
|
|
if numeric {
|
|
rand, _ := rand.Int(rand.Reader, big.NewInt(int64(len(numberChars))))
|
|
ch := numberChars[rand.Int64()]
|
|
required = append(required, ch)
|
|
allowed = append(allowed, numberChars...)
|
|
}
|
|
if special {
|
|
rand, _ := rand.Int(rand.Reader, big.NewInt(int64(len(specialChars))))
|
|
ch := specialChars[rand.Int64()]
|
|
required = append(required, ch)
|
|
allowed = append(allowed, specialChars...)
|
|
}
|
|
|
|
if len(allowed) == 0 {
|
|
return "" // No character sets enabled
|
|
}
|
|
|
|
// Fill the rest of the password
|
|
for i := 0; i < length-len(required); i++ {
|
|
rand, _ := rand.Int(rand.Reader, big.NewInt(int64(len(allowed))))
|
|
ch := allowed[rand.Int64()]
|
|
password = append(password, ch)
|
|
}
|
|
|
|
// Combine required and random characters, then shuffle
|
|
password = append(password, required...)
|
|
mrand.Shuffle(len(password), func(i, j int) {
|
|
password[i], password[j] = password[j], password[i]
|
|
})
|
|
|
|
return string(password)
|
|
}
|