clear('SESSION.form_visible'); } public function show($f3, $args) { if (!$f3->exists('SESSION.user')) { $f3->reroute('/login'); } $this->get_infos($f3, $args); $this->get_contreparties($f3); $this->get_dons($f3); $this->get_recurrents($f3); if ($f3->exists('GET.validate')) { $f3->set('modal_counterparts', '1'); $f3->clear('GET.validate'); } else { $f3->set('modal_counterparts', '0'); }; $f3->set('block_content', 'user/perso.html'); } public function get_infos($f3, $args) { // Chargement des informations de l'utilisateur $db = $f3->get('DB'); $user = $f3->get('container')['user_finder']->findById($f3->get('SESSION.id')); $f3->set('infos', $user); $result = $db->query("SELECT id, pdf, decimale FROM dons WHERE user_id='".$user['id']."' and pdf!='' "); $pdfs = array(); foreach ($result->fetchAll(\PDO::FETCH_ASSOC) as $row) { $pdfs[$row['pdf']] = $row; } $addresse = $f3->get('container')['address_finder']->findByUserId((int) $user['id']); $f3->set('adresse', $addresse); $f3->set('pdfs', $pdfs); } public function get_contreparties($f3) { // Chargement des contreparties de l'utilisateur $contreparties = $f3->get('container')['counterpart_finder']->findByUserId((int) $f3->get('SESSION.id')); $f3->set('contreparties', $contreparties); } public function get_dons($f3) { // Chargement des dons de l'utilisateur $db = $f3->get('DB'); $dons = $f3->get('container')['donation_finder']->findByUserId((int) $f3->get('SESSION.id')); $dons = array_filter($dons, function ($id) { return in_array((int) $id, [1, 4, 102]); }); $f3->set('dons', $dons); } public function get_recurrents($f3) { // Chargement des abonnements de l'utilisateur $db = $f3->get('DB'); $result = $db->query("SELECT datec, somme, status, id, pdf, identifier FROM dons WHERE user_id='".$f3->get('infos.id')."' AND status IN (101) ORDER BY datec ASC"); $data = array(); foreach ($result->fetchAll(\PDO::FETCH_ASSOC) as $row) { $data[] = $row; } $f3->set('dons_recurrents', $data); } public function login($f3, $args) { $f3->set('form_visible', 'login'); if ($f3->get('action')=='renew_password') { // Renouvellement de mot de passe $f3->clear('form_visible'); $this->renew_password($f3); $f3->reroute('/'); } elseif ($f3->get('action')=='create_account') { // Création d'un compte utilisateur $f3->clear('form_visible'); $this->create_user($f3); } elseif ($f3->get('email')) { // Tentative de connexion // We should use auth module from Fat Free $db = $f3->get('DB'); $mapper = new \DB\SQL\Mapper($f3->get('DB'), 'users'); $auth = new \Auth($mapper, array('id' => 'email', 'pw' => 'hash')); $email = \Utils::asl($f3->get('email')); $hash = hash('sha256', $f3->get('password')); $login = $auth->login($email, $hash); // As we're login with email, not for id, we need to get it if ($login) { // We want to retrieve the associated user $result = $db->query("SELECT id, email FROM users WHERE email='".$email."'"); $id = $result->fetch(\PDO::FETCH_ASSOC)['id']; $email = $result->fetch(\PDO::FETCH_ASSOC)['email']; $f3->set('SESSION.id', $id); $f3->set('SESSION.email', $email); $f3->set('SESSION.user', true); $f3->clear('form_visible'); $f3->set('block_content', 'user/perso.html'); } else { $f3->set('SESSION.error', _("Mauvais identifiant ou mot de passe.")); Campaign::show($f3, $args); return; } } else { $f3->set('SESSION.error', _("Merci de renseigner une adresse mail.")); Campaign::show($f3, $args); return; } Campaign::show($f3, $args); } public function logout($f3, $args) { $f3->clear('SESSION'); $f3->reroute('/'); } public function renew_password($f3) { if ($f3->get('email')!='') { // On vérifie que l'adresse mail existe $db = $f3->get('DB'); $result = $db->query("SELECT email FROM users WHERE email='".\Utils::asl($f3->get('email'))."';"); $row = $result->fetch(\PDO::FETCH_ASSOC); if ($row['email']!='') { // On régénère un mot de passe $pass = \Utils::generate_password(); // On ne conserve que le mot de passe haché $hash = hash('sha256', $pass); // On le sauve en base de données $query = "UPDATE users SET hash='".$hash."' WHERE email='".\Utils::asl($f3->get('email'))."';"; $db->query($query); // On le renvoie par email // On utilise le système SMTP de fat free $mailer = new \SMTP(SMTP_HOST, SMTP_PORT, SMTP_SECURITY, SMTP_USER, SMTP_PW); $mailer->set('From', $f3->get('mail.from')); $mailer->set('To', $f3->get('email')); $mailer->set('Subject', _("Renouvellement de mot de passe")); $mailer->set('FromName', $f3->get('mail.fromName')); $mailer->set('CharSet', "UTF-8"); // Préparation du texte du mail par morceaux $text = _("Bonjour, Un nouveau mot de passe vient de vous être attribuer pour pouvoir vous connecter à votre page d'administration pour choisir vos contreparties, et nous indiquer vos coordonnées : %%URL_ADMIN%% Identifiant : votre adresse email Mot de passe : %%PASSWORD%% Encore merci pour votre soutien, Toute l'équipe de La Quadrature du Net ")."\n\n"; // Création de l'url d'administration $admin_url = "https://support.laquadrature.net/perso"; foreach ($f3->get('languages') as $key => $language) { if ($f3->get('lang')==$language[1]) { $admin_url = "https://".$language[0].$f3->get('dev').".laquadrature.net/perso"; } } // Remplacement des variables par leurs valeurs $fields = array( "PASSWORD" => $pass, "URL_ADMIN" => $admin_url ); foreach ($fields as $k=>$v) { $text = str_replace("%%".$k."%%", $v, $text); } if ($mailer->send($text)) { $f3->set('SESSION.message', _("Nouveau mot de passe envoyé par mail.")); } else { $logger = new \Log('mail.log'); $f3->set('SESSION.error', _('Oops')); $logger->write($mailer->log()); } } else { $f3->set('SESSION.error', _("Vous n'avez pas encore de compte, merci de faire un don pour cela.")); } } else { $f3->set('SESSION.error', _("Merci de renseigner une adresse mail.")); } } public function create_user($f3) { if ($f3->get('email')!='') { // On vérifie que l'adresse mail n'existe pas $db = $f3->get('DB'); $user = $f3->get('container')['user_finder']->findByEmail($f3->get('email')); $total = 0; $cumul = 0; if ($user['email']!=$f3->get('email')) { $hash = hash('sha256', $f3->get('password')); // On recherche le montant cumulé jusqu'à présent. On fait la somme depuis le // premier janvier 2013 en se basant sur l'adresse mail $res = $db->query("SELECT sum(dons.somme) as somme FROM dons INNER JOIN users WHERE dons.user_id = users.id AND users.email='".$f3->get('email')."' and dons.status in (1, 4, 102) and dons.datec>'2013-01-01';"); $total = $res->fetch(\PDO::FETCH_ASSOC); $total = (int) $total['somme']; // Création de l'utilisateur $f3->clear('SESSION.error'); $f3->set('SESSION.msg', _("Votre compte a bien été créé, merci.")); $f3->get('container')['command_handler']->handle(new UserCreateCommand($f3->get('email'), $hash, '', $total, $total)); $f3->reroute('/perso'); } else { $f3->set('SESSION.error', _("Vous avez déjà un compte associé à cette adresse mail, merci de demander un nouveau mot de passe.")); } } else { $f3->set('SESSION.error', _("Merci de renseigner une adresse mail.")); } } public function infos($f3, $args) { $db = $f3->get('DB'); if ($f3->exists('SESSION.id')) { // Let's firts check that both the password match if ($f3->get('password') != $f3->get('password_confirmation')) { $f3->set('SESSION.error', _("Les mots de passe ne correspondent pas")); } else { $sql = "UPDATE users SET email='".\Utils::asl($f3->get('email'))."', pseudo='".\Utils::asl($f3->get('pseudo'))."'"; if ($f3->get('password') != '') { $hash = hash('sha256', $f3->get('password')); $sql .= ", hash='".$hash."'"; } $sql .= " WHERE id='".$f3->get('SESSION.id')."'"; $db->query($sql); } } else { $f3->error(401); } $f3->set('SESSION.msg', _('Informations personnelles modifiées.')); $this->show($f3, $args); } public function adresses($f3, $args) { if (!$f3->exists('SESSION.id')) { $f3->error('401'); } switch ($f3->get('action')) { case 'ADD': try { $f3->get('container')['command_handler']->handle( new AddressCreateCommand( \Utils::asl($f3->get('SESSION.id')), \Utils::asl($f3->get('nom')), \Utils::asl($f3->get('adresse')), \Utils::asl($f3->get('adresse2')), \Utils::asl($f3->get('codepostal')), \Utils::asl($f3->get('ville')), \Utils::asl($f3->get('pays')), \Utils::asl($f3->get('state')) ) ); } catch (AddressAlreadyExistsException $e) { $f3->set("error", _("Cette adresse existe déjà.")); $f3->error('403'); } $f3->set('SESSION.message', _("Adresse ajoutée à votre profil")); break; case 'DELETE': try { $f3->get('container')['command_handler']->handle( new AddressDeleteCommand( \Utils::asl($f3->get('id')), \Utils::asl($f3->get('SESSION.id')) ) ); } catch (AddressUsedException $e) { $f3->set("error", _("Cette adresse est utilisée pour une de vos contreparties")); $f3->error('403'); }; $f3->set('SESSION.message', _("Adresse supprimée de votre profil")); break; } $f3->reroute('/perso'); } public function add_contrepartie($f3, $args) { if (!$f3->exists('SESSION.user')) { $f3->error('401'); } $user = $f3->get('container')['user_finder']->findById($f3->get('SESSION.id')); // Récupération des valeurs du formulaire $adresse_id = $f3->get('adresse_id'); $quoi = $f3->get('quoi'); $commentaire = $f3->get('commentaire'); $valeur = 0; $piplome_id = intval(substr($f3->get('piplome_id'), 0, strpos($f3->get('piplome_id'), '_'))); $taille = intval($f3->get('taille')); $taille_h = intval($f3->get('taille_h')); switch ($quoi) { case 'piplome': $valeur = 30; break; case 'pibag': $valeur = 50; break; case 'pishirt': $valeur = 100; break; case 'hoopie': $valeur = 250; break; } // Ajout d'une demande de contrepartie pour chaque contrepartie if ((int) $user['cumul'] >= $valeur) { switch ($quoi) { case 'piplome': $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'piplome', \Utils::asl($piplome_id), 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire))); break; case 'pibag': $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'pibag', '', 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire))); break; case 'pishirt': $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'pishirt', \Utils::asl($taille), 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire))); break; case 'hoopie': $f3->get('container')['command_handler']->handle(new CounterpartCreateCommand(\Utils::asl($adresse_id), $f3->get('SESSION.id'), 'hoopie', \Utils::asl($taille_h), 1, date("Y-m-d H:i:s"), \Utils::asl($commentaire))); break; } // Puis diminution du cumul de la valeur des contreparties $f3->get('container')['command_handler']->handle(new UserUpdateCumulCommand($user['id'], $user['cumul'] - $valeur)); $f3->set('SESSION.message', _("Merci, vos contreparties seront envoyées dès que possible !".$valeur)); } else { $f3->set('SESSION.error', _("Désolé, mais vous n'avez pas cumulé suffisament de dons pour avoir un ").$quoi); $f3->clear('SESSION.message'); } $f3->reroute('/perso'); } public function receipt($f3, $params) { if (!$f3->exists('SESSION.user')) { $f3->reroute('/login'); } // Variables utiles $logger = new \Log('receipt.log'); $db = $f3->get('DB'); $id = $params['id']; $command = "pdftk "; $args = " ../www/receipt.pdf fill_form ../tmp/".$id.".xfdf output ../tmp/".$id.".pdf flatten dont_ask"; $logger->write($command . " " .$args); // Vérification que le don appartient bien à l'utilisateur connecté $query="SELECT dons.datec, dons.somme, adresses.nom as pseudo, adresses.adresse, adresses.adresse2, adresses.codepostal, adresses.ville, adresses.pays FROM dons INNER JOIN users ON users.id = dons.user_id LEFT OUTER JOIN adresses ON adresses.user_id = users.id WHERE users.id=".$f3->get('SESSION.id')." AND dons.id=".\Utils::asl($id).";"; $result = $db->query($query); $logger->write($query); $don = $result->fetch(\PDO::FETCH_ASSOC); if (!$don) { $f3->reroute("/perso"); } // Création du fichier datas $name = $don['pseudo']; $address = $name; if ($don['adresse']!='') { $address .= "\n" . $don['adresse']; $address .= "\n" . $don['adresse2']; $address .= "\n" . $don['codepostal'] . " " . $don['ville']; } $amount = $don['somme']; $monthes = array( '01'=>_('Janvier'), '02'=>_('Février'), '03'=>_('Mars'), '04'=>_('Avril'), '05'=>_('Mai'), '06'=>_('Juin'), '07'=>_('Juillet'), '08'=>_('Août'), '09'=>_('Septembre'), '10'=>_('Octobre'), '11'=>_('Novembre'), '12'=>_('Décembre') ); $date = substr($don['datec'], 8, 2)." ".$monthes[substr($don['datec'], 5, 2)]." ".substr($don['datec'], 0, 4); $content = ' '.$address.' '.$name.' Reçu le '.$date.' un don de '.$amount.' euros de la part de '.$name.'. Fait à Paris le '.$date.' '; $fp = fopen("../tmp/".$id.".xfdf", "w"); if ($fp) { fputs($fp, $content); fclose($fp); } // Création du reçu $output = array(); exec($command.$args, $output); // Suppression du fichier datas unlink("../tmp/".$id.".xfdf"); // Renvoi du fichier pdf au client $fp = fopen("../tmp/".$id.".pdf", "rb"); if ($fp) { $fsize = filesize("../tmp/".$id.".pdf"); header("Content-Type: application/pdf"); header("Content-Disposition: attachment; filename=\"".$id.".pdf\""); header("Content-Length: $fsize"); while (!feof($fp)) { $buffer = fread($fp, 2048); echo $buffer; } fclose($fp); } else { $f3->reroute('/perso'); } // Suppression du fichier reçu unlink("../tmp/".$id.".pdf"); die(); } public function cancel($f3, $params) { $db = $f3->get('DB'); $result = $db->query("SELECT identifier, user_id from identifiers where identifier like '".$params['id']."'"); $result = $result->fetch(\PDO::FETCH_ASSOC); if ($result) { $identifier = $result['identifier']; $user_id = $result['user_id']; } else { $f3->reroute('/perso'); } // Commande customerCancel $date = new \DateTime('now', new \DateTimeZone("UTC")); $parameters = array( "shopId" => SITE_ID, "cardIdent" => $identifier, "date" => $date->format("Ymd"), "ctxMode" => CTX_MODE, ); // Calcul de la signature $signature = ""; foreach ($params as $key=>$value) { $signature .= $value."+"; } $signature .= CERTIFICATE; $signature = base64_encode(hash_hmac('sha256', $signature, CERTIFICATE, true)); #$signature = sha1($signature); $parameters["wsSignature"] = $signature; $client = new \SoapClient("https://paiement.systempay.fr/vads-ws/ident-v2.1?wsdl"); $result = $client->customerCancel($parameters); // Let's add a 103 don at 0€ to keep track of them $f3->query("INSERT INTO dons SET status = '103', datec = NOW(), somme = 0, user_id = '".$user_id."', identifier = '".$identifier."', cumul = 0;"); $f3->set('SESSION.message', _("Don récurrent supprimé.")); $f3->reroute('/perso'); } public function renew($f3, $params) { // TODO: à écrire, finaliser, tester, mettre en prod :o) /* // Variables utiles $id = $params['id']; // Cas S2 de mise à jour des infos de la CB $target = "https://paiement.systempay.fr/vads-payment/"; $transaction_date = new \DateTime('now', new \DateTimeZone("UTC")); $params = array( // Champs obligatoires "vads_trans_date" => $transaction_date->format("YmdHis"), "vads_site_id" => SITE_ID, "vads_action_mode" => "INTERACTIVE", "vads_ctx_mode" => CTX_MODE, // Autres codes possibles (page 16) "vads_trans_id" => str_repeat("0",6-strlen($id)).$id, "vads_version" => "V2", // Champs facultatifs "vads_language" => $f3->get('lang'), "vads_order_id" => $id, "vads_url_cancel" => ROOTURL, "vads_url_check" => "", "vads_url_error" => ROOTURL, "vads_url_referral" => ROOTURL, "vads_url_refused" => ROOTURL, "vads_url_return" => ROOTURL, "vads_url_success" => ROOTURL, "vads_validation_mode" => "0", "vads_shop_name" => "La Quadrature du Net", "vads_shop_url" => ROOTURL ); if ($f3->get('monthly')) { // En cas de paiement récurrent, on doit créer un compte carte si ce n'est pas déjà fait $result = mysql_fetch_array(mysql_query("SELECT identifier from users where email='".$email."'")); $identifier = ""; if ($result) { $identifier = $result['identifier']; } if ($identifier=="") { // Si l'utilisateur n'existe pas déjà, on lui crée un identifiant $identifier = $id . "_" . substr($email,0,strpos($email,'@')); $params["vads_identifier"] = substr($identifier, 0, 50); // Pas plus de 50 caractères $params["vads_page_action"] = "REGISTER_SUBSCRIBE"; $params["vads_cust_email"] = $email; // Email du porteur } else { // Sinon, on instaure juste une récurrence en utilisant l'identifiant déjà connu $params["vads_page_action"] = "SUBSCRIBE"; $params["vads_identifier"] = $identifier; } $params["vads_sub_effect_date"] = date("Ymd"); // Date d'effet à ce jour $params["vads_sub_amount"] = $f3->get('sum')*100; $params["vads_sub_currency"] = "978"; $params["vads_sub_desc"] = "RRULE:FREQ=MONTHLY;BYMONTHDAY=7"; // Tous les 7 du mois } else { // En cas de paiement ponctuel, le montant est donné différemment $params["vads_page_action"] = "PAYMENT"; $params["vads_amount"] = $f3->get('sum')*100; $params["vads_currency"] = "978"; $params["vads_payment_config"] = "SINGLE"; } // Calcul de la signature ksort($params); $signature = ""; foreach ($params as $key=>$value) { $signature .= $value."+"; } $signature .= CERTIFICATE; $signature = sha1($signature); $f3->set('target', $target); $f3->set('params', $params); $f3->set('signature', $signature); */ } };