diff --git a/xplat/Flipper/ConnectionContextStore.cpp b/xplat/Flipper/ConnectionContextStore.cpp index b3697dd81..b1d448ab2 100644 --- a/xplat/Flipper/ConnectionContextStore.cpp +++ b/xplat/Flipper/ConnectionContextStore.cpp @@ -44,10 +44,19 @@ bool ConnectionContextStore::hasRequiredFiles() { } std::string ConnectionContextStore::getCertificateSigningRequest() { + // Use in-memory CSR if already loaded if (csr != "") { return csr; } - resetFlipperDir(); + + // Attempt to load existing CSR from previous run of the app + csr = loadStringFromFile(absoluteFilePath(CSR_FILE_NAME)); + if (csr != "") { + return csr; + } + + // Clean all state and generate a new one + resetState(); bool success = generateCertSigningRequest( deviceData_.appId.c_str(), absoluteFilePath(CSR_FILE_NAME).c_str(), @@ -104,7 +113,11 @@ std::string ConnectionContextStore::getCertificateDirectoryPath() { return absoluteFilePath(""); } -bool ConnectionContextStore::resetFlipperDir() { +bool ConnectionContextStore::resetState() { + // Clear in-memory state + csr = ""; + + // Delete state from disk std::string dirPath = absoluteFilePath(""); struct stat info; if (stat(dirPath.c_str(), &info) != 0) { diff --git a/xplat/Flipper/ConnectionContextStore.h b/xplat/Flipper/ConnectionContextStore.h index eb4043eee..bb4baa9bb 100644 --- a/xplat/Flipper/ConnectionContextStore.h +++ b/xplat/Flipper/ConnectionContextStore.h @@ -27,13 +27,13 @@ public: std::string getCertificateDirectoryPath(); std::string getDeviceId(); void storeConnectionConfig(folly::dynamic& config); + bool resetState(); private: DeviceData deviceData_; std::string csr = ""; std::string absoluteFilePath(const char* filename); - bool resetFlipperDir(); }; } // namespace flipper diff --git a/xplat/Flipper/FlipperConnectionManagerImpl.cpp b/xplat/Flipper/FlipperConnectionManagerImpl.cpp index 8458a458b..9cbcfb5e9 100644 --- a/xplat/Flipper/FlipperConnectionManagerImpl.cpp +++ b/xplat/Flipper/FlipperConnectionManagerImpl.cpp @@ -187,6 +187,10 @@ void FlipperConnectionManagerImpl::doCertificateExchange() { .get(); connectingInsecurely->complete(); + auto resettingState = flipperState_->start("Reset state"); + contextStore_->resetState(); + resettingState->complete(); + requestSignedCertFromFlipper(); }