use std::fmt;
use crate::network::auth::ManagedAuthorizationState;
use super::ChallengeAuthorizationInitiatingAction;
use crate::network::auth::state_machine::{
AuthorizationActionError, AuthorizationInitiatingAction, AuthorizationInitiatingState,
};
#[derive(PartialEq, Debug, Clone)]
pub(crate) enum ChallengeAuthorizationInitiatingState {
ChallengeConnecting,
WaitingForAuthChallengeNonceResponse,
ReceivedAuthChallengeNonceResponse,
WaitingForAuthChallengeSubmitResponse,
}
impl ChallengeAuthorizationInitiatingState {
pub(crate) fn next_initiating_state(
&self,
action: ChallengeAuthorizationInitiatingAction,
cur_state: &mut ManagedAuthorizationState,
) -> Result<AuthorizationInitiatingState, AuthorizationActionError> {
match &self {
ChallengeAuthorizationInitiatingState::ChallengeConnecting => match action {
ChallengeAuthorizationInitiatingAction::SendAuthChallengeNonceRequest => {
let new_state = AuthorizationInitiatingState::Challenge(
ChallengeAuthorizationInitiatingState::WaitingForAuthChallengeNonceResponse,
);
cur_state.initiating_state = new_state.clone();
Ok(new_state)
}
_ => Err(AuthorizationActionError::InvalidInitiatingMessageOrder(
AuthorizationInitiatingState::Challenge(self.clone()),
AuthorizationInitiatingAction::Challenge(action),
)),
},
ChallengeAuthorizationInitiatingState::WaitingForAuthChallengeNonceResponse => {
match action {
ChallengeAuthorizationInitiatingAction::ReceiveAuthChallengeNonceResponse => {
let new_state = AuthorizationInitiatingState::Challenge(
ChallengeAuthorizationInitiatingState::ReceivedAuthChallengeNonceResponse,
);
cur_state.initiating_state = new_state.clone();
Ok(new_state)
}
_ => Err(AuthorizationActionError::InvalidInitiatingMessageOrder(
AuthorizationInitiatingState::Challenge(self.clone()),
AuthorizationInitiatingAction::Challenge(action),
)),
}
}
ChallengeAuthorizationInitiatingState::ReceivedAuthChallengeNonceResponse => {
match action {
ChallengeAuthorizationInitiatingAction::SendAuthChallengeSubmitRequest => {
let new_state = AuthorizationInitiatingState::Challenge(
ChallengeAuthorizationInitiatingState::WaitingForAuthChallengeSubmitResponse,
);
cur_state.initiating_state = new_state.clone();
Ok(new_state)
}
_ => Err(AuthorizationActionError::InvalidInitiatingMessageOrder(
AuthorizationInitiatingState::Challenge(self.clone()),
AuthorizationInitiatingAction::Challenge(action),
)),
}
}
ChallengeAuthorizationInitiatingState::WaitingForAuthChallengeSubmitResponse => {
match action {
ChallengeAuthorizationInitiatingAction::ReceiveAuthChallengeSubmitResponse(
identity,
) => {
cur_state.local_authorization = Some(identity);
let new_state = AuthorizationInitiatingState::Authorized;
cur_state.initiating_state = new_state.clone();
Ok(new_state)
}
_ => Err(AuthorizationActionError::InvalidInitiatingMessageOrder(
AuthorizationInitiatingState::Challenge(self.clone()),
AuthorizationInitiatingAction::Challenge(action),
)),
}
}
}
}
}
impl fmt::Display for ChallengeAuthorizationInitiatingState {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(match self {
ChallengeAuthorizationInitiatingState::ChallengeConnecting => "ChallengeConnecting",
ChallengeAuthorizationInitiatingState::WaitingForAuthChallengeNonceResponse => {
"WaitingForAuthChallengeNonceResponse"
}
ChallengeAuthorizationInitiatingState::ReceivedAuthChallengeNonceResponse => {
"ReceivedAuthChallengeNonceResponse"
}
ChallengeAuthorizationInitiatingState::WaitingForAuthChallengeSubmitResponse => {
"WaitingForAuthChallengeSubmitResponse"
}
})
}
}