<?php
/*
Ce fichier est sous licence GPL V2 ou V3.
Je vous demanderai toutefois de bien vouloir me faire parvenir (par mail ou par
un autre moyen à votre convenance) les modifications que vous êtes suceptibles
d'y ajouter, ainsi que leurs justification.

--------------------------------------------------------------------------------------

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 or 3 of the License.

Thanks to send me any change you can wrote to this project and their reasons.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
//Active ou non le debuggage du code
$DEBUG=0;

//compteur pour avoir le nombre de symbole dans la liste
$cptsymbole=0;

//Premier accès a la page ou regénération
if (isset ($_POST['generate'])) $generate=1;
else 
$generate=0;

//Generation de la liste des symboles

/*
Modele coché par défaut :
-------------------------------------
if (!isset ($_POST['nom']) && $generate)
{
  $nom=0;
}
else
{
  $nom=1;
  $symbole[$cptsymbole++]="symbole";
}
-------------------------------------

Modele non coché par defaut
-------------------------------------
if (isset ($_POST['nom'))
{
  $nom=1;
  $symbole[$cptsymbole++]="symbole";
}
else
  $nom=0;
-------------------------------------

NB : Les générations d'une série de symboles se font avec une boucle en plus.

NB2 : Pour la fonction HaveSpecial, il faut faire attention a bien lister tous les nouveaux caractères
speciaux dans cette fonction.
=> Corrigé en utilisant une autre expression régulière.

*/

if (!isset ($_POST['number']) && $generate)
  
$number=0;
else
{
  
$number=1;
  for (
$sym=0;$sym<=9;)
    
$symbole[$cptsymbole++]=$sym++;
}

if (!isset (
$_POST['minuscule']) && $generate)
  
$minuscule=0;
else
{
  
$minuscule=1;
  for (
$sym="a";$sym<"z";)
    
$symbole[$cptsymbole++]=$sym++;
  
$symbole[$cptsymbole++]=$sym;
}

if (!isset (
$_POST['majuscule']) && $generate)
  
$majuscule=0;
else
{
  
$majuscule=1;
  for (
$sym="A";$sym<"Z";)
    
$symbole[$cptsymbole++]=$sym++;
  
$symbole[$cptsymbole++]=$sym;
}

if (!isset (
$_POST['et']) && $generate)
  
$et=0;
else
{
  
$et=1;
  
$symbole[$cptsymbole++]="&";
}

if (isset (
$_POST['tilde']))
{
  
$tilde=1;
  
$symbole[$cptsymbole++]="~";
}
else
  
$tilde=0;

if (isset (
$_POST['espace']))
{
  
$espace=1;
  
$symbole[$cptsymbole++]=" ";
}
else
  
$espace=0;

if (!isset (
$_POST['dblequote']) && $generate)
  
$dblequote=0;
else
{
  
$dblequote=1;
  
$symbole[$cptsymbole++]='"';
}

if (!isset (
$_POST['quote']) && $generate)
  
$quote=0;
else
{
  
$quote=1;
  
$symbole[$cptsymbole++]="'";
}

if (!isset (
$_POST['acoouv']) && $generate)
  
$acoouv=0;
else
{
  
$acoouv=1;
  
$symbole[$cptsymbole++]="{";
}

if (!isset (
$_POST['acofer']) && $generate)
  
$acofer=0;
else
{
  
$acofer=1;
  
$symbole[$cptsymbole++]="}";
}

if (!isset (
$_POST['diese']) && $generate)
  
$diese=0;
else
{
  
$diese=1;
  
$symbole[$cptsymbole++]="#";
}

if (!isset (
$_POST['carre']) && $generate)
  
$carre=0;
else
{
  
$carre=1;
  
$symbole[$cptsymbole++]="²";
}

if (!isset (
$_POST['ouvpar']) && $generate)
  
$ouvpar=0;
else
{
  
$ouvpar=1;
  
$symbole[$cptsymbole++]="(";
}

if (!isset (
$_POST['ferpar']) && $generate)
  
$ferpar=0;
else
{
  
$ferpar=1;
  
$symbole[$cptsymbole++]=")";
}

if (!isset (
$_POST['ouvcro']) && $generate)
  
$ouvcro=0;
else
{
  
$ouvcro=1;
  
$symbole[$cptsymbole++]="[";
}

if (!isset (
$_POST['fercro']) && $generate)
  
$fercro=0;
else
{
  
$fercro=1;
  
$symbole[$cptsymbole++]="]";
}

if (!isset (
$_POST['moins']) && $generate)
  
$moins=0;
else
{
  
$moins=1;
  
$symbole[$cptsymbole++]="-";
}

if (!isset (
$_POST['pipe']) && $generate)
  
$pipe=0;
else
{
  
$pipe=1;
  
$symbole[$cptsymbole++]="|";
}

if (!isset (
$_POST['und']) && $generate)
  
$und=0;
else
{
  
$und=1;
  
$symbole[$cptsymbole++]="_";
}

if (!isset (
$_POST['backslash']) && $generate)
  
$backslash=0;
else
{
  
$backslash=1;
  
$symbole[$cptsymbole++]="\\";
}

if (!isset (
$_POST['arobase']) && $generate)
  
$arobase=0;
else
{
  
$arobase=1;
  
$symbole[$cptsymbole++]="@";
}

if (!isset (
$_POST['egual']) && $generate)
  
$egual=0;
else
{
  
$egual=1;
  
$symbole[$cptsymbole++]="=";
}

if (!isset (
$_POST['dollar']) && $generate)
  
$dollar=0;
else
{
  
$dollar=1;
  
$symbole[$cptsymbole++]="$";
}

if (!isset (
$_POST['livre']) && $generate)
  
$livre=0;
else
{
  
$livre=1;
  
$symbole[$cptsymbole++]="£";
}

if (!isset (
$_POST['pourcent']) && $generate)
  
$pourcent=0;
else
{
  
$pourcent=1;
  
$symbole[$cptsymbole++]="%";
}

if (!isset (
$_POST['etoile']) && $generate)
  
$etoile=0;
else
{
  
$etoile=1;
  
$symbole[$cptsymbole++]="*";
}

if (!isset (
$_POST['slash']) && $generate)
  
$slash=0;
else
{
  
$slash=1;
  
$symbole[$cptsymbole++]="/";
}

if (!isset (
$_POST['plus']) && $generate)
  
$plus=0;
else
{
  
$plus=1;
  
$symbole[$cptsymbole++]="+";
}

if (isset (
$_POST['backquote']))
{
  
$backquote=1;
  
$symbole[$cptsymbole++]="`";
}
else
  
$backquote=0;

if (isset (
$_POST['circo']))
{
  
$circo=1;
  
$symbole[$cptsymbole++]="^";
}
else
  
$circo=0;

//Taille du mot de passe

if (isset ($_POST['taille']) && intval($_POST['taille']) > $taille=intval($_POST['taille']);
else 
$taille=8;

////////////////////////////////////////////////////////////////////////////
////////////Contraintes et validation de celles-ci//////////////////////////
////////////////////////////////////////////////////////////////////////////

$Warning="";

if (isset (
$_POST['haveNumber']))
{
  if (isset (
$_POST['number'])) $haveNumber=1;
  else
  {
    
$Warning.="      La contrainte sur les chiffre est annulée. Incohérence avec les options de génération.<br />\n";
    
$haveNumber=0;
  }
}
else
  
$haveNumber=0;

if (isset (
$_POST['haveMinuscule']))
{
  if (isset(
$_POST['minuscule'])) $haveMinuscule=1;
  else
  {
    
$Warning.="      La contrainte sur les Minuscule est annulée. Incohérence avec les options de génération.<br />\n";
    
$haveMinuscule=0;
  }
}
else
  
$haveMinuscule=0;

if (isset (
$_POST['haveMajuscule']))
{
  if (isset (
$_POST['majuscule'])) $haveMajuscule=1;
  else
  {
    
$Warning.="      La contrainte sur les Majuscule est annulée. Incohérence avec les options de génération.<br />\n";
    
$haveMajuscule=0;
  }
}
else
  
$haveMajuscule=0;

if (isset (
$_POST['haveSpecial']))
{
  
$nbSpec=0;
  for (
$i=0;$i<=$cptsymbole;$i++)
  {
    if (
ereg ("[^0-9a-zA-Z]"$symbole[$i])) $nbSpec += 1;
  }
  if (
$nbSpec$haveSpecial=1;
  else
  {
    
$Warning.="      La contrainte sur les caractères spéciaux est annulée. Incohérence avec les options de génération.<br />\n";
    
$haveSpecial=0;
  }
}
else
  
$haveSpecial=0;

if (isset (
$_POST['haveChar']))
{
  if (isset (
$_POST['majuscule']) || isset($_POST['minuscule'])) $haveChar=1;
  else
  {
    
$Warning.="      La contrainte sur les Lettres est annulée. Incohérence avec les options de génération.<br />\n";
    
$haveChar=0;
  }
}
else
  
$haveChar=0;

//Mes fonctions
function Generate (&$symbole$cptsymbole$taille)
{
$passwd="";

for (
$i=0;$i++<$taille;)
  
$passwd.=$symbole[rand (0$cptsymbole-1)];

return 
$passwd;
}

function 
HaveNumber ($passwd)
{
  if (
ereg ("[0-9]"$passwd)) return true;
  
/*else*/ return false;
}

function 
HaveMinuscule ($passwd)
{
  if (
ereg ("[a-z]"$passwd)) return true;
  
/*else*/ return false;
}

function 
HaveMajuscule ($passwd)
{
  if (
ereg ("[A-Z]"$passwd)) return true;
  
/*else*/ return false;
}

function 
HaveSpecial ($passwd)
{
  if (
ereg ("[^0-9a-zA-Z]"$passwd)) return true;
  
/*else*/ return false;
}

function 
HaveChar ($passwd)
{
  if (
ereg ("[a-zA-Z]"$passwd)) return true;
  
/*else*/ return false;
}

?>
      <form action="./Generateur-mot-de-passe.html" method="post">
    <div>
          <input type="hidden" name="generate" value="" />
      <table border="0">
      <tr>
        <td><input type="checkbox" name="number" <?php if ($number) echo "checked=\"checked\""?> />Chiffre<br /></td>
        <td><input type="checkbox" name="minuscule" <?php if ($minuscule) echo "checked=\"checked\""?> />Minuscules<br /></td>
        <td><input type="checkbox" name="majuscule" <?php if ($majuscule) echo "checked=\"checked\""?> />Majuscule<br /></td>
            <td><input type="checkbox" name="et" <?php if ($et) echo "checked=\"checked\""?> />&amp;<br /></td>
            <td><input type="checkbox" name="tilde" <?php if ($tilde) echo "checked=\"checked\""?> />~<br /></td>
            <td><input type="checkbox" name="espace" <?php if ($espace) echo "checked=\"checked\""?> />"espace"<br /></td>
      </tr><tr>
            <td><input type="checkbox" name="dblequote" <?php if ($dblequote) echo "checked=\"checked\""?> />"<br /></td>
            <td><input type="checkbox" name="quote" <?php if ($quote) echo "checked=\"checked\""?> />'<br /></td>
            <td><input type="checkbox" name="acoouv" <?php if ($acoouv) echo "checked=\"checked\""?> />{<br /></td>
            <td><input type="checkbox" name="acofer" <?php if ($acofer) echo "checked=\"checked\""?> />}<br /></td>
            <td><input type="checkbox" name="diese" <?php if ($diese) echo "checked=\"checked\""?> />#<br /></td>
            <td><input type="checkbox" name="carre" <?php if ($carre) echo "checked=\"checked\""?> />²<br /></td>
      </tr><tr>
            <td><input type="checkbox" name="ouvpar" <?php if ($ouvpar) echo "checked=\"checked\""?> />(<br /></td>
            <td><input type="checkbox" name="ferpar" <?php if ($ferpar) echo "checked=\"checked\""?> />)<br /></td>
            <td><input type="checkbox" name="ouvcro" <?php if ($ouvcro) echo "checked=\"checked\""?> />[<br /></td>
            <td><input type="checkbox" name="fercro" <?php if ($fercro) echo "checked=\"checked\""?> />]<br /></td>
            <td><input type="checkbox" name="moins" <?php if ($moins) echo "checked=\"checked\""?> />-<br /></td>
            <td><input type="checkbox" name="plus" <?php if ($plus) echo "checked=\"checked\""?> />+<br /></td>
      </tr><tr>
            <td><input type="checkbox" name="egual" <?php if ($egual) echo "checked=\"checked\""?> />=<br /></td>
            <td><input type="checkbox" name="pipe" <?php if ($pipe) echo "checked=\"checked\""?> />|<br /></td>
            <td><input type="checkbox" name="backquote" <?php if ($backquote) echo "checked=\"checked\""?> />`<br /></td>
            <td><input type="checkbox" name="und" <?php if ($und) echo "checked=\"checked\""?> />_<br /></td>
            <td><input type="checkbox" name="backslash" <?php if ($backslash) echo "checked=\"checked\""?> />\<br /></td>
            <td><input type="checkbox" name="circo" <?php if ($circo) echo "checked=\"checked\""?> />^<br /></td>
      </tr><tr>
            <td><input type="checkbox" name="arobase" <?php if ($arobase) echo "checked=\"checked\""?> />@<br /></td>
            <td><input type="checkbox" name="dollar" <?php if ($dollar) echo "checked=\"checked\""?> />$<br /></td>
            <td><input type="checkbox" name="livre" <?php if ($livre) echo "checked=\"checked\""?> />£<br /></td>
            <td><input type="checkbox" name="pourcent" <?php if ($pourcent) echo "checked=\"checked\""?> />%<br /></td>
            <td><input type="checkbox" name="etoile" <?php if ($etoile) echo "checked=\"checked\""?> />*<br /></td>
            <td><input type="checkbox" name="slash" <?php if ($slash) echo "checked=\"checked\""?> />/<br /></td>
      </tr>
      </table>
      <input type="text" name="taille" size="2" value="<?php echo $taille;?>" /><br />
      <br /><br />
      Options de controle :<br />
      <input type="checkbox" name="haveNumber" <?php if ($haveNumber) echo "checked=\"checked\""?> />Le mot de passe contiens un chiffre<br />
      <input type="checkbox" name="haveChar" <?php if ($haveChar) echo "checked=\"checked\""?> />Le mot de passe contiens une lettre<br />
      <input type="checkbox" name="haveMinuscule" <?php if ($haveMinuscule) echo "checked=\"checked\""?> />Le mot de passe contiens une minuscule<br />
      <input type="checkbox" name="haveMajuscule" <?php if ($haveMajuscule) echo "checked=\"checked\""?> />Le mot de passe contiens une majuscule<br />
      <input type="checkbox" name="haveSpecial" <?php if ($haveSpecial) echo "checked=\"checked\""?> />Le mot de passe contiens uncaractere special<br />
      <input type="submit" value="generer" />
    </div>
      </form>
      <h3>Mot de passe</h3>
<?php
if ($DEBUG)
{
//echo $cptsymbole."\n<br />\n";
//for ($i=0; $i<$cptsymbole;$i++)
//  echo $symbole[$i];
//echo "<br /><br />";
//
//if (is_int (intval($_POST['taille']))) echo intval($_POST['taille']);
if (HaveSpecial ('"')) echo "|c'est bon<br />";else echo "c'est pas bon<br />";
echo 
"<br /><br /><br />";
}
echo 
$Warning;
?>
      Votre mot de passe est : (cliquez sur générer pour en générer un nouveau)<br />
<?php
if ($cptsymbole == 0)
{
  
$passwd="0000";
  echo 
"      Ceci est un mot de passe NUL, car vous n'avez pas coché de caractères utilisables<br />\n";
}
else
  
$passwd=Generate ($symbole$cptsymbole$taille);
for (
$OK=0;!$OK;Generate ($symbole$cptsymbole$taille))
{
  
$OK=1;
  if (
$haveNumber$OK $OK && HaveNumber ($passwd);
  if (
$haveMinuscule$OK $OK && HaveMinuscule ($passwd);
  if (
$haveMajuscule$OK $OK && HaveMajuscule ($passwd);
  if (
$haveSpecial$OK $OK && HaveSpecial ($passwd);
  if (
$haveChar$OK $OK && HaveChar ($passwd);
}
?>
      <input type="text" name="result" size="<?=($taille+5)?>" value="<?php echo htmlspecialchars($passwd);?>" />