This commit is contained in:
Sven Luethi committed 2021-05-07 21:51:40 +02:00
1 parent af592f2082
commit c0b549631c
6 files changed
+239 -190

No files matched your search

-72
View File
@@ -1,72 +0,0 @@
#include "Record.hpp"
namespace Plains {
namespace Core {
namespace DNS {
Record::Record(const uint16_t id) : _id(id) {
_os = new ostream(&_sb);
*_os << "NOT IMPLEMENTED";
}
Record::~Record() {
delete _os;
}
ostream& Record::serialze() {
return *_os;
}
ARecord::ARecord() : Record(1) {}
AAAARecord::AAAARecord() : Record(28) {}
AFSDBRecord::AFSDBRecord() : Record(18) {}
APLRecord::APLRecord() : Record(42) {}
CAARecord::CAARecord() : Record(257) {}
CDNSKEYRecord::CDNSKEYRecord() : Record(60) {}
CDSRecord::CDSRecord() : Record(59) {}
CERTRecord::CERTRecord() : Record(37) {}
CNAMERecord::CNAMERecord() : Record(5) {}
CSYNCRecord::CSYNCRecord() : Record(62) {}
DHCIDRecord::DHCIDRecord() : Record(49) {}
DLVRecord::DLVRecord() : Record(32769) {}
DNAMERecord::DNAMERecord() : Record(39) {}
DNSKEYRecord::DNSKEYRecord() : Record(48) {}
DSRecord::DSRecord() : Record(43) {}
EUI48Record::EUI48Record() : Record(108) {}
EUI64Record::EUI64Record() : Record(109) {}
HINFORecord::HINFORecord() : Record(13) {}
HIPRecord::HIPRecord() : Record(55) {}
IPSECKEYRecord::IPSECKEYRecord() : Record(45) {}
KEYRecord::KEYRecord() : Record(25) {}
KXRecord::KXRecord() : Record(36) {}
LOCRecord::LOCRecord() : Record(29) {}
MXRecord::MXRecord() : Record(15) {}
NAPTRRecord::NAPTRRecord() : Record(35) {}
NSRecord::NSRecord() : Record(2) {}
NSECRecord::NSECRecord() : Record(47) {}
NSEC3Record::NSEC3Record() : Record(50) {}
NSEC3PARAMRecord::NSEC3PARAMRecord() : Record(51) {}
OPENPGPKEYRecord::OPENPGPKEYRecord() : Record(61) {}
PTRRecord::PTRRecord() : Record(12) {}
RRSIGRecord::RRSIGRecord() : Record(46) {}
RPRecord::RPRecord() : Record(17) {}
SIGRecord::SIGRecord() : Record(24) {}
SMIMEARecord::SMIMEARecord() : Record(53) {}
SOARecord::SOARecord() : Record(6) {}
SRVRecord::SRVRecord() : Record(33) {}
SSHFPRecord::SSHFPRecord() : Record(44) {}
TARecord::TARecord() : Record(32768) {}
TKEYRecord::TKEYRecord() : Record(249) {}
TLSARecord::TLSARecord() : Record(52) {}
TSIGRecord::TSIGRecord() : Record(250) {}
TXTRecord::TXTRecord() : Record(16) {}
URIRecord::URIRecord() : Record(256) {}
ZONEMDRecord::ZONEMDRecord() : Record(63) {}
SVCBRecord::SVCBRecord() : Record(64) {}
HTTPSRecord::HTTPSRecord() : Record(65) {}
}}}
+72
View File
@@ -0,0 +1,72 @@
#include "Record.hpp"
namespace Plains {
namespace Core {
namespace DNS {
ResourceRecord::ResourceRecord(const uint16_t id) : _id(id) {
_os = new ostream(&_sb);
*_os << "NOT IMPLEMENTED";
}
ResourceRecord::~ResourceRecord() {
delete _os;
}
ostream& ResourceRecord::serialze() {
return *_os;
}
ARecord::ARecord() : ResourceRecord(1) {}
AAAARecord::AAAARecord() : ResourceRecord(28) {}
AFSDBRecord::AFSDBRecord() : ResourceRecord(18) {}
APLRecord::APLRecord() : ResourceRecord(42) {}
CAARecord::CAARecord() : ResourceRecord(257) {}
CDNSKEYRecord::CDNSKEYRecord() : ResourceRecord(60) {}
CDSRecord::CDSRecord() : ResourceRecord(59) {}
CERTRecord::CERTRecord() : ResourceRecord(37) {}
CNAMERecord::CNAMERecord() : ResourceRecord(5) {}
CSYNCRecord::CSYNCRecord() : ResourceRecord(62) {}
DHCIDRecord::DHCIDRecord() : ResourceRecord(49) {}
DLVRecord::DLVRecord() : ResourceRecord(32769) {}
DNAMERecord::DNAMERecord() : ResourceRecord(39) {}
DNSKEYRecord::DNSKEYRecord() : ResourceRecord(48) {}
DSRecord::DSRecord() : ResourceRecord(43) {}
EUI48Record::EUI48Record() : ResourceRecord(108) {}
EUI64Record::EUI64Record() : ResourceRecord(109) {}
HINFORecord::HINFORecord() : ResourceRecord(13) {}
HIPRecord::HIPRecord() : ResourceRecord(55) {}
IPSECKEYRecord::IPSECKEYRecord() : ResourceRecord(45) {}
KEYRecord::KEYRecord() : ResourceRecord(25) {}
KXRecord::KXRecord() : ResourceRecord(36) {}
LOCRecord::LOCRecord() : ResourceRecord(29) {}
MXRecord::MXRecord() : ResourceRecord(15) {}
NAPTRRecord::NAPTRRecord() : ResourceRecord(35) {}
NSRecord::NSRecord() : ResourceRecord(2) {}
NSECRecord::NSECRecord() : ResourceRecord(47) {}
NSEC3Record::NSEC3Record() : ResourceRecord(50) {}
NSEC3PARAMRecord::NSEC3PARAMRecord() : ResourceRecord(51) {}
OPENPGPKEYRecord::OPENPGPKEYRecord() : ResourceRecord(61) {}
PTRRecord::PTRRecord() : ResourceRecord(12) {}
RRSIGRecord::RRSIGRecord() : ResourceRecord(46) {}
RPRecord::RPRecord() : ResourceRecord(17) {}
SIGRecord::SIGRecord() : ResourceRecord(24) {}
SMIMEARecord::SMIMEARecord() : ResourceRecord(53) {}
SOARecord::SOARecord() : ResourceRecord(6) {}
SRVRecord::SRVRecord() : ResourceRecord(33) {}
SSHFPRecord::SSHFPRecord() : ResourceRecord(44) {}
TARecord::TARecord() : ResourceRecord(32768) {}
TKEYRecord::TKEYRecord() : ResourceRecord(249) {}
TLSARecord::TLSARecord() : ResourceRecord(52) {}
TSIGRecord::TSIGRecord() : ResourceRecord(250) {}
TXTRecord::TXTRecord() : ResourceRecord(16) {}
URIRecord::URIRecord() : ResourceRecord(256) {}
ZONEMDRecord::ZONEMDRecord() : ResourceRecord(63) {}
SVCBRecord::SVCBRecord() : ResourceRecord(64) {}
HTTPSRecord::HTTPSRecord() : ResourceRecord(65) {}
}}}
-81
View File
@@ -1,81 +0,0 @@
#ifndef RECORD_HPP
#define RECORD_HPP
#include <cstdint>
#include "Resource.hpp"
#include <iostream>
#include <sstream>
#include <memory>
namespace Plains {
namespace Core {
namespace DNS {
using std::ostream;
using std::stringbuf;
// Provides an abstract class for dns records that may be stored in the database
class Record : public Resource
{
public:
const uint16_t _id;
ostream& serialze();
Record(const uint16_t id);
~Record();
private:
stringbuf _sb;
ostream* _os;
};
class ARecord : public Record { ARecord(); };
class AAAARecord : public Record { AAAARecord(); };
class AFSDBRecord : public Record { AFSDBRecord(); };
class APLRecord : public Record { APLRecord(); };
class CAARecord : public Record { CAARecord(); };
class CDNSKEYRecord : public Record { CDNSKEYRecord(); };
class CDSRecord : public Record { CDSRecord(); };
class CERTRecord : public Record { CERTRecord(); };
class CNAMERecord : public Record { CNAMERecord(); };
class CSYNCRecord : public Record { CSYNCRecord(); };
class DHCIDRecord : public Record { DHCIDRecord(); };
class DLVRecord : public Record { DLVRecord(); };
class DNAMERecord : public Record { DNAMERecord(); };
class DNSKEYRecord : public Record { DNSKEYRecord(); };
class DSRecord : public Record { DSRecord(); };
class EUI48Record : public Record { EUI48Record(); };
class EUI64Record : public Record { EUI64Record(); };
class HINFORecord : public Record { HINFORecord(); };
class HIPRecord : public Record { HIPRecord(); };
class IPSECKEYRecord : public Record { IPSECKEYRecord(); };
class KEYRecord : public Record { KEYRecord(); };
class KXRecord : public Record { KXRecord(); };
class LOCRecord : public Record { LOCRecord(); };
class MXRecord : public Record { MXRecord(); };
class NAPTRRecord : public Record { NAPTRRecord(); };
class NSRecord : public Record { NSRecord(); };
class NSECRecord : public Record { NSECRecord(); };
class NSEC3Record : public Record { NSEC3Record(); };
class NSEC3PARAMRecord : public Record { NSEC3PARAMRecord(); };
class OPENPGPKEYRecord : public Record { OPENPGPKEYRecord(); };
class PTRRecord : public Record { PTRRecord(); };
class RRSIGRecord : public Record { RRSIGRecord(); };
class RPRecord : public Record { RPRecord(); };
class SIGRecord : public Record { SIGRecord(); };
class SMIMEARecord : public Record { SMIMEARecord(); };
class SOARecord : public Record { SOARecord(); };
class SRVRecord : public Record { SRVRecord(); };
class SSHFPRecord : public Record { SSHFPRecord(); };
class TARecord : public Record { TARecord(); };
class TKEYRecord : public Record { TKEYRecord(); };
class TLSARecord : public Record { TLSARecord(); };
class TSIGRecord : public Record { TSIGRecord(); };
class TXTRecord : public Record { TXTRecord(); };
class URIRecord : public Record { URIRecord(); };
class ZONEMDRecord : public Record { ZONEMDRecord(); };
class SVCBRecord : public Record { SVCBRecord(); };
class HTTPSRecord : public Record { HTTPSRecord(); };
}}}
#endif
+81
View File
@@ -0,0 +1,81 @@
#ifndef RESOURCE_RECORD_HPP
#define RESOURCE_RECORD_HPP
#include <cstdint>
#include "Resource.hpp"
#include <iostream>
#include <sstream>
#include <memory>
namespace Plains {
namespace Core {
namespace DNS {
using std::ostream;
using std::stringbuf;
// Provides an abstract class for dns records that may be stored in the database
class ResourceRecord : public Resource
{
public:
const uint16_t _id;
ostream& serialze();
ResourceRecord(const uint16_t id);
~ResourceRecord();
private:
stringbuf _sb;
ostream* _os;
};
class ARecord : public ResourceRecord { ARecord(); };
class AAAARecord : public ResourceRecord { AAAARecord(); };
class AFSDBRecord : public ResourceRecord { AFSDBRecord(); };
class APLRecord : public ResourceRecord { APLRecord(); };
class CAARecord : public ResourceRecord { CAARecord(); };
class CDNSKEYRecord : public ResourceRecord { CDNSKEYRecord(); };
class CDSRecord : public ResourceRecord { CDSRecord(); };
class CERTRecord : public ResourceRecord { CERTRecord(); };
class CNAMERecord : public ResourceRecord { CNAMERecord(); };
class CSYNCRecord : public ResourceRecord { CSYNCRecord(); };
class DHCIDRecord : public ResourceRecord { DHCIDRecord(); };
class DLVRecord : public ResourceRecord { DLVRecord(); };
class DNAMERecord : public ResourceRecord { DNAMERecord(); };
class DNSKEYRecord : public ResourceRecord { DNSKEYRecord(); };
class DSRecord : public ResourceRecord { DSRecord(); };
class EUI48Record : public ResourceRecord { EUI48Record(); };
class EUI64Record : public ResourceRecord { EUI64Record(); };
class HINFORecord : public ResourceRecord { HINFORecord(); };
class HIPRecord : public ResourceRecord { HIPRecord(); };
class IPSECKEYRecord : public ResourceRecord { IPSECKEYRecord(); };
class KEYRecord : public ResourceRecord { KEYRecord(); };
class KXRecord : public ResourceRecord { KXRecord(); };
class LOCRecord : public ResourceRecord { LOCRecord(); };
class MXRecord : public ResourceRecord { MXRecord(); };
class NAPTRRecord : public ResourceRecord { NAPTRRecord(); };
class NSRecord : public ResourceRecord { NSRecord(); };
class NSECRecord : public ResourceRecord { NSECRecord(); };
class NSEC3Record : public ResourceRecord { NSEC3Record(); };
class NSEC3PARAMRecord : public ResourceRecord { NSEC3PARAMRecord(); };
class OPENPGPKEYRecord : public ResourceRecord { OPENPGPKEYRecord(); };
class PTRRecord : public ResourceRecord { PTRRecord(); };
class RRSIGRecord : public ResourceRecord { RRSIGRecord(); };
class RPRecord : public ResourceRecord { RPRecord(); };
class SIGRecord : public ResourceRecord { SIGRecord(); };
class SMIMEARecord : public ResourceRecord { SMIMEARecord(); };
class SOARecord : public ResourceRecord { SOARecord(); };
class SRVRecord : public ResourceRecord { SRVRecord(); };
class SSHFPRecord : public ResourceRecord { SSHFPRecord(); };
class TARecord : public ResourceRecord { TARecord(); };
class TKEYRecord : public ResourceRecord { TKEYRecord(); };
class TLSARecord : public ResourceRecord { TLSARecord(); };
class TSIGRecord : public ResourceRecord { TSIGRecord(); };
class TXTRecord : public ResourceRecord { TXTRecord(); };
class URIRecord : public ResourceRecord { URIRecord(); };
class ZONEMDRecord : public ResourceRecord { ZONEMDRecord(); };
class SVCBRecord : public ResourceRecord { SVCBRecord(); };
class HTTPSRecord : public ResourceRecord { HTTPSRecord(); };
}}}
#endif
+53 -25
View File
@@ -4,33 +4,61 @@
namespace Plains { namespace Plains {
namespace Resolver { namespace Resolver {
unsigned Message::Header::id() const { return ntohs(_id); }
unsigned Message::Header::rCode() const { return ntohs(_rCode); }
unsigned Message::Header::qdCount() const { return ntohs(_qdCount); }
unsigned Message::Header::anCount() const { return ntohs(_anCount); }
unsigned Message::Header::nsCount() const { return ntohs(_nsCount); }
unsigned Message::Header::arCount() const { return ntohs(_arCount); }
unsigned Message::Header::opCode() const { return ntohs(_opCode); }
bool Message::Header::rd() const { return ntohs(_rd); }
bool Message::Header::aa() const { return ntohs(_aa); }
bool Message::Header::tc() const { return ntohs(_tc); }
bool Message::Header::ra() const { return ntohs(_ra); }
bool Message::Header::qr() const { return ntohs(_qr); }
void Message::Header::id (unsigned value) { _id = htons(value); }
void Message::Header::rCode (unsigned value) { _rCode = htons(value); }
void Message::Header::qdCount(unsigned value) { _qdCount = htons(value); }
void Message::Header::anCount(unsigned value) { _anCount = htons(value); }
void Message::Header::nsCount(unsigned value) { _nsCount = htons(value); }
void Message::Header::arCount(unsigned value) { _arCount = htons(value); }
void Message::Header::opCode (unsigned value) { _opCode = htons(value); }
void Message::Header::rd (RD::FLAG flag) { _rd = flag; }
void Message::Header::aa (AA::FLAG flag) { _aa = flag; }
void Message::Header::tc (TC::FLAG flag) { _tc = flag; }
void Message::Header::ra (RA::FLAG flag) { _ra = flag; }
void Message::Header::qr (QR::FLAG flag) { _qr = flag; }
size_t Message::size() { return 12; } Message::Message() {
_id = 0;
_qr = 0;
_opCode = 0;
_aa = 0;
_tc = 0;
_rd = 0;
_ra = 0;
_rCode = 0;
_qdCount = 0;
_anCount = 0;
_nsCount = 0;
_arCount = 0;
}
Message::Message(const Buffer& buffer) { decodeMessage(buffer); }
unsigned Message::id() const { return _id; }
unsigned Message::rCode() const { return _rCode; }
unsigned Message::qdCount() const { return _qdCount; }
unsigned Message::anCount() const { return _anCount; }
unsigned Message::nsCount() const { return _nsCount; }
unsigned Message::arCount() const { return _arCount; }
unsigned Message::opCode() const { return _opCode; }
bool Message::rd() const { return _rd; }
bool Message::aa() const { return _aa; }
bool Message::tc() const { return _tc; }
bool Message::ra() const { return _ra; }
bool Message::qr() const { return _qr; }
void Message::id (unsigned value) { _id = value; }
void Message::rCode (unsigned value) { _rCode = value; }
void Message::qdCount(unsigned value) { _qdCount = value; }
void Message::anCount(unsigned value) { _anCount = value; }
void Message::nsCount(unsigned value) { _nsCount = value; }
void Message::arCount(unsigned value) { _arCount = value; }
void Message::opCode (unsigned value) { _opCode = value; }
void Message::rd (RD::FLAG flag) { _rd = flag; }
void Message::aa (AA::FLAG flag) { _aa = flag; }
void Message::tc (TC::FLAG flag) { _tc = flag; }
void Message::ra (RA::FLAG flag) { _ra = flag; }
void Message::qr (QR::FLAG flag) { _qr = flag; }
unique_ptr<Buffer> Message::encodeMessage() const; {
//Encode message
}
void Message::decode(const Buffer& buffer) {
//Interprete Buffer
//buffer.size
//buffer.data
//ntohs & htons
}
+33 -12
View File
@@ -1,21 +1,16 @@
#ifndef MESSAGE_HPP #ifndef MESSAGE_HPP
#define MESSAGE_HPP #define MESSAGE_HPP
#include <cstddef> #include <cstddef>
#include <memory>
namespace Plains { namespace Plains {
namespace Resolver { namespace Resolver {
using std::size_t; using std::size_t;
using std::unique_ptr;
class Message class Message
{ {
public:
Message();
size_t size();
public: //change to private after debugging
class Header {
public:
/* /*
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
@@ -32,6 +27,8 @@ class Message
| ARCOUNT | | ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*/ */
public:
struct RCode { enum FLAG { NO_ERR, FORMAT_ERR, SERVER_FAIL, NAME_ERR, NOT_IMPL, REFUSED, YX_DOM, YX_RR_SET, NX_RR_SET, NOT_AUTH, NOT_ZONE }; }; struct RCode { enum FLAG { NO_ERR, FORMAT_ERR, SERVER_FAIL, NAME_ERR, NOT_IMPL, REFUSED, YX_DOM, YX_RR_SET, NX_RR_SET, NOT_AUTH, NOT_ZONE }; };
struct OpCode { enum FLAG { QUERY, IQUERY, STATUS, reserved, NOTIFY, UPDATE }; }; struct OpCode { enum FLAG { QUERY, IQUERY, STATUS, reserved, NOTIFY, UPDATE }; };
struct QR { enum FLAG { QUERY, RESPONSE }; }; struct QR { enum FLAG { QUERY, RESPONSE }; };
@@ -40,6 +37,14 @@ class Message
struct RD { enum FLAG { NOT_DESIRED, DESIRED }; }; struct RD { enum FLAG { NOT_DESIRED, DESIRED }; };
struct RA { enum FLAG { NOT_AVAILABLE, AVAILABLE }; }; struct RA { enum FLAG { NOT_AVAILABLE, AVAILABLE }; };
struct Buffer {
size_t size;
void* data;
};
Message();
Message(const Buffer& buffer);
unsigned id() const; // Identifyer unsigned id() const; // Identifyer
unsigned rCode() const; // Response Code unsigned rCode() const; // Response Code
unsigned qdCount() const; // Question Count unsigned qdCount() const; // Question Count
@@ -52,6 +57,7 @@ class Message
bool tc() const; // Truncation Flag bool tc() const; // Truncation Flag
bool rd() const; // Recursion Desired Flag bool rd() const; // Recursion Desired Flag
bool ra() const; // Recursion Available Flag bool ra() const; // Recursion Available Flag
unique_ptr<Buffer> encodeMessage() const; // Creates network byte-orderd message to be sent
void id (unsigned value); void id (unsigned value);
void rCode (unsigned value); void rCode (unsigned value);
@@ -65,7 +71,10 @@ class Message
void tc(TC::FLAG flag); void tc(TC::FLAG flag);
void rd(RD::FLAG flag); void rd(RD::FLAG flag);
void ra(RA::FLAG flag); void ra(RA::FLAG flag);
void decodeMessage(const Buffer& buffer);
private:
struct Header {
private: private:
unsigned _id : 16; //Identifier: A 16-bit identification field generated by the device that creates the DNS query. It is copied by the server into the response, so it can be used by that device to match that query to the corresponding reply received from a DNS server. This is used in a manner similar to how the Identifier field is used in many of the ICMP message types. unsigned _id : 16; //Identifier: A 16-bit identification field generated by the device that creates the DNS query. It is copied by the server into the response, so it can be used by that device to match that query to the corresponding reply received from a DNS server. This is used in a manner similar to how the Identifier field is used in many of the ICMP message types.
bool _qr : 1; //Query/Response Flag: Differentiates between queries and responses. Set to 0 when the query is generated; changed to 1 when that query is changed to a response by a replying server. bool _qr : 1; //Query/Response Flag: Differentiates between queries and responses. Set to 0 when the query is generated; changed to 1 when that query is changed to a response by a replying server.
@@ -80,13 +89,25 @@ class Message
unsigned _anCount : 16; //Answer Record Count: Specifies the number of resource records in the Answer section of the message. unsigned _anCount : 16; //Answer Record Count: Specifies the number of resource records in the Answer section of the message.
unsigned _nsCount : 16; //Authority Record Count: Specifies the number of resource records in the Authority section of the message. (“NS” stands for “name server”, of course. J) unsigned _nsCount : 16; //Authority Record Count: Specifies the number of resource records in the Authority section of the message. (“NS” stands for “name server”, of course. J)
unsigned _arCount : 16; //Additional Record Count: Specifies the number of resource records in the Additional section of the message. unsigned _arCount : 16; //Additional Record Count: Specifies the number of resource records in the Additional section of the message.
} header; };
struct Question {} question; unsigned _id;
struct Answer {} answer; bool _qr;
struct Authority {} authority; unsigned _opCode;
struct Additional {} additional; bool _aa;
bool _tc;
bool _rd;
bool _ra;
unsigned _rCode;
unsigned _qdCount;
unsigned _anCount;
unsigned _nsCount;
unsigned _arCount;
vector<ResourceRecord> _question;
vector<ResourceRecord> _answer;
vector<ResourceRecord> _authority;
vector<ResourceRecord> _additional;
}; };