commit d16f85f071510288119f210281785bddcae112bd Author: Gregory Colpart Date: Sun Sep 6 01:20:22 2009 +0000 Premier commit : publication du logiciel "EvoAdmin", interface web pour gérer les packs Evolix Mail et/ou Samba diff --git a/evoadmin/AUTHOR b/evoadmin/AUTHOR new file mode 100644 index 0000000..e69de29 diff --git a/evoadmin/INSTALL b/evoadmin/INSTALL new file mode 100644 index 0000000..376298f --- /dev/null +++ b/evoadmin/INSTALL @@ -0,0 +1,10 @@ +cp evoadmin.sh /usr/share/scripts/ +chmod +x evoadmin.sh +visudo + +User_Alias WWW = www-data +Cmnd_Alias EVOAUTH = /usr/share/scripts/evoadmin.sh +WWW ALL= NOPASSWD: EVOAUTH + +apt-get install php5-mhash + diff --git a/evoadmin/LICENSE b/evoadmin/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/evoadmin/README b/evoadmin/README new file mode 100644 index 0000000..e69de29 diff --git a/evoadmin/TODO b/evoadmin/TODO new file mode 100644 index 0000000..b2b93f7 --- /dev/null +++ b/evoadmin/TODO @@ -0,0 +1,12 @@ +- Gestion des comptes avec un nom identique +- Gerer les erreurs si le compte existe deja +- Gerer les quotas +- Gerer les entrees accentuees en latin1 et utf8 +- Gerer les hooks pour insertions (par exemple, ldap spamassassin) +- Gerer la detection de logins differents (login,login2,login3, etc.) + lors d'une utilisation mutualisee non-virtuelle... + +- Dans le cas du mode virtuel, il y a un bug avec maildrop: qui est optionnel... mais dans le code + il doit toujours en avoir un ! Du coup, à corriger (attention la conf Postfix doit aussi etre + correcte pour gerer les entrees contenant virtualaliases+virtualmailboxes)... ou désactiver la possibilité + de positionner des maildrop dans le cas du mode virtuel diff --git a/evoadmin/docs/inc/evoadmin.sh b/evoadmin/docs/inc/evoadmin.sh new file mode 100644 index 0000000..58e1b88 --- /dev/null +++ b/evoadmin/docs/inc/evoadmin.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +PASSWORD='xxx' +DATE=$(date +"%d-%m-%Y") + +while getopts "p:qu:g:sad" option ; do +case $option in + + p) + READPASS=$OPTARG + ;; + + q) + QUOTA='on' + ;; + + u) + USERIS=$OPTARG + ;; + + g) + GROUPIS=$OPTARG + ;; + + s) + SIZE='on' + ;; + + a) + ADD='on' + ;; + + d) + DEL='on' + ;; + + *) + echo "script error" + exit 1 + ;; +esac +done + +if [ "$PASSWORD" != "$READPASS" ]; then + echo "Invalid password" + echo "Use -p " + exit 1 +fi + +if [ "$QUOTA" == "on" ]; then + if [ -n "$USERIS" ]; then + NOW=`LANG=C quota $USERIS | tr -d "\n" | sed -e "s/^.*\/dev\///" | tr -s " " | cut -d" " -f2` + LIMIT=`LANG=C quota $USERIS | tr -d "\n" | sed -e "s/^.*\/dev\///" | tr -s " " | cut -d" " -f3` + echo "$NOW/$LIMIT" + exit 0 + fi + + if [ -n "$GROUPIS" ]; then + # no quota + if LANG=C quota -g $GROUPIS | grep none > /dev/null; then + echo "0/0" + exit 0 + fi + NOW=`LANG=C quota -g $GROUPIS | tr -d "\n" | sed -e "s/^.*\/dev\///" | tr -s " " | cut -d" " -f2` + LIMIT=`LANG=C quota -g $GROUPIS | tr -d "\n" | sed -e "s/^.*\/dev\///" | tr -s " " | cut -d" " -f3` + echo "$NOW/$LIMIT" + exit 0 + fi + +fi + +if [ "$SIZE" == "on" ]; then + NOW=`df | grep "/home" | tr -s " " | cut -d " " -f3` + LIMIT=`df | grep "/home" | tr -s " " | cut -d " " -f2` + echo "$NOW/$LIMIT" + exit 0 +fi + +if [ "$ADD" == "on" ]; then + if [[ -n $USERIS && $GROUPIS && ! -e "/home/$USERIS" ]]; then + mkdir /home/$USERIS + chmod 0700 /home/$USERIS + chown "$USERIS:$GROUPIS" /home/$USERIS + setquota -u $USERIS 5000000 8000000 0 0 -a + echo "Mail d'initialisation du compte." |\ + mail -s "Premier message" $USERIS@localhost + exit 0 + fi +fi + + +if [ "$DEL" == "on" ]; then + if [[ -n $USERIS && -e "/home/$USERIS" ]]; then + mv /home/$USERIS /home/$USERIS.$DATE + exit 0 + fi +fi + +exit 1 + diff --git a/evoadmin/htdocs/.svnignore b/evoadmin/htdocs/.svnignore new file mode 100644 index 0000000..f6830d0 --- /dev/null +++ b/evoadmin/htdocs/.svnignore @@ -0,0 +1 @@ +connect.php diff --git a/evoadmin/htdocs/admin.php b/evoadmin/htdocs/admin.php new file mode 100755 index 0000000..316084a --- /dev/null +++ b/evoadmin/htdocs/admin.php @@ -0,0 +1,199 @@ + + * @version 1.0 + */ + +/* + * Functions + */ + +/** + * Show account/alias details + * @param string $compte + * @param string $type + * @return NULL + */ +function show_my_details($name,$type) { + + print '' .$name. ''; + + if ( $type == 'compte' ) { + print '' .getquota($name,'user'). ''; + } + + print ''; + print ' + '; + print ''; +} + + +/** + * Path + */ +define('EVOADMIN_BASE','./'); + +//recuperer la session en cours +session_name('EVOADMIN_SESS'); +session_start(); + +// TODO : restrictions if non superadmin + +if (isset($_SESSION['login'])) { + + /** + * Requires + */ + require_once EVOADMIN_BASE . 'common.php'; + + include EVOADMIN_BASE . 'haut.php'; + + $login = $_SESSION['login']; + + if (isset($_GET['domain'])) { + // TODO : verifier si le domaine existe !! + $_SESSION['domain'] = Html::clean($_GET['domain']); + } + + // TODO : verifier que le domaine est actif + // et que les droits sont corrects + $domain = $_SESSION['domain']; + + // RDN for all LDAP search + if (! $conf['domaines']['onlyone']) { + + // compatibilite anciens schemas + if ($conf['evoadmin']['version'] <= 2) { + $rdn= "domain=" .$domain. "," .LDAP_BASE; + } else { + $rdn= "cn=" .$domain. "," .LDAP_BASE; + } + + } else { + $rdn= "ou=people," .LDAP_BASE; + } + $_SESSION['rdn'] = $rdn; + + include EVOADMIN_BASE . 'debut.php'; + + // tableau contenant tous les comptes + $comptes = array(); + // tableau contenant tous les alias + $aliases = array(); + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + + $filter="(objectClass=mailAccount)"; + $sr=ldap_search($ldapconn, $rdn, $filter); + $info = ldap_get_entries($ldapconn, $sr); + + // We use uid attribute for account + for ($i=0;$i<$info["count"];$i++) { + array_push($comptes,$info[$i]["uid"][0]); + } + + // We use cn attribute for alias + $filter="(objectClass=mailAlias)"; + // compatibilite anciens schemas + if ($conf['evoadmin']['version'] == 1) { + $filter="(&(objectClass=mailAlias)(onlyAlias=TRUE))"; + } + $sr=ldap_search($ldapconn, $rdn, $filter); + $info = ldap_get_entries($ldapconn, $sr); + + for ($i=0;$i<$info["count"];$i++) { + array_push($aliases,$info[$i]["cn"][0]); + } + + ldap_unbind($ldapconn); + + //tri alphanumeriques des tableaux + sort($comptes); + sort($aliases); +?> +
+ + Ajouter un nouveau compte
+ + + + Ajouter un nouvel alias/groupe de diffusion

+
' + method='POST' name='listing'> + + +
+ + + +

Liste des comptes :

+ + + + + + + + + "; + + } elseif ( (isset($_POST['viewonly'])) && ($_POST['viewonly']==2) ) { + + ?> + +

Liste des alias/groupe de diffusion :

+ +
Nom du compteQuotaSuppr
+ + + + + + + +
Nom de l'alias/groupe de diffusionSuppr
+
+ + diff --git a/evoadmin/htdocs/alias.php b/evoadmin/htdocs/alias.php new file mode 100755 index 0000000..69b8e27 --- /dev/null +++ b/evoadmin/htdocs/alias.php @@ -0,0 +1,476 @@ + + * @version 1.0 + */ + +/** + * Path + */ +define('EVOADMIN_BASE','./'); + +/** + * PHP cookies session + */ +session_name('EVOADMIN_SESS'); +session_start(); + +if (isset($_SESSION['login'])) +{ + require_once EVOADMIN_BASE . 'common.php'; + + include EVOADMIN_BASE . 'haut.php'; + + $login = $_SESSION['login']; + $rdn = $_SESSION['rdn']; + + include EVOADMIN_BASE . 'debut.php'; + + if (isset($_GET['view'])) { + + $cn = Html::clean($_GET['view']); + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + + $filter="(cn=$cn)"; + $sr=ldap_search($ldapconn, $rdn, $filter); + $info = ldap_get_entries($ldapconn, $sr); + + if ( (isset($_GET['modif'])) && ($_GET['modif'] == 'yes')) { + + print "
"; + print "

Modification en cours...

"; + + // on obtient une table avec les nouveaux champs mailacceptinggeneralid + // TODO : if onlyone = false, verifier le domaine !! + $count = array_shift($info[0]["mailacceptinggeneralid"]); + + // in multi-domains mode, we force @domain + if (!$conf['domaines']['onlyone']) { + // add @domain for each element + array_walk($_POST['mailaccept'],'adddomain'); + } + + $newmailaccept[0] = array_pop($_POST['mailaccept']); + $newmailaccept[1] = array_pop($_POST['mailaccept']); + $newmailaccept[2] = array_pop($_POST['mailaccept']); + if ( ($newmailaccept[0] != NULL) || ($newmailaccept[1] != NULL) || + ($newmailaccept[2] != NULL) || + array_diff($info[0]["mailacceptinggeneralid"],$_POST['mailaccept']) ) { + $new["mailacceptinggeneralid"] = $_POST['mailaccept']; + $new["mailacceptinggeneralid"][$count]= $newmailaccept[0]; + $new["mailacceptinggeneralid"][$count+1]= $newmailaccept[1]; + $new["mailacceptinggeneralid"][$count+2]= $newmailaccept[2]; + + // on vire les valeurs nulles + sort($new["mailacceptinggeneralid"]); + while ( $new["mailacceptinggeneralid"][0] == NULL ) { + array_shift($new["mailacceptinggeneralid"]); + + // on evite une boucle infinie + if ( count($new["mailacceptinggeneralid"]) == 0 ) { + print "Erreur, vous devez avoir au moins un mail entrant\n"; + exit(1); + } + } + } + + // idem avec maildrop + $count = array_shift($info[0]["maildrop"]); + $newmaildrop[0] = array_pop($_POST['maildrop']); + $newmaildrop[1] = array_pop($_POST['maildrop']); + $newmaildrop[2] = array_pop($_POST['maildrop']); + if ( ($newmaildrop[0] != NULL) | ($newmaildrop[1] != NULL) | + ($newmaildrop[2] != NULL) | + array_diff($info[0]["maildrop"],$_POST['maildrop']) ) { + $new["maildrop"] = $_POST['maildrop']; + $new["maildrop"][$count]= $newmaildrop[0]; + $new["maildrop"][$count+1]= $newmaildrop[1]; + $new["maildrop"][$count+2]= $newmaildrop[2]; + + // on vire les valeurs nulles + sort($new["maildrop"]); + while ( $new["maildrop"][0] == NULL ) { + array_shift($new["maildrop"]); + + // on evite une boucle infinie + if ( count($new["maildrop"]) == 0 ) { + print "Erreur, vous devez avoir au moins une redirection.\n"; + exit(1); + } + } + } + + $postisactive = (isset($_POST['isactive']) ? 'TRUE' : 'FALSE'); + + // Compatibilite anciens schemas LDAP + //if ($conf['evoadmin']['version'] == 1) { + // if ( $info[0]["accountactive"][0] != $postisactive ) { + // $new["accountActive"] = $postisactive; + // } + //} else { + if ( $info[0]["isactive"][0] != $postisactive ) { + $new["isActive"] = $postisactive; + } + //} + + // if $new not null, set modification + if ( (isset($new)) && ($new != NULL) ) { + $sr=ldap_modify($ldapconn,"cn=" .$cn. ",".$rdn,$new); + + // Si LDAP est content, c'est bon :) + if ( $sr ) { + print "

Modifications effectuées.

"; + print "Voir l'alias modifié

"; + } else { + print "

Erreur, envoyez le message d'erreur + suivant a votre administrateur :

"; + var_dump($new); + Evolog::log("Modify error of $cn by $login"); + } + + } else { + print "

Aucune modification nécessaire.

"; + } + + print "
"; + + } else { + + $filter="(&(cn=$cn)(objectClass=mailAlias))"; + $sr=ldap_search($ldapconn, $rdn, $filter); + $info = ldap_get_entries($ldapconn, $sr); + + // On verifie que le compte existe bien + if ( $info['count'] != 1 ) { + print "

Erreur, alias inexistant

"; + EvoLog::log("alias $cn unknown"); + exit(1); + } + + print "
\n"; + print "

Modification de l'alias $cn

\n"; + + print "
\n"; + + print "\n"; + + print ""; + + // compteur pour les tabindex + $tab=1; + + for ($i=0;$i<$info[0]["mailacceptinggeneralid"]['count'];$i++) { + + if (!$conf['domaines']['onlyone']) { + $info[0]['mailacceptinggeneralid'][$i] = + ereg_replace('@'.$_SESSION['domain'],'',$info[0]['mailacceptinggeneralid'][$i]); + } + + print " + \n"; + } + + print " + \n"; + + print " + \n"; + + print " + \n"; + + + for ($i=0;$i<$info[0]["maildrop"]['count'];$i++) { + print " + \n"; + } + + print " + \n"; + print " + \n"; + print " + \n"; + + print ""; + + // Compatibilite anciens schemas LDAP + //if ($conf['evoadmin']['version'] == 1) { + // $isactive= ($info[0]["accountactive"][0] == 'TRUE') ? 'checked' : ''; + //} else { + $isactive= ($info[0]["isactive"][0] == 'TRUE') ? 'checked' : ''; + //} + print " + \n"; + + print ""; + + print "
"; + print "

Ajoutez/modifiez/supprimez les mails acceptés en entrée).
+ Un minimum d'un mail est requis. Mêmes instructions
+ pour les redirections (compte(s) dans le(s)quel(s) est/sont délivré(s) les mails). +

"; + print "
Mail accepté en entrée :\n"; + if (!$conf['domaines']['onlyone']) { + print "@" .$_SESSION['domain']; + } + + print "
Création d'un nouveau mail accepté en entrée :\n"; + if (!$conf['domaines']['onlyone']) { + print "@" .$_SESSION['domain']; + } + print "
Création d'un nouveau mail accepté en entrée :\n"; + if (!$conf['domaines']['onlyone']) { + print "@" .$_SESSION['domain']; + } + print "
Création d'un nouveau mail accepté en entrée :\n"; + if (!$conf['domaines']['onlyone']) { + print "@" .$_SESSION['domain']; + } + print "
Mails entrants redirigés vers : +
Nouvelle redirection vers :
Nouvelle redirection vers :
Nouvelle redirection vers :
"; + print "

Activer/désactiver l'alias

"; + print "
Alias actif :
 ,"; + print "

\n"; + print "
\n"; + print '
'; + } + + } elseif ( isset($_GET['del']) ) { + + $cn = Html::clean($_GET['del']); + + if ( (isset($_GET['modif'])) && ($_GET['modif'] == 'yes')) { + + print "
"; + + print "

Suppression $cn en cours...

"; + + // TODO : Verifier que l'objet existe avant sa suppression + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + $sr = Ldap::lda_del($ldapconn,"cn=" .$cn. "," .$rdn); + + if ( $sr ) { + + print "

Suppression $cn effectuée.

"; + + EvoLog::log("Del alias ".$cn); + + } else { + print "

$cn...
"; + print "
Confirmer la suppression"; + print "

"; + } + + } else { + + if ( (isset($_GET['modif'])) && ($_GET['modif'] == 'yes')) { + + $cn = Html::clean(Html::purgeaccents(utf8_decode($_POST['cn']))); + + $aliases = $_POST['alias']; + + // in multi-domains mode, we force @domain + if (!$conf['domaines']['onlyone']) { + // add @domain for each element + array_walk($aliases,'adddomain'); + } + + $maildrop = $_POST['maildrop']; + + print '
'; + print "

Ajout en cours

"; + + // on vire les valeurs nulles + sort($aliases); + sort($maildrop); + // TODO : if driver = ldap, verifier le domaine !! + while ( $aliases[0] == NULL ) { + array_shift($aliases); + + // on evite une boucle infinie + if ( count($aliases) == 0 ) { + print "Erreur, vous devez avoir au moins un alias.\n"; + exit(1); + } + } + while ( $maildrop[0] == NULL ) { + array_shift($maildrop); + + // on evite une boucle infinie + if ( count($maildrop) == 0 ) { + print "Erreur, vous devez avoir au moins une redirection.\n"; + exit(1); + } + } + + $info["cn"]=$cn; + $info["objectclass"][0] = "mailAlias"; + $info["isActive"] = ($_POST['isactive']) ? "TRUE" : "FALSE"; + + // Compatibilite anciens schemas LDAP + if ($conf['evoadmin']['version'] == 1) { + $info["objectclass"][1] = "inetOrgPerson"; + $info["onlyAlias"] = "TRUE"; + $info["sn"]=$cn; + //$info["accountActive"] = ($_POST['isactive']) ? "TRUE" : "FALSE"; + } + + $info["mailacceptinggeneralid"] = $aliases; + $info["maildrop"] = $maildrop; + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + $sr=ldap_add($ldapconn,"cn=" .$cn. "," .$rdn, $info); + + // on teste si LDAP est content + if ( $sr ) { + print "

Ajout effectué.

"; + print "Voir l'alias ajouté

"; + EvoLog::log("Add alias ".$cn); + } else { + print "

Erreur, envoyez le message d'erreur + suivant a votre administrateur :

"; + var_dump($info); + EvoLog::log("Add alias $cn failed"); + } + + print "
"; + + } else { + ?> +
+ +

Ajout d'un alias

+ +
+ +

Remplissez lez champs.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nom (unique) de l'alias :
Alias : + +
Alias : + +
Alias : + +
Alias : + +
Alias : + +
Redirection :
Redirection :
Redirection :
Redirection :
Redirection :
+

Activer/désactiver l'alias

+
Alias actif :
  +

+
+
+ +
+ + + diff --git a/evoadmin/htdocs/auth.php b/evoadmin/htdocs/auth.php new file mode 100755 index 0000000..53d7827 --- /dev/null +++ b/evoadmin/htdocs/auth.php @@ -0,0 +1,169 @@ + + * @version 1.0 + */ + +/** + * Path + */ +define('EVOADMIN_BASE','./'); + +/** + * Requires + */ +require_once EVOADMIN_BASE . 'common.php'; + +/* + * Functions + */ + +/** + * Display message for bad authentification + * + * @param NULL + * @return NULL + */ +function badauth() { + + global $conf; + + display("Échec de l'authentification, utilisateur ou mot de passe incorrect.
+ Si vous avez oublié votre mot de passe, contactez
" .$conf['admin']['mail']. ""); + +} + +/** + * Display FORM HTML formular for connexion + * + * @param NULL + * @return NULL + */ +function Formulaire() { + + ?> +
+ + + + + + + + + + + + + + +
Utilisateur + +
Mot de passe
  + +
+ +

+
Webmail
+ +
+ + + + + diff --git a/evoadmin/htdocs/common.php b/evoadmin/htdocs/common.php new file mode 100755 index 0000000..95b12be --- /dev/null +++ b/evoadmin/htdocs/common.php @@ -0,0 +1,72 @@ + + * @version 1.0 + */ + +/** + * Path + */ +define('EVOADMIN_BASE','./'); + +/** + * PHP cookies session + */ +session_name('EVOADMIN_SESS'); +session_start(); + + +if (isset($_SESSION['login'])) +{ + + // $login var need for debut.php + $login = $_SESSION['login']; + + /** + * Requires + */ + require_once EVOADMIN_BASE . 'common.php'; + + include EVOADMIN_BASE . 'haut.php'; + include EVOADMIN_BASE . 'inc/add.js'; + include EVOADMIN_BASE . 'debut.php'; + + $rdn = $_SESSION['rdn']; + + /** + * Account modification + */ + if (isset($_GET['view'])) { + + $uid = Html::clean($_GET['view']); + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + + $filter="(uid=$uid)"; + $sr=ldap_search($ldapconn, $rdn, $filter); + $info = ldap_get_entries($ldapconn, $sr); + + $cn = $info[0]["cn"][0]; + $sn = $info[0]["sn"][0]; + $gid = $info[0]["gidnumber"][0]; + // optional + $mail = array_key_exists("mail",$info[0]) ? $info[0]["mail"][0] : ''; + + // Cas d'un compte Samba + if (($conf['admin']['what'] == 2) || ($conf['admin']['what'] == 3)) { + + $displayname = $info[0]["displayname"][0]; + $sambagroup = array_search($gid,getsambagroups('unix')); + if (!$sambagroup) { + $sambagroup = "!!undefined!!"; + } + } + + /** + * Set account modification + */ + if ( (isset($_GET['modif'])) && ($_GET['modif'] == 'yes')) { + + print "
"; + print "

Modification en cours...

"; + + // TODO : contraintes sur cn, sn, etc. + if ( $cn != Html::clean($_POST['cn']) ) { + $new["cn"] = Html::justclean(Html::purgeaccents(utf8_decode($_POST['cn']))); + + if ($conf['evoadmin']['version'] == 1) { + $new["sn"] = $new["cn"]; + } + + } + + if ( ($conf['evoadmin']['version'] > 1) && (!$conf['domaines']['ldap']['virtual']) && ( $sn != Html::clean($_POST['sn']) ) ) { + $new["sn"] = Html::justclean(Html::purgeaccents(utf8_decode($_POST['sn']))); + } + + if ( (!$conf['domaines']['ldap']['virtual']) && ( $mail != Html::clean($_POST['mail']) )) { + $new["mail"] = Html::clean($_POST['mail']); + } + + if ( $_POST['pass1'] != '' ) { + if ( $_POST['pass1'] != $_POST['pass2'] ) { + print "

Erreur, vous avez tapé + deux mots de passe différents

"; + EvoLog::log("Reinit password failed for $uid by $login"); + exit(1); + } + + if ( Auth::badpassword($_POST['pass1']) ) { + print "

Erreur, mot de passe invalide + (trop court ou avec des caracteres incorrects)

"; + EvoLog::log("Set password failed for $uid by $login"); + exit(1); + } + + $new["userPassword"] = "{SSHA}".Ldap::ssha($_POST['pass1']); + + // Cas d'un compte Samba + if (($conf['admin']['what'] == 2) || ($conf['admin']['what'] == 3)) { + + $new["sambaPwdLastSet"] = strtotime("now"); + $new["sambaLMPassword"] = Ldap::sambalm($_POST['pass1']); + $new["sambaNTPassword"] = Ldap::sambant($_POST['pass1']); + $new["shadowLastChange"] = floor(strtotime("now")/(3600*24)); + } + + } + + $postisactive = (isset($_POST['isactive']) ? 'TRUE' : 'FALSE'); + if ( $info[0]["isactive"][0] != $postisactive ) { + $new["isActive"] = $postisactive; + } + + $postisadmin = (isset($_POST['isadmin']) ? 'TRUE' : 'FALSE'); + if ( $info[0]["isadmin"][0] != $postisadmin ) { + $new["isAdmin"] = $postisadmin; + } + + // only for mail mode + if (($conf['admin']['what'] == 1) || ($conf['admin']['what'] == 3)) { + + $postaccountactive = (isset($_POST['accountactive']) ? 'TRUE' : 'FALSE'); + if ( $info[0]["accountactive"][0] != $postaccountactive ) { + $new["accountActive"] = $postaccountactive; + } + + $postauthsmtpactive = (isset($_POST['authsmtpactive']) ? 'TRUE' : 'FALSE'); + if ( $info[0]["authsmtpactive"][0] != $postauthsmtpactive ) { + $new["authsmtpActive"] = $postauthsmtpactive; + } + + $postwebmailactive = (isset($_POST['webmailactive']) ? 'TRUE' : 'FALSE'); + if ( $info[0]["webmailactive"][0] != $postwebmailactive ) { + $new["webmailActive"] = $postwebmailactive; + } + + $postcourieractive = (isset($_POST['courieractive']) ? 'TRUE' : 'FALSE'); + if ( $info[0]["courieractive"][0] != $postcourieractive ) { + $new["courierActive"] = $postcourieractive; + } + + // on obtient une table avec les nouveaux champs mailacceptinggeneralid + // TODO : if driver == ldap, verifier le domaine !! + $count = array_shift($info[0]["mailacceptinggeneralid"]); + + // Compatibilite anciens schemas LDAP et mode "virtuel" + if (($conf['evoadmin']['version'] == 1) || ($conf['domaines']['ldap']['virtual'])) { + // add @domain for each element + array_walk($_POST['mailaccept'],'adddomain'); + } + + $newmailaccept = array_pop($_POST['mailaccept']); + if ( ($newmailaccept != NULL) | + array_diff($info[0]["mailacceptinggeneralid"],$_POST['mailaccept']) ) { + $new["mailacceptinggeneralid"] = $_POST['mailaccept']; + $new["mailacceptinggeneralid"][$count]= $newmailaccept; + + // on vire les valeurs nulles en triant puis supprimant les premieres valeurs + sort($new["mailacceptinggeneralid"]); + while ( $new["mailacceptinggeneralid"][0] == NULL ) { + array_shift($new["mailacceptinggeneralid"]); + + // on evite une boucle infinie + if ( count($new["mailacceptinggeneralid"]) == 0 ) { + print "Erreur, vous devez avoir au moins un mail entrant\n"; + exit(1); + } + } + } + + // idem avec maildrop + $count = array_shift($info[0]["maildrop"]); + $newmaildrop = array_pop($_POST['maildrop']); + if ( ($newmaildrop != NULL) | + array_diff($info[0]["maildrop"],$_POST['maildrop']) ) { + $new["maildrop"] = $_POST['maildrop']; + $new["maildrop"][$count]= $newmaildrop; + + // on vire les valeurs nulles + sort($new["maildrop"]); + while ( $new["maildrop"][0] == NULL ) { + array_shift($new["maildrop"]); + + // on evite une boucle infinie + if ( count($new["maildrop"]) == 0 ) { + print "Erreur, vous devez avoir au moins une redirection.\n"; + exit(1); + } + } + } + + } + + // only for samba mode + if (($conf['admin']['what'] == 2) || ($conf['admin']['what'] == 3)) { + + $postsmbactive = (isset($_POST['smbactive']) ? 'TRUE' : 'FALSE'); + if ( $info[0]["smbactive"][0] != $postsmbactive ) { + $new["smbActive"] = $postsmbactive; + } + + if ( $displayname != Html::clean($_POST['displayname']) ) { + $new["displayname"] = Html::clean($_POST['displayname']); + } + } + + // if $new not null, set modification + if ( (isset($new)) && ($new != NULL) ) { + $sr=ldap_modify($ldapconn,"uid=" .$uid. ",".$rdn,$new); + + // Si LDAP est content, c'est bon :) + if ( $sr ) { + print "

Modifications effectuées.

"; + print "Voir le compte modifié"; + } else { + print "

Erreur, envoyez le message d'erreur + suivant à votre administrateur :

"; + var_dump($new); + Evolog::log("Modify error of $uid by $login"); + } + + } else { + print "

Aucune modification nécessaire.

"; + } + + print "
"; + + /* + * Formular for account modification + */ + } else { + + $filter="(uid=$uid)"; + $sr=ldap_search($ldapconn, $rdn, $filter); + $info = ldap_get_entries($ldapconn, $sr); + + // On verifie que le compte existe bien + if ( $info['count'] != 1 ) { + print "

Erreur, compte inexistant

"; + EvoLog::log("login $uid unknown"); + exit(1); + } + + print "
\n"; + print "

Modification du compte $uid

\n"; + + print"

Modifiez les champs que vous désirez changer.
+ [*] indique ceux qui ne doivent pas être nuls.
+ Vous pouvez réinitialiser le mot de passe si besoin.

"; + + print "
\n"; + + print "\n"; + + + // Compatibilite anciens schemas LDAP ou mode "virtuel" + if (($conf['evoadmin']['version'] != 1) && (!$conf['domaines']['ldap']['virtual'])) { + + print " + \n"; + } + + print " + \n"; + + print " + \n"; + print " + \n"; + + // Compatibilite anciens schemas LDAP + if ($conf['evoadmin']['version'] == 1) { + + print "\n"; + print ""; + + } elseif (!$conf['domaines']['ldap']['virtual']) { + print "\n"; + } + + // count for tabindex + $tab=6; + + // only for samba mode + if (($conf['admin']['what'] == 2) || ($conf['admin']['what'] == 3)) { + + print ""; + + print " + \n"; + + print " + \n"; + } + + // only for mail mode + if (($conf['admin']['what'] == 1) || ($conf['admin']['what'] == 3)) { + + print ""; + + + for ($i=0;$i<$info[0]["mailacceptinggeneralid"]['count'];$i++) { + + if (!$conf['domaines']['onlyone']) { + $info[0]['mailacceptinggeneralid'][$i] = + ereg_replace('@'.$_SESSION['domain'],'',$info[0]['mailacceptinggeneralid'][$i]); + } + + print " + \n"; + } + + print " + \n"; + + for ($i=0;$i<$info[0]["maildrop"]['count'];$i++) { + print " + \n"; + } + + print " + \n"; + } + + print ""; + + $isactive= ($info[0]["isactive"][0] == 'TRUE') ? 'checked' : ''; + print " + \n"; + + $isadmin= ($info[0]["isadmin"][0] == 'TRUE') ? 'checked' : ''; + print " + \n"; + + // only for samba mode + if (($conf['admin']['what'] == 2) || ($conf['admin']['what'] == 3)) { + $smbactive= ($info[0]["smbactive"][0] == 'TRUE') ? 'checked' : ''; + print " + \n"; + } + + // only for mail mode + if (($conf['admin']['what'] == 1) || ($conf['admin']['what'] == 3)) { + + $accountactive= ($info[0]["accountactive"][0] == 'TRUE') ? 'checked' : ''; + print " + \n"; + + $courieractive= ($info[0]["courieractive"][0] == 'TRUE') ? 'checked' : ''; + print " + \n"; + + $webmailactive= ($info[0]["webmailactive"][0] == 'TRUE') ? 'checked' : ''; + print " + \n"; + + $authsmtpactive= ($info[0]["authsmtpactive"][0] == 'TRUE') ? 'checked' : ''; + print " + \n"; + + } + + print ""; + + print "
Nom [*] :
Nom Complet [*] :
Nouveau mot de passe :
Confirmation du mot de passe :
Mail principal :"; + print "$mail
Mail annoncé dans l'annuaire "; + print " :
"; + print "

Modification pour Samba

"; + print "
Nom dans Samba :
Groupe Samba :$sambagroup
"; + print "

Ajoutez/modifiez/supprimez les alias (mails acceptés en entrée).
+ Un minimum d'un alias est requis. Mêmes instructions
+ pour les redirections (compte(s) dans le(s)quel(s) est/sont délivré(s) les mails). +

"; + print "
Mail accepté en entrée :"; + + if (!$conf['domaines']['onlyone']) { + print "@" .$_SESSION['domain']; + } + + print "
Création d'un nouveau mail accepté en entrée :"; + if (!$conf['domaines']['onlyone']) { + print "@" .$_SESSION['domain']; + } + print "
Mails entrants redirigés vers : +
Nouvelle redirection vers :
"; + print "

Modifiez les autorisations du compte si besoin.

"; + print "
Activation globale :
Compte admin:
Compte Samba actif :
Compte mail actif :
Utilisation POP/IMAP :
Webmail actif :
Authentification SMTP :
 ,"; + print "

\n"; + print "
\n"; + print '
'; + } + + /** + * Delete account + */ + } elseif ( isset($_GET['del']) ) { + + $uid = Html::clean($_GET['del']); + + if ( (isset($_GET['modif'])) && ($_GET['modif'] == 'yes')) { + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + + print "
"; + + print "

Suppression $uid en cours...

"; + + // Verify if person exists... + // TODO : /!\ il faudrait verifier le DN plutot que le uid + if (!Ldap::is_uid($uid)) { + print "

1) { + print "

Suppression $uid effectuée.

"; + + EvoLog::log("Del user ".$uid); + + } else { + print "

$uid
"; + print "Tous ses messages et paramètres seront définitivement perdus.

"; + print "Confirmer la suppression"; + print "
"; + } + + // Ajouter un compte + } else { + + /** + * Account creation + */ + + /** + * Set account creation + */ + if ( (isset($_GET['modif'])) && ($_GET['modif'] == 'yes')) { + + // Verification coherence des mots de passe + if ( $_POST['pass1'] != $_POST['pass2'] ) { + print "

Erreur, mot de passe invalide + (trop court ou avec des caracteres incorrects)

"; + EvoLog::log("Set password failed for $postuid by $login"); + exit(1); + } + + $cn = Html::justclean(Html::purgeaccents(utf8_decode($_POST['cn']))); + + if (badname($postuid)) { + print "

Erreur, mail deja present !

"; + EvoLog::log("$mail already exists by $login"); + exit(1); + } + // ...sinon on le change legerement ! + $tmp = 1; + $uid = $postuid; + while (Ldap::is_uid($uid)) { + $tmp++; + $uid = $postuid.$tmp; + } + } else { + $uid = $mail; + if (Ldap::is_uid($uid)) { + print "

Erreur, mail deja present !

"; + EvoLog::log("$uid already exists by $login"); + exit(1); + } + } + + // Cas d'un compte Samba + if (($conf['admin']['what'] == 2) || ($conf['admin']['what'] == 3)) { + + $smbgroup = Html::clean($_POST['smbgroup']); + $tmp = getsambagroups('unix'); + $gid = $tmp[$smbgroup]; + } else { + + $gid = getgid($_SESSION['domain']); + } + + if ( $gid < 1 ) { + print "Erreur, groupe non detecte..."; + exit(1); + } + + print "
"; + print "Ajout en cours..."; + + // TODO : generer un UID different en LDAP non-virtual !!! + $info["uid"]=$uid; + // recuperer un uid number valide + // TODO : erreur si uid non compris entre 1000 et 29999 + $info["uidNumber"]= getfreeuid(); + $info["gidNumber"]= $gid; + $info["objectclass"][0] = "posixAccount"; + + if (!$conf['domaines']['ldap']['virtual']) { + $info["objectclass"][1] = "shadowAccount"; + $info["objectclass"][2] = "inetorgperson"; + + // Choose what objects you want... + if (($conf['admin']['what'] == 1) || ($conf['admin']['what'] == 3)) { + $info["objectclass"][3] = "mailAccount"; + } elseif ($conf['admin']['what'] == 2) { + $info["objectclass"][3] = "sambaSamAccount"; + } + if ($conf['admin']['what'] == 3) { + $info["objectclass"][4] = "sambaSamAccount"; + } + + } else { + $info["objectclass"][1] = "organizationalRole"; + $info["objectclass"][2] = "mailAccount"; + } + + // Compatibilite anciens schemas LDAP + if ($conf['evoadmin']['version'] == 1) { + $info["objectclass"][4] = "mailAlias"; + //$info["onlyAlias"] = "FALSE"; + $info["spamassassin"][0] = "whitelist_from dupont@seulement-cet-expediteur.com"; + $info["spamassassin"][1] = "whitelist_from *@tous-les-mails-de-ce-domaine.com"; + } + + $info["isActive"] = (isset($_POST['isactive'])) ? "TRUE" : "FALSE"; + $info["isAdmin"] = (isset($_POST['isadmin'])) ? "TRUE" : "FALSE"; + + $info["cn"] = $cn; + if (!$conf['domaines']['ldap']['virtual']) { + $info["loginShell"] = "/bin/bash"; + $info["sn"] = $sn; + $info["homeDirectory"] = "/home/" .$uid; + + // TODO: rajouter un isset pour verifier la presence de ce champ optionnel + if ( $mail != '') { + $info["mail"] = $mail; + } + } else { + $info["homeDirectory"] = "/home/vmail/" .$_SESSION['domain']. "/" .$postuid. "/"; + } + + // Cas d'un compte mail + if (($conf['admin']['what'] == 1) || ($conf['admin']['what'] == 3)) { + + // Aliases + $aliases = $_POST['alias']; + + // Compatibilite anciens schemas LDAP et mode "virtuel" + if (($conf['evoadmin']['version'] == 1) || ($conf['domaines']['ldap']['virtual'])) { + // add @domain for each element + array_walk($aliases,'adddomain'); + } + + + if (!$conf['domaines']['onlyone']) { + array_push($aliases,$postuid."@".$_SESSION['domain']); + } else { + array_push($aliases,$uid); + } + + // TODO: if ($conf['domaines']['onlyone'] != true) { + // verifier que le domaine des aliases est correct !! + + // on vire les valeurs nulles + sort($aliases); + while ( $aliases[0] == NULL ) { + array_shift($aliases); + } + + $info["mailacceptinggeneralid"] = $aliases; + if (!$conf['domaines']['ldap']['virtual']) { + $info["maildrop"] = $uid; + } + + $info["accountActive"] = (isset($_POST['accountactive'])) ? "TRUE" : "FALSE"; + $info["courierActive"] = (isset($_POST['courieractive'])) ? "TRUE" : "FALSE"; + $info["webmailActive"] = (isset($_POST['webmailactive'])) ? "TRUE" : "FALSE"; + $info["authsmtpActive"] = (isset($_POST['authsmtpactive'])) ? "TRUE" : "FALSE"; + + } + + // Cas d'un compte Samba + if (($conf['admin']['what'] == 2) || ($conf['admin']['what'] == 3)) { + + $userRid = 2 * $info["uidNumber"] + 1000; + + $info["sambaSID"] = $conf['samba']['sid'].'-'.$userRid; + if(!empty($_POST['displayname'])) { + $info["displayName"] = Html::clean($_POST['displayname']); + } + $info["smbActive"] = (isset($_POST['smbactive'])) ? "TRUE" : "FALSE"; + $info["sambaDomainName"] = $conf['samba']['dn']; + + $tmp = getsambagroups('smb'); + $info["sambaPrimaryGroupSID"] = $conf['samba']['sid'] . $tmp[$smbgroup]; + $info["sambaPwdLastSet"] = strtotime("now"); + $info["sambaLMPassword"] = Ldap::sambalm($_POST['pass1']); + $info["sambaNTPassword"] = Ldap::sambant($_POST['pass1']); + $info["shadowLastChange"] = floor(strtotime("now")/(3600*24)); + + $info["sambaPwdCanChange"] = "-2"; + $info["sambaPwdMustChange"] = "2147483647"; + $info["sambaKickoffTime"] = "2147483647"; + $info["sambaAcctFlags"] = "[XU ]"; + + $info["shadowExpire"] = "-1"; + $info["shadowInactive"] = "-1"; + $info["shadowMax"] = "200"; + $info["shadowMin"] = "0"; + $info["shadowWarning"] = "30"; + $info["shadowFlag"] = "-1"; + + } + + $info["userPassword"] = "{SSHA}" .Ldap::ssha($_POST['pass1']); + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + // We use uid attribute for DN + $sr=ldap_add($ldapconn,"uid=" .$uid. "," .$rdn, $info); + + // test if ldap connection is successful + if ( $sr ) { + + if (!$conf['domaines']['ldap']['virtual']) { + // script creation systeme + unix_add($uid,getgid($_SESSION['domain'])); + } else { + mail($uid, 'Premier message',"Mail d'initialisation du compte."); + } + + print "

Ajout effectué.

"; + print "Voir le compte créé"; + EvoLog::log("Add user ".$uid); + + // notification par mail + mailnotify($info,$_SESSION['domain'],$_POST['pass1']); + + } else { + print "

Erreur, envoyez le message d'erreur + suivant à votre administrateur :

"; + var_dump($info); + EvoLog::log("Add $uid failed"); + } + + print "
"; + + } else { + ?> +
+ +

Ajout d'un compte

+ +
+ +

Remplissez lez champs, ceux contenant [*] sont obligatoires.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Login [*] : + +
Nom [*] :
Nom Complet [*] :
Mot de passe [*] :
Confirmation du mot de passe [*] :
Mail annoncé dans l'annuaire :
+

Gestion des parametres Samba

+
Nom dans Samba :
Groupe Samba : + + + +
+

En plus du mail utilisant le login, vous pouvez ajouter des alias.

+
Alias : + +
Alias : + +
Alias : + +
+

Cochez les cases pour choisir les autorisations du compte.

+
Activation globale :
Compte admin :
Compte Samba actif :
Compte mail actif :
Utilisation POP/IMAP :
Webmail actif :
Authentification SMTP : />
  +

+
+
+ +
+ + diff --git a/evoadmin/htdocs/config/.svnignore b/evoadmin/htdocs/config/.svnignore new file mode 100644 index 0000000..16420d4 --- /dev/null +++ b/evoadmin/htdocs/config/.svnignore @@ -0,0 +1 @@ +conf.php diff --git a/evoadmin/htdocs/config/conf-dist.php b/evoadmin/htdocs/config/conf-dist.php new file mode 100755 index 0000000..7d20fca --- /dev/null +++ b/evoadmin/htdocs/config/conf-dist.php @@ -0,0 +1,42 @@ + + * @version 1.0 + */ + +define("LDAP_URI","ldap://127.0.0.1"); +define("LDAP_BASE","dc=example,dc=com"); +define("LDAP_ADMIN_DN","cn=admin,dc=example,dc=com"); +define("LDAP_ADMIN_PASS","xxxxx"); + +define("SUDOBIN","/usr/bin/sudo"); +define("SUDOSCRIPT","/usr/share/scripts/evoadmin.sh"); +define("SUDOPASS","xxxxxx"); + +define ('SERVEUR', "localhost"); + +define('SERVEUR','localhost'); +define('SERVEURPORT',3306); +define('BASE','horde'); +define('NOM', 'horde'); +define('PASSE', 'xxxx'); + +?> diff --git a/evoadmin/htdocs/debut.php b/evoadmin/htdocs/debut.php new file mode 100755 index 0000000..16a0881 --- /dev/null +++ b/evoadmin/htdocs/debut.php @@ -0,0 +1,25 @@ +'; + //print ''; +?> + + + + + + + +Vous êtes $login.
"; + +if (isset($_SESSION['domain'])) +{ + print "Vous administrez le domaine " + .$_SESSION['domain']. ""; + +} +print '

'; +?> + diff --git a/evoadmin/htdocs/domaine.php b/evoadmin/htdocs/domaine.php new file mode 100755 index 0000000..f622b81 --- /dev/null +++ b/evoadmin/htdocs/domaine.php @@ -0,0 +1,220 @@ + + * @version 1.0 + */ + +/** + * Path + */ +define('EVOADMIN_BASE','./'); + +/** + * PHP cookies session + */ +session_name('EVOADMIN_SESS'); +session_start(); + +if (isset($_SESSION['login'])) { + + /** + * Requires + */ + require_once EVOADMIN_BASE . 'common.php'; + + // $login var need for debut.php + $login = $_SESSION['login']; + + include EVOADMIN_BASE . 'haut.php'; + include EVOADMIN_BASE . 'inc/add.js'; + include EVOADMIN_BASE . 'debut.php'; + + if ( (!superadmin($login)) || ($conf['domaines']['driver'] != 'ldap') ) { + + print "

Vous n'avez pas les droits pour cette page

"; + EvoLog::log("Access denied on domaine.php"); + + include EVOADMIN_BASE . 'fin.php'; + exit(1); + } + + // Supprimer un domaine + if ( isset($_GET['del']) ) { + + $domain = Html::clean($_GET['del']); + + if ( (isset($_GET['modif'])) && ($_GET['modif'] == 'yes')) { + + print "
"; + + print "

Suppression $domain en cours...

"; + + // TODO : Verifier que l'objet existe avant sa suppression + //$ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + //$sr = Ldap::lda_del($ldapconn,"domain=" .$domain. "," .$rdn); + + if ( $sr ) { + // script suppression systeme + //unix_del_dom($domain); + + // TODO : suppression comptes associes + + print "

Suppression $domain effectuée.

"; + + EvoLog::log("Del domain ".$domain); + + } else { + print "

"; + print "Veuillez prendre contact avec l'administrateur pour faire cela.

"; + //print "Tous les messages et paramètres seront définitivement perdus.

"; + //print "Confirmer la suppression"; + print "
"; + } + + } else { + + // Ajouter un domaine + if ( (isset($_GET['modif'])) && ($_GET['modif'] == 'yes')) { + + $domain = Html::clean($_POST['domain']); + + print "
"; + print "Ajout en cours..."; + + if (!$conf['domaines']['ldap']['virtual']) { + + if ( $conf['evoadmin']['version'] == 1) { + + $info["domain"]=$domain; + $info["objectclass"][0] = "ldapDomain"; + $info["postfixTransport"] = "local:"; + $info["accountActive"] = (isset($_POST['isactive'])) ? "TRUE" : "FALSE"; + + $info2["cn"] = $domain; + $info2["objectclass"]="posixGroup"; + // recuperer un uid number valide + // TODO : erreur si uid non compris entre 1000 et 29999 + $info2["gidNumber"]= getfreegid(); + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + + // on teste si LDAP est content + if ( ldap_add($ldapconn,"domain=" .$domain. "," .LDAP_BASE, $info) + && ldap_add($ldapconn,"cn=" .$domain. ",ou=group," .LDAP_BASE, $info2) ) { + + // script ajout systeme (TODO : quota) + //unix_add($uid,getgid($_SESSION['domain'])); + print "

Ajout effectué.

"; + EvoLog::log("Add domain ".$domain); + + // notification par mail + domainnotify($domain); + + } else { + print "

Erreur, envoyez le message d'erreur + suivant à votre administrateur :

"; + var_dump($info); + var_dump($info2); + EvoLog::log("Add $domain failed"); + } + } elseif ( $conf['evoadmin']['version'] == 2) { + // TODO : cf worldsat, etc. + + } + } else { + + // Ajout d'un domaine virtuel + + $info["cn"]=$domain; + $info["objectclass"][0] = "postfixDomain"; + $info["objectclass"][1] = "posixGroup"; + $info["postfixTransport"] = "virtual:"; + $info["isActive"] = (isset($_POST['isactive'])) ? "TRUE" : "FALSE"; + + // recuperer un uid number valide + // TODO : erreur si uid non compris entre 1000 et 29999 + $info["gidNumber"]= getfreegid(); + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + + // on teste si LDAP est content + if (ldap_add($ldapconn,"cn=" .$domain. "," .LDAP_BASE, $info)) { + + print "

Ajout effectué.

"; + EvoLog::log("Add domain ".$domain); + + // notification par mail + domainnotify($domain); + + } else { + print "

Erreur, envoyez le message d'erreur + suivant à votre administrateur :

"; + var_dump($info); + EvoLog::log("Add $domain failed"); + } + + } + + print "
"; + + // Formulaire d'ajout d'un domaine + } else { + ?> +
+ +

Ajout d'un domaine

+ +
+ +

Remplissez lez champs, ceux contenant [*] sont obligatoires.

+ + + + + + + + + + + + +
Domaine [*] :
Activation globale :
  +

+
+
+ +
+ + diff --git a/evoadmin/htdocs/evolibs/Auth.php b/evoadmin/htdocs/evolibs/Auth.php new file mode 100644 index 0000000..1245f0d --- /dev/null +++ b/evoadmin/htdocs/evolibs/Auth.php @@ -0,0 +1,56 @@ + 12) || + (strlen($pass) < 5) || + (!ereg('^([[:graph:]]*)$',$pass)) ); + + } + + /** + * verifie qu'un FQDN semble correct + */ + + function badfqdn($domain) + { + return (!ereg('^([[:alnum:]\.\-]{2,70}.[[:alpha:]]{2,5})$',$domain)); + } + +} + + +?> diff --git a/evoadmin/htdocs/evolibs/EvoLog.php b/evoadmin/htdocs/evolibs/EvoLog.php new file mode 100755 index 0000000..8d717ef --- /dev/null +++ b/evoadmin/htdocs/evolibs/EvoLog.php @@ -0,0 +1,56 @@ +log($message, $priority); + } + + function debug() + { + if (DEBUG > 2) + { + echo "

SESSION DEBUG :
"; + print_r($_SESSION); + echo "
"; + echo 'session_name() : ' . session_name() . "
\n" ; + echo 'session_id() : ' . session_id() . "
\n" ; + echo 'session_cache_expire() : ' . session_cache_expire() . "
\n" ; + echo 'session_cache_limiter() : ' . session_cache_limiter() . "
\n" ; + echo 'session_get_cookie_params() : '; + print_r(array_values(session_get_cookie_params())); + echo "
\n"; + echo 'session_module_name() : ' . session_module_name() . "
\n" ; + echo 'session_save_path() : ' . session_save_path() . "
\n" ; + + echo "

POST DEBUG :
"; + print_r($_POST); + echo "

GET DEBUG :
"; + print_r($_GET); + echo "

"; + + } + + } + +} + +?> diff --git a/evoadmin/htdocs/evolibs/Html.php b/evoadmin/htdocs/evolibs/Html.php new file mode 100755 index 0000000..ebcd7b0 --- /dev/null +++ b/evoadmin/htdocs/evolibs/Html.php @@ -0,0 +1,100 @@ +\\1',$texte); + return addslashes($texte); + } + + /** + * Nettoie une requete SQL + * Ajoute des antislashes devant : guillements simples, doubles, antislashes + * caractere NULL + * Cette fonction n'agit que si la directive magic_quotes_gpc est sur Off + */ + + function sqlclean($texte) + { + return (get_magic_quotes_gpc()) ? $texte : addslashes($texte); + } + + + function purgeaccents($texte) + { + + // liste des caracteres accentuees + $couple["é"] = "e"; $couple["è"] = "e"; $couple["ê"] = "e"; $couple["ë"] = "e"; + $couple["È"] = "e"; $couple["É"] = "e"; $couple["Ê"] = "e"; $couple["Ë"] = "e"; + $couple["à"] = "a"; $couple["ä"] = "a"; $couple["â"] = "a"; $couple["å"] = "a"; + $couple["á"] = "a"; $couple["ã"] = "a"; $couple["æ"] = "a"; + $couple["À"] = "a"; $couple["Á"] = "a"; $couple["Â"] = "a"; $couple["Ã"] = "a"; + $couple["Ä"] = "a"; $couple["Å"] = "a"; $couple["Æ"] = "a"; + $couple["ù"] = "u"; $couple["ü"] = "u"; $couple["û"] = "u"; $couple["ú"] = "u"; + $couple["ô"] = "o"; $couple["ö"] = "o"; $couple["ò"] = "o"; $couple["ó"] = "o"; $couple["õ"] = "o"; + $couple["î"] = "i"; $couple["ï"] = "i"; $couple["ì"] = "i"; $couple["í"] = "i"; + $couple["ç"] = "c"; $couple["Ç"] = "c"; + $couple["ÿ"] = "y"; $couple["ý"] = "y"; $couple["ñ"] = "n"; + + while(list($car,$val) = each($couple)) + { + $texte = ereg_replace($car,$val,$texte); + } + + return $texte; + + } + + /** + * renvoie un entier + */ + + function toint($var) + { + return number_format($var, 0, '', ''); + } +} +?> diff --git a/evoadmin/htdocs/evolibs/Ldap.php b/evoadmin/htdocs/evolibs/Ldap.php new file mode 100755 index 0000000..0cc23af --- /dev/null +++ b/evoadmin/htdocs/evolibs/Ldap.php @@ -0,0 +1,189 @@ + http://gcolpart.evolix.net/debian/php-crypt-chap/ + // inspire de lib/Driver/smbldap.php (Horde Password) + function sambalm($pass) { + $hash = &new Crypt_CHAP_MSv2(); + $hash->password = $pass; + return strtoupper(bin2hex($hash->lmPasswordHash())); + } + + // necessite Crypt/CHAP -> http://gcolpart.evolix.net/debian/php-crypt-chap/ + // inspire de lib/Driver/smbldap.php (Horde Password) + function sambant($pass) { + $hash = &new Crypt_CHAP_MSv2(); + $hash->password = $pass; + return strtoupper(bin2hex($hash->ntPasswordHash())); + } + +} + +?> diff --git a/evoadmin/htdocs/evolibs/Math.php b/evoadmin/htdocs/evolibs/Math.php new file mode 100755 index 0000000..767999d --- /dev/null +++ b/evoadmin/htdocs/evolibs/Math.php @@ -0,0 +1,38 @@ + diff --git a/evoadmin/htdocs/fin.php b/evoadmin/htdocs/fin.php new file mode 100644 index 0000000..7dc7924 --- /dev/null +++ b/evoadmin/htdocs/fin.php @@ -0,0 +1,5 @@ +
+

Powered by EvoAdmin

+ + + diff --git a/evoadmin/htdocs/haut.php b/evoadmin/htdocs/haut.php new file mode 100755 index 0000000..a83ab3b --- /dev/null +++ b/evoadmin/htdocs/haut.php @@ -0,0 +1,19 @@ +'; + +?> + + + + + +<?php print $conf['html']['title']; ?> + + + + + +

diff --git a/evoadmin/htdocs/help.php b/evoadmin/htdocs/help.php new file mode 100755 index 0000000..ee49838 --- /dev/null +++ b/evoadmin/htdocs/help.php @@ -0,0 +1,98 @@ + + * @version 1.0 + */ + +/** + * Path + */ +define('EVOADMIN_BASE','./'); + +/** + * PHP cookies session + */ +session_name('EVOADMIN_SESS'); +session_start(); + +if (isset($_SESSION['login'])) +{ + + $rep = './'; + require_once($rep. 'common.php'); + + include($rep. 'haut.php'); + + $login = $_SESSION['login']; + + include($rep. 'debut.php'); + +?> + +Cette page devrait être lue attentivement avant d'utiliser cette interface. + +

Aide

+ +Cette aide devrait vous permettre de comprendre le fonctionnement de cette interface. + +

Créer un compte mail

+ +

Vous devez choisir un mot de passe et éventuellement des alias. Veillez à entrer des alias avec une syntaxe valide et un mot de passe valide et assez complexe. Vous pouvez également choisir de donner les droits "Admin" en cochant la case Admin, c'est-à-dire permettre à l'utilisateur de se connecter à cette interface pour pouvoir ajouter/supprimer des mails/alias.
+Vous devez également choisir un Login qui ne sera plus modifiable par la suite. Ce login et le mot de passe serviront à se connecter au Webmail, serveur SMTP, serveur POP et serveur IMAP et éventuellement à cette interface (si l'utilisateur a les droits "Admin"). +

+ +

Créer un alias

+ +

Vous devez choisir un alias et un mail valide pour rediriger les mails. Prenez bien garde à entrer un mail valide sinon les mails ne vous parviendront jamais.

+ +

FAQ

+ +Cette Foire-Aux-Questions (FAQ) devrait répondre à vos questions. Au fil du temps, de nouvelles questions/réponses seront ajoutées. Posez vos questions à . + +

Qu'est-ce qu'une syntaxe valide pour un compte mail ?

+ +Le début du mail (avant le @), doit respecter les règles suivantes : +
    +
  • être compris entre 3 et 30 caractères
  • +
  • n'avoir que des caractères de types lettre minuscules ou chiffres
  • +
  • les caractères tiret (-), point (.) et underscore (_) sont permis sauf en début et fin
  • +
+
+ +

Qu'est-ce qu'un mot de passe valide ?

+ +Votre mot de passe doit répondre aux règles suivantes : +
    +
  • avoir entre 5 et 12 caractères
  • +
  • N'utiliser ques des caractères imprimables c'est-à-dire des lettres (majuscules, minuscules ou accentuées), des chiffres ou les caractères suivants : +
    []!"#$%&'()*+,-./:;<=>?@\^_`{|}~
    +
+
+ +

Qu'est-ce qu'un mot de passe assez complexe ?

+ +Outre d'avoir un mot de passe assez long (voir question précédente), il est fortement conseillé d'utilisé au moins un chiffre, au moins une lettre minuscule, au moins une lettre majuscule et au moins un caractères "spécial". De plus, l'utilisation de suites de caractères "connues" (mots, dates, noms, etc.) est fortement déconseillée. + + + + + + + diff --git a/evoadmin/htdocs/inc/.svnignore b/evoadmin/htdocs/inc/.svnignore new file mode 100755 index 0000000..a8f9515 --- /dev/null +++ b/evoadmin/htdocs/inc/.svnignore @@ -0,0 +1 @@ +hook.php diff --git a/evoadmin/htdocs/inc/add.js b/evoadmin/htdocs/inc/add.js new file mode 100755 index 0000000..42698b4 --- /dev/null +++ b/evoadmin/htdocs/inc/add.js @@ -0,0 +1,33 @@ + + diff --git a/evoadmin/htdocs/inc/exit.png b/evoadmin/htdocs/inc/exit.png new file mode 100755 index 0000000..785e118 Binary files /dev/null and b/evoadmin/htdocs/inc/exit.png differ diff --git a/evoadmin/htdocs/inc/functions.php b/evoadmin/htdocs/inc/functions.php new file mode 100755 index 0000000..a513bc2 --- /dev/null +++ b/evoadmin/htdocs/inc/functions.php @@ -0,0 +1,252 @@ +" . $msg . "

\n"; +} + +// teste si l'utilisateur est superadmin +function superadmin($login) { + + global $conf; + + foreach ($conf['admin']['logins'] as $admin) { + if ( Html::clean($login) == $admin ) { + return TRUE; + } + } + return FALSE; +} + + +// execution du script shell associe +function evoexec($cmd) { + //exec(SUBIN . " " . SUUSER . " -c " . SUDOBIN . " '$cmd'"); + return exec(SUDOBIN . " " . SUDOSCRIPT . " -p " . SUDOPASS . " $cmd"); +} + + +// retourne le quota d'un utilisateur ou d'un groupe +function getquota($who,$what) { + +global $conf; + + if ( $what == 'user') { + $quota = evoexec("-qu $who"); + } elseif ( $what == 'group') { + if ( $conf['domaines']['driver'] == 'file' ) { + $quota = evoexec("-s"); + } elseif ( $conf['domaines']['driver'] == 'ldap' ) { + $quota = evoexec("-qg $who"); + } + } + + list ($now,$limit) = split("/",$quota); + $now = $now / 1024; + $limit = $limit / 1024; + $quota = "" . Math::arrondi($now). "M/" .Math::arrondi($limit). "M"; + + return $quota; +} + +// commande shell a lancer pour creer un utilisateur +function unix_add($user,$group=NULL) { + + if ( $group == NULL) { + $group = getgid(); + } + evoexec("-a -u $user -g $group"); +} + +// commande shell a lancer pour supprimer un utilisateur +function unix_del($user) { + + evoexec("-d -u $user"); +} + +// renvoie le gidNumber associe a un domaine +function getgid($domain=NULL) { + + global $conf; + + if ( $conf['domaines']['driver'] == 'file' ) { + return $conf['domaines']['file']['gid']; + } elseif ( $conf['domaines']['driver'] == 'ldap' ) { + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + $filter="(&(cn=" .$domain. ")(gidnumber=*))"; + $sr=ldap_search($ldapconn, LDAP_BASE, $filter); + $info = ldap_get_entries($ldapconn, $sr); + ldap_unbind($ldapconn); + + if ($info['count']) { + return (int) $info[0]["gidnumber"][0]; + } else { + return -1; + } + + } else { + return -1; + } +} + +// renvoie le 1er uidNumber disponible +function getfreeuid() { + + global $conf; + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + $filter="(uidNumber=*)"; + $sr=ldap_search($ldapconn, LDAP_BASE, $filter); + $info = ldap_get_entries($ldapconn, $sr); + ldap_unbind($ldapconn); + + $uids = array(); + + foreach ($info as $entry) { + array_push($uids,$entry['uidnumber'][0]); + } + + sort($uids); + $uid = max(array_pop($uids)+1,$conf['unix']['minuid']); + + return (int) $uid; +} + +// renvoie le 1er uidNumber disponible +function getfreegid() { + + global $conf; + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + $filter="(gidNumber=*)"; + $sr=ldap_search($ldapconn, LDAP_BASE, $filter); + $info = ldap_get_entries($ldapconn, $sr); + ldap_unbind($ldapconn); + + $gids = array(); + + foreach ($info as $entry) { + array_push($gids,$entry['gidnumber'][0]); + } + + sort($gids); + $gid = max(array_pop($gids)+1,$conf['unix']['mingid']); + + return (int) $gid; +} + + +// get number of account or aliases for a domain +function getnumber($domain,$type) { + + global $conf; + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + if ( $type == 'compte' ) { + $filter="(objectClass=posixAccount)"; + + } elseif ( $type == 'mail' ) { + $filter="(objectClass=mailAccount)"; + + } elseif ( $type == 'alias' ) { + $filter="(objectClass=mailAlias)"; + + // compatibilite anciens schemas + if ($conf['evoadmin']['version'] == 1) { + $filter="(&(objectClass=mailAlias)(onlyAlias=TRUE))"; + } + + } elseif ( $type == 'smb' ) { + $filter="(objectClass=sambaSamAccount)"; + } + + if (! $conf['domaines']['onlyone']) { + + // compatibilite anciens schemas + if ($conf['evoadmin']['version'] <= 2) { + $rdn= "domain=" .$domain. "," .LDAP_BASE; + } else { + $rdn= "cn=" .$domain. "," .LDAP_BASE; + } + + } else { + //$rdn= "ou=people," .LDAP_BASE; + $rdn= LDAP_BASE; + } + + $sr=ldap_search($ldapconn, $rdn, $filter); + $info = ldap_get_entries($ldapconn, $sr); + ldap_unbind($ldapconn); + + return $info['count']; +} + +function getsambagroups($type) { + + global $conf; + + // Si la liste des groupes est defini dans la config on l'utilise + + if($type == "unix" && isset($conf['samba']['unixgroups'])) { + return $conf['samba']['unixgroups']; + } + + if($type == "smb" && isset($conf['samba']['smbgroups'])) { + return $conf['samba']['smbgroups']; + } + + // sinon on interroge LDAP + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + $filter = "(objectClass=sambaGroupMapping)"; + $rdn = LDAP_BASE; + $sr=ldap_search($ldapconn, $rdn, $filter); + $info = ldap_get_entries($ldapconn, $sr); + ldap_unbind($ldapconn); + + $ret = array(); + for($i=0; $i<$info['count']; $i++) { + + $entry = $info[$i]; + $cn = $entry['cn'][0]; + + if($type == "unix") { + $ret[$cn] = $entry['gidnumber'][0]; + } elseif($type == "smb") { + $tmp = explode('-', $entry['sambasid'][0]); + $ret[$cn] = "-".array_pop($tmp); + } + } + + return $ret; +} + +/** + * Verifie qu'un login est incorrect + * entre 2 et 30 caracteres + * en lettres minuscule, chiffres, '-', '.' ou '_' + * pour le premier et dernier caracteres : seuls lettres et minuscules + * et chiffres sont possibles + */ +function badname($login) +{ + return (!preg_match('`^([a-z0-9][a-z0-9\-\.\_]{0,28}[a-z0-9])$`',$login)); +} + +/** + * Ajouter la composante @domaine + */ +function adddomain(&$item,$key) +{ + if (preg_match('`@`',$item)) { + print "

Ne pas inclure de @ dans les mails acceptes !

"; + exit(1); + } + + if (!empty($item)) { + $item = "$item". "@".$_SESSION['domain']; + } +} + + diff --git a/evoadmin/htdocs/inc/help.png b/evoadmin/htdocs/inc/help.png new file mode 100755 index 0000000..7481254 Binary files /dev/null and b/evoadmin/htdocs/inc/help.png differ diff --git a/evoadmin/htdocs/inc/home.png b/evoadmin/htdocs/inc/home.png new file mode 100755 index 0000000..d701851 Binary files /dev/null and b/evoadmin/htdocs/inc/home.png differ diff --git a/evoadmin/htdocs/inc/hook-dist.php b/evoadmin/htdocs/inc/hook-dist.php new file mode 100644 index 0000000..d930ee8 --- /dev/null +++ b/evoadmin/htdocs/inc/hook-dist.php @@ -0,0 +1,54 @@ + + + + + diff --git a/evoadmin/htdocs/inc/style.css b/evoadmin/htdocs/inc/style.css new file mode 100755 index 0000000..4669b3b --- /dev/null +++ b/evoadmin/htdocs/inc/style.css @@ -0,0 +1,76 @@ +body { +margin: 0 auto; +padding: 0; +font-size: 14px; +} + +.light { +color: #333; +} + +/* Form styles. */ +/* from Horde3 */ +input, select, textarea { +font-family: Geneva, Arial, Helvetica, sans-serif; +font-size: 12px; +color: #000; +background-color: #f3f3f9; +border: 1px solid #669; +} + +input:focus, textarea:focus { +background-color: #fff; +border: 1px solid #99f; +} + +.button, .button:focus { +background-color: #339; +border-bottom: 1px solid #333; +border-right: 1px solid #000; +border-left: 1px solid #C4C4B8; +border-top: 1px solid #C4C4B8; +-moz-border-radius: 5px; +color: #fff; +} + +.button:hover { +background-color: #66a; +} + +p.login { +border: 1px solid #aaa; +color: #666; +font-size: 12px; +text-align: center; +background-color: #ccc; +} + +img { +border: 0; +} + +table { +background-color: #fff; +text-align: center; +} + +p.display { +background-color: #ddd; +text-align: center; +color: red; +font-size: 11px; +} + +p.error { +background-color: #999; +color: red; +text-align: center; +} + +.italic { +font-style: italic +} + +.strong { +font-weight: bold; +} diff --git a/evoadmin/htdocs/inc/suppr.png b/evoadmin/htdocs/inc/suppr.png new file mode 100755 index 0000000..9bee82f Binary files /dev/null and b/evoadmin/htdocs/inc/suppr.png differ diff --git a/evoadmin/htdocs/index.php b/evoadmin/htdocs/index.php new file mode 100755 index 0000000..a76b119 --- /dev/null +++ b/evoadmin/htdocs/index.php @@ -0,0 +1,19 @@ + + * @version 1.0 + */ + +header("Location: auth.php\n\n"); +exit(0); + +/* Copyright (c) 2004-2006 Evolix - Tous droits reserves */ +?> diff --git a/evoadmin/htdocs/superadmin.php b/evoadmin/htdocs/superadmin.php new file mode 100755 index 0000000..caff320 --- /dev/null +++ b/evoadmin/htdocs/superadmin.php @@ -0,0 +1,179 @@ + + * @version 1.0 + */ + +/* + * Functions + */ + +/** + * Show domain details + * @param string $domain + * @return NULL + */ +function show_domaine_details($domain) { + + global $conf; + + print '' .$domain. ''; + + // TODO : synchronization OpenLDAP<-Active Directory + print 'N/A'; + print '' .getnumber($domain,'compte'). ''; + print '' .getnumber($domain,'mail'). ''; + print '' .getnumber($domain,'smb'). ''; + print '' .getnumber($domain,'alias'). ''; + print '' .getquota($domain,'group'). ''; + + print ''; + + // suppression possible que si utilisation de LDAP + if ( $conf['domaines']['driver'] == 'ldap' ) { + print ' + '; + } else { + print "Impossible"; + } + print ''; +} + +/** + * Path + */ +define('EVOADMIN_BASE','./'); + +/** + * PHP cookies session + */ +session_name('EVOADMIN_SESS'); +session_start(); + +if (isset($_SESSION['login'])) { + + /** + * Requires + */ + require_once EVOADMIN_BASE . 'common.php'; + + include EVOADMIN_BASE . 'haut.php'; + + $login = $_SESSION['login']; + + // pas de domaine/variable domaine sur superadmin.php + unset($_SESSION['domain']); + + global $conf; + + // array with all domains with rights on + $domaines = array(); + + // If you are superadmin, you view all domains + if (superadmin($login)) { + + // driver 'ldap' + if ( $conf['domaines']['driver'] == 'ldap' ) { + + $ldapconn = Ldap::lda_connect(LDAP_ADMIN_DN,LDAP_ADMIN_PASS); + + if ($ldapconn) { + + // compatibilite anciens schemas + if ($conf['evoadmin']['version'] == 1) { + $filter="(objectClass=ldapDomain)"; + } else { + $filter="(objectClass=postfixDomain)"; + } + $sr=ldap_search($ldapconn, LDAP_BASE, $filter); + $info = ldap_get_entries($ldapconn, $sr); + + for ($i=0;$i<$info["count"];$i++) { + // compatibilite anciens schemas + if ($conf['evoadmin']['version'] == 1) { + array_push($domaines,$info[$i]["domain"][0]); + } else { + array_push($domaines,$info[$i]["cn"][0]); + } + } + + ldap_unbind($ldapconn); + + } else { + print "

Erreur de connexion : $ldapconn

"; + EvoLog::log("LDAP connection failed"); + } + + // driver 'file' + } elseif ( $conf['domaines']['driver'] == 'file' ) { + + $domaines = $conf['domaines']['file']['all']; + } + // If you are not superadmin... + } elseif ( $conf['domaines']['driver'] == 'file' ) { + // you view all if using driver 'file' + $domaines = $conf['domaines']['file']['all']; + } elseif ( $conf['domaines']['driver'] == 'ldap' ) { + // you view only your domain if using driver 'ldap' + // we select domain in your DN + // thanks to http://www.physiol.ox.ac.uk/~trp/regexp.html + $mydomain = preg_replace("/uid=" .$login. ",domain=((?:(?:[0-9a-zA-Z_\-]+)\.){1,}(?:[0-9a-zA-Z_\-]+))," + . LDAP_BASE ."/","$1",$_SESSION['dn']); + array_push($domaines,$mydomain); + } + + // alphanumerique sort before displaying domains + sort($domaines); + + include EVOADMIN_BASE . 'debut.php'; + + // with driver 'ldap', we can add a domain + // TODO : retrict to superadmin guys + if ( $conf['domaines']['driver'] == 'ldap' ) { + print '

+ Ajouter un domaine...

'; + } + + ?> +
+

Liste des domaines administrables :

+ + + + + + + + + + + + + + '; + print '
'; + +//if (isset($_SESSION['login'])) +} else { + + header("location: auth.php\n\n"); + exit(0); +} + +include(EVOADMIN_BASE . 'fin.php'); + +?>
Nom du domaineSynchro AD/LDAPNombre de comptesdont comptes maildont comptes SambaNombre d'alias mailTaille/QuotaSuppression du domaine