<!DOCTYPE html>
    <html lang="fr">
    <head>
  		<meta charset=UTF-8>
  		<title>Inscription au service VaultWarden - AutoMario</title>
  		<meta name="description" content="Projet d'hébergement participatif et décentralisé, fournissant un ensemble de services pour particuliers et associations et basé sur des technologies et logiciels libres."/>
  		<meta name="keywords" content="CHATONS,mail,cloud,bitwarden,hébergement,libre"/>
  		<meta name="author" content="Vincent Finance"/>
  		<meta name="viewport" content="initial-scale=1.0"/>
  		<link rel="stylesheet" href="/css/site.css" type="text/css">
      <link rel="stylesheet" href="/css/inscription.css" type="text/css">
  		<link rel="icon" type="image/x-icon" href="/pictures/favicon.ico"/>
  		<meta name="generator" content="Nanoc 4.11.8">
  	</head>
    <body>
      <header>
        <picture>
          <img alt="Logo officiel du projet - Tête de pengouin en pixelart" src="/pictures/logo.png"/>
        </picture>
      </header>
<?php
    # *** LICENSE ***
    # You can redistribute it under the terms of the MIT Licence.
    # *** LICENSE ***
    # File to subscribe to an account

    /*

     !!! Le dossier /data doit être interdit dans la config du serveur !!!

     Si aucun argument :
     - Afficher un formulaire de contact qui propose le nom d'utilisateur, donne une adresse mail de contact en cas de problème
     - adresse mail souhaitée
     - mot de passe souhaité pour récupérer les identifiants
     - captcha

     - Le formulaire est envoyé au sysadmin avec une url aléatoire
     - Le script renvoie vers une page indiquant l'URL à suivre pour obtenir les informations sur le nouveau compte.

     Si argument :
     - Vérifier si le fichier en argument existe dans /data
     - Si oui, on affiche son contenu qui contient les identifiants avec un beau template, puis SUPPRIMER le fichier contenant les identifiants
     - Si non, indiquer que la création du compte n'est pas encore prête ou périmée.
     */

    session_start();

    $GLOBALS['mail_admin'] = 'linuxmario@automario.eu';
    $GLOBALS['subscribe_dir'] = '/bitwarden/';
    $GLOBALS['subscribe_page'] = $GLOBALS['subscribe_dir'] . 'form.php';
    $GLOBALS['nbname'] = array(
                               // Chiffres 0 à 16 pour captcha
                               '0' => 'zéro',
                               '1' => 'un',
                               '2' => 'deux',
                               '3' => 'trois',
                               '4' => 'quatre',
                               '5' => 'cinq',
                               '6' => 'six',
                               '7' => 'sept',
                               '8' => 'huit',
                               '9' => 'neuf',
                               '10' => 'dix',
                               '11' => 'onze',
                               '12' => 'douze',
                               '13' => 'treize',
                               '14' => 'quatorze',
                               '15' => 'quinze',
                               '16' => 'seize',
                               );
    ?>

<?php

    function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
    # https://stackoverflow.com/questions/4356289/php-random-string-generator/31107425#31107425
    {
        $keyspace = str_shuffle($keyspace );
        $str = '';
        $max = mb_strlen($keyspace, '8bit') - 1;
        for ($i = 0; $i < $length; ++$i) {
            $str .= $keyspace[random_int(0, $max)];
        }
        return $str;
    }

    function captcha()
    /* Invent captcha
     return calculus string
     store expected result in _SESSION */
    {
        $v1 = rand(0,16);
        $v2 = rand(0,100);
        $_SESSION['captcha'] = $v1 + $v2;

        $str = $GLOBALS['nbname'][strval($v1)] . " + " . $v2 . " = ";

        return $str;
    }

    function show_form()
    {
        echo '<main>';
        echo '<div class="formel">';
        echo '<h1 id="inscription">Demander à créer votre compte VaultWarden</h1>';
        echo '<form id="contact" class="formstyle" method="post" action="'.$GLOBALS['subscribe_page'].'">';
        echo '<ul>';
        echo '<li>';
        echo '<label for="user">Prénom et nom </label>';
        echo '<input type="text" required id="user" name="user" placeholder="Vladimir Komarov"/>';
        echo '</li>';
        echo '<li>';
        echo '<label for="rescuemail">Adresse e-mail valide </label>';
        echo "<label>Attention, veuillez ne pas utiliser d'adresse mail temporaire et bien vérifier vos spams !</label>";
        echo '<input type="text" required id="rescuemail" name="rescuemail" placeholder="vladimir@mail.valide"/>';
        echo '</li>';
        echo '<li>';
        echo '<label for="captcha">Un petit calcul ? </label>';
        echo captcha() ;
        echo '<input type="number" required id="captcha" name="captcha" min="0" step="1" />';
        echo '</li>';
        echo '<input id="subscribe" type="submit" name="subscribe" value="Envoyer" />';
        echo '</ul>';
        echo '</form>';
        echo '</div>';
        echo '</main>';
    }

    /* Inscription demandée, on affiche la réponse */
    if (!empty($_POST["subscribe"])) {
        if ( $_SESSION['captcha'] != $_POST['captcha'] ) {
            echo "Petite erreur de calcul ?";
        }
        else
        {
            $user = '';
            $rescuemail = '';
            $admin_email = $GLOBALS['mail_admin'];

            // formulaire envoyé, on récupère tous les champs.
            if (!empty($_POST["user"])) {
                $user = trim($_POST["user"]);
                $rescuemail = trim($_POST["rescuemail"]);
            }


            if ($user != '') {

                $random_file = random_str(rand(10,75));
                $random_page = $GLOBALS['subscribe_page'] . "?patate=" . $random_file;

                $headers  = 'MIME-Version: 1.0' . "\r\n";
                $headers .= 'From: <linuxmario@automario.eu>' . "\r\n" .
                'Reply-To: <linuxmario@automario.eu>' . "\r\n" .
                'Content-Type: text/plain; charset="utf-8"; DelSp="Yes"; format=flowed '."\r\n" .
                'Content-Disposition: inline'. "\r\n" .
                'Content-Transfer-Encoding: 7bit'." \r\n" .
                'X-Mailer:PHP/'.phpversion();

                $message = "Vous venez de recevoir une nouvelle demande d'inscription pour le service VaultWarden\r\n";
                $message .= "\r\n";
                $message .= "- Prénom et nom de l'utilisateur : ".$user . "\r\n";
                $message .= "- Adresse e-mail pour invitation : ".$rescuemail . "\r\n";
                $message .= "\r\n";
                $message .= "- Identifiant à enregistrer dans l'interface de VaultWarden pour envoyer une invitation\r\n";
                $message .= "\r\n";
                $message .= "Marche à suivre :\r\n";
                $message .= "\r\n";
                $message .= "- Ajouter l'utilisateur via l'interface d'administration de VaultWarden\r\n";
                $message .= "- Un e-mail sera envoyé automatiquement à l'utilisateur\r\n";


                // Envoi du mail
                if (mail($admin_email, 'Demande de nouvelle inscription VaultWarden', $message, $headers)) {
                    echo '<main>';
                    echo '<div class="formel">';
                    echo "<h2>Demande effectuée avec succès</h2>";
                    echo "<p>Votre demande est bien envoyée, l'admin va s'en occuper.</p>";
                    echo "<p>Après réception, l'administrateur va vous envoyer une invitation par mail pour créer vos identifiants sur l'instance et vous permettre de vous connecter. Attention, chaque lien d'invitation est unique et se périme automatiquement.<br/>Nous vous invitons à consulter votre dossier Courrier indésirable en cas de non réception ou bien à contacter l'administrateur au besoin.</p>";
                    echo "<p>Vous pourrez vous enregistrer directement via le lien envoyé.";
                    echo '</div>';
                    echo '</main>';
                } else {
                    echo '<main>';
                    echo '<div class="formel">';
                    echo "<h2>Echec du traitement de votre demande</h2>";
                    echo "<p>Une erreur est survenue lors de l'envoi du message. Nous n'avons pas pu traiter votre demande d'inscription.</p>";
                    echo "<p>Nous vous invitons à réessayer plus tard ou à contacter l'administrateur par mail ou IRC si vous n'arrivez toujours pas à nous l'envoyer.</p>";
                    echo "<p>Nous nous excusons pour la gêne occasionnée.</p>";
                    echo '</div>';
                    echo '</main>';
                };
            }
        }
    }
    else {
        show_form();
    }
    ?>
        <footer>
			<p>Généré via <a title="Générateur de sites en Ruby" target="_blank" rel="noopener noreferrer" href="http://nanoc.ws/about/">Nanoc</a> / Propulsé par <a href="https://debian.org/" rel="noopener noreferrer" target="_blank" title="Lien vers le site officiel de Debian">Debian</a> / Licence <a title="Lien vers la licence du projet" rel="noopener noreferrer" target="_blank" href="/licence.txt">MIT</a> / <a target="_blank" rel="noopener noreferrer" href="https://liberapay.com/linuxmario/donate">Soutenir le projet</a> / Photo by <a rel="noopener noreferrer" target="_blank" href="https://unsplash.com/@nate_dumlao?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Nathan Dumlao</a> on Unsplash</p>
		</footer>
    </body>
</html>
