# TaBr - tabr_passwd pour modifier un mot de passe 2023-05-15T13:54:04Z Ce script est censé s'utiliser ainsi, en tant que _tabr_admin: ``` doas -u _tabr_admin tabr_passwd /var/www/tabr_chpw_requests/ ``` Comme on peut le voir, il prend en argument un répertoire. Ce dossier contient des fichiers au nom de l'utilisateur demandant le changement de mot de passe. À l'intérieur, on y trouvera sur 2 lignes respectives le code de récupération de l'utilisateur généré à l'inscription et le nouveau mot de passe demandé. En réalité, on utiliserait plutôt ce script en l'ajoutant dans le crontab de l'utilisateur _tabr_admin: ``` # crontab -u _tabr_admin -e */1 * * * * /usr/local/sbin/tabr_passwd /var/www/tabr_chpw_requests ``` Le script va : * Vérifier que l'utilisateur existe * Vérifie le code de récupération * Change le mot de passe * Alerte l'admin, que la requête aboutisse ou non. On est parti pour décortiquer le script: Comme d'hab, on explique comment ça marche: ``` usage() { printf "%s\n" "$0 " exit 1 } ``` Ensuite, voici une fonction qui va se charger de terminer le script en alertant dans tous les cas l'admin. D'ailleurs, on voudra sans doute créer un alias dans "/etc/mail/aliases" pour rediriger le mail ``` end() { # $1 : file # $2 : message # $3 : exit code ## alert root cat << EOF | mail -s "$(basename $1) password change request" ${admin} $1 was created to change password and returned: $2 EOF rm -f "$1" exit $3 } ``` On voit dans cette fonction qu'elle envoie un mail à l'admin définit dans "/etc/tabr.conf" indiquant qu'il y a eu demande de changement de mot de passe. Ensuite, on indique un éventuel message d'erreur. Dans tous les cas, on supprime le fichier de demande de changement de mot de passe avant de quitter. On peut passer à la fonction qui va se charger de traiter la demande: ``` handle_request() { u="$(basename ${1})" ## check if user is indeed registered [[ -e $data/$u ]] || end "${1}" "No user $u found" 1 ``` Cette fonction prend en argument le chemin complet vers le fichier de demande de changement. Ce fichier porte le nom de l'utilisateur, on le met dans une variable "$u" comme à l'accoutumée. On vérifie avant d'aller plus loin qu'on a bien un fichier de récupération pour l'utilisateur en question. ``` ## check if recovery match user hashed recovery # recovery is on first line #recovery="$(sed -n '1p' ${1})" head -n 1 "${1}" | /usr/local/bin/hashmatchstr $(cat ${data}/${u}) \ || end "${1}" "Wrong recovery code" 1 ``` On vérifie ici que le code de récupération précisé par l'utilisateur correspond au hash de ce code enregistré lors de l'inscription. Pour cela, on utilise un bout de C "hashmatchstr". => /log/2023-05-04-Check-if-a-string-match-a--bcrypt--hash.xhtml hasmatchstr fait appel à la fonction "crypt_checkpass". Ensuite, on récupère le mot de passe demandé et on procède aux modification: ``` newpw="$(sed -n '2p' ${1})" # pw on 2nd line newpwhash="$(print "%s" "${newpw}" | encrypt -b a )" ## change system pw doas /usr/sbin/usermod -p "${newpwhash}" "${u}" ## xmpp printf "%s\n%s\n" "${newpw}" "${newpw}" | doas /usr/local/sbin/prosodyctl passwd "${u}@${domain}" end ${1} "Everything seems OK" 0 } ``` usermod attend le hash du mot de passe, d'où l'appel à "encrypt". Vous noterez ici la petite astuce avec "printf" pour prosody qui attend le nouveau mot de passe en entrée. Enfin, on appelle la fonction ci-dessus par une boucle sur tous les fichiers du dossier passé en argument. On se sert pour cela de "find", c'est plus propre et gère les éventuels noms de fichiers chelous (je ne fais pas confiance à ce qu'un petit malin a pu éventuellement réussir à déposer malgré toutes mes précautions). ``` [[ $# -ne 1 ]] && usage # loop over file lists find "$1"/ -type f | while read -r request_file; do handle_request "${request_file}" done ``` Ces fichiers contenant les requêtes peuvent être créés via un script, appelé via l'instruction "ForceCommand" lors d'une connexion SSH. Cependant, ce n'est pas très facile d'accès pour les gens normaux. Aussi, j'ai prévu un petit code CGI afin de demander le changement de mot de passe en ligne. Mais ça, c'est pour le prochain article ^^ ## Une réaction? => mailto:bla@bla.si3t.ch?subject=TaBr-tabr_passwd-part3 Envoyez votre commentaire par mail (anonyme). => /log/commentaires/ Mode d'emploi de la liste de diffusion pour recevoir les réponses.