date.chapril.org-framadate/studs.php

257 lines
11 KiB
PHP
Raw Normal View History

2011-05-15 01:32:47 +02:00
<?php
/**
* This software is governed by the CeCILL-B license. If a copy of this license
* is not distributed with this file, you can obtain one at
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt
*
* Authors of STUdS (initial project): Guilhem BORGHESI (borghesi@unistra.fr) and Raphaël DROZ
* Authors of Framadate/OpenSondage: Framasoft (https://github.com/framasoft)
*
* =============================
*
* Ce logiciel est régi par la licence CeCILL-B. Si une copie de cette licence
* ne se trouve pas avec ce fichier vous pouvez l'obtenir sur
* http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt
*
* Auteurs de STUdS (projet initial) : Guilhem BORGHESI (borghesi@unistra.fr) et Raphaël DROZ
* Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
*/
use Framadate\Editable;
2016-03-05 16:05:37 +01:00
use Framadate\Exception\AlreadyExistsException;
use Framadate\Exception\ConcurrentEditionException;
use Framadate\Exception\ConcurrentVoteException;
use Framadate\Message;
use Framadate\Security\Token;
2014-12-17 13:17:08 +01:00
use Framadate\Services\InputService;
use Framadate\Services\LogService;
use Framadate\Services\MailService;
2015-10-13 01:03:41 +02:00
use Framadate\Services\NotificationService;
use Framadate\Services\PollService;
use Framadate\Services\SecurityService;
2015-11-30 22:23:26 +01:00
use Framadate\Services\SessionService;
2014-12-17 13:47:14 +01:00
use Framadate\Utils;
include_once __DIR__ . '/app/inc/init.php';
2015-11-30 22:23:26 +01:00
/* Constantes */
/* ---------- */
const USER_REMEMBER_VOTES_KEY = 'UserVotes';
2014-12-17 13:17:08 +01:00
/* Variables */
/* --------- */
2014-12-17 13:47:14 +01:00
$poll_id = null;
$poll = null;
2014-12-17 13:17:08 +01:00
$message = null;
$editingVoteId = 0;
$accessGranted = true;
$resultPubliclyVisible = true;
$slots = [];
$votes = [];
$comments = [];
$selectedNewVotes = [];
/* Services */
/*----------*/
2015-01-06 23:52:52 +01:00
$logService = new LogService();
2014-12-25 00:55:52 +01:00
$pollService = new PollService($connect, $logService);
2014-12-17 13:17:08 +01:00
$inputService = new InputService();
$mailService = new MailService($config['use_smtp'], $config['smtp_options'], $config['use_sendmail']);
$notificationService = new NotificationService($mailService, $smarty);
$securityService = new SecurityService();
2015-11-30 22:23:26 +01:00
$sessionService = new SessionService();
/* PAGE */
/* ---- */
2011-05-15 03:56:54 +02:00
2015-04-07 17:09:18 +02:00
if (!empty($_GET['poll'])) {
$poll_id = filter_input(INPUT_GET, 'poll', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => POLL_REGEX]]);
$poll = $pollService->findById($poll_id);
}
if (!$poll) {
2015-04-07 20:06:24 +02:00
$smarty->assign('error', __('Error', 'This poll doesn\'t exist !'));
$smarty->display('error.tpl');
exit;
2011-05-15 03:56:54 +02:00
}
2015-11-30 22:23:26 +01:00
$editedVoteUniqueId = $sessionService->get(USER_REMEMBER_VOTES_KEY, $poll_id, '');
// -------------------------------
// Password verification
// -------------------------------
if (!is_null($poll->password_hash)) {
// If we came from password submission
$password = isset($_POST['password']) ? $_POST['password'] : null;
if (!empty($password)) {
$securityService->submitPollAccess($poll, $password);
}
2014-12-17 13:17:08 +01:00
if (!$securityService->canAccessPoll($poll)) {
$accessGranted = false;
2014-12-17 13:17:08 +01:00
}
$resultPubliclyVisible = $poll->results_publicly_visible;
if (!$accessGranted && !empty($password)) {
$message = new Message('danger', __('Password', 'Wrong password'));
} else if (!$accessGranted && !$resultPubliclyVisible) {
$message = new Message('danger', __('Password', 'You have to provide a password to access the poll.'));
} else if (!$accessGranted && $resultPubliclyVisible) {
$message = new Message('danger', __('Password', 'You have to provide a password so you can participate to the poll.'));
}
}
// We allow actions only if access is granted
if ($accessGranted) {
// -------------------------------
// A vote is going to be edited
// -------------------------------
if (!empty($_GET['vote'])) {
$editingVoteId = filter_input(INPUT_GET, 'vote', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => POLL_REGEX]]);
2014-12-17 13:17:08 +01:00
}
2014-12-16 00:45:16 +01:00
// -------------------------------
// Something to save (edit or add)
// -------------------------------
if (!empty($_POST['save'])) { // Save edition of an old vote
$name = $inputService->filterName($_POST['name']);
Collecting Polled Users Emails Modification de la BDD : ajout de la colonne mail dans la table vote Modification de la BDD : ajout de la colonne mail dans la table vote (bis) MAJ de VoteRepository : méthode insert et update MAJ de PollService : méthodes updateVote, addVote et splitVotes Modification studs.php, adminstuds.php et vote_table_date.tpl : OK pour l'ajout d'un vote avec nom + mail Modification de vote_table_classic.tpl : OK pour l'ajout d'un vote avec nom + mail Ajout d'un bouton enveloppe pour chaque colonne avec méthode de traitement pour test Le numéro de la colonne est enfin récupéré correctement Implémentation récupération des adresses mails des sondés intéressants dans adminstuds.php et appel d'un fichier display_mails.tpl qui affichent ces adresses mails. Extension du traitement pour les sondages classic Ajout récupération des adresses des non aussi, et ajouts de tests pour l'affichage Changement des input type=text en type=email Corrections automatiques pour passage pipelines Corrections suite aux remarques sur la merge request Corrections 2 suite aux remarques sur la merge request Corrections 3 suite aux remarques sur la merge request Modif BDD : ajout colonne collect_mail dans poll Modif classes Form, PollRepository Passage de la collecte des mails des sondés en fonctionalité optionnelle Si la collecte de mail est activée, la saisie du mail est obligatoire Ajout avertissements collect_mail + editableByAll dans création de sondage et tableaux de vote Update create poll string and put a danger background on warning Signed-off-by: Thomas Citharel <tcit@tcit.fr> Translation strings updated and better position for the email public warning message Also, a CSS tweak and cleanup Signed-off-by: Thomas Citharel <tcit@tcit.fr> CS Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-03-18 10:40:38 +01:00
if(empty($_POST['mail']) || $inputService->filterMail($_POST['mail']) === false) {
$mail = null;
} else {
$mail = $inputService->filterMail($_POST['mail']);
}
$editedVote = filter_input(INPUT_POST, 'save', FILTER_VALIDATE_INT);
$choices = $inputService->filterArray($_POST['choices'], FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => CHOICE_REGEX]]);
2016-03-05 16:05:37 +01:00
$slots_hash = $inputService->filterMD5($_POST['control']);
if (empty($editedVote)) {
2018-07-06 18:06:35 +02:00
$message = new Message('danger', __('Error', 'Something has gone wrong...'));
}
if (count($choices) !== count($_POST['choices'])) {
$message = new Message('danger', __('Error', 'There is a problem with your choices'));
}
if ($message === null) {
// Update vote
2016-03-05 16:05:37 +01:00
try {
Collecting Polled Users Emails Modification de la BDD : ajout de la colonne mail dans la table vote Modification de la BDD : ajout de la colonne mail dans la table vote (bis) MAJ de VoteRepository : méthode insert et update MAJ de PollService : méthodes updateVote, addVote et splitVotes Modification studs.php, adminstuds.php et vote_table_date.tpl : OK pour l'ajout d'un vote avec nom + mail Modification de vote_table_classic.tpl : OK pour l'ajout d'un vote avec nom + mail Ajout d'un bouton enveloppe pour chaque colonne avec méthode de traitement pour test Le numéro de la colonne est enfin récupéré correctement Implémentation récupération des adresses mails des sondés intéressants dans adminstuds.php et appel d'un fichier display_mails.tpl qui affichent ces adresses mails. Extension du traitement pour les sondages classic Ajout récupération des adresses des non aussi, et ajouts de tests pour l'affichage Changement des input type=text en type=email Corrections automatiques pour passage pipelines Corrections suite aux remarques sur la merge request Corrections 2 suite aux remarques sur la merge request Corrections 3 suite aux remarques sur la merge request Modif BDD : ajout colonne collect_mail dans poll Modif classes Form, PollRepository Passage de la collecte des mails des sondés en fonctionalité optionnelle Si la collecte de mail est activée, la saisie du mail est obligatoire Ajout avertissements collect_mail + editableByAll dans création de sondage et tableaux de vote Update create poll string and put a danger background on warning Signed-off-by: Thomas Citharel <tcit@tcit.fr> Translation strings updated and better position for the email public warning message Also, a CSS tweak and cleanup Signed-off-by: Thomas Citharel <tcit@tcit.fr> CS Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-03-18 10:40:38 +01:00
$result = $pollService->updateVote($poll_id, $editedVote, $name, $choices, $slots_hash, $mail);
2016-03-05 16:05:37 +01:00
if ($result) {
if ($poll->editable === Editable::EDITABLE_BY_OWN) {
2016-03-05 16:05:37 +01:00
$editedVoteUniqueId = filter_input(INPUT_POST, 'edited_vote', FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => POLL_REGEX]]);
2016-05-01 14:21:08 +02:00
$message = getMessageForOwnVoteEditableVote($sessionService, $smarty, $editedVoteUniqueId, $config['use_smtp'], $poll_id, $name);
2016-03-05 16:05:37 +01:00
} else {
2018-07-06 18:06:35 +02:00
$message = new Message('success', __('studs', 'Vote updated'));
2016-03-05 16:05:37 +01:00
}
$notificationService->sendUpdateNotification($poll, NotificationService::UPDATE_VOTE, $name);
} else {
2016-03-05 16:05:37 +01:00
$message = new Message('danger', __('Error', 'Update vote failed'));
}
2018-04-06 14:00:20 +02:00
} catch (AlreadyExistsException $aee) {
$message = new Message('danger', __('Error', 'The name you\'ve chosen already exist in this poll!'));
} catch (ConcurrentEditionException $cee) {
2016-03-05 16:05:37 +01:00
$message = new Message('danger', __('Error', 'Poll has been updated before you vote'));
} catch (ConcurrentVoteException $cve) {
$message = new Message('danger', __('Error', "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."));
2015-04-07 17:58:45 +02:00
}
2014-12-16 00:45:16 +01:00
}
} elseif (isset($_POST['save'])) { // Add a new vote
$name = $inputService->filterName($_POST['name']);
Collecting Polled Users Emails Modification de la BDD : ajout de la colonne mail dans la table vote Modification de la BDD : ajout de la colonne mail dans la table vote (bis) MAJ de VoteRepository : méthode insert et update MAJ de PollService : méthodes updateVote, addVote et splitVotes Modification studs.php, adminstuds.php et vote_table_date.tpl : OK pour l'ajout d'un vote avec nom + mail Modification de vote_table_classic.tpl : OK pour l'ajout d'un vote avec nom + mail Ajout d'un bouton enveloppe pour chaque colonne avec méthode de traitement pour test Le numéro de la colonne est enfin récupéré correctement Implémentation récupération des adresses mails des sondés intéressants dans adminstuds.php et appel d'un fichier display_mails.tpl qui affichent ces adresses mails. Extension du traitement pour les sondages classic Ajout récupération des adresses des non aussi, et ajouts de tests pour l'affichage Changement des input type=text en type=email Corrections automatiques pour passage pipelines Corrections suite aux remarques sur la merge request Corrections 2 suite aux remarques sur la merge request Corrections 3 suite aux remarques sur la merge request Modif BDD : ajout colonne collect_mail dans poll Modif classes Form, PollRepository Passage de la collecte des mails des sondés en fonctionalité optionnelle Si la collecte de mail est activée, la saisie du mail est obligatoire Ajout avertissements collect_mail + editableByAll dans création de sondage et tableaux de vote Update create poll string and put a danger background on warning Signed-off-by: Thomas Citharel <tcit@tcit.fr> Translation strings updated and better position for the email public warning message Also, a CSS tweak and cleanup Signed-off-by: Thomas Citharel <tcit@tcit.fr> CS Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-03-18 10:40:38 +01:00
if(empty($_POST['mail']) || $inputService->filterMail($_POST['mail']) === false) {
$mail = null;
} else {
$mail = $inputService->filterMail($_POST['mail']);
}
$choices = $inputService->filterArray($_POST['choices'], FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => CHOICE_REGEX]]);
2016-03-05 16:05:37 +01:00
$slots_hash = $inputService->filterMD5($_POST['control']);
2014-12-17 13:17:08 +01:00
if ($name === null) {
$message = new Message('danger', __('Error', 'The name is invalid.'));
}
if (count($choices) !== count($_POST['choices'])) {
$message = new Message('danger', __('Error', 'There is a problem with your choices'));
}
2014-12-16 00:45:16 +01:00
if ($message === null) {
// Add vote
2016-03-05 16:05:37 +01:00
try {
Collecting Polled Users Emails Modification de la BDD : ajout de la colonne mail dans la table vote Modification de la BDD : ajout de la colonne mail dans la table vote (bis) MAJ de VoteRepository : méthode insert et update MAJ de PollService : méthodes updateVote, addVote et splitVotes Modification studs.php, adminstuds.php et vote_table_date.tpl : OK pour l'ajout d'un vote avec nom + mail Modification de vote_table_classic.tpl : OK pour l'ajout d'un vote avec nom + mail Ajout d'un bouton enveloppe pour chaque colonne avec méthode de traitement pour test Le numéro de la colonne est enfin récupéré correctement Implémentation récupération des adresses mails des sondés intéressants dans adminstuds.php et appel d'un fichier display_mails.tpl qui affichent ces adresses mails. Extension du traitement pour les sondages classic Ajout récupération des adresses des non aussi, et ajouts de tests pour l'affichage Changement des input type=text en type=email Corrections automatiques pour passage pipelines Corrections suite aux remarques sur la merge request Corrections 2 suite aux remarques sur la merge request Corrections 3 suite aux remarques sur la merge request Modif BDD : ajout colonne collect_mail dans poll Modif classes Form, PollRepository Passage de la collecte des mails des sondés en fonctionalité optionnelle Si la collecte de mail est activée, la saisie du mail est obligatoire Ajout avertissements collect_mail + editableByAll dans création de sondage et tableaux de vote Update create poll string and put a danger background on warning Signed-off-by: Thomas Citharel <tcit@tcit.fr> Translation strings updated and better position for the email public warning message Also, a CSS tweak and cleanup Signed-off-by: Thomas Citharel <tcit@tcit.fr> CS Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2018-03-18 10:40:38 +01:00
$result = $pollService->addVote($poll_id, $name, $choices, $slots_hash, $mail);
2016-03-05 16:05:37 +01:00
if ($result) {
if (intval($poll->editable) === Editable::EDITABLE_BY_OWN) {
2016-03-05 16:05:37 +01:00
$editedVoteUniqueId = $result->uniqId;
2016-05-01 14:21:08 +02:00
$message = getMessageForOwnVoteEditableVote($sessionService, $smarty, $editedVoteUniqueId, $config['use_smtp'], $poll_id, $name);
2016-03-05 16:05:37 +01:00
} else {
2018-07-06 18:06:35 +02:00
$message = new Message('success', __('studs', 'Vote added'));
2016-03-05 16:05:37 +01:00
}
$notificationService->sendUpdateNotification($poll, NotificationService::ADD_VOTE, $name);
} else {
2016-03-05 16:05:37 +01:00
$message = new Message('danger', __('Error', 'Adding vote failed'));
}
2016-03-05 16:05:37 +01:00
} catch (AlreadyExistsException $aee) {
$message = new Message('danger', __('Error', 'You already voted'));
$selectedNewVotes = $choices;
2016-03-05 16:05:37 +01:00
} catch (ConcurrentEditionException $cee) {
$message = new Message('danger', __('Error', 'Poll has been updated before you vote'));
} catch (ConcurrentVoteException $cve) {
$message = new Message('danger', __('Error', "Your vote wasn't counted, because someone voted in the meantime and it conflicted with your choices and the poll conditions. Please retry."));
}
2014-12-16 00:45:16 +01:00
}
}
}
2014-12-17 13:47:14 +01:00
2016-05-01 14:21:08 +02:00
// Functions
function getMessageForOwnVoteEditableVote(SessionService &$sessionService, Smarty &$smarty, $editedVoteUniqueId, $canUseSMTP, $poll_id, $name) {
$sessionService->set(USER_REMEMBER_VOTES_KEY, $poll_id, $editedVoteUniqueId);
$urlEditVote = Utils::getUrlSondage($poll_id, false, $editedVoteUniqueId);
$message = new Message(
'success',
2018-07-06 18:06:35 +02:00
__('studs', 'Your vote has been saved, but please note: you need to keep this personalised link to be able to edit your vote.'),
2016-05-01 14:21:08 +02:00
$urlEditVote,
2016-05-03 21:09:41 +02:00
__f('Poll results', 'Edit the line: %s', $name),
2016-05-01 14:21:08 +02:00
'glyphicon-pencil');
if ($canUseSMTP) {
$token = new Token();
$sessionService->set("Common", SESSION_EDIT_LINK_TOKEN, $token);
$smarty->assign('editedVoteUniqueId', $editedVoteUniqueId);
$smarty->assign('token', $token->getValue());
$smarty->assign('poll_id', $poll_id);
$message->includeTemplate = $smarty->fetch('part/form_remember_edit_link.tpl');
$smarty->clearAssign('token');
}
return $message;
}
// Retrieve data
if ($resultPubliclyVisible || $accessGranted) {
$slots = $pollService->allSlotsByPoll($poll);
$votes = $pollService->allVotesByPollId($poll_id);
$comments = $pollService->allCommentsByPollId($poll_id);
}
2014-10-21 01:31:26 +02:00
// Assign data to template
$smarty->assign('poll_id', $poll_id);
$smarty->assign('poll', $poll);
2015-04-07 20:06:24 +02:00
$smarty->assign('title', __('Generic', 'Poll') . ' - ' . $poll->title);
2015-03-13 12:56:45 +01:00
$smarty->assign('expired', strtotime($poll->end_date) < time());
2015-05-29 17:46:29 +02:00
$smarty->assign('deletion_date', strtotime($poll->end_date) + PURGE_DELAY * 86400);
$smarty->assign('slots', $poll->format === 'D' ? $pollService->splitSlots($slots) : $slots);
2016-03-05 16:05:37 +01:00
$smarty->assign('slots_hash', $pollService->hashSlots($slots));
2014-12-17 13:17:08 +01:00
$smarty->assign('votes', $pollService->splitVotes($votes));
2018-04-05 17:34:43 +02:00
$smarty->assign('best_choices', $pollService->computeBestChoices($votes, $poll));
$smarty->assign('comments', $comments);
2014-12-16 00:45:16 +01:00
$smarty->assign('editingVoteId', $editingVoteId);
2014-12-17 13:17:08 +01:00
$smarty->assign('message', $message);
$smarty->assign('admin', false);
$smarty->assign('hidden', $poll->hidden);
$smarty->assign('accessGranted', $accessGranted);
$smarty->assign('resultPubliclyVisible', $resultPubliclyVisible);
$smarty->assign('editedVoteUniqueId', $editedVoteUniqueId);
$smarty->assign('ValueMax', $poll->ValueMax);
$smarty->assign('selectedNewVotes', $selectedNewVotes);
$smarty->display('studs.tpl');