Skip to content

Commit

Permalink
[nemo-qml-plugin-devicelock] Handle authentication evaluating state w…
Browse files Browse the repository at this point in the history
…hen checking code. Contributes to JB#45803

The HostAuthenticator has now evaluating state changed handled in the
checkCodeFinished upon Authenticating, RequestingPermission, AuthenticatingForChange, and
AuthenticatingForClear.

When entering to authenticating evaluating the EvaluatingFlag is
resorted to the state of the authenticator.
  • Loading branch information
rainemak committed May 26, 2019
1 parent 306cdc8 commit d62f20a
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions src/nemo-devicelock/host/hostauthenticator.cpp
Expand Up @@ -45,6 +45,7 @@ namespace NemoDeviceLock

static const auto authenticatorInterface = QStringLiteral("org.nemomobile.devicelock.client.Authenticator");
static const auto securityCodeInterface = QStringLiteral("org.nemomobile.devicelock.client.SecurityCodeSettings");
static const auto attemptsRemaining = QStringLiteral("attemptsRemaining");

HostAuthenticatorAdaptor::HostAuthenticatorAdaptor(HostAuthenticator *authenticator)
: QDBusAbstractAdaptor(authenticator)
Expand Down Expand Up @@ -493,13 +494,19 @@ void HostAuthenticator::authorize()

void HostAuthenticator::checkCodeFinished(int result)
{
const FeedbackFunction feebackFunction = (m_state & EvaluatingFlag)
? &HostAuthenticationInput::authenticationResumed
: static_cast<void (HostAuthenticationInput::*)(AuthenticationInput::Feedback, const QVariantMap &, Authenticator::Methods)>(&HostAuthenticationInput::feedback);

m_state = State(m_state & ~EvaluatingFlag);

switch (m_state) {
case Authenticating:
case RequestingPermission:
switch (result) {
case Evaluating:
authenticationEvaluating();
m_state = State(m_state | EvaluatingFlag);
return;
case Success:
case SecurityCodeExpired:
Expand Down Expand Up @@ -528,10 +535,12 @@ void HostAuthenticator::checkCodeFinished(int result)
case AuthenticatingForChange:
switch (result) {
case Evaluating:
authenticationEvaluating();
m_state = State(m_state | EvaluatingFlag);
return;
case Success:
case SecurityCodeExpired:
enterCodeChangeState(&HostAuthenticationInput::feedback, Authenticator::SecurityCode);
enterCodeChangeState(feebackFunction, Authenticator::SecurityCode);
return;
case LockedOut:
lockedOut();
Expand All @@ -544,6 +553,8 @@ void HostAuthenticator::checkCodeFinished(int result)
case AuthenticatingForClear: {
switch (result) {
case Evaluating:
authenticationEvaluating();
m_state = State(m_state | EvaluatingFlag);
return;
case Success:
if (clearCode(m_currentCode)) {
Expand All @@ -563,19 +574,21 @@ void HostAuthenticator::checkCodeFinished(int result)
return;
}


const int attempts = result;
const int maximum = maximumAttempts();

QVariantMap data;
if (maximum > 0 && attempts > 0) {
feedback(AuthenticationInput::IncorrectSecurityCode, qMax(0, maximum - attempts));
data.insert(attemptsRemaining, qMax(0, maximum - attempts));
(this->*feebackFunction)(AuthenticationInput::IncorrectSecurityCode, data, Authenticator::Methods());

if (attempts >= maximum) {
lockedOut();
return;
}
} else {
feedback(AuthenticationInput::IncorrectSecurityCode, -1);
data.insert(attemptsRemaining, -1);
(this->*feebackFunction)(AuthenticationInput::IncorrectSecurityCode, data, Authenticator::Methods());
}
}

Expand Down

0 comments on commit d62f20a

Please sign in to comment.