tor-browser

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

NeckoMessageUtils.h (7663B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #ifndef mozilla_net_NeckoMessageUtils_h
      7 #define mozilla_net_NeckoMessageUtils_h
      8 
      9 #include "ipc/EnumSerializer.h"
     10 #include "ipc/IPCMessageUtils.h"
     11 #include "ipc/IPCMessageUtilsSpecializations.h"
     12 #include "mozilla/net/ClassOfService.h"
     13 #include "mozilla/net/DNS.h"
     14 #include "nsExceptionHandler.h"
     15 #include "nsICacheInfoChannel.h"
     16 #include "nsIDNSService.h"
     17 #include "nsIHttpChannel.h"
     18 #include "nsITRRSkipReason.h"
     19 #include "nsPrintfCString.h"
     20 #include "nsString.h"
     21 #include "prio.h"
     22 #include "mozilla/net/HttpTransactionShell.h"
     23 
     24 namespace IPC {
     25 
     26 // nsIPermissionManager utilities
     27 
     28 struct Permission {
     29  nsCString origin, type;
     30  uint32_t capability, expireType;
     31  int64_t expireTime;
     32 
     33  Permission() : capability(0), expireType(0), expireTime(0) {}
     34 
     35  Permission(const nsCString& aOrigin, const nsACString& aType,
     36             const uint32_t aCapability, const uint32_t aExpireType,
     37             const int64_t aExpireTime)
     38      : origin(aOrigin),
     39        type(aType),
     40        capability(aCapability),
     41        expireType(aExpireType),
     42        expireTime(aExpireTime) {}
     43 
     44  bool operator==(const Permission& aOther) const {
     45    return aOther.origin == origin && aOther.type == type &&
     46           aOther.capability == capability && aOther.expireType == expireType &&
     47           aOther.expireTime == expireTime;
     48  }
     49 };
     50 
     51 template <>
     52 struct ParamTraits<Permission> {
     53  static void Write(MessageWriter* aWriter, const Permission& aParam) {
     54    WriteParam(aWriter, aParam.origin);
     55    WriteParam(aWriter, aParam.type);
     56    WriteParam(aWriter, aParam.capability);
     57    WriteParam(aWriter, aParam.expireType);
     58    WriteParam(aWriter, aParam.expireTime);
     59  }
     60 
     61  static bool Read(MessageReader* aReader, Permission* aResult) {
     62    return ReadParam(aReader, &aResult->origin) &&
     63           ReadParam(aReader, &aResult->type) &&
     64           ReadParam(aReader, &aResult->capability) &&
     65           ReadParam(aReader, &aResult->expireType) &&
     66           ReadParam(aReader, &aResult->expireTime);
     67  }
     68 };
     69 
     70 template <>
     71 struct ParamTraits<mozilla::net::NetAddr> {
     72  static void Write(MessageWriter* aWriter,
     73                    const mozilla::net::NetAddr& aParam) {
     74    WriteParam(aWriter, aParam.raw.family);
     75    if (aParam.raw.family == AF_UNSPEC) {
     76      aWriter->WriteBytes(aParam.raw.data, sizeof(aParam.raw.data));
     77    } else if (aParam.raw.family == AF_INET) {
     78      WriteParam(aWriter, aParam.inet.port);
     79      WriteParam(aWriter, aParam.inet.ip);
     80    } else if (aParam.raw.family == AF_INET6) {
     81      WriteParam(aWriter, aParam.inet6.port);
     82      WriteParam(aWriter, aParam.inet6.flowinfo);
     83      WriteParam(aWriter, aParam.inet6.ip.u64[0]);
     84      WriteParam(aWriter, aParam.inet6.ip.u64[1]);
     85      WriteParam(aWriter, aParam.inet6.scope_id);
     86 #if defined(XP_UNIX)
     87    } else if (aParam.raw.family == AF_LOCAL) {
     88      // Train's already off the rails:  let's get a stack trace at least...
     89      MOZ_CRASH(
     90          "Error: please post stack trace to "
     91          "https://bugzilla.mozilla.org/show_bug.cgi?id=661158");
     92      aWriter->WriteBytes(aParam.local.path, sizeof(aParam.local.path));
     93 #endif
     94    } else {
     95      if (XRE_IsParentProcess()) {
     96        CrashReporter::RecordAnnotationU32(
     97            CrashReporter::Annotation::UnknownNetAddrSocketFamily,
     98            aParam.raw.family);
     99      }
    100 
    101      MOZ_CRASH("Unknown socket family");
    102    }
    103  }
    104 
    105  static bool Read(MessageReader* aReader, mozilla::net::NetAddr* aResult) {
    106    if (!ReadParam(aReader, &aResult->raw.family)) return false;
    107 
    108    if (aResult->raw.family == AF_UNSPEC) {
    109      return aReader->ReadBytesInto(&aResult->raw.data,
    110                                    sizeof(aResult->raw.data));
    111    } else if (aResult->raw.family == AF_INET) {
    112      return ReadParam(aReader, &aResult->inet.port) &&
    113             ReadParam(aReader, &aResult->inet.ip);
    114    } else if (aResult->raw.family == AF_INET6) {
    115      return ReadParam(aReader, &aResult->inet6.port) &&
    116             ReadParam(aReader, &aResult->inet6.flowinfo) &&
    117             ReadParam(aReader, &aResult->inet6.ip.u64[0]) &&
    118             ReadParam(aReader, &aResult->inet6.ip.u64[1]) &&
    119             ReadParam(aReader, &aResult->inet6.scope_id);
    120 #if defined(XP_UNIX)
    121    } else if (aResult->raw.family == AF_LOCAL) {
    122      return aReader->ReadBytesInto(&aResult->local.path,
    123                                    sizeof(aResult->local.path));
    124 #endif
    125    }
    126 
    127    /* We've been tricked by some socket family we don't know about! */
    128    return false;
    129  }
    130 };
    131 
    132 template <>
    133 struct ParamTraits<nsIRequest::TRRMode>
    134    : public ContiguousEnumSerializerInclusive<nsIRequest::TRRMode,
    135                                               nsIRequest::TRR_DEFAULT_MODE,
    136                                               nsIRequest::TRR_ONLY_MODE> {};
    137 
    138 template <>
    139 struct ParamTraits<nsITRRSkipReason::value>
    140    : public ContiguousEnumSerializerInclusive<
    141          nsITRRSkipReason::value, nsITRRSkipReason::value::TRR_UNSET,
    142          nsITRRSkipReason::value::eLAST_VALUE> {};
    143 
    144 template <>
    145 struct ParamTraits<nsIDNSService::DNSFlags>
    146    : public BitFlagsEnumSerializer<
    147          nsIDNSService::DNSFlags, nsIDNSService::DNSFlags::ALL_DNSFLAGS_BITS> {
    148 };
    149 
    150 template <>
    151 struct ParamTraits<nsIDNSService::ResolverMode>
    152    : public ContiguousEnumSerializerInclusive<
    153          nsIDNSService::ResolverMode,
    154          nsIDNSService::ResolverMode::MODE_NATIVEONLY,
    155          nsIDNSService::ResolverMode::MODE_TRROFF> {};
    156 
    157 template <>
    158 struct ParamTraits<nsIClassOfService::FetchPriority>
    159    : public ContiguousEnumSerializerInclusive<
    160          nsIClassOfService::FetchPriority,
    161          nsIClassOfService::FETCHPRIORITY_UNSET,
    162          nsIClassOfService::FETCHPRIORITY_HIGH> {};
    163 
    164 template <>
    165 struct ParamTraits<mozilla::net::ClassOfService> {
    166  typedef mozilla::net::ClassOfService paramType;
    167 
    168  static void Write(MessageWriter* aWriter, const paramType& aParam) {
    169    WriteParam(aWriter, aParam.mClassFlags);
    170    WriteParam(aWriter, aParam.mIncremental);
    171    WriteParam(aWriter, aParam.mFetchPriority);
    172  }
    173 
    174  static bool Read(MessageReader* aReader, paramType* aResult) {
    175    if (!ReadParam(aReader, &aResult->mClassFlags) ||
    176        !ReadParam(aReader, &aResult->mIncremental) ||
    177        !ReadParam(aReader, &aResult->mFetchPriority))
    178      return false;
    179 
    180    return true;
    181  }
    182 };
    183 
    184 template <>
    185 struct ParamTraits<struct mozilla::net::LNAPerms> {
    186  typedef struct mozilla::net::LNAPerms paramType;
    187 
    188  static void Write(MessageWriter* aWriter, const paramType& aParam) {
    189    WriteParam(aWriter, aParam.mLocalHostPermission);
    190    WriteParam(aWriter, aParam.mLocalNetworkPermission);
    191  }
    192 
    193  static bool Read(MessageReader* aReader, paramType* aResult) {
    194    if (!ReadParam(aReader, &aResult->mLocalHostPermission) ||
    195        !ReadParam(aReader, &aResult->mLocalNetworkPermission))
    196      return false;
    197 
    198    return true;
    199  }
    200 };
    201 
    202 template <>
    203 struct ParamTraits<mozilla::net::LNAPermission>
    204    : public ContiguousEnumSerializerInclusive<
    205          mozilla::net::LNAPermission, mozilla::net::LNAPermission::Granted,
    206          mozilla::net::LNAPermission::Pending> {};
    207 
    208 template <>
    209 struct ParamTraits<nsICacheInfoChannel::CacheDisposition>
    210    : public ContiguousEnumSerializer<
    211          nsICacheInfoChannel::CacheDisposition,
    212          nsICacheInfoChannel::kCacheUnresolved,
    213          nsICacheInfoChannel::kCacheDispositionEnd> {};
    214 
    215 }  // namespace IPC
    216 
    217 #endif  // mozilla_net_NeckoMessageUtils_h