diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.cpp | 18 | ||||
| -rw-r--r-- | src/pairing.cpp | 20 | 
2 files changed, 24 insertions, 14 deletions
| diff --git a/src/main.cpp b/src/main.cpp index 84dfe2a..cb9002e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -128,18 +128,28 @@ void createIdentity(const vector<string> & args)  	}  } -void printAttachResult(string prefix, Peer peer, future<bool> && success) +void printPairingResult(string prefix, Peer peer, future<PairingServiceBase::Outcome> && future)  { +	auto outcome = future.get();  	ostringstream ss;  	ss << prefix << -		(success.get() ? "-done " : "-failed ") << +		(outcome == PairingServiceBase::Outcome::Success ? "-done " : "-failed ") <<  		getPeer(peer).id; +	switch (outcome) +	{ +	case PairingServiceBase::Outcome::Success: break; +	case PairingServiceBase::Outcome::PeerRejected: ss << " rejected"; break; +	case PairingServiceBase::Outcome::UserRejected: ss << " user"; break; +	case PairingServiceBase::Outcome::UnexpectedMessage: ss << " unexpected"; break; +	case PairingServiceBase::Outcome::NonceMismatch: ss << " nonce"; break; +	case PairingServiceBase::Outcome::Stale: ss << " stale"; break; +	}  	printLine(ss.str());  } -future<bool> confirmPairing(string prefix, const Peer & peer, string confirm, future<bool> && success) +future<bool> confirmPairing(string prefix, const Peer & peer, string confirm, future<PairingServiceBase::Outcome> && outcome)  { -	thread(printAttachResult, prefix, peer, move(success)).detach(); +	thread(printPairingResult, prefix, peer, move(outcome)).detach();  	promise<bool> promise;  	auto input = promise.get_future(); diff --git a/src/pairing.cpp b/src/pairing.cpp index 91e0b0f..babe886 100644 --- a/src/pairing.cpp +++ b/src/pairing.cpp @@ -29,7 +29,7 @@ PairingServiceBase::~PairingServiceBase()  		scoped_lock lock(state->lock);  		if (state->phase != StatePhase::PairingDone &&  				state->phase != StatePhase::PairingFailed) { -			state->success.set_value(false); +			state->outcome.set_value(Outcome::Stale);  			state->phase = StatePhase::PairingFailed;  		}  	} @@ -124,7 +124,7 @@ void PairingServiceBase::handle(Context & ctx)  				requestNonceFailedHook(ctx.peer());  			if (state->phase < StatePhase::PairingDone) {  				state->phase = StatePhase::PairingFailed; -				state->success.set_value(false); +				state->outcome.set_value(Outcome::NonceMismatch);  			}  			return;  		} @@ -143,7 +143,7 @@ void PairingServiceBase::handle(Context & ctx)  	else if (auto reject = rec->item("reject").asText()) {  		if (state->phase < StatePhase::PairingDone) {  			state->phase = StatePhase::PairingFailed; -			state->success.set_value(false); +			state->outcome.set_value(Outcome::PeerRejected);  		}  	} @@ -151,7 +151,7 @@ void PairingServiceBase::handle(Context & ctx)  		if (state->phase == StatePhase::OurRequestReady) {  			handlePairingResult(ctx);  			state->phase = StatePhase::PairingDone; -			state->success.set_value(true); +			state->outcome.set_value(Outcome::Success);  		} else {  			result = ctx.ref();  		} @@ -211,16 +211,16 @@ string PairingServiceBase::confirmationNumber(const vector<uint8_t> & digest)  void PairingServiceBase::waitForConfirmation(Peer peer, weak_ptr<State> wstate, string confirm, ConfirmHook hook)  { -	future<bool> success; +	future<Outcome> outcome;  	if (auto state = wstate.lock()) { -		success = state->success.get_future(); +		outcome = state->outcome.get_future();  	} else {  		return;  	}  	bool ok;  	try { -		ok = hook(peer, confirm, std::move(success)).get(); +		ok = hook(peer, confirm, std::move(outcome)).get();  	}  	catch (const std::future_error & e) {  		if (e.code() == std::future_errc::broken_promise) @@ -249,20 +249,20 @@ void PairingServiceBase::waitForConfirmation(Peer peer, weak_ptr<State> wstate,  					return ctx.local();  				});  				state->phase = StatePhase::PairingDone; -				state->success.set_value(true); +				state->outcome.set_value(Outcome::Success);  			} else {  				state->phase = StatePhase::OurRequestReady;  			}  		} else if (state->phase == StatePhase::PeerRequestConfirm) {  			peer.send(uuid(), handlePairingCompleteRef(peer));  			state->phase = StatePhase::PairingDone; -			state->success.set_value(true); +			state->outcome.set_value(Outcome::Success);  		}  	} else {  		if (state->phase != StatePhase::PairingFailed) {  			peer.send(uuid(), Object(Record({{ "reject", string() }})));  			state->phase = StatePhase::PairingFailed; -			state->success.set_value(false); +			state->outcome.set_value(Outcome::UserRejected);  		}  	}  } |