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); $f3->set('block_content', 'user/perso.html'); } public function get_infos($f3, $args) { // Chargement des informations de l'utilisateur $db = $f3->get('DB'); // Let's update the total first $total = 0; $total_res = $db->query("SELECT SUM(somme) as total FROM dons WHERE status in (1, 4, 101, 102) AND user_id='".$f3->get('SESSION.id')."'"); $total_res = $total_res->fetch(\PDO::FETCH_ASSOC); $total = $total_res['total']; // While we're at it, let's remove the price of each asked contreparties // printed piplome is 30, pibag is 50, pishirt is 100 and hoodie is 250 // We first need to have the number of each counterpart claimed by the // user $cumul_counterpart = $db->query("SELECT sum(if(quoi='piplome', 1, 0)) as piplomes, sum(if(quoi='pibag', 1, 0)) as pibags, sum(if(quoi='pishirt', 1, 0)) as pishirts, sum(if(quoi='hoodie', 1, 0)) as hoodies FROM contreparties WHERE user_id = '".$f3->get('SESSION.id')."';"); $cumul_counterpart = $cumul_counterpart->fetch(\PDO::FETCH_ASSOC); foreach (['hoodies', 'pishirts', 'pibags', 'piplomes'] as $key) { if (!array_key_exists($key, $cumul_counterpart)) { $cumul_counterpart[$key] = 0; } } $cumul = $cumul_counterpart['hoodies'] * 250 + max(($cumul_counterpart['pishirts'] - $cumul_counterpart['hoodies']), 0) * 100 + max(($cumul_counterpart['pibags'] - $cumul_counterpart['pishirts'] - $cumul_counterpart['hoodies']), 0) * 50 + max(($cumul_counterpart['piplomes'] - $cumul_counterpart['pibags'] - $cumul_counterpart['pishirts'] - $cumul_counterpart['hoodies']), 0) * 30; $cumul = $total - $cumul; $db->query("UPDATE users SET total = '".$total."', cumul = '".$cumul."' WHERE id = '".$f3->get('SESSION.id')."'"); $result = $db->query("SELECT id, pseudo, email, total, cumul FROM users WHERE id='".$f3->get('SESSION.id')."' "); $data = $result->fetch(\PDO::FETCH_ASSOC); $f3->set('infos', $data); $result = $db->query("SELECT id, pdf, decimale FROM dons WHERE user_id='".$data['id']."' and pdf!='' "); $pdfs = array(); foreach ($result->fetchAll(\PDO::FETCH_ASSOC) as $row) { $pdfs[$row['pdf']] = $row; } $addresses = $f3->get('container')['address_finder']->findByUserId((int) $data['id']); $f3->set('adresses', $addresses); $f3->set('pdfs', $pdfs); } public function get_contreparties($f3) { // Chargement des contreparties de l'utilisateur $db = $f3->get('DB'); $result =$db->query("SELECT datec, status, quoi, taille, adresse_id FROM contreparties WHERE user_id='".$f3->get('SESSION.id')."' ORDER BY datec DESC"); $data = array(); foreach ($result->fetchAll(\PDO::FETCH_ASSOC) as $row) { $data[] = $row; } $f3->set('contreparties', $data); } public function get_dons($f3) { // Chargement des dons de l'utilisateur $db = $f3->get('DB'); $result = $db->query("SELECT datec, somme, id, pdf, status FROM dons WHERE user_id='".$f3->get('infos.id')."' AND status IN (1,4,102) ORDER BY datec ASC"); $data = array(); foreach ($result->fetchAll(\PDO::FETCH_ASSOC) as $row) { $data[] = $row; } $f3->set('dons', $data); } 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->clear('SESSION.error'); $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'); $query = $db->query("SELECT email FROM users WHERE email='".$f3->get('email')."';"); $result = $query->fetch(\PDO::FETCH_ASSOC); $cumul = 0; if ($result['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 = $total['somme']; // Création de l'utilisateur $query = "INSERT INTO users (email, hash, total, cumul) VALUES ('".$f3->get('email')."', '".$hash."', '".$total."', 0);"; $res = $db->exec($query); $f3->set('SESSION.error', $query); } 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', 'Passwords mismatch'); } 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'); } // Let's get the email adress of the user 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('alias')), \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')), $f3->exists('defaut') ) ); } catch (AddressAlreadyExistsException $e) { $f3->set("error", _("Cette adresse existe déjà.")); $f3->error('403'); } break; case 'UPDATE': $f3->get('container')['command_handler']->handle( new AddressUpdateCommand( \Utils::asl($f3->get('id')), \Utils::asl($f3->get('SESSION.id')), \Utils::asl($f3->get('alias')), \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')), $f3->exists('defaut') ) ); 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 et il vous n'avez pas définit d'adresse par défault.")); $f3->error('403'); }; break; } $f3->reroute('/perso'); } public function add_contrepartie($f3, $args) { if (!$f3->exists('SESSION.user')) { $f3->error('401'); } // Récupération du cumul actuel de l'utilisateur $db = $f3->get('DB'); $result = $db->query("SELECT cumul FROM users WHERE id='".$f3->get('SESSION.id')."' "); $me = $result->fetch(\PDO::FETCH_ASSOC); $cumul = $me['cumul']; // Récupération des valeurs du formulaire $adresse_id = $f3->get('adresse_id'); $quoi = $f3->get('quoi'); $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')); $f3->clear('SESSION.error'); 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 ($cumul >= $valeur) { switch ($quoi) { case 'piplome': $db->query("INSERT INTO contreparties (user_id,datec,quoi,taille,adresse_id,status) VALUES ('".$f3->get('SESSION.id')."',NOW(),'piplome','".\Utils::asl($piplome_id)."','".\Utils::asl($adresse_id)."',1)"); break; case 'pibag': $db->query("INSERT INTO contreparties (user_id,datec,quoi,taille,adresse_id,status) VALUES ('".$f3->get('SESSION.id')."',NOW(),'pibag','','".\Utils::asl($adresse_id)."',1)"); break; case 'pishirt': $db->query("INSERT INTO contreparties (user_id,datec,quoi,taille,adresse_id,status) VALUES ('".$f3->get('SESSION.id')."',NOW(),'pishirt','".\Utils::asl($taille)."','".\Utils::asl($adresse_id)."',1)"); break; case 'hoopie': $db->query("INSERT INTO contreparties (user_id,datec,quoi,taille,adresse_id,status) VALUES ('".$f3->get('SESSION.id')."',NOW(),'hoodie','".\Utils::asl($taille_h)."','".\Utils::asl($adresse_id)."',1)"); } } // Puis diminution du cumul de la valeur des contreparties $db->query("UPDATE users SET cumul = cumul - ".$valeur." WHERE id='".$f3->get('SESSION.id')."'"); $f3->set('msg', _("Merci, vos contreparties seront envoyées dès que possible !")); $this->show($f3, $args); } 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 = " ./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 adresses.defaut IS true 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 = 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->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); */ } };