Skip to content

Commit 396f0c3

Browse files
author
Damir Zainullin
committed
++
1 parent 280d3f0 commit 396f0c3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+3305
-1144
lines changed

process-plugin-api/ipAddress.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ union IPAddress {
1919
constexpr IPAddress() noexcept
2020
{
2121
std::memset(&u8, 0, sizeof(IPAddress));
22-
};
22+
}
2323

2424
constexpr IPAddress(const uint32_t ipv4) noexcept
2525
{
2626
u32[0] = ipv4;
2727
u32[1] = 0;
2828
u32[2] = u32[3] = std::numeric_limits<uint32_t>::max();
29-
};
29+
}
3030

3131
constexpr IPAddress(const std::array<uint8_t, 16>& ipv6) noexcept
3232
{
3333
u8 = ipv6;
34-
};
34+
}
3535

3636
constexpr bool isIPv4() const noexcept
3737
{
File renamed without changes.

process-plugin-api/process/dns/src/dnsHeaderFlags.hpp renamed to process-plugin-api/process/common/dnsParser/dnsHeaderFlags.hpp

File renamed without changes.
File renamed without changes.
File renamed without changes.

process-plugin-api/process/dns/src/dnsParser.cpp renamed to process-plugin-api/process/common/dnsParser/dnsParser.cpp

Lines changed: 85 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,43 @@ bool parseDnsOverTCPLength(std::span<const std::byte> payload) noexcept
3535
return dnsDataLength;
3636
}
3737

38+
constexpr static
39+
std::optional<std::size_t>
40+
parseSection(
41+
std::span<const std::byte> payload,
42+
std::span<const std::byte> fullDNSPayload,
43+
const uint16_t recordCount,
44+
std::function<bool(const DNSRecord& record)>& recordCallback) noexcept
45+
{
46+
const std::byte* lastRecordPayloadEnd = payload.data();
47+
DNSSectionReader reader(payload, fullDNSPayload, recordCount);
48+
49+
std::ranges::for_each(reader,
50+
[&recordCallback, &lastRecordPayloadEnd, needToCallCallback = true]
51+
(const DNSRecord& record) mutable {
52+
lastRecordPayloadEnd = record.data.getSpan().end();
53+
if (needToCallCallback) {
54+
needToCallCallback = !recordCallback(record);
55+
}
56+
});
57+
58+
/*if (!parsedSection->records.empty()) {
59+
m_firstAnswer = parsedSection->records[0];
60+
}*/
61+
62+
return lastRecordPayloadEnd - payload.data();
63+
}
64+
3865
constexpr
3966
bool DnsParser::parse(
40-
std::span<const std::byte> payload, const bool isDnsOverTCP) noexcept
67+
std::span<const std::byte> payload,
68+
const bool isDnsOverTCP,
69+
std::function<bool(const DNSQuestion& query)>& queryCallback,
70+
std::function<bool(const DNSRecord& answer)>& answerCallback,
71+
std::function<bool(const DNSRecord& authorityRecord)>& authorityCallback,
72+
std::function<bool(const DNSRecord& additionalRecord)>& additionalCallback
73+
) noexcept
4174
{
42-
const std::byte* dnsBegin = payload.data();
4375
if (isDnsOverTCP) {
4476
const std::optional<uint16_t> dnsDataLength
4577
= parseDnsOverTCPLength(payload);
@@ -48,47 +80,61 @@ bool DnsParser::parse(
4880
return false;
4981
}
5082
payload = payload.subspan(sizeof(uint16_t), *dnsDataLength);
51-
dnsBegin = payload.data();
83+
5284
}
5385

86+
fullDNSPayload = payload;
87+
5488
const std::optional<DNSHeader> header = parseHeader(payload);
5589
if (!header.has_value()) {
5690
return false;
5791
}
58-
m_answersCount = ntohs(header->answerRecordCount);
59-
m_id = header->id;
60-
m_responseCode = header->flags.responseCode;
92+
answersCount = ntohs(header->answerRecordCount);
93+
id = header->id;
94+
responseCode = header->flags.responseCode;
6195

62-
const std::span<const std::byte> originalDNSPayload = payload;
6396
constexpr std::size_t questionSectionOffset = sizeof(DNSHeader);
6497
const std::optional<std::size_t> questionSectionSize = parseQuestionSection(
65-
originalDNSPayload,
66-
originalDNSPayload.subspan(questionSectionOffset),
67-
ntohs(header->questionRecordCount));
98+
payload.subspan(questionSectionOffset),
99+
fullDNSPayload,
100+
ntohs(header->questionRecordCount),
101+
queryCallback);
68102
if (!questionSectionSize.has_value()) {
69103
return false;
70104
}
71105

72106
const std::size_t answerSectionOffset
73107
= questionSectionOffset + *questionSectionSize;
74108
const std::optional<std::size_t> answerSectionSize
75-
= parseAnswerSection(payload.subspan(answerSectionOffset), dnsBegin, *header);
109+
= parseSection(
110+
payload.subspan(answerSectionOffset),
111+
fullDNSPayload,
112+
ntohs(header->answerRecordCount),
113+
answerCallback);
76114
if (!answerSectionSize.has_value()) {
77115
return false;
78116
}
79117

80118
const std::size_t authoritySectionOffset
81119
= questionSectionOffset + *parseQuestionSection;
82120
const std::optional<std::size_t> authoritySectionSize
83-
= parseAuthorityResourceRecordsSection(payload.subspan(authoritySectionOffset), dnsBegin, *header);
121+
= parseSection(
122+
payload.subspan(authoritySectionOffset),
123+
fullDNSPayload,
124+
ntohs(header->authorityRecordCount),
125+
authorityCallback);
84126
if (!authoritySectionSize.has_value()) {
85127
return false;
86128
}
87129

88130
const std::size_t additionalSectionOffset
89131
= authoritySectionOffset + *authoritySectionSize;
90132
const std::optional<std::size_t> additionalSectionSize
91-
= parseAdditionalResourceRecordsSection(payload.subspan(additionalSectionOffset), dnsBegin, *header);
133+
= parseSection(
134+
payload.subspan(additionalSectionOffset),
135+
fullDNSPayload,
136+
ntohs(header->additionalRecordCount),
137+
additionalCallback);
92138
if (!additionalSectionSize.has_value()) {
93139
return false;
94140
}
@@ -108,13 +154,17 @@ std::optional<DNSHeader> parseHeader(std::span<const std::byte> payload) noexcep
108154
constexpr
109155
std::optional<std::size_t> DnsParser::parseQuestionSection(
110156
std::span<const std::byte> payload,
111-
const std::byte* dnsBegin,
112-
const uint16_t questionCount) noexcept
157+
std::span<const std::byte> fullDNSPayload,
158+
const uint16_t questionCount,
159+
std::function<bool(const DNSQuestion& query)>& queryCallback) noexcept
113160
{
114-
for (size_t questionIndex = 0; questionIndex < questionCount;
115-
questionIndex++) {
161+
const std::byte* queriesBegin = payload.data();
162+
bool needToCallCallback = true;
163+
164+
for (size_t questionIndex = 0; questionIndex < questionCount; questionIndex++) {
116165

117-
const std::optional<DNSName> name = DNSName::createFrom(payload, dnsBegin);
166+
const std::optional<DNSName> name
167+
= DNSName::createFrom(payload, fullDNSPayload);
118168
if (!name.has_value()) {
119169
return std::nullopt;
120170
}
@@ -129,17 +179,23 @@ std::optional<std::size_t> DnsParser::parseQuestionSection(
129179

130180
payload = payload.subspan(name->length() + 2 * sizeof(uint16_t));
131181

132-
if (questionIndex == 0) {
133-
m_parsedFirstQuestion = {ParsedQuestion {
134-
.name = *name,
135-
.type = queryType,
136-
.recordClass = queryClass}};
137-
}
138-
}
182+
if (needToCallCallback) {
183+
needToCallCallback = !queryCallback(DNSQuery{
184+
.name = *name,
185+
.type = queryType,
186+
.class = queryClass
187+
});
188+
}
189+
/*if (questionIndex == 0) {
190+
m_parsedFirstQuestion = {ParsedQuestion {
191+
.name = *name,
192+
.type = queryType,
193+
.recordClass = queryClass}};
194+
}*/
139195

140-
return static_cast<std::size_t>(questionBegin - m_dnsData.data());
196+
return static_cast<std::size_t>(payload.data() - queriesBegin);
141197
}
142-
198+
/*
143199
constexpr
144200
std::optional<std::size_t>
145201
DnsParser::parseAnswerSection(
@@ -208,7 +264,7 @@ DnsParser::parseAdditionalResourceRecordsSection(
208264
}
209265
210266
return parsedSection->records.back().data.end() - payload.data().begin();
211-
}
267+
}*/
212268

213-
} // namespace ipxp2
269+
} // namespace ipxp
214270

process-plugin-api/process/dns/src/dnsParser.hpp renamed to process-plugin-api/process/common/dnsParser/dnsParser.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,19 @@ class DnsParser {
3434
* @return True of parsed successfully, false otherwise
3535
*/
3636
constexpr bool parse(
37-
std::span<const std::byte> payload, const bool isDnsOverTCP) noexcept;
37+
std::span<const std::byte> payload, const bool isDnsOverTCP,
38+
std::function<bool(const DNSQuestion& query)>& queryCallback,
39+
std::function<bool(const DNSRecord& answer)>& answerCallback,
40+
std::function<bool(const DNSRecord& authorityRecord)>& authorityCallback,
41+
std::function<bool(const DNSRecord& additionalRecord)>& additionalCallback) noexcept;
3842

3943
uint16_t answersCount;
4044
uint16_t id;
4145
uint8_t responseCode;
4246
std::optional<DNSQuestion> firstQuestion;
4347
std::optional<DNSRecord> firstAnswer;
4448
std::optional<OPTRecord> firstOPTRecord;
45-
const std::byte* dnsBegin;
49+
std::span<const std::byte> fullDNSPayload;
4650

4751

4852
private:

process-plugin-api/process/dns/src/dnsQueryType.hpp renamed to process-plugin-api/process/common/dnsParser/dnsQueryType.hpp

File renamed without changes.

process-plugin-api/process/dns/src/dnsQuestion.hpp renamed to process-plugin-api/process/common/dnsParser/dnsQuestion.hpp

File renamed without changes.

process-plugin-api/process/dns/src/dnsRecord.hpp renamed to process-plugin-api/process/common/dnsParser/dnsRecord.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "dnsName.hpp"
99
#include "dnsQueryType.hpp"
10+
#include "dnsRecordPayload.hpp"
1011

1112
namespace ipxp
1213
{
@@ -19,9 +20,7 @@ struct DNSRecord {
1920
DNSQueryType type;
2021
uint16_t recordClass;
2122
uint32_t timeToLive;
22-
std::span<const std::byte> data;
23-
24-
std::string toString() const noexcept;
23+
DNSRecordPayload payload;
2524
};
2625

2726
} // namespace ipxp

0 commit comments

Comments
 (0)