217 lines
16 KiB
C++
217 lines
16 KiB
C++
/*!
|
|
* AuthController.cpp
|
|
*
|
|
* \copyright Copyright (c) 2014 Governikus GmbH & Co. KG
|
|
*/
|
|
|
|
#include "context/AuthContext.h"
|
|
#include "controller/AuthController.h"
|
|
#include "states/CompositeStateProcessCvcsAndSetRights.h"
|
|
#include "states/CompositeStateSelectCard.h"
|
|
#include "states/FinalState.h"
|
|
#include "states/StateCheckRefreshAddress.h"
|
|
#include "states/StateCleanUpReaderManager.h"
|
|
#include "states/StateDidAuthenticateEac1.h"
|
|
#include "states/StateDidAuthenticateEac2.h"
|
|
#include "states/StateDidList.h"
|
|
#include "states/StateEACAdditionalInputType.h"
|
|
#include "states/StateEstablishPaceCan.h"
|
|
#include "states/StateEstablishPacePin.h"
|
|
#include "states/StateGenericSendReceive.h"
|
|
#include "states/StateGetTcToken.h"
|
|
#include "states/StateInitializeFramework.h"
|
|
#include "states/StateParseTcTokenUrl.h"
|
|
#include "states/StateProcessCertificatesFromEac2.h"
|
|
#include "states/StateProcessing.h"
|
|
#include "states/StateRedirectBrowser.h"
|
|
#include "states/StateStartPaos.h"
|
|
#include "states/StateStartPaosResponse.h"
|
|
#include "states/StateTransmit.h"
|
|
#include "states/StateUpdateRetryCounter.h"
|
|
#include "states/StateWriteHistory.h"
|
|
|
|
#include <initializer_list>
|
|
#include <QDebug>
|
|
|
|
|
|
using namespace governikus;
|
|
|
|
|
|
AuthController::AuthController(QSharedPointer<AuthContext> pContext)
|
|
: WorkflowController(pContext)
|
|
{
|
|
auto sProcessing = addAndConnectState<StateProcessing>();
|
|
mStateMachine.setInitialState(sProcessing);
|
|
auto sParseTcTokenUrl = addAndConnectState<StateParseTcTokenUrl>();
|
|
auto sGetTcToken = addAndConnectState<StateGetTcToken>();
|
|
auto sStartPaos = addAndConnectState<StateStartPaos>();
|
|
auto sSendStartPaos = addAndConnectState<StateSendStartPaos>();
|
|
auto sInitializeFramework = addAndConnectState<StateInitializeFramework>();
|
|
auto sSendInitializeFrameworkResponse = addAndConnectState<StateSendInitializeFrameworkResponse>();
|
|
auto sDidList = addAndConnectState<StateDidList>();
|
|
auto sSendDidListResponse = addAndConnectState<StateSendDIDListResponse>();
|
|
auto sProcessCvcsAndSetRights = new CompositeStateProcessCvcsAndSetRights(pContext);
|
|
mStateMachine.addState(sProcessCvcsAndSetRights);
|
|
auto sSelectCard = new CompositeStateSelectCard(pContext);
|
|
mStateMachine.addState(sSelectCard);
|
|
auto sUpdateRetryCounter = addAndConnectState<StateUpdateRetryCounter>();
|
|
auto sEstablishPaceCan = addAndConnectState<StateEstablishPaceCan>();
|
|
auto sEstablishPacePin = addAndConnectState<StateEstablishPacePin>();
|
|
auto sDidAuthenticateEac1 = addAndConnectState<StateDidAuthenticateEac1>();
|
|
auto sSendDidAuthenticateResponseEac1 = addAndConnectState<StateSendDIDAuthenticateResponseEAC1>();
|
|
auto sEacAdditionalInputType = addAndConnectState<StateEACAdditionalInputType>();
|
|
auto sSendDidAuthenticatResponseEacAdditionalInput = addAndConnectState<StateSendDIDAuthenticateResponseEACAdditionalInputType>();
|
|
auto sProcessCertificatesFromEac2 = addAndConnectState<StateProcessCertificatesFromEac2>();
|
|
auto sDidAuthenticateEac2 = addAndConnectState<StateDidAuthenticateEac2>();
|
|
auto sSendDidAuthenticateResponseEac2 = addAndConnectState<StateSendDIDAuthenticateResponseEAC2>();
|
|
auto sTransmit = addAndConnectState<StateTransmit>();
|
|
auto sSendTransmitResponse = addAndConnectState<StateSendTransmitResponse>();
|
|
auto sSendDisconnectResponse = addAndConnectState<StateSendDisconnectResponse>();
|
|
auto sStartPaosResponse = addAndConnectState<StateStartPaosResponse>();
|
|
auto sCheckRefreshAddress = addAndConnectState<StateCheckRefreshAddress>();
|
|
auto sWriteHistory = addAndConnectState<StateWriteHistory>();
|
|
auto sRedirectBrowser = addAndConnectState<StateRedirectBrowser>();
|
|
auto sCleanUpReaderManager = addAndConnectState<StateCleanUpReaderManager>();
|
|
auto sFinal = addAndConnectState<FinalState>();
|
|
|
|
sProcessing->addTransition(sProcessing, &AbstractState::fireSuccess, sParseTcTokenUrl);
|
|
sProcessing->addTransition(sProcessing, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sProcessing->addTransition(sProcessing, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
|
|
sParseTcTokenUrl->addTransition(sParseTcTokenUrl, &AbstractState::fireSuccess, sGetTcToken);
|
|
sParseTcTokenUrl->addTransition(sParseTcTokenUrl, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sParseTcTokenUrl->addTransition(sParseTcTokenUrl, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
|
|
sGetTcToken->addTransition(sGetTcToken, &AbstractState::fireSuccess, sStartPaos);
|
|
sGetTcToken->addTransition(sGetTcToken, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sGetTcToken->addTransition(sGetTcToken, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
|
|
sStartPaos->addTransition(sStartPaos, &AbstractState::fireSuccess, sSendStartPaos);
|
|
sStartPaos->addTransition(sStartPaos, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sStartPaos->addTransition(sStartPaos, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
|
|
sSendStartPaos->addTransition(sSendStartPaos, &AbstractState::fireSuccess, sInitializeFramework);
|
|
sSendStartPaos->addTransition(sSendStartPaos, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sSendStartPaos->addTransition(sSendStartPaos, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
sSendStartPaos->addTransition(sSendStartPaos, &StateSendStartPaos::fireReceivedDidList, sDidList);
|
|
sSendStartPaos->addTransition(sSendStartPaos, &StateSendStartPaos::fireReceivedExtractCvcsFromEac1InputType, sProcessCvcsAndSetRights);
|
|
sSendStartPaos->addTransition(sSendStartPaos, &StateSendStartPaos::fireReceivedStartPaosResponse, sStartPaosResponse);
|
|
|
|
sInitializeFramework->addTransition(sInitializeFramework, &AbstractState::fireSuccess, sSendInitializeFrameworkResponse);
|
|
sInitializeFramework->addTransition(sInitializeFramework, &AbstractState::fireError, sSendInitializeFrameworkResponse);
|
|
sInitializeFramework->addTransition(sInitializeFramework, &AbstractState::fireCancel, sSendInitializeFrameworkResponse);
|
|
|
|
sSendInitializeFrameworkResponse->addTransition(sSendInitializeFrameworkResponse, &AbstractState::fireSuccess, sDidList);
|
|
sSendInitializeFrameworkResponse->addTransition(sSendInitializeFrameworkResponse, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sSendInitializeFrameworkResponse->addTransition(sSendInitializeFrameworkResponse, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
sSendInitializeFrameworkResponse->addTransition(sSendInitializeFrameworkResponse, &StateSendInitializeFrameworkResponse::fireReceivedExtractCvcsFromEac1InputType, sProcessCvcsAndSetRights);
|
|
sSendInitializeFrameworkResponse->addTransition(sSendInitializeFrameworkResponse, &StateSendInitializeFrameworkResponse::fireReceivedStartPaosResponse, sStartPaosResponse);
|
|
|
|
sDidList->addTransition(sDidList, &AbstractState::fireSuccess, sSendDidListResponse);
|
|
sDidList->addTransition(sDidList, &AbstractState::fireError, sSendDidListResponse);
|
|
sDidList->addTransition(sDidList, &AbstractState::fireCancel, sSendDidListResponse);
|
|
|
|
sSendDidListResponse->addTransition(sSendDidListResponse, &AbstractState::fireSuccess, sProcessCvcsAndSetRights);
|
|
sSendDidListResponse->addTransition(sSendDidListResponse, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sSendDidListResponse->addTransition(sSendDidListResponse, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
sSendDidListResponse->addTransition(sSendDidListResponse, &StateSendDIDListResponse::fireReceivedDisconnect, sSendDisconnectResponse);
|
|
sSendDidListResponse->addTransition(sSendDidListResponse, &StateSendDIDListResponse::fireReceivedStartPaosResponse, sStartPaosResponse);
|
|
|
|
sProcessCvcsAndSetRights->addTransition(sProcessCvcsAndSetRights, &CompositeStateProcessCvcsAndSetRights::fireSuccess, sSelectCard);
|
|
sProcessCvcsAndSetRights->addTransition(sProcessCvcsAndSetRights, &CompositeStateProcessCvcsAndSetRights::fireError, sSendDidAuthenticateResponseEac1);
|
|
sProcessCvcsAndSetRights->addTransition(sProcessCvcsAndSetRights, &CompositeStateProcessCvcsAndSetRights::fireCancel, sSendDidAuthenticateResponseEac1);
|
|
|
|
sSelectCard->addTransition(sSelectCard, &CompositeStateSelectCard::fireSuccess, sUpdateRetryCounter);
|
|
sSelectCard->addTransition(sSelectCard, &CompositeStateSelectCard::fireError, sSendDidAuthenticateResponseEac1);
|
|
sSelectCard->addTransition(sSelectCard, &CompositeStateSelectCard::fireCancel, sSendDidAuthenticateResponseEac1);
|
|
|
|
sUpdateRetryCounter->addTransition(sUpdateRetryCounter, &StateUpdateRetryCounter::fireRetryCounterIsGTOne, sEstablishPacePin);
|
|
sUpdateRetryCounter->addTransition(sUpdateRetryCounter, &StateUpdateRetryCounter::fireRetryCounterIsOne, sEstablishPaceCan);
|
|
sUpdateRetryCounter->addTransition(sUpdateRetryCounter, &StateUpdateRetryCounter::fireRetryCounterIsZero, sSendDidAuthenticateResponseEac1);
|
|
sUpdateRetryCounter->addTransition(sUpdateRetryCounter, &AbstractState::fireError, sSendDidAuthenticateResponseEac1);
|
|
sUpdateRetryCounter->addTransition(sUpdateRetryCounter, &AbstractState::fireCancel, sSendDidAuthenticateResponseEac1);
|
|
|
|
sEstablishPaceCan->addTransition(sEstablishPaceCan, &AbstractState::fireSuccess, sEstablishPacePin);
|
|
sEstablishPaceCan->addTransition(sEstablishPaceCan, &StateEstablishPaceCan::fireInvalidCan, sUpdateRetryCounter);
|
|
sEstablishPaceCan->addTransition(sEstablishPaceCan, &AbstractState::fireError, sSendDidAuthenticateResponseEac1);
|
|
sEstablishPaceCan->addTransition(sEstablishPaceCan, &AbstractState::fireCancel, sSendDidAuthenticateResponseEac1);
|
|
|
|
sEstablishPacePin->addTransition(sEstablishPacePin, &AbstractState::fireSuccess, sDidAuthenticateEac1);
|
|
sEstablishPacePin->addTransition(sEstablishPacePin, &StateEstablishPacePin::fireInvalidPin, sUpdateRetryCounter);
|
|
sEstablishPacePin->addTransition(sEstablishPacePin, &AbstractState::fireError, sSendDidAuthenticateResponseEac1);
|
|
sEstablishPacePin->addTransition(sEstablishPacePin, &AbstractState::fireCancel, sSendDidAuthenticateResponseEac1);
|
|
|
|
sDidAuthenticateEac1->addTransition(sDidAuthenticateEac1, &AbstractState::fireSuccess, sSendDidAuthenticateResponseEac1);
|
|
sDidAuthenticateEac1->addTransition(sDidAuthenticateEac1, &AbstractState::fireError, sSendDidAuthenticateResponseEac1);
|
|
sDidAuthenticateEac1->addTransition(sDidAuthenticateEac1, &AbstractState::fireCancel, sSendDidAuthenticateResponseEac1);
|
|
|
|
sSendDidAuthenticateResponseEac1->addTransition(sSendDidAuthenticateResponseEac1, &AbstractState::fireSuccess, sEacAdditionalInputType);
|
|
sSendDidAuthenticateResponseEac1->addTransition(sSendDidAuthenticateResponseEac1, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sSendDidAuthenticateResponseEac1->addTransition(sSendDidAuthenticateResponseEac1, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
sSendDidAuthenticateResponseEac1->addTransition(sSendDidAuthenticateResponseEac1, &StateSendDIDAuthenticateResponseEAC1::fireReceivedDisconnect, sSendDisconnectResponse);
|
|
sSendDidAuthenticateResponseEac1->addTransition(sSendDidAuthenticateResponseEac1, &StateSendDIDAuthenticateResponseEAC1::fireReceivedStartPaosResponse, sStartPaosResponse);
|
|
|
|
sEacAdditionalInputType->addTransition(sEacAdditionalInputType, &AbstractState::fireSuccess, sProcessCertificatesFromEac2);
|
|
sEacAdditionalInputType->addTransition(sEacAdditionalInputType, &AbstractState::fireError, sSendDidAuthenticatResponseEacAdditionalInput);
|
|
sEacAdditionalInputType->addTransition(sEacAdditionalInputType, &AbstractState::fireCancel, sSendDidAuthenticatResponseEacAdditionalInput);
|
|
sEacAdditionalInputType->addTransition(sEacAdditionalInputType, &StateEACAdditionalInputType::fireSendDidAuthenticatResponse, sSendDidAuthenticatResponseEacAdditionalInput);
|
|
|
|
sSendDidAuthenticatResponseEacAdditionalInput->addTransition(sSendDidAuthenticatResponseEacAdditionalInput, &AbstractState::fireSuccess, sProcessCertificatesFromEac2);
|
|
sSendDidAuthenticatResponseEacAdditionalInput->addTransition(sSendDidAuthenticatResponseEacAdditionalInput, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sSendDidAuthenticatResponseEacAdditionalInput->addTransition(sSendDidAuthenticatResponseEacAdditionalInput, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
sSendDidAuthenticatResponseEacAdditionalInput->addTransition(sSendDidAuthenticatResponseEacAdditionalInput, &StateSendDIDAuthenticateResponseEACAdditionalInputType::fireReceivedStartPaosResponse, sStartPaosResponse);
|
|
|
|
sProcessCertificatesFromEac2->addTransition(sProcessCertificatesFromEac2, &AbstractState::fireSuccess, sDidAuthenticateEac2);
|
|
sProcessCertificatesFromEac2->addTransition(sProcessCertificatesFromEac2, &AbstractState::fireError, sSendDidAuthenticateResponseEac2);
|
|
sProcessCertificatesFromEac2->addTransition(sProcessCertificatesFromEac2, &AbstractState::fireCancel, sSendDidAuthenticateResponseEac2);
|
|
|
|
sDidAuthenticateEac2->addTransition(sDidAuthenticateEac2, &AbstractState::fireSuccess, sSendDidAuthenticateResponseEac2);
|
|
sDidAuthenticateEac2->addTransition(sDidAuthenticateEac2, &AbstractState::fireError, sSendDidAuthenticateResponseEac2);
|
|
sDidAuthenticateEac2->addTransition(sDidAuthenticateEac2, &AbstractState::fireCancel, sSendDidAuthenticateResponseEac2);
|
|
|
|
sSendDidAuthenticateResponseEac2->addTransition(sSendDidAuthenticateResponseEac2, &AbstractState::fireSuccess, sTransmit);
|
|
sSendDidAuthenticateResponseEac2->addTransition(sSendDidAuthenticateResponseEac2, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sSendDidAuthenticateResponseEac2->addTransition(sSendDidAuthenticateResponseEac2, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
sSendDidAuthenticateResponseEac2->addTransition(sSendDidAuthenticateResponseEac2, &StateSendDIDAuthenticateResponseEAC2::fireReceivedDisconnect, sSendDisconnectResponse);
|
|
sSendDidAuthenticateResponseEac2->addTransition(sSendDidAuthenticateResponseEac2, &StateSendDIDAuthenticateResponseEAC2::fireReceivedStartPaosResponse, sStartPaosResponse);
|
|
|
|
sTransmit->addTransition(sTransmit, &AbstractState::fireSuccess, sSendTransmitResponse);
|
|
sTransmit->addTransition(sTransmit, &AbstractState::fireError, sSendTransmitResponse);
|
|
sTransmit->addTransition(sTransmit, &AbstractState::fireCancel, sSendTransmitResponse);
|
|
|
|
sSendTransmitResponse->addTransition(sSendTransmitResponse, &AbstractState::fireSuccess, sTransmit);
|
|
sSendTransmitResponse->addTransition(sSendTransmitResponse, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sSendTransmitResponse->addTransition(sSendTransmitResponse, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
sSendTransmitResponse->addTransition(sSendTransmitResponse, &StateSendTransmitResponse::fireReceivedDisconnect, sSendDisconnectResponse);
|
|
sSendTransmitResponse->addTransition(sSendTransmitResponse, &StateSendTransmitResponse::fireReceivedStartPaosResponse, sStartPaosResponse);
|
|
|
|
sSendDisconnectResponse->addTransition(sSendDisconnectResponse, &AbstractState::fireSuccess, sStartPaosResponse);
|
|
sSendDisconnectResponse->addTransition(sSendDisconnectResponse, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sSendDisconnectResponse->addTransition(sSendDisconnectResponse, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
|
|
sStartPaosResponse->addTransition(sStartPaosResponse, &AbstractState::fireSuccess, sCleanUpReaderManager);
|
|
sStartPaosResponse->addTransition(sStartPaosResponse, &AbstractState::fireError, sCleanUpReaderManager);
|
|
sStartPaosResponse->addTransition(sStartPaosResponse, &AbstractState::fireCancel, sCleanUpReaderManager);
|
|
|
|
sCleanUpReaderManager->addTransition(sCleanUpReaderManager, &AbstractState::fireSuccess, sCheckRefreshAddress);
|
|
sCleanUpReaderManager->addTransition(sCleanUpReaderManager, &AbstractState::fireError, sCheckRefreshAddress);
|
|
sCleanUpReaderManager->addTransition(sCleanUpReaderManager, &AbstractState::fireCancel, sCheckRefreshAddress);
|
|
|
|
sCheckRefreshAddress->addTransition(sCheckRefreshAddress, &AbstractState::fireSuccess, sWriteHistory);
|
|
sCheckRefreshAddress->addTransition(sCheckRefreshAddress, &AbstractState::fireError, sRedirectBrowser);
|
|
sCheckRefreshAddress->addTransition(sCheckRefreshAddress, &AbstractState::fireCancel, sRedirectBrowser);
|
|
|
|
sWriteHistory->addTransition(sWriteHistory, &AbstractState::fireSuccess, sRedirectBrowser);
|
|
sWriteHistory->addTransition(sWriteHistory, &AbstractState::fireError, sRedirectBrowser);
|
|
sWriteHistory->addTransition(sWriteHistory, &AbstractState::fireCancel, sRedirectBrowser);
|
|
|
|
sRedirectBrowser->addTransition(sRedirectBrowser, &AbstractState::fireSuccess, sFinal);
|
|
sRedirectBrowser->addTransition(sRedirectBrowser, &AbstractState::fireError, sFinal);
|
|
sRedirectBrowser->addTransition(sRedirectBrowser, &AbstractState::fireCancel, sFinal);
|
|
}
|
|
|
|
|
|
AuthController::~AuthController()
|
|
{
|
|
}
|