tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

MockNetworkLayerController.cpp (3587B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "MockNetworkLayerController.h"
      8 
      9 #include "mozilla/ClearOnShutdown.h"
     10 #include "mozilla/net/SocketProcessParent.h"
     11 #include "nsIOService.h"
     12 #include "nsNetAddr.h"
     13 
     14 namespace mozilla::net {
     15 
     16 static StaticRefPtr<MockNetworkLayerController> gController;
     17 
     18 bool FindNetAddrOverride(const NetAddr& aInput, NetAddr& aOutput) {
     19  RefPtr<MockNetworkLayerController> controller = gController;
     20  if (!controller) {
     21    return false;
     22  }
     23 
     24  nsAutoCString addrPort;
     25  aInput.ToAddrPortString(addrPort);
     26  AutoReadLock lock(controller->mLock);
     27  return controller->mNetAddrOverrides.Get(addrPort, &aOutput);
     28 }
     29 
     30 bool FindBlockedUDPAddr(const NetAddr& aInput) {
     31  RefPtr<MockNetworkLayerController> controller = gController;
     32  if (!controller) {
     33    return false;
     34  }
     35 
     36  nsAutoCString addrPort;
     37  aInput.ToAddrPortString(addrPort);
     38  AutoReadLock lock(controller->mLock);
     39  return controller->mBlockedUDPAddresses.Contains(addrPort);
     40 }
     41 
     42 // static
     43 already_AddRefed<nsIMockNetworkLayerController>
     44 MockNetworkLayerController::GetSingleton() {
     45  if (gController) {
     46    return do_AddRef(gController);
     47  }
     48 
     49  gController = new MockNetworkLayerController();
     50  ClearOnShutdown(&gController);
     51  return do_AddRef(gController);
     52 }
     53 
     54 NS_IMPL_ISUPPORTS(MockNetworkLayerController, nsIMockNetworkLayerController)
     55 
     56 NS_IMETHODIMP MockNetworkLayerController::CreateScriptableNetAddr(
     57    const nsACString& aIP, uint16_t aPort, nsINetAddr** aResult) {
     58  NetAddr rawAddr;
     59  if (NS_FAILED(rawAddr.InitFromString(aIP))) {
     60    return NS_ERROR_FAILURE;
     61  }
     62 
     63  rawAddr.inet.port = PR_htons(aPort);
     64 
     65  RefPtr<nsNetAddr> netaddr = new nsNetAddr(&rawAddr);
     66  netaddr.forget(aResult);
     67  return NS_OK;
     68 }
     69 
     70 NS_IMETHODIMP MockNetworkLayerController::AddNetAddrOverride(nsINetAddr* aFrom,
     71                                                             nsINetAddr* aTo) {
     72  MOZ_ASSERT(NS_IsMainThread());
     73 
     74  NetAddr fromAddr;
     75  aFrom->GetNetAddr(&fromAddr);
     76  NetAddr toAddr;
     77  aTo->GetNetAddr(&toAddr);
     78  nsAutoCString addrPort;
     79  fromAddr.ToAddrPortString(addrPort);
     80  {
     81    AutoWriteLock lock(mLock);
     82    mNetAddrOverrides.InsertOrUpdate(addrPort, toAddr);
     83  }
     84  if (nsIOService::UseSocketProcess()) {
     85    RefPtr<SocketProcessParent> parent = SocketProcessParent::GetSingleton();
     86    if (parent) {
     87      (void)parent->SendAddNetAddrOverride(fromAddr, toAddr);
     88    }
     89  }
     90  return NS_OK;
     91 }
     92 
     93 NS_IMETHODIMP MockNetworkLayerController::ClearNetAddrOverrides() {
     94  MOZ_ASSERT(NS_IsMainThread());
     95  {
     96    AutoWriteLock lock(mLock);
     97    mNetAddrOverrides.Clear();
     98  }
     99  if (nsIOService::UseSocketProcess()) {
    100    RefPtr<SocketProcessParent> parent = SocketProcessParent::GetSingleton();
    101    if (parent) {
    102      (void)parent->SendClearNetAddrOverrides();
    103    }
    104  }
    105  return NS_OK;
    106 }
    107 
    108 NS_IMETHODIMP MockNetworkLayerController::BlockUDPAddrIO(nsINetAddr* aAddr) {
    109  MOZ_ASSERT(NS_IsMainThread());
    110 
    111  NetAddr addr;
    112  aAddr->GetNetAddr(&addr);
    113  nsAutoCString addrPort;
    114  addr.ToAddrPortString(addrPort);
    115  {
    116    AutoWriteLock lock(mLock);
    117    mBlockedUDPAddresses.Insert(addrPort);
    118  }
    119 
    120  return NS_OK;
    121 }
    122 
    123 NS_IMETHODIMP MockNetworkLayerController::ClearBlockedUDPAddr() {
    124  MOZ_ASSERT(NS_IsMainThread());
    125 
    126  AutoWriteLock lock(mLock);
    127  mBlockedUDPAddresses.Clear();
    128  return NS_OK;
    129 }
    130 
    131 }  // namespace mozilla::net