Summary: This change fixes a bug with the handled flag during the certificate exchange process. Explanation: handled was passed by reference as &handled Once the function goes out of scope then the reference, well, it just becomes invalid (undefined behaviour) In some cases, it appears as 'handled' because the reference is invalid and it happens to be 'true'. Changelog: Fixed an issue where clients would randomly not connect to Flipper. Please update FlipperKit to 0.110.0 to apply the fix: https://fbflipper.com/docs/getting-started/react-native#using-the-latest-flipper-sdk Reviewed By: mweststrate Differential Revision: D31017592 fbshipit-source-id: c087a769fa23de1acfd3c198b4db4d6ccdb2be90
89 lines
2.3 KiB
C++
89 lines
2.3 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <folly/Executor.h>
|
|
#include <folly/io/async/EventBase.h>
|
|
#include <mutex>
|
|
#include "FlipperConnectionManager.h"
|
|
#include "FlipperInitConfig.h"
|
|
#include "FlipperSocket.h"
|
|
#include "FlipperState.h"
|
|
|
|
namespace facebook {
|
|
namespace flipper {
|
|
|
|
class ConnectionEvents;
|
|
class ConnectionContextStore;
|
|
class FlipperRSocketResponder;
|
|
class FlipperConnectionManagerWrapper;
|
|
class FlipperConnectionManagerImpl : public FlipperConnectionManager {
|
|
friend ConnectionEvents;
|
|
|
|
public:
|
|
FlipperConnectionManagerImpl(
|
|
FlipperInitConfig config,
|
|
std::shared_ptr<FlipperState> state,
|
|
std::shared_ptr<ConnectionContextStore> contextStore);
|
|
|
|
~FlipperConnectionManagerImpl();
|
|
|
|
void start() override;
|
|
|
|
void stop() override;
|
|
|
|
bool isOpen() const override;
|
|
|
|
void setCallbacks(Callbacks* callbacks) override;
|
|
|
|
void sendMessage(const folly::dynamic& message) override;
|
|
|
|
void onMessageReceived(
|
|
const folly::dynamic& message,
|
|
std::unique_ptr<FlipperResponder> responder) override;
|
|
|
|
void reconnect();
|
|
void setCertificateProvider(
|
|
const std::shared_ptr<FlipperCertificateProvider> provider) override;
|
|
std::shared_ptr<FlipperCertificateProvider> getCertificateProvider() override;
|
|
|
|
private:
|
|
bool isOpen_ = false;
|
|
bool isStarted_ = false;
|
|
std::shared_ptr<FlipperCertificateProvider> certProvider_ = nullptr;
|
|
Callbacks* callbacks_;
|
|
DeviceData deviceData_;
|
|
std::shared_ptr<FlipperState> flipperState_;
|
|
int insecurePort;
|
|
int securePort;
|
|
|
|
folly::EventBase* flipperEventBase_;
|
|
folly::EventBase* connectionEventBase_;
|
|
|
|
std::unique_ptr<FlipperSocket> client_;
|
|
|
|
bool connectionIsTrusted_;
|
|
bool certificateExchangeCompleted_ = false;
|
|
|
|
int failedConnectionAttempts_ = 0;
|
|
std::shared_ptr<ConnectionContextStore> contextStore_;
|
|
std::shared_ptr<FlipperConnectionManagerWrapper> implWrapper_;
|
|
|
|
void startSync();
|
|
bool connectAndExchangeCertificate();
|
|
bool connectSecurely();
|
|
bool isCertificateExchangeNeeded();
|
|
void requestSignedCertFromFlipper();
|
|
bool isRunningInOwnThread();
|
|
void sendLegacyCertificateRequest(folly::dynamic message);
|
|
std::string getDeviceId();
|
|
};
|
|
|
|
} // namespace flipper
|
|
} // namespace facebook
|