#!/bin/sh

# apm - Gestionnaire de mots de passe d'Apache - permet 
#   l'administrateur de manipuler facilement l'addition, la mise  jour,
#   ou la destruction de comptes et de mots de passe pour l'accs  un
#   sous-rpertoire dans une configuration d'Apache classique (o le
#   fichier de configuration s'appelle .htaccess)

echo "Content-type: text/html"
echo ""
echo "<html><title>APM: Gestionnaire de mots de passe d'Apache</title><body>"

myname="$(basename $0)"
temppwfile="/tmp/apm.$$";       trap "/bin/rm -f $temppwfile" 0
footer="apm-footer.html"
htaccess=".htaccess"   # si vous utilisez un /cgi-bin, assurez-vous que
                       #   ceci pointe sur le bon fichier .htaccess!

#   Les versions modernes de htpasswd proposent une option -b qui
#   permet de spcifier le mot de passe en ligne de commande. Si la
#   vtre en est capable, indiquez-le ici, avec l'option -b:
# htpasswd="/usr/local/bin/htpasswd -b"
#
# Dans le cas contraire, vous trouverez une rcriture de ce script
# en Perl qui pourra le remplacer,  l'adresse
# http://www.intuitive.com/wicked/examples/htpasswd-b.html

htpasswd="/web/intuitive/wicked/examples/protected/htpasswd-b.pl"

if [ "$REMOTE_USER" != "admin" -a -s $htpasswd ] ; then
  echo "Erreur: vous devez tre l'utilisateur <b>admin</b> pour utiliser APM."
  exit 0
fi

# Maintenant on cherche le nom du fichier de mots de passe dans le
#   fichier .htaccess

if [ ! -r "$htaccess" ] ; then
  echo "Erreur: je ne peux pas lire le fichier $htaccess dans ce rpertoire."
  exit 0
fi

passwdfile="$(grep "AuthUserFile" $htaccess | cut -d\   -f2)"

if [ ! -r $passwdfile ] ; then
  echo "Erreur: fichier de mots de passe illisible: mises  jour impossibles."
  exit 0
elif [ ! -w $passwdfile ] ; then
  echo "Erreur: fichier de mots de passe non inscriptible: mises  jour impossibles."
  exit 0
fi

echo "<center><h2 style='background:#ccf'>Gestionnaire de mots de passe d'Apache</h2>"

action="$(echo $QUERY_STRING | cut -c3)"
user="$(echo $QUERY_STRING|cut -d\& -f2|cut -d= -f2|tr '[:upper:]' '[:lower:]')"

case "$action" in 
  A ) echo "<h3>Ajout de l'utilisateur <u>$user</u></h3>"
        if [ ! -z "$(grep -E "^${user}:" $passwdfile)" ] ; then
          echo "Erreur: l'utilisateur <b>$user</b> apparat dj dans le fichier."
        else
          pass="$(echo $QUERY_STRING|cut -d\& -f3|cut -d= -f2)"
          if [ ! -z "$(echo $pass | tr -d '[[:upper:][:lower:][:digit:]]')" ] ; then
            echo "Erreur: les mots de passe ne doivent comporter que a-z A-Z 0-9 ($pass)"
          else
            $htpasswd $passwdfile $user $pass
            echo "Ajout!<br>"
          fi
        fi
        ;;
  U ) echo "<h3>Mise  jour du mot de passe de l'utilisateur <u>$user</u></h3>"
        if [ -z "$(grep -E "^${user}:" $passwdfile)" ] ; then
          echo "Erreur: l'utilisateur <b>$user</b> n'apparat pas dans le fichier?"
          echo "<pre>";cat $passwdfile;echo "</pre>"
          echo "j'ai cherch &quot;^${user}:&quot; dans $passwdfile"
        else
          pass="$(echo $QUERY_STRING|cut -d\& -f3|cut -d= -f2)"
          if [ ! -z "$(echo $pass | tr -d '[[:upper:][:lower:][:digit:]]')" ] ; then
            echo "Erreur: les mots de passe ne doivent comporter que a-z A-Z 0-9 ($pass)"
          else
            grep -vE "^${user}:" $passwdfile > $temppwfile
            mv $temppwfile $passwdfile
            $htpasswd $passwdfile $user $pass
            echo "Mis  jour!<br>"
          fi
        fi
        ;;
  D ) echo "<h3>Destruction du compte utilisateur <u>$user</u></h3>"
        if [ -z "$(grep -E "^${user}:" $passwdfile)" ] ; then
          echo "Erreur: l'utilisateur <b>$user</b> n'apparat pas dans le fichier?"
        elif [ "$user" = "admin" ] ; then
          echo "Erreur: vous ne pouvez pas dtruire le compte admin."
        else
          grep -vE "^${user}:" $passwdfile > $temppwfile
          mv $temppwfile $passwdfile
          echo "Dtruit!<br>"
        fi
        ;;
esac

# On donne toujours la liste des utilisateurs actuellement prsents dans
#   le fichier de mots de passe...

echo "<br><br><table border='1' cellspacing='0' width='80%' cellpadding='3'>"
echo "<tr bgcolor='#cccccc'><th colspan='3'>Liste "
echo "de tous les utilisateurs actuels</td></tr>"
oldIFS=$IFS ; IFS=":"   # on modifie le dlimiteur entre les mots
while read acct pw ; do
  echo "<tr><th>$acct</th><td align=center><a href=\"$myname?a=D&u=$acct\">"
  echo "[effacer]</a></td></tr>"
done < $passwdfile
echo "</table>"
IFS=$oldIFS             # puis on le remet en place

# On construit la chane de slection optionstring incluant tous les comptes
optionstring="$(cut -d: -f1 $passwdfile | sed 's/^/<option>/'|tr '\n' ' ')"

# Et on produit le pied de page
sed -e "s/--myname--/$myname/g" -e "s/--options--/$optionstring/g" < $footer

exit 0
