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