use std::fmt;
use crate::network::auth::ManagedAuthorizationState;
use crate::network::auth::state_machine::{
AuthorizationAcceptingAction, AuthorizationAcceptingState, AuthorizationActionError, Identity,
};
use super::ChallengeAuthorizationAcceptingAction;
#[derive(PartialEq, Debug, Clone)]
pub(crate) enum ChallengeAuthorizationAcceptingState {
ChallengeConnecting,
ReceivedAuthChallengeNonce,
WaitingForAuthChallengeSubmitRequest,
ReceivedAuthChallengeSubmitRequest(Identity),
}
impl ChallengeAuthorizationAcceptingState {
pub(crate) fn next_accepting_state(
&self,
action: ChallengeAuthorizationAcceptingAction,
cur_state: &mut ManagedAuthorizationState,
) -> Result<AuthorizationAcceptingState, AuthorizationActionError> {
match &self {
ChallengeAuthorizationAcceptingState::ChallengeConnecting => match action {
ChallengeAuthorizationAcceptingAction::ReceiveAuthChallengeNonceRequest => {
let new_state = AuthorizationAcceptingState::Challenge(
ChallengeAuthorizationAcceptingState::ReceivedAuthChallengeNonce,
);
cur_state.accepting_state = new_state.clone();
Ok(new_state)
}
_ => Err(AuthorizationActionError::InvalidAcceptingMessageOrder(
AuthorizationAcceptingState::Challenge(self.clone()),
AuthorizationAcceptingAction::Challenge(action),
)),
},
ChallengeAuthorizationAcceptingState::ReceivedAuthChallengeNonce => match action {
ChallengeAuthorizationAcceptingAction::SendAuthChallengeNonceResponse => {
let new_state = AuthorizationAcceptingState::Challenge(
ChallengeAuthorizationAcceptingState::WaitingForAuthChallengeSubmitRequest,
);
cur_state.accepting_state = new_state.clone();
Ok(new_state)
}
_ => Err(AuthorizationActionError::InvalidAcceptingMessageOrder(
AuthorizationAcceptingState::Challenge(self.clone()),
AuthorizationAcceptingAction::Challenge(action),
)),
},
ChallengeAuthorizationAcceptingState::WaitingForAuthChallengeSubmitRequest => {
match action {
ChallengeAuthorizationAcceptingAction::ReceiveAuthChallengeSubmitRequest(
identity,
) => {
let new_state = AuthorizationAcceptingState::Challenge(
ChallengeAuthorizationAcceptingState::ReceivedAuthChallengeSubmitRequest(
identity,
),
);
cur_state.accepting_state = new_state.clone();
Ok(new_state)
}
_ => Err(AuthorizationActionError::InvalidAcceptingMessageOrder(
AuthorizationAcceptingState::Challenge(self.clone()),
AuthorizationAcceptingAction::Challenge(action),
)),
}
}
ChallengeAuthorizationAcceptingState::ReceivedAuthChallengeSubmitRequest(identity) => {
match action {
ChallengeAuthorizationAcceptingAction::SendAuthChallengeSubmitResponse => {
let new_state = AuthorizationAcceptingState::Done(identity.clone());
cur_state.accepting_state = new_state.clone();
Ok(new_state)
}
_ => Err(AuthorizationActionError::InvalidAcceptingMessageOrder(
AuthorizationAcceptingState::Challenge(self.clone()),
AuthorizationAcceptingAction::Challenge(action),
)),
}
}
}
}
}
impl fmt::Display for ChallengeAuthorizationAcceptingState {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(match self {
ChallengeAuthorizationAcceptingState::ChallengeConnecting => "ChallengeConnecting",
ChallengeAuthorizationAcceptingState::ReceivedAuthChallengeNonce => {
"ReceivedAuthChallengeNonce"
}
ChallengeAuthorizationAcceptingState::WaitingForAuthChallengeSubmitRequest => {
"WaitingForAuthChallengeSubmitRequest"
}
ChallengeAuthorizationAcceptingState::ReceivedAuthChallengeSubmitRequest(_) => {
"ReceivedAuthChallengeSubmitRequest"
}
})
}
}