Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0fdfae6a authored by Henri Chataing's avatar Henri Chataing
Browse files

system/gd/security: Migrate to libbluetooth_log

Test: m com.android.btservices
Bug: 305066880
Flag: EXEMPT, mechanical refactor
Change-Id: Icea5097c45a79410aa8af2fbbf3e3a00b308ffcb
parent 8d2e64ab
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
 */
#include "security/channel/security_manager_channel.h"

#include <bluetooth/log.h>

#include "hci/address.h"

namespace bluetooth {
@@ -42,7 +44,7 @@ void SecurityManagerChannel::Connect(hci::Address address) {
  ASSERT_LOG(l2cap_security_interface_ != nullptr, "L2cap Security Interface is null!");
  auto entry = link_map_.find(address);
  if (entry != link_map_.end()) {
    LOG_WARN("Already connected to '%s'", ADDRESS_TO_LOGGABLE_CSTR(address));
    log::warn("Already connected to '{}'", ADDRESS_TO_LOGGABLE_CSTR(address));
    entry->second->Hold();
    entry->second->EnsureAuthenticated();
    return;
@@ -54,7 +56,7 @@ void SecurityManagerChannel::Connect(hci::Address address) {
void SecurityManagerChannel::Release(hci::Address address) {
  auto entry = link_map_.find(address);
  if (entry == link_map_.end()) {
    LOG_WARN("Unknown address '%s'", ADDRESS_TO_LOGGABLE_CSTR(address));
    log::warn("Unknown address '{}'", ADDRESS_TO_LOGGABLE_CSTR(address));
    return;
  }
  entry->second->Release();
@@ -64,7 +66,7 @@ void SecurityManagerChannel::Disconnect(hci::Address address) {
  outgoing_pairing_remote_devices_.erase(address);
  auto entry = link_map_.find(address);
  if (entry == link_map_.end()) {
    LOG_WARN("Unknown address '%s'", ADDRESS_TO_LOGGABLE_CSTR(address));
    log::warn("Unknown address '{}'", ADDRESS_TO_LOGGABLE_CSTR(address));
    return;
  }
  entry->second->Disconnect();
@@ -104,7 +106,7 @@ void SecurityManagerChannel::OnLinkConnected(std::unique_ptr<l2cap::classic::Lin
void SecurityManagerChannel::OnLinkDisconnected(hci::Address address) {
  auto entry = link_map_.find(address);
  if (entry == link_map_.end()) {
    LOG_WARN("Unknown address '%s'", ADDRESS_TO_LOGGABLE_CSTR(address));
    log::warn("Unknown address '{}'", ADDRESS_TO_LOGGABLE_CSTR(address));
    return;
  }
  entry->second.reset();
+2 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
 */
#include "security/channel/security_manager_channel.h"

#include <bluetooth/log.h>
#include <gtest/gtest.h>

#include "hci/address.h"
@@ -209,7 +210,7 @@ class SecurityManagerChannelCallback : public ISecurityManagerChannelListener {
  }

  void OnConnectionClosed(hci::Address address) override {
    LOG_INFO("Called");
    log::info("Called");
  }
};

+16 −14
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */
#include "security/facade.h"

#include <bluetooth/log.h>

#include "blueberry/facade/security/facade.grpc.pb.h"
#include "grpc/grpc_event_queue.h"
#include "hci/address_with_type.h"
@@ -218,13 +220,13 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
            hci::AddressWithType(peer, remote_type), request->boolean());
        break;
      case UiCallbackType::PIN:
        LOG_INFO("PIN Callback");
        log::info("PIN Callback");
        security_module_->GetSecurityManager()->OnPinEntry(
            hci::AddressWithType(peer, remote_type),
            std::vector<uint8_t>(request->pin().cbegin(), request->pin().cend()));
        break;
      default:
        LOG_ERROR("Unknown UiCallbackType %d", static_cast<int>(request->message_type()));
        log::error("Unknown UiCallbackType {}", static_cast<int>(request->message_type()));
        return ::grpc::Status(::grpc::StatusCode::INVALID_ARGUMENT, "Unknown UiCallbackType");
    }
    return ::grpc::Status::OK;
@@ -463,7 +465,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
  }

  void OobDataEventOccurred(bluetooth::hci::CommandCompleteView packet) {
    LOG_INFO("Got OOB Data event");
    log::info("Got OOB Data event");
    ASSERT(packet.IsValid());
    auto cc = bluetooth::hci::ReadLocalOobDataCompleteView::Create(packet);
    ASSERT(cc.IsValid());
@@ -496,14 +498,14 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
  }

  void DisconnectEventOccurred(bluetooth::hci::AddressWithType peer) {
    LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(peer));
    log::info("{}", ADDRESS_TO_LOGGABLE_CSTR(peer));
    DisconnectMsg msg;
    *msg.mutable_address() = ToFacadeAddressWithType(peer);
    disconnect_events_.OnIncomingEvent(msg);
  }

  void DisplayPairingPrompt(const bluetooth::hci::AddressWithType& peer, std::string /* name */) {
    LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(peer));
    log::info("{}", ADDRESS_TO_LOGGABLE_CSTR(peer));
    UiMsg display_yes_no;
    *display_yes_no.mutable_peer() = ToFacadeAddressWithType(peer);
    display_yes_no.set_message_type(UiMsgType::DISPLAY_PAIRING_PROMPT);
@@ -515,7 +517,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
    const bluetooth::hci::AddressWithType& peer = data.GetAddressWithType();
    std::string name = data.GetName();
    uint32_t numeric_value = data.GetNumericValue();
    LOG_INFO("%s value = 0x%x", ADDRESS_TO_LOGGABLE_CSTR(peer), numeric_value);
    log::info("{} value = 0x{:x}", ADDRESS_TO_LOGGABLE_CSTR(peer), numeric_value);
    UiMsg display_with_value;
    *display_with_value.mutable_peer() = ToFacadeAddressWithType(peer);
    display_with_value.set_message_type(UiMsgType::DISPLAY_YES_NO_WITH_VALUE);
@@ -527,7 +529,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
  void DisplayYesNoDialog(ConfirmationData data) override {
    const bluetooth::hci::AddressWithType& peer = data.GetAddressWithType();
    std::string name = data.GetName();
    LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(peer));
    log::info("{}", ADDRESS_TO_LOGGABLE_CSTR(peer));
    UiMsg display_yes_no;
    *display_yes_no.mutable_peer() = ToFacadeAddressWithType(peer);
    display_yes_no.set_message_type(UiMsgType::DISPLAY_YES_NO);
@@ -539,7 +541,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
    const bluetooth::hci::AddressWithType& peer = data.GetAddressWithType();
    std::string name = data.GetName();
    uint32_t passkey = data.GetNumericValue();
    LOG_INFO("%s value = 0x%x", ADDRESS_TO_LOGGABLE_CSTR(peer), passkey);
    log::info("{} value = 0x{:x}", ADDRESS_TO_LOGGABLE_CSTR(peer), passkey);
    UiMsg display_passkey;
    *display_passkey.mutable_peer() = ToFacadeAddressWithType(peer);
    display_passkey.set_message_type(UiMsgType::DISPLAY_PASSKEY);
@@ -551,7 +553,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
  void DisplayEnterPasskeyDialog(ConfirmationData data) override {
    const bluetooth::hci::AddressWithType& peer = data.GetAddressWithType();
    std::string name = data.GetName();
    LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(peer));
    log::info("{}", ADDRESS_TO_LOGGABLE_CSTR(peer));
    UiMsg display_passkey_input;
    *display_passkey_input.mutable_peer() = ToFacadeAddressWithType(peer);
    display_passkey_input.set_message_type(UiMsgType::DISPLAY_PASSKEY_ENTRY);
@@ -562,7 +564,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
  void DisplayEnterPinDialog(ConfirmationData data) override {
    const bluetooth::hci::AddressWithType& peer = data.GetAddressWithType();
    std::string name = data.GetName();
    LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(peer));
    log::info("{}", ADDRESS_TO_LOGGABLE_CSTR(peer));
    UiMsg display_pin_input;
    *display_pin_input.mutable_peer() = ToFacadeAddressWithType(peer);
    display_pin_input.set_message_type(UiMsgType::DISPLAY_PIN_ENTRY);
@@ -571,7 +573,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
  }

  void Cancel(const bluetooth::hci::AddressWithType& peer) override {
    LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(peer));
    log::info("{}", ADDRESS_TO_LOGGABLE_CSTR(peer));
    UiMsg display_cancel;
    *display_cancel.mutable_peer() = ToFacadeAddressWithType(peer);
    display_cancel.set_message_type(UiMsgType::DISPLAY_CANCEL);
@@ -580,7 +582,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
  }

  void OnDeviceBonded(hci::AddressWithType peer) override {
    LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(peer));
    log::info("{}", ADDRESS_TO_LOGGABLE_CSTR(peer));
    BondMsg bonded;
    *bonded.mutable_peer() = ToFacadeAddressWithType(peer);
    bonded.set_message_type(BondMsgType::DEVICE_BONDED);
@@ -590,7 +592,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
  void OnEncryptionStateChanged(hci::EncryptionChangeView /* encryption_change_view */) override {}

  void OnDeviceUnbonded(hci::AddressWithType peer) override {
    LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(peer));
    log::info("{}", ADDRESS_TO_LOGGABLE_CSTR(peer));
    BondMsg unbonded;
    *unbonded.mutable_peer() = ToFacadeAddressWithType(peer);
    unbonded.set_message_type(BondMsgType::DEVICE_UNBONDED);
@@ -598,7 +600,7 @@ class SecurityModuleFacadeService : public SecurityModuleFacade::Service,
  }

  void OnDeviceBondFailed(hci::AddressWithType peer, PairingFailure status) override {
    LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(peer));
    log::info("{}", ADDRESS_TO_LOGGABLE_CSTR(peer));
    BondMsg bond_failed;
    *bond_failed.mutable_peer() = ToFacadeAddressWithType(peer);
    bond_failed.set_message_type(BondMsgType::DEVICE_BOND_FAILED);
+35 −29
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include "security_manager_impl.h"

#include <android_bluetooth_sysprop.h>
#include <bluetooth/log.h>

#include "common/bind.h"
#include "hci/address_with_type.h"
@@ -46,7 +47,7 @@ void SecurityManagerImpl::DispatchPairingHandler(
      common::BindOnce(&SecurityManagerImpl::OnPairingHandlerComplete, common::Unretained(this));
  auto entry = pairing_handler_map_.find(record->GetPseudoAddress()->GetAddress());
  if (entry != pairing_handler_map_.end()) {
    LOG_WARN("Device already has a pairing handler, and is in the middle of pairing!");
    log::warn("Device already has a pairing handler, and is in the middle of pairing!");
    return;
  }
  std::shared_ptr<pairing::PairingHandler> pairing_handler = nullptr;
@@ -136,7 +137,7 @@ void SecurityManagerImpl::CreateBondOutOfBand(
  } else {
    if (!record->IsPairing()) {
      // Dispatch pairing handler, if we are calling create we are the initiator
      LOG_WARN("Dispatch #1");
      log::warn("Dispatch #1");
      DispatchPairingHandler(
          record,
          true,
@@ -194,7 +195,7 @@ void SecurityManagerImpl::RemoveBond(hci::AddressWithType device) {

void SecurityManagerImpl::SetUserInterfaceHandler(UI* user_interface, os::Handler* handler) {
  if (user_interface_ != nullptr || user_interface_handler_ != nullptr) {
    LOG_ALWAYS_FATAL("Listener has already been registered!");
    log::fatal("Listener has already been registered!");
  }
  user_interface_ = user_interface;
  user_interface_handler_ = handler;
@@ -214,7 +215,7 @@ void SecurityManagerImpl::SetLeInitiatorAddressPolicyForTest(
void SecurityManagerImpl::RegisterCallbackListener(ISecurityManagerListener* listener, os::Handler* handler) {
  for (auto it = listeners_.begin(); it != listeners_.end(); ++it) {
    if (it->first == listener) {
      LOG_ALWAYS_FATAL("Listener has already been registered!");
      log::fatal("Listener has already been registered!");
    }
  }

@@ -229,7 +230,7 @@ void SecurityManagerImpl::UnregisterCallbackListener(ISecurityManagerListener* l
    }
  }

  LOG_ALWAYS_FATAL("Listener has not been registered!");
  log::fatal("Listener has not been registered!");
}

void SecurityManagerImpl::NotifyDeviceBonded(hci::AddressWithType device) {
@@ -271,10 +272,10 @@ void SecurityManagerImpl::HandleEvent(T packet) {

    if (event_code != hci::EventCode::LINK_KEY_REQUEST && event_code != hci::EventCode::PIN_CODE_REQUEST &&
        event_code != hci::EventCode::IO_CAPABILITY_RESPONSE) {
      LOG_ERROR(
          "No classic pairing handler for device '%s' ready for command %s ",
      log::error(
          "No classic pairing handler for device '{}' ready for command {}",
          ADDRESS_TO_LOGGABLE_CSTR(bd_addr),
          hci::EventCodeText(event_code).c_str());
          hci::EventCodeText(event_code));
      return;
    }

@@ -282,7 +283,7 @@ void SecurityManagerImpl::HandleEvent(T packet) {

    auto record =
        security_database_.FindOrCreate(hci::AddressWithType{bd_addr, hci::AddressType::PUBLIC_DEVICE_ADDRESS});
    LOG_WARN("Dispatch #2");
    log::warn("Dispatch #2");
    DispatchPairingHandler(
        record,
        false,
@@ -337,7 +338,7 @@ void SecurityManagerImpl::OnHciEventReceived(hci::EventView packet) {
    case hci::EventCode::ENCRYPTION_CHANGE: {
      EncryptionChangeView encryption_change_view = EncryptionChangeView::Create(event);
      if (!encryption_change_view.IsValid()) {
        LOG_ERROR("Invalid EncryptionChange packet received");
        log::error("Invalid EncryptionChange packet received");
        return;
      }
      if (encryption_change_view.GetConnectionHandle() == pending_le_pairing_.connection_handle_) {
@@ -357,7 +358,7 @@ void SecurityManagerImpl::OnHciEventReceived(hci::EventView packet) {
void SecurityManagerImpl::OnConnectionClosed(hci::Address address) {
  auto entry = pairing_handler_map_.find(address);
  if (entry != pairing_handler_map_.end()) {
    LOG_INFO("Cancelling pairing handler for '%s'", ADDRESS_TO_LOGGABLE_CSTR(address));
    log::info("Cancelling pairing handler for '{}'", ADDRESS_TO_LOGGABLE_CSTR(address));
    entry->second->Cancel();
  }
  auto record = security_database_.FindOrCreate(hci::AddressWithType(address, hci::AddressType::PUBLIC_DEVICE_ADDRESS));
@@ -376,7 +377,7 @@ void SecurityManagerImpl::OnHciLeEvent(hci::LeMetaEventView event) {
  if (code == hci::SubeventCode::LONG_TERM_KEY_REQUEST) {
    hci::LeLongTermKeyRequestView le_long_term_key_request_view = hci::LeLongTermKeyRequestView::Create(event);
    if (!le_long_term_key_request_view.IsValid()) {
      LOG_ERROR("Invalid LeLongTermKeyRequestView packet received");
      log::error("Invalid LeLongTermKeyRequestView packet received");
      return;
    }

@@ -385,13 +386,13 @@ void SecurityManagerImpl::OnHciLeEvent(hci::LeMetaEventView event) {
      return;
    }

    LOG_INFO("Unhandled HCI LE security event, code %s", hci::SubeventCodeText(code).c_str());
    log::info("Unhandled HCI LE security event, code {}", hci::SubeventCodeText(code));
    return;
  }

  // hci::SubeventCode::READ_LOCAL_P256_PUBLIC_KEY_COMPLETE,
  // hci::SubeventCode::GENERATE_DHKEY_COMPLETE,
  LOG_ERROR("Unhandled HCI LE security event, code %s", hci::SubeventCodeText(code).c_str());
  log::error("Unhandled HCI LE security event, code {}", hci::SubeventCodeText(code));
}

void SecurityManagerImpl::OnPairingPromptAccepted(const bluetooth::hci::AddressWithType& address, bool confirmed) {
@@ -430,10 +431,10 @@ void SecurityManagerImpl::OnPasskeyEntry(const bluetooth::hci::AddressWithType&
void SecurityManagerImpl::OnPinEntry(const bluetooth::hci::AddressWithType& address, std::vector<uint8_t> pin) {
  auto entry = pairing_handler_map_.find(address.GetAddress());
  if (entry != pairing_handler_map_.end()) {
    LOG_INFO("PIN for %s", ADDRESS_TO_LOGGABLE_CSTR(address));
    log::info("PIN for {}", ADDRESS_TO_LOGGABLE_CSTR(address));
    entry->second->OnPinEntry(address, pin);
  } else {
    LOG_WARN("No handler found for PIN for %s", ADDRESS_TO_LOGGABLE_CSTR(address));
    log::warn("No handler found for PIN for {}", ADDRESS_TO_LOGGABLE_CSTR(address));
    // TODO(jpawlowski): Implement LE version
  }
}
@@ -490,7 +491,7 @@ bool SecurityManagerImpl::EraseStoredLeChannel(const hci::AddressWithType& devic
void SecurityManagerImpl::OnSmpCommandLe(hci::AddressWithType device) {
  LeFixedChannelEntry* stored_chan = FindStoredLeChannel(device);
  if (!stored_chan) {
    LOG_ALWAYS_FATAL("Received SMP command for unknown channel");
    log::fatal("Received SMP command for unknown channel");
    return;
  }

@@ -498,7 +499,7 @@ void SecurityManagerImpl::OnSmpCommandLe(hci::AddressWithType device) {

  auto packet = channel->GetQueueUpEnd()->TryDequeue();
  if (!packet) {
    LOG_ERROR("Received dequeue, but no data ready...");
    log::error("Received dequeue, but no data ready...");
    return;
  }

@@ -511,13 +512,13 @@ void SecurityManagerImpl::OnSmpCommandLe(hci::AddressWithType device) {

  // no pending pairing attempt
  if (!temp_cmd_view.IsValid()) {
    LOG_ERROR("Invalid Command packet");
    log::error("Invalid Command packet");
    return;
  }

  if (temp_cmd_view.GetCode() == Code::SECURITY_REQUEST) {
    // TODO: either start encryption or pairing
    LOG_WARN("Unhandled security request!!!");
    log::warn("Unhandled security request!!!");
    return;
  }

@@ -525,7 +526,7 @@ void SecurityManagerImpl::OnSmpCommandLe(hci::AddressWithType device) {
  if (temp_cmd_view.GetCode() == Code::PAIRING_REQUEST && my_role == hci::Role::PERIPHERAL) {
    // TODO: if (pending_le_pairing_) { do not start another }

    LOG_INFO("start of security request handling!");
    log::info("start of security request handling!");

    stored_chan->channel_->Acquire();

@@ -652,7 +653,7 @@ void SecurityManagerImpl::OnConnectionClosedLe(
  if (pending_le_pairing_.address_ != address) {
    LeFixedChannelEntry* stored_chan = FindStoredLeChannel(address);
    if (!stored_chan) {
      LOG_ALWAYS_FATAL("Received connection closed for unknown channel");
      log::fatal("Received connection closed for unknown channel");
      return;
    }
    stored_chan->channel_->GetQueueUpEnd()->UnregisterDequeue();
@@ -704,7 +705,9 @@ SecurityManagerImpl::SecurityManagerImpl(
}

void SecurityManagerImpl::OnPairingFinished(security::PairingResultOrFailure pairing_result) {
  LOG_INFO(" ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Received pairing result");
  log::info(
      "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Received "
      "pairing result");

  LeFixedChannelEntry* stored_chan = FindStoredLeChannel(pending_le_pairing_.address_);
  if (stored_chan) {
@@ -713,8 +716,10 @@ void SecurityManagerImpl::OnPairingFinished(security::PairingResultOrFailure pai

  if (std::holds_alternative<PairingFailure>(pairing_result)) {
    PairingFailure failure = std::get<PairingFailure>(pairing_result);
    LOG_INFO(" ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ failure message: %s",
             failure.message.c_str());
    log::info(
        "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ failure "
        "message: {}",
        failure.message);
    if (stored_chan) {
      NotifyDeviceBondFailed(stored_chan->channel_->GetDevice(), failure);
    }
@@ -722,7 +727,7 @@ void SecurityManagerImpl::OnPairingFinished(security::PairingResultOrFailure pai
  }

  auto result = std::get<PairingResult>(pairing_result);
  LOG_INFO("Pairing with %s was successful", ADDRESS_TO_LOGGABLE_CSTR(result.connection_address));
  log::info("Pairing with {} was successful", ADDRESS_TO_LOGGABLE_CSTR(result.connection_address));

  // TODO: ensure that the security level is not weaker than what we already have.
  auto record = this->security_database_.FindOrCreate(result.connection_address);
@@ -832,7 +837,7 @@ void SecurityManagerImpl::InternalEnforceSecurityPolicy(
      return;
  }

  LOG_WARN("Dispatch #3");
  log::warn("Dispatch #3");
  DispatchPairingHandler(
      record,
      true,
@@ -845,7 +850,8 @@ void SecurityManagerImpl::InternalEnforceSecurityPolicy(
void SecurityManagerImpl::UpdateLinkSecurityCondition(hci::AddressWithType remote) {
  auto entry = enforce_security_policy_callback_map_.find(remote);
  if (entry == enforce_security_policy_callback_map_.end()) {
    LOG_ERROR("No L2CAP security policy callback pending for %s", ADDRESS_TO_LOGGABLE_CSTR(remote));
    log::error(
        "No L2CAP security policy callback pending for {}", ADDRESS_TO_LOGGABLE_CSTR(remote));
    return;
  }
  std::move(entry->second.callback_).Invoke(IsSecurityRequirementSatisfied(remote, entry->second.policy_));
@@ -870,7 +876,7 @@ void SecurityManagerImpl::EnforceSecurityPolicy(
    hci::AddressWithType remote,
    l2cap::classic::SecurityPolicy policy,
    l2cap::classic::SecurityEnforcementInterface::ResultCallback result_callback) {
  LOG_INFO("Attempting to enforce security policy");
  log::info("Attempting to enforce security policy");
  auto record = security_database_.FindOrCreate(remote);
  if (!record->IsPairing()) {
    this->InternalEnforceSecurityPolicy(remote, policy, std::move(result_callback));
+46 −43

File changed.

Preview size limit exceeded, changes collapsed.

Loading