Anpassung Leet: LEET_PROB=0.4
All checks were successful
release-tag / release-image (push) Successful in 2m7s
All checks were successful
release-tag / release-image (push) Successful in 2m7s
This commit is contained in:
46
main.go
46
main.go
@@ -26,6 +26,7 @@ type Config struct {
|
||||
LeetMap map[rune]string
|
||||
Suggestions int
|
||||
RuleSets []string // e.g. ["random","passphrase","hybrid"]
|
||||
LeetProb float64
|
||||
}
|
||||
|
||||
type genRequest struct {
|
||||
@@ -86,6 +87,23 @@ func main() {
|
||||
|
||||
/* -------------------- Config & ENV -------------------- */
|
||||
|
||||
func floatEnv(k string, def float64) float64 {
|
||||
if v := os.Getenv(k); v != "" {
|
||||
v = strings.ReplaceAll(v, ",", ".") // deutsche Kommas erlauben
|
||||
if f, err := strconv.ParseFloat(v, 64); err == nil && f >= 0 && f <= 1 {
|
||||
return f
|
||||
}
|
||||
}
|
||||
return def
|
||||
}
|
||||
|
||||
func randChance(p float64) bool {
|
||||
if p <= 0 { return false }
|
||||
if p >= 1 { return true }
|
||||
// 1e6 Auflösung reicht; kryptografisch sicher über mustCryptoInt
|
||||
return mustCryptoInt(1_000_000) < int(p*1_000_000)
|
||||
}
|
||||
|
||||
func loadConfig() Config {
|
||||
minLen := intEnv("MIN_LENGTH", 12)
|
||||
minLower := intEnv("MIN_LOWER", 2)
|
||||
@@ -95,6 +113,7 @@ func loadConfig() Config {
|
||||
addr := strEnv("SERVER_ADDR", ":8080")
|
||||
specials := strEnv("SPECIALS", "!@#$%&*()-=+:?")
|
||||
leet := parseLeetMap(strEnv("LEET_MAP", "a:4,e:3,o:0,t:7"))
|
||||
leetProb := floatEnv("LEET_PROB", 0.35)
|
||||
sug := intEnv("SUGGESTION_COUNT", 5)
|
||||
rules := strEnv("RULESETS", "random,passphrase,hybrid")
|
||||
rs := []string{}
|
||||
@@ -118,6 +137,7 @@ func loadConfig() Config {
|
||||
LeetMap: leet,
|
||||
Suggestions: sug,
|
||||
RuleSets: rs,
|
||||
LeetProb: leetProb,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,7 +190,7 @@ func generateFromSentence(sentence string, cfg Config) (string, complexity) {
|
||||
if i > 0 {
|
||||
b.WriteString(randFrom(cfg.Specials))
|
||||
}
|
||||
b.WriteString(applyLeet(w, cfg.LeetMap))
|
||||
b.WriteString(applyLeet(w, cfg.LeetMap, cfg.LeetProb))
|
||||
}
|
||||
pw := b.String()
|
||||
|
||||
@@ -181,17 +201,17 @@ func generateFromSentence(sentence string, cfg Config) (string, complexity) {
|
||||
return ensureAll(pw, cfg)
|
||||
}
|
||||
|
||||
func applyLeet(s string, leet map[rune]string) string {
|
||||
var b strings.Builder
|
||||
for _, r := range s {
|
||||
lr := unicode.ToLower(r)
|
||||
if rep, ok := leet[lr]; ok {
|
||||
b.WriteString(rep)
|
||||
} else {
|
||||
b.WriteRune(r)
|
||||
}
|
||||
}
|
||||
return b.String()
|
||||
func applyLeet(s string, leet map[rune]string, p float64) string {
|
||||
var b strings.Builder
|
||||
for _, r := range s {
|
||||
lr := unicode.ToLower(r)
|
||||
if rep, ok := leet[lr]; ok && randChance(p) {
|
||||
b.WriteString(rep) // Ersetze nur mit Chance p
|
||||
} else {
|
||||
b.WriteRune(r)
|
||||
}
|
||||
}
|
||||
return b.String()
|
||||
}
|
||||
|
||||
func sprinkleCase(s string) string {
|
||||
@@ -370,7 +390,7 @@ func genHybrid(cfg Config) string {
|
||||
if coin() {
|
||||
w2 = strings.ToUpper(w2[:1]) + w2[1:]
|
||||
}
|
||||
base := applyLeet(w1, cfg.LeetMap) + randFrom(cfg.Specials) + applyLeet(w2, cfg.LeetMap)
|
||||
base := applyLeet(w1, cfg.LeetMap, cfg.LeetProb) + randFrom(cfg.Specials) + applyLeet(w2, cfg.LeetMap, cfg.LeetProb)
|
||||
// streue zweite Sonderzeichen
|
||||
base = insertAt(base, randPos(base), randFrom(cfg.Specials))
|
||||
// 3–5 Ziffern an zufälligen Stellen
|
||||
|
||||
Reference in New Issue
Block a user