tor-browser

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

NativeDNSResolverOverrideParent.cpp (3687B)


      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 "NativeDNSResolverOverrideParent.h"
      8 
      9 #include "mozilla/ClearOnShutdown.h"
     10 #include "mozilla/net/SocketProcessParent.h"
     11 #include "nsIOService.h"
     12 #include "DNS.h"
     13 
     14 namespace mozilla {
     15 namespace net {
     16 
     17 NS_IMPL_ISUPPORTS(NativeDNSResolverOverrideParent, nsINativeDNSResolverOverride)
     18 
     19 static StaticRefPtr<NativeDNSResolverOverrideParent>
     20    gNativeDNSResolverOverrideParent;
     21 
     22 // static
     23 already_AddRefed<nsINativeDNSResolverOverride>
     24 NativeDNSResolverOverrideParent::GetSingleton() {
     25  if (gNativeDNSResolverOverrideParent) {
     26    return do_AddRef(gNativeDNSResolverOverrideParent);
     27  }
     28 
     29  if (!gIOService) {
     30    return nullptr;
     31  }
     32 
     33  gNativeDNSResolverOverrideParent = new NativeDNSResolverOverrideParent();
     34  ClearOnShutdown(&gNativeDNSResolverOverrideParent);
     35 
     36  auto initTask = []() {
     37    RefPtr<SocketProcessParent> socketParent =
     38        SocketProcessParent::GetSingleton();
     39    (void)socketParent->SendPNativeDNSResolverOverrideConstructor(
     40        gNativeDNSResolverOverrideParent);
     41  };
     42  gIOService->CallOrWaitForSocketProcess(initTask);
     43  return do_AddRef(gNativeDNSResolverOverrideParent);
     44 }
     45 
     46 NS_IMETHODIMP NativeDNSResolverOverrideParent::AddIPOverride(
     47    const nsACString& aHost, const nsACString& aIPLiteral) {
     48  NetAddr tempAddr;
     49  if (!aIPLiteral.Equals("N/A"_ns) &&
     50      NS_FAILED(tempAddr.InitFromString(aIPLiteral))) {
     51    return NS_ERROR_UNEXPECTED;
     52  }
     53 
     54  RefPtr<NativeDNSResolverOverrideParent> self = this;
     55  nsCString host(aHost);
     56  nsCString ip(aIPLiteral);
     57  auto task = [self{std::move(self)}, host = std::move(host),
     58               ip = std::move(ip)]() {
     59    (void)self->SendAddIPOverride(host, ip);
     60  };
     61  gIOService->CallOrWaitForSocketProcess(task);
     62  return NS_OK;
     63 }
     64 
     65 NS_IMETHODIMP NativeDNSResolverOverrideParent::AddHTTPSRecordOverride(
     66    const nsACString& aHost, const uint8_t* aData, uint32_t aLength) {
     67  nsCString host(aHost);
     68  CopyableTArray<uint8_t> data(aData, aLength);
     69  auto task = [self = RefPtr{this}, host = std::move(host),
     70               data = std::move(data)]() {
     71    (void)self->SendAddHTTPSRecordOverride(host, data);
     72  };
     73  gIOService->CallOrWaitForSocketProcess(std::move(task));
     74  return NS_OK;
     75 }
     76 
     77 NS_IMETHODIMP NativeDNSResolverOverrideParent::SetCnameOverride(
     78    const nsACString& aHost, const nsACString& aCNAME) {
     79  if (aCNAME.IsEmpty()) {
     80    return NS_ERROR_UNEXPECTED;
     81  }
     82 
     83  RefPtr<NativeDNSResolverOverrideParent> self = this;
     84  nsCString host(aHost);
     85  nsCString cname(aCNAME);
     86  auto task = [self{std::move(self)}, host = std::move(host),
     87               cname = std::move(cname)]() {
     88    (void)self->SendSetCnameOverride(host, cname);
     89  };
     90  gIOService->CallOrWaitForSocketProcess(task);
     91  return NS_OK;
     92 }
     93 
     94 NS_IMETHODIMP NativeDNSResolverOverrideParent::ClearHostOverride(
     95    const nsACString& aHost) {
     96  RefPtr<NativeDNSResolverOverrideParent> self = this;
     97  nsCString host(aHost);
     98  auto task = [self{std::move(self)}, host = std::move(host)]() {
     99    (void)self->SendClearHostOverride(host);
    100  };
    101  gIOService->CallOrWaitForSocketProcess(task);
    102  return NS_OK;
    103 }
    104 
    105 NS_IMETHODIMP NativeDNSResolverOverrideParent::ClearOverrides() {
    106  RefPtr<NativeDNSResolverOverrideParent> self = this;
    107  auto task = [self{std::move(self)}]() { (void)self->SendClearOverrides(); };
    108  gIOService->CallOrWaitForSocketProcess(task);
    109  return NS_OK;
    110 }
    111 
    112 }  // namespace net
    113 }  // namespace mozilla