tor-browser

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

HTTPSSVC.h (4822B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #ifndef HTTPSSVC_h__
      6 #define HTTPSSVC_h__
      7 
      8 #include "nsIDNSByTypeRecord.h"
      9 #include "mozilla/net/DNS.h"
     10 #include "mozilla/Variant.h"
     11 #include "mozilla/Maybe.h"
     12 #include "nsHttp.h"
     13 
     14 namespace mozilla {
     15 namespace net {
     16 
     17 class DNSHTTPSSVCRecordBase;
     18 
     19 enum SvcParamKey : uint16_t {
     20  SvcParamKeyMandatory = 0,
     21  SvcParamKeyAlpn = 1,
     22  SvcParamKeyNoDefaultAlpn = 2,
     23  SvcParamKeyPort = 3,
     24  SvcParamKeyIpv4Hint = 4,
     25  SvcParamKeyEchConfig = 5,
     26  SvcParamKeyIpv6Hint = 6,
     27  SvcParamKeyODoHConfig = 32769,
     28 };
     29 
     30 inline bool IsValidSvcParamKey(uint16_t aKey) {
     31  return aKey <= SvcParamKeyIpv6Hint || aKey == SvcParamKeyODoHConfig;
     32 }
     33 
     34 struct SvcParamAlpn {
     35  bool operator==(const SvcParamAlpn& aOther) const {
     36    return mValue == aOther.mValue;
     37  }
     38  CopyableTArray<nsCString> mValue;
     39 };
     40 
     41 struct SvcParamNoDefaultAlpn {
     42  bool operator==(const SvcParamNoDefaultAlpn& aOther) const { return true; }
     43 };
     44 
     45 struct SvcParamPort {
     46  bool operator==(const SvcParamPort& aOther) const {
     47    return mValue == aOther.mValue;
     48  }
     49  uint16_t mValue;
     50 };
     51 
     52 struct SvcParamIpv4Hint {
     53  bool operator==(const SvcParamIpv4Hint& aOther) const {
     54    return mValue == aOther.mValue;
     55  }
     56  CopyableTArray<mozilla::net::NetAddr> mValue;
     57 };
     58 
     59 struct SvcParamEchConfig {
     60  bool operator==(const SvcParamEchConfig& aOther) const {
     61    return mValue == aOther.mValue;
     62  }
     63  nsCString mValue;
     64 };
     65 
     66 struct SvcParamIpv6Hint {
     67  bool operator==(const SvcParamIpv6Hint& aOther) const {
     68    return mValue == aOther.mValue;
     69  }
     70  CopyableTArray<mozilla::net::NetAddr> mValue;
     71 };
     72 
     73 struct SvcParamODoHConfig {
     74  bool operator==(const SvcParamODoHConfig& aOther) const {
     75    return mValue == aOther.mValue;
     76  }
     77  nsCString mValue;
     78 };
     79 
     80 using SvcParamType =
     81    mozilla::Variant<Nothing, SvcParamAlpn, SvcParamNoDefaultAlpn, SvcParamPort,
     82                     SvcParamIpv4Hint, SvcParamEchConfig, SvcParamIpv6Hint,
     83                     SvcParamODoHConfig>;
     84 
     85 struct SvcFieldValue {
     86  bool operator==(const SvcFieldValue& aOther) const {
     87    return mValue == aOther.mValue;
     88  }
     89  SvcFieldValue() : mValue(AsVariant(Nothing{})) {}
     90  SvcParamType mValue;
     91 };
     92 
     93 struct SVCB {
     94  bool operator==(const SVCB& aOther) const {
     95    return mSvcFieldPriority == aOther.mSvcFieldPriority &&
     96           mSvcDomainName == aOther.mSvcDomainName &&
     97           mSvcFieldValue == aOther.mSvcFieldValue;
     98  }
     99  bool operator<(const SVCB& aOther) const;
    100  Maybe<uint16_t> GetPort() const;
    101  bool NoDefaultAlpn() const;
    102  void GetIPHints(CopyableTArray<mozilla::net::NetAddr>& aAddresses) const;
    103  nsTArray<std::tuple<nsCString, SupportedAlpnRank>> GetAllAlpn(
    104      bool& aHasNoDefaultAlpn) const;
    105  uint16_t mSvcFieldPriority = 0;
    106  nsCString mSvcDomainName;
    107  nsCString mEchConfig;
    108  nsCString mODoHConfig;
    109  bool mHasIPHints = false;
    110  bool mHasEchConfig = false;
    111  CopyableTArray<SvcFieldValue> mSvcFieldValue;
    112 };
    113 
    114 struct SVCBWrapper {
    115  explicit SVCBWrapper(const SVCB& aRecord) : mRecord(aRecord) {}
    116  Maybe<std::tuple<nsCString, SupportedAlpnRank>> mAlpn;
    117  const SVCB& mRecord;
    118 };
    119 
    120 class SVCBRecord : public nsISVCBRecord {
    121  NS_DECL_THREADSAFE_ISUPPORTS
    122  NS_DECL_NSISVCBRECORD
    123 public:
    124  explicit SVCBRecord(const SVCB& data)
    125      : mData(data), mPort(Nothing()), mAlpn(Nothing()) {}
    126  explicit SVCBRecord(const SVCB& data,
    127                      Maybe<std::tuple<nsCString, SupportedAlpnRank>> aAlpn);
    128 
    129 private:
    130  friend class DNSHTTPSSVCRecordBase;
    131 
    132  virtual ~SVCBRecord() = default;
    133 
    134  SVCB mData;
    135  Maybe<uint16_t> mPort;
    136  Maybe<std::tuple<nsCString, SupportedAlpnRank>> mAlpn;
    137 };
    138 
    139 class DNSHTTPSSVCRecordBase {
    140 public:
    141  explicit DNSHTTPSSVCRecordBase(const nsACString& aHost) : mHost(aHost) {}
    142 
    143 protected:
    144  virtual ~DNSHTTPSSVCRecordBase() = default;
    145 
    146  already_AddRefed<nsISVCBRecord> GetServiceModeRecordInternal(
    147      bool aNoHttp2, bool aNoHttp3, const nsTArray<SVCB>& aRecords,
    148      bool& aRecordsAllExcluded, bool aCheckHttp3ExcludedList,
    149      const nsACString& aCname);
    150 
    151  bool HasIPAddressesInternal(const nsTArray<SVCB>& aRecords);
    152 
    153  void GetAllRecordsInternal(bool aNoHttp2, bool aNoHttp3,
    154                             const nsACString& aCname,
    155                             const nsTArray<SVCB>& aRecords,
    156                             bool aOnlyRecordsWithECH,
    157                             bool* aAllRecordsHaveEchConfig,
    158                             bool* aAllRecordsInH3ExcludedList,
    159                             nsTArray<RefPtr<nsISVCBRecord>>& aResult,
    160                             bool aCheckHttp3ExcludedList = true);
    161 
    162  // The owner name of this HTTPS RR.
    163  nsCString mHost;
    164 };
    165 
    166 }  // namespace net
    167 }  // namespace mozilla
    168 
    169 #endif  // HTTPSSVC_h__