Skip to content

Commit

Permalink
Whispeak: Track every authentiy attempt - refs BT#15821
Browse files Browse the repository at this point in the history
  • Loading branch information
AngelFQC committed Oct 7, 2019
1 parent 5dad320 commit a313138
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 173 deletions.
1 change: 0 additions & 1 deletion plugin/whispeakauth/Entity/LogEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
*/
class LogEvent
{
const STATUS_REQUIRED = -1;
const STATUS_FAILED = 0;
const STATUS_SUCCESS = 1;

Expand Down
143 changes: 5 additions & 138 deletions plugin/whispeakauth/WhispeakAuthPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -692,43 +692,7 @@ public static function quizQuestionAuthentify($questionId, Exercise $exercise)
}

/**
* @param int $userId
* @param int $lpItemId
* @param int $lpId
*
* @throws \Doctrine\ORM\NonUniqueResultException
*
* @return LogEventLp|null
*/
public function getLastRequiredAttemptInLearningPath($userId, $lpItemId, $lpId)
{
$query = Database::getManager()
->createQuery(
'SELECT log FROM ChamiloPluginBundle:WhispeakAuth\LogEventLp log
WHERE
log.user = :user AND
log.lp = :lp AND
log.lpItem = :lp_item AND
log.actionStatus = :action_status
ORDER BY log.datetime DESC'
)
->setMaxResults(1)
->setParameters(
[
'user' => $userId,
'lp' => $lpId,
'lp_item' => $lpItemId,
'action_status' => LogEvent::STATUS_REQUIRED,
]
);

/** @var LogEventLp|null $logEvent */
$logEvent = $query->getOneOrNullResult();

return $logEvent;
}

/**
* @param int $status
* @param int $userId
* @param int $lpItemId
* @param int $lpId
Expand All @@ -739,7 +703,7 @@ public function getLastRequiredAttemptInLearningPath($userId, $lpItemId, $lpId)
*
* @return LogEventLp|null
*/
public function addAttemptInLearningPath($userId, $lpItemId, $lpId)
public function addAttemptInLearningPath($status, $userId, $lpItemId, $lpId)
{
$em = Database::getManager();

Expand All @@ -759,7 +723,7 @@ public function addAttemptInLearningPath($userId, $lpItemId, $lpId)
->setDatetime(
api_get_utc_datetime(null, false, true)
)
->setActionStatus($logEvent::STATUS_REQUIRED);
->setActionStatus($status);

$em->persist($logEvent);
$em->flush();
Expand All @@ -769,73 +733,6 @@ public function addAttemptInLearningPath($userId, $lpItemId, $lpId)

/**
* @param int $status
* @param int $userId
* @param int $lpItemId
* @param int $lpId
*
* @throws \Doctrine\ORM\NonUniqueResultException
* @throws \Doctrine\ORM\OptimisticLockException
*
* @return LogEventLp|null
*/
public function updateAttemptInLearningPath($status, $userId, $lpItemId, $lpId)
{
$em = Database::getManager();

$logEvent = $this->getLastRequiredAttemptInLearningPath($userId, $lpItemId, $lpId);

if (empty($logEvent)) {
return null;
}

if ($logEvent->getActionStatus() !== $status) {
$logEvent->setActionStatus($status);

$em->persist($logEvent);
$em->flush();
}

return $logEvent;
}

/**
* @param int $userId
* @param int $questionId
* @param int $quizId
*
* @throws \Doctrine\ORM\NonUniqueResultException
*
* @return LogEventQuiz|null
*/
public function getLastRequiredAttemptInQuiz($userId, $questionId, $quizId)
{
$query = Database::getManager()
->createQuery(
'SELECT log FROM ChamiloPluginBundle:WhispeakAuth\LogEventQuiz log
WHERE
log.user = :user AND
log.quiz = :quiz AND
log.question = :question AND
log.actionStatus = :action_status
ORDER BY log.datetime DESC'
)
->setMaxResults(1)
->setParameters(
[
'user' => $userId,
'quiz' => $quizId,
'question' => $questionId,
'action_status' => LogEvent::STATUS_REQUIRED,
]
);

/** @var LogEventQuiz|null $logEvent */
$logEvent = $query->getOneOrNullResult();

return $logEvent;
}

/**
* @param int $userId
* @param int $questionId
* @param int $quizId
Expand All @@ -846,7 +743,7 @@ public function getLastRequiredAttemptInQuiz($userId, $questionId, $quizId)
*
* @return LogEventQuiz|null
*/
public function addAttemptInQuiz($userId, $questionId, $quizId)
public function addAttemptInQuiz($status, $userId, $questionId, $quizId)
{
$em = Database::getManager();

Expand All @@ -866,44 +763,14 @@ public function addAttemptInQuiz($userId, $questionId, $quizId)
->setDatetime(
api_get_utc_datetime(null, false, true)
)
->setActionStatus($logEvent::STATUS_REQUIRED);
->setActionStatus($status);

$em->persist($logEvent);
$em->flush();

return $logEvent;
}

/**
* @param int $status
* @param int $userId
* @param int $questionId
* @param int $quizId
*
* @throws \Doctrine\ORM\NonUniqueResultException
* @throws \Doctrine\ORM\OptimisticLockException
*
* @return LogEventQuiz|null
*/
public function updateAttemptInQuiz($status, $userId, $questionId, $quizId)
{
$logEvent = $this->getLastRequiredAttemptInQuiz($userId, $questionId, $quizId);

if (empty($logEvent)) {
return null;
}

if ($logEvent->getActionStatus() !== $status) {
$logEvent->setActionStatus($status);

$em = Database::getManager();
$em->persist($logEvent);
$em->flush();
}

return $logEvent;
}

/**
* @param int $lpId
* @param int $userId
Expand Down
36 changes: 18 additions & 18 deletions plugin/whispeakauth/ajax/authentify_password.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,22 @@
$userPass = true;

if (!$isValidPassword || !$isActive || !$isExpired) {
if (!empty($lpItemInfo)) {
$plugin->addAttemptInLearningPath(
LogEvent::STATUS_FAILED,
$user->getId(),
$lpItemInfo['lp_item'],
$lpItemInfo['lp']
);
} elseif (!empty($quizQuestionInfo)) {
$plugin->addAttemptInQuiz(
LogEvent::STATUS_FAILED,
$user->getId(),
$quizQuestionInfo['question'],
$quizQuestionInfo['quiz']
);
}

$userPass = false;

$message = $plugin->get_lang('AuthentifyFailed');
Expand All @@ -76,34 +92,18 @@
if (!$maxAttempts ||
($maxAttempts && $failedLogins >= $maxAttempts)
) {
if (!empty($lpItemInfo)) {
$plugin->updateAttemptInLearningPath(
LogEvent::STATUS_FAILED,
$user->getId(),
$lpItemInfo['lp_item'],
$lpItemInfo['lp']
);
} elseif (!empty($quizQuestionInfo)) {
$plugin->updateAttemptInQuiz(
LogEvent::STATUS_FAILED,
$user->getId(),
$quizQuestionInfo['question'],
$quizQuestionInfo['quiz']
);
}

$userPass = true;
}
} elseif ($isValidPassword) {
if (!empty($lpItemInfo)) {
$plugin->updateAttemptInLearningPath(
$plugin->addAttemptInLearningPath(
LogEvent::STATUS_SUCCESS,
$user->getId(),
$lpItemInfo['lp_item'],
$lpItemInfo['lp']
);
} elseif (!empty($quizQuestionInfo)) {
$plugin->updateAttemptInQuiz(
$plugin->addAttemptInQuiz(
LogEvent::STATUS_SUCCESS,
$user->getId(),
$quizQuestionInfo['question'],
Expand Down
22 changes: 20 additions & 2 deletions plugin/whispeakauth/ajax/record_audio.php
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,24 @@
$message = $plugin->get_lang('AuthentifySuccess');

if (!$success) {
if (!empty($lpItemInfo)) {
$plugin->addAttemptInLearningPath(
LogEvent::STATUS_FAILED,
$user->getId(),
$lpItemInfo['lp_item'],
$lpItemInfo['lp']
);
}

if (!empty($quizQuestionInfo)) {
$plugin->addAttemptInQuiz(
LogEvent::STATUS_FAILED,
$user->getId(),
$quizQuestionInfo['question'],
$quizQuestionInfo['quiz']
);
}

$message = $plugin->get_lang('AuthentifyFailed');

ChamiloSession::write(WhispeakAuthPlugin::SESSION_FAILED_LOGINS, ++$failedLogins);
Expand Down Expand Up @@ -249,7 +267,7 @@
ChamiloSession::erase(WhispeakAuthPlugin::SESSION_LP_ITEM);
ChamiloSession::erase(WhispeakAuthPlugin::SESSION_2FA_USER);

$plugin->updateAttemptInLearningPath(
$plugin->addAttemptInLearningPath(
LogEvent::STATUS_SUCCESS,
$user->getId(),
$lpItemInfo['lp_item'],
Expand All @@ -267,7 +285,7 @@

ChamiloSession::write(WhispeakAuthPlugin::SESSION_QUIZ_QUESTION, $quizQuestionInfo);

$plugin->updateAttemptInQuiz(
$plugin->addAttemptInQuiz(
LogEvent::STATUS_SUCCESS,
$user->getId(),
$quizQuestionInfo['question'],
Expand Down
14 changes: 0 additions & 14 deletions plugin/whispeakauth/authentify.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,20 +44,6 @@
exit;
}

if (!empty($lpItemInfo)) {
$plugin->addAttemptInLearningPath(
$userId,
$lpItemInfo['lp_item'],
$lpItemInfo['lp']
);
} elseif (!empty($lpQuestionInfo)) {
$plugin->addAttemptInQuiz(
$userId,
$lpQuestionInfo['question'],
$lpQuestionInfo['quiz']
);
}

if ($userId) {
$wsid = WhispeakAuthPlugin::getAuthUidValue($userId);

Expand Down

0 comments on commit a313138

Please sign in to comment.