#ifndef NET_DNS_RECORD_RDATA_H_
#define NET_DNS_RECORD_RDATA_H_
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/check_op.h"
#include "base/compiler_specific.h"
#include "base/strings/string_piece.h"
#include "net/base/io_buffer.h"
#include "net/base/ip_address.h"
#include "net/base/net_export.h"
#include "net/dns/public/dns_protocol.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/boringssl/src/include/openssl/sha.h"
namespace net {
class DnsRecordParser;
class NET_EXPORT RecordRdata {
public:
virtual ~RecordRdata() = default;
static bool HasValidSize(base::StringPiece data, uint16_t type);
virtual bool IsEqual(const RecordRdata* other) const = 0;
virtual uint16_t Type() const = 0;
};
class NET_EXPORT_PRIVATE SrvRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeSRV;
SrvRecordRdata(const SrvRecordRdata&) = delete;
SrvRecordRdata& operator=(const SrvRecordRdata&) = delete;
~SrvRecordRdata() override;
static std::unique_ptr<SrvRecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
uint16_t priority() const { return priority_; }
uint16_t weight() const { return weight_; }
uint16_t port() const { return port_; }
const std::string& target() const { return target_; }
private:
SrvRecordRdata();
uint16_t priority_ = 0;
uint16_t weight_ = 0;
uint16_t port_ = 0;
std::string target_;
};
class NET_EXPORT ARecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeA;
ARecordRdata(const ARecordRdata&) = delete;
ARecordRdata& operator=(const ARecordRdata&) = delete;
~ARecordRdata() override;
static std::unique_ptr<ARecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
const IPAddress& address() const { return address_; }
private:
ARecordRdata();
IPAddress address_;
};
class NET_EXPORT AAAARecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeAAAA;
AAAARecordRdata(const AAAARecordRdata&) = delete;
AAAARecordRdata& operator=(const AAAARecordRdata&) = delete;
~AAAARecordRdata() override;
static std::unique_ptr<AAAARecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
const IPAddress& address() const { return address_; }
private:
AAAARecordRdata();
IPAddress address_;
};
class NET_EXPORT_PRIVATE CnameRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeCNAME;
CnameRecordRdata(const CnameRecordRdata&) = delete;
CnameRecordRdata& operator=(const CnameRecordRdata&) = delete;
~CnameRecordRdata() override;
static std::unique_ptr<CnameRecordRdata> Create(
base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
const std::string& cname() const { return cname_; }
private:
CnameRecordRdata();
std::string cname_;
};
class NET_EXPORT_PRIVATE PtrRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypePTR;
PtrRecordRdata(const PtrRecordRdata&) = delete;
PtrRecordRdata& operator=(const PtrRecordRdata&) = delete;
~PtrRecordRdata() override;
static std::unique_ptr<PtrRecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
std::string ptrdomain() const { return ptrdomain_; }
private:
PtrRecordRdata();
std::string ptrdomain_;
};
class NET_EXPORT_PRIVATE TxtRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeTXT;
TxtRecordRdata(const TxtRecordRdata&) = delete;
TxtRecordRdata& operator=(const TxtRecordRdata&) = delete;
~TxtRecordRdata() override;
static std::unique_ptr<TxtRecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
const std::vector<std::string>& texts() const { return texts_; }
private:
TxtRecordRdata();
std::vector<std::string> texts_;
};
class NET_EXPORT_PRIVATE NsecRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeNSEC;
NsecRecordRdata(const NsecRecordRdata&) = delete;
NsecRecordRdata& operator=(const NsecRecordRdata&) = delete;
~NsecRecordRdata() override;
static std::unique_ptr<NsecRecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
uint16_t bitmap_length() const {
DCHECK_LE(bitmap_.size(), 32u);
return static_cast<uint16_t>(bitmap_.size() * 8);
}
bool GetBit(unsigned i) const;
private:
NsecRecordRdata();
std::vector<uint8_t> bitmap_;
};
}
#endif