diff --git a/xplat/Sonar/SonarState.h b/xplat/Sonar/SonarState.h index 8d09d08fb..705bc3dc0 100644 --- a/xplat/Sonar/SonarState.h +++ b/xplat/Sonar/SonarState.h @@ -10,6 +10,7 @@ #include #include +#include class SonarStep; class SonarStateUpdateListener; diff --git a/xplat/Sonar/SonarWebSocketImpl.cpp b/xplat/Sonar/SonarWebSocketImpl.cpp index 0d800f287..8eb3d4cad 100644 --- a/xplat/Sonar/SonarWebSocketImpl.cpp +++ b/xplat/Sonar/SonarWebSocketImpl.cpp @@ -99,10 +99,11 @@ SonarWebSocketImpl::~SonarWebSocketImpl() { } void SonarWebSocketImpl::start() { + auto step = sonarState_->start("Start connection thread"); folly::makeFuture() .via(sonarEventBase_->getEventBase()) .delayed(std::chrono::milliseconds(0)) - .thenValue([this](auto&&){ startSync(); }); + .thenValue([this, step](auto&&){ step->complete(); startSync(); }); } void SonarWebSocketImpl::startSync() { @@ -137,6 +138,7 @@ void SonarWebSocketImpl::doCertificateExchange() { "device", deviceData_.device)("app", deviceData_.app))); address.setFromHostPort(deviceData_.host, insecurePort); + auto connectingInsecurely = sonarState_->start("Connect insecurely"); connectionIsTrusted_ = false; client_ = rsocket::RSocket::createConnectedClient( @@ -148,6 +150,7 @@ void SonarWebSocketImpl::doCertificateExchange() { nullptr, // stats std::make_shared(this)) .get(); + connectingInsecurely->complete(); ensureSonarDirExists(); requestSignedCertFromSonar(); @@ -172,6 +175,7 @@ void SonarWebSocketImpl::connectSecurely() { absoluteFilePath(PRIVATE_KEY_FILE).c_str()); sslContext->authenticate(true, false); + auto connectingSecurely = sonarState_->start("Connect securely"); connectionIsTrusted_ = true; client_ = rsocket::RSocket::createConnectedClient( @@ -185,6 +189,7 @@ void SonarWebSocketImpl::connectSecurely() { nullptr, // stats std::make_shared(this)) .get(); + connectingSecurely->complete(); failedConnectionAttempts_ = 0; } @@ -219,6 +224,7 @@ void SonarWebSocketImpl::sendMessage(const folly::dynamic& message) { } bool SonarWebSocketImpl::isCertificateExchangeNeeded() { + auto step = sonarState_->start("Check required certificates are present"); if (failedConnectionAttempts_ >= 2) { return true; } @@ -232,23 +238,29 @@ bool SonarWebSocketImpl::isCertificateExchangeNeeded() { if (caCert == "" || clientCert == "" || privateKey == "") { return true; } - + step->complete(); return false; } void SonarWebSocketImpl::requestSignedCertFromSonar() { + auto generatingCSR = sonarState_->start("Generate CSR"); generateCertSigningRequest( deviceData_.appId.c_str(), absoluteFilePath(CSR_FILE_NAME).c_str(), absoluteFilePath(PRIVATE_KEY_FILE).c_str()); + generatingCSR->complete(); + auto loadingCSR = sonarState_->start("Load CSR"); std::string csr = loadStringFromFile(absoluteFilePath(CSR_FILE_NAME)); + loadingCSR->complete(); folly::dynamic message = folly::dynamic::object("method", "signCertificate")( "csr", csr.c_str())("destination", absoluteFilePath("").c_str()); - sonarEventBase_->add([this, message]() { + auto sendingCSR = sonarState_->start("Send CSR to desktop"); + sonarEventBase_->add([this, message, sendingCSR]() { client_->getRequester() ->fireAndForget(rsocket::Payload(folly::toJson(message))) - ->subscribe([this]() { + ->subscribe([this, sendingCSR]() { + sendingCSR->complete(); // Disconnect after message sending is complete. // This will trigger a reconnect which should use the secure channel. client_ = nullptr;