100 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| ## Gestion de mots de passe
 | |
| ##@cooked nocomments
 | |
| ##@require base
 | |
| uprovide password
 | |
| urequire base
 | |
| 
 | |
| function random_index() {
 | |
|     # Afficher un index au hasard dans le tableau $1
 | |
|     [ -n "$1" ] || return
 | |
|     local -a __rn_array; array_copy __rn_array "$1"
 | |
|     [ ${#__rn_array[*]} -gt 0 ] || return
 | |
|     echo $(($RANDOM % ${#__rn_array[*]}))
 | |
| }
 | |
| 
 | |
| function random_value() {
 | |
|     # Afficher une valeur au hasard dans le tableau $1
 | |
|     local __rv_index="$(random_index "$1")"
 | |
|     [ -n "$__rv_index" ] || return
 | |
|     eval "echo \${$1[$__rv_index]}"
 | |
| }
 | |
| 
 | |
| function random_char() {
 | |
|     # Afficher un caractère au hasard dans la chaine $1
 | |
|     local section="$1"
 | |
|     [ ${#section} -gt 0 ] || return
 | |
|     local index=$(($RANDOM % ${#section}))
 | |
|     echo "${section:$index:1}"
 | |
| }
 | |
| 
 | |
| GENPASS_UPPER="AZERTYUIOPQSDFGHJKLMWXCVBN"
 | |
| GENPASS_LOWER="azertyuiopqsdfghjklmwxcvbn"
 | |
| GENPASS_NUMBERS="1234567890"
 | |
| GENPASS_SYMBOLS="&\"'(-_)=^\$*!:;,?./%+#{[|\\]}"
 | |
| GENPASS_LEN=10
 | |
| GENPASS_SECTIONS=("$GENPASS_UPPER" "$GENPASS_LOWER" "$GENPASS_UPPER$GENPASS_LOWER" "$GENPASS_NUMBERS" "$GENPASS_SYMBOLS" "$GENPASS_NUMBERS$GENPASS_SYMBOLS")
 | |
| GENPASS_COUNTS=(0 0 4 0 0 1)
 | |
| 
 | |
| function genpass() {
 | |
|     # Générer un mot de passe au hasard avec les paramètres GENPASS_*
 | |
|     local -a indexes parts
 | |
|     local count index hascount part password
 | |
| 
 | |
|     [ "${#GENPASS_SECTIONS[*]}" -eq "${#GENPASS_COUNTS[*]}" ] || die "GENPASS_COUNTS et GENPASS_SECTIONS doivent être de même taille"
 | |
| 
 | |
|     # indexes contient les indexes dans le tableau SECTIONS, avec comme poids le
 | |
|     # nombre de caractères minimum de chaque sections
 | |
|     indexes=()
 | |
|     index=0
 | |
|     for count in "${GENPASS_COUNTS[@]}"; do
 | |
|         while [ $count -ge 0 ]; do
 | |
|             array_add indexes "$index"
 | |
|             count=$(($count - 1))
 | |
|         done
 | |
|         index=$(($index + 1))
 | |
|     done
 | |
| 
 | |
|     # générer chaque caractère du mot de passe au hasard
 | |
|     parts=()
 | |
|     while true; do
 | |
|         # vérifier s'il reste encore des sections avec un nombre minimum
 | |
|         hascount=
 | |
|         for count in "${GENPASS_COUNTS[@]}"; do
 | |
|             [ "$count" -gt 0 ] && {
 | |
|                 hascount=1
 | |
|                 break
 | |
|             }
 | |
|         done
 | |
|         [ -n "$hascount" ] || break
 | |
|         # calculer la prochaine section à générer
 | |
|         while true; do
 | |
|             index=$(random_index GENPASS_SECTIONS)
 | |
|             [ ${GENPASS_COUNTS[$index]} -gt 0 ] && break
 | |
|         done
 | |
|         # générer un caractère au hasard
 | |
|         part="$(random_char "${GENPASS_SECTIONS[$index]}")"
 | |
|         array_add parts "$part"
 | |
|         GENPASS_COUNTS[$index]=$((${GENPASS_COUNTS[$index]} - 1))
 | |
|     done
 | |
|     # générer les autres caractères jusqu'à GENPASS_LEN
 | |
|     while [ "${#parts[*]}" -lt "$GENPASS_LEN" ]; do
 | |
|         index=$(random_value indexes)
 | |
|         part="$(random_char "${GENPASS_SECTIONS[$index]}")"
 | |
|         array_add parts "$part"
 | |
|     done
 | |
| 
 | |
|     # puis générer le mot de passe en prenant chaque partie au hasard
 | |
|     password=
 | |
|     while [ ${#parts[*]} -gt 0 ]; do
 | |
|         index=$(random_index parts)
 | |
|         password="$password${parts[$index]}"
 | |
|         before=()
 | |
|         [ $index -gt 0 ] && before=("${parts[@]:0:$index}")
 | |
|         after=("${parts[@]:$((index + 1))}")
 | |
|         parts=("${before[@]}" "${after[@]}")
 | |
|     done
 | |
| 
 | |
|     echo "$password"
 | |
| }
 | 
