Bienvenue dans notre parcours de création d'un gestionnaire de mots de passe dans Go ! Dans ce deuxième volet, nous explorerons les progrès que nous avons réalisés depuis notre engagement initial. Nous avons ajouté de nouvelles fonctionnalités, amélioré la structure du code et implémenté des tests. Allons-y !
L'un des premiers changements que vous remarquerez est la structure améliorée du projet. Nous avons séparé notre code en plusieurs fichiers et packages, en suivant les meilleures pratiques de Go :
dost/ . ├── LICENSE ├── README.md ├── go.mod ├── go.sum ├── internal │ ├── internal_test.go │ └── passgen.go └── main.go
Cette structure permet une meilleure organisation et maintenabilité à mesure que notre projet se développe.
Nous avons considérablement amélioré notre CLI, la rendant plus flexible et conviviale. Voici un extrait de notre main.go :
func main() { generateCmd := flag.NewFlagSet("generate", flag.ExitOnError) flag.Parse() switch os.Args[1] { case "generate": internal.Generate(generateCmd) } }
Cette configuration autorise les sous-commandes, prenant actuellement en charge la commande generate. Les utilisateurs peuvent désormais interagir avec notre outil comme ceci :
go run main.go generate email/reachme@example.com 15
Nous avons ajouté des options pour personnaliser la génération de mot de passe. Les utilisateurs peuvent désormais spécifier la longueur du mot de passe et choisir d'exclure les caractères spéciaux :
func Generate(generateFlags *flag.FlagSet) { generateFlags.BoolVar(&noSymbols, "n", false, "Skip symbols while generating password") generateFlags.BoolVar(©ToClipBoard, "c", false, "Copy to clipboard.") generateFlags.Parse(os.Args[2:]) passwordLength := 25 // ... (code to parse custom length) password, err := generatePassword(passwordLength, noSymbols) // ... (code to handle password output) }
Cette fonction permet aux utilisateurs d'utiliser des indicateurs comme -n pour exclure les symboles et -c pour copier le mot de passe dans le presse-papiers au lieu de l'afficher.
Nous avons affiné notre fonction de génération de mot de passe pour gérer les nouvelles options de personnalisation :
func generatePassword(length int, noSymbols bool) (string, error) { const ( uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" lowercaseLetters = "abcdefghijklmnopqrstuvwxyz" digits = "0123456789" specialChars = "!@#$%^&*()-_=+[]{}|;:'\",.<>/?" ) allChars := uppercaseLetters + lowercaseLetters + digits if !noSymbols { allChars += specialChars } var password string for i := 0; i < length; i++ { // Generate a random index to select a character from allChars randomIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(allChars)))) if err != nil { return "", err } // Append the randomly selected character to the password password += string(allChars[randomIndex.Int64()]) } return password, nil }
Cette fonction respecte désormais le flag noSymbols, permettant une génération de mot de passe plus flexible.
Nous avons franchi une étape importante pour garantir la fiabilité de notre code en mettant en œuvre des tests. Voici un extrait de notre fichier de test :
func TestPasswordLength(t *testing.T) { password, err := generatePassword(10, true) if err != nil { t.Errorf("Expected no error, got %v", err) } else { if len(password) != 10 { t.Errorf("Expected 10 character password, got %d", len(password)) } } } func TestSpecialCharacter10K(t *testing.T) { splCharMissing := 0 for i := 1; i <= 10000; i++ { password, err := generatePassword(10, false) // ... (code to check for special characters) } if splCharMissing > 0 { t.Errorf("Special character was missing in %d / 10000 instances.", splCharMissing) } }
Ces tests vérifient la longueur correcte du mot de passe et l'inclusion de caractères spéciaux. Il est intéressant de noter que notre test des caractères spéciaux a révélé un point à améliorer : sur 10 000 mots de passe générés, 234 ne contenaient pas de caractères spéciaux. Cela nous donne une direction claire pour notre prochain raffinement.
Bien que nous ayons réalisé des progrès significatifs, il reste encore place à l'amélioration :
Restez à l'écoute pour la prochaine partie de notre série, où nous relèverons ces défis et continuerons à faire évoluer notre gestionnaire de mots de passe !
N'oubliez pas que le code source complet est disponible sur GitHub. N'hésitez pas à cloner, bifurquer et contribuer au projet. Vos commentaires et contributions sont toujours les bienvenus !
Bon codage et restez en sécurité ! ??
dost est un gestionnaire de mots de passe CLI écrit en Go.
Inspiré par (Pass)[https://www.passwordstore.org/]
> go build -o dost main.go
Generating password:
> ./dost generate email/vema@example.com Generated Password: );XE,7-Dv?)Aa+&<{V-|pKuq5
Generating password with specified length (default is 25):
> ./dost generate email/vema@example.com 12 Generated Password: si<yJ=5/lEb3
Copy generated password to clipboard without printing:
> ./dost generate -c email/vema@example.com Copied to clipboard! ✅
Avoid symbols for generating passwords:
> ./dost generate -n email/vema@example.com Generated Password: E2UST}^{Ac[Fb&D|cD%;Eij>H
MIT
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!