Browse Source

Use constructors instead of static methods to parse DNS packets

develop
Robin Thoni 6 years ago
parent
commit
9be539af34

+ 3
- 1
src/modules/dns-base/CMakeLists.txt View File

21
         includes/dns-base/QDnsResourceRecord.h
21
         includes/dns-base/QDnsResourceRecord.h
22
         src/QDnsPacket.cpp
22
         src/QDnsPacket.cpp
23
         includes/dns-base/QDnsPacket.h
23
         includes/dns-base/QDnsPacket.h
24
-        includes/dns-base/QDnsBase.h)
24
+        includes/dns-base/QDnsBase.h
25
+        src/RecordData/QDnsRDataDecoder.cpp
26
+        includes/dns-base/RecordData/QDnsRDataDecoder.h src/RecordData/QDnsRDataA.cpp src/RecordData/QDnsRDataA.h)
25
 
27
 
26
 target_link_libraries(${PROJECT_NAME} Qt5::Core)
28
 target_link_libraries(${PROJECT_NAME} Qt5::Core)
27
 
29
 

+ 4
- 2
src/modules/dns-base/includes/dns-base/QDnsHeader.h View File

18
         public:
18
         public:
19
             QDnsHeader();
19
             QDnsHeader();
20
 
20
 
21
-            static QDnsHeader parse(const QByteArray &data);
21
+            explicit QDnsHeader(const QByteArray &data);
22
 
22
 
23
-            static QDnsHeader parse(QDataStream &dataStream);
23
+            explicit QDnsHeader(QDataStream &dataStream);
24
 
24
 
25
             QByteArray serialize() const;
25
             QByteArray serialize() const;
26
 
26
 
97
             void setAdditionalCount(quint16 additionalCount);
97
             void setAdditionalCount(quint16 additionalCount);
98
 
98
 
99
         private:
99
         private:
100
+            void parse(QDataStream &dataStream);
101
+
100
             bool m_isValid;
102
             bool m_isValid;
101
             quint16 m_id;
103
             quint16 m_id;
102
             quint16 m_flags;
104
             quint16 m_flags;

+ 4
- 4
src/modules/dns-base/includes/dns-base/QDnsPacket.h View File

19
         public:
19
         public:
20
             QDnsPacket();
20
             QDnsPacket();
21
 
21
 
22
-            static QDnsPacket parse(const QByteArray &data);
22
+            explicit QDnsPacket(const QByteArray &data);
23
 
23
 
24
-            static QDnsPacket parse(const QByteArray &data, QDataStream &dataStream);
24
+            QDnsPacket(const QByteArray &data, QDataStream &dataStream);
25
 
25
 
26
             QByteArray serialize() const;
26
             QByteArray serialize() const;
27
 
27
 
50
             void setAdditionalRecords(const QList<QDnsResourceRecord> &additionalRecords);
50
             void setAdditionalRecords(const QList<QDnsResourceRecord> &additionalRecords);
51
 
51
 
52
         private:
52
         private:
53
-            bool m_isValid;
53
+            void parse(const QByteArray &data, QDataStream &dataStream);
54
 
54
 
55
+            bool m_isValid;
55
             QDnsHeader m_header;
56
             QDnsHeader m_header;
56
-
57
             QList<QDnsQuery> m_queries;
57
             QList<QDnsQuery> m_queries;
58
             QList<QDnsResourceRecord> m_answerRecords;
58
             QList<QDnsResourceRecord> m_answerRecords;
59
             QList<QDnsResourceRecord> m_authorityRecords;
59
             QList<QDnsResourceRecord> m_authorityRecords;

+ 4
- 3
src/modules/dns-base/includes/dns-base/QDnsQuery.h View File

17
         public:
17
         public:
18
             QDnsQuery();
18
             QDnsQuery();
19
 
19
 
20
-            static QDnsQuery parse(const QByteArray &packetData, quint32 pos);
20
+            QDnsQuery(const QByteArray &packetData, quint32 pos);
21
 
21
 
22
-            static QDnsQuery parse(const QByteArray &packetData, QDataStream &dataStream);
22
+            QDnsQuery(const QByteArray &packetData, QDataStream &dataStream);
23
 
23
 
24
             QByteArray serialize() const;
24
             QByteArray serialize() const;
25
 
25
 
40
             void setClass(quint16 aClass);
40
             void setClass(quint16 aClass);
41
 
41
 
42
         private:
42
         private:
43
-            bool m_isValid;
43
+            void parse(const QByteArray &packetData, QDataStream &dataStream);
44
 
44
 
45
+            bool m_isValid;
45
             QString m_name;
46
             QString m_name;
46
             quint16 m_type;
47
             quint16 m_type;
47
             quint16 m_class;
48
             quint16 m_class;

+ 4
- 3
src/modules/dns-base/includes/dns-base/QDnsResourceRecord.h View File

18
         public:
18
         public:
19
             QDnsResourceRecord();
19
             QDnsResourceRecord();
20
 
20
 
21
-            static QDnsResourceRecord parse(const QByteArray &packetData, quint32 pos);
21
+            QDnsResourceRecord(const QByteArray &packetData, quint32 pos);
22
 
22
 
23
-            static QDnsResourceRecord parse(const QByteArray &packetData, QDataStream &dataStream);
23
+            QDnsResourceRecord(const QByteArray &packetData, QDataStream &dataStream);
24
 
24
 
25
             QByteArray serialize() const;
25
             QByteArray serialize() const;
26
 
26
 
49
             void setData(const QByteArray &data);
49
             void setData(const QByteArray &data);
50
 
50
 
51
         private:
51
         private:
52
-            bool m_isValid;
52
+            void parse(const QByteArray &packetData, QDataStream &dataStream);
53
 
53
 
54
+            bool m_isValid;
54
             QString m_name;
55
             QString m_name;
55
             quint16 m_type;
56
             quint16 m_type;
56
             quint16 m_class;
57
             quint16 m_class;

+ 16
- 15
src/modules/dns-base/src/QDnsHeader.cpp View File

17
                   , m_authorityCount(0)
17
                   , m_authorityCount(0)
18
                   , m_additionalCount(0)
18
                   , m_additionalCount(0)
19
         {
19
         {
20
-
21
         }
20
         }
22
 
21
 
23
-        QDnsHeader QDnsHeader::parse(const QByteArray &data)
22
+        QDnsHeader::QDnsHeader(const QByteArray &data)
23
+                : QDnsHeader()
24
         {
24
         {
25
             QDataStream dataStream(data);
25
             QDataStream dataStream(data);
26
-            return QDnsHeader::parse(dataStream);
26
+            parse(dataStream);
27
         }
27
         }
28
 
28
 
29
-        QDnsHeader QDnsHeader::parse(QDataStream &dataStream)
29
+        QDnsHeader::QDnsHeader(QDataStream &dataStream)
30
+                : QDnsHeader()
31
+        {
32
+            parse(dataStream);
33
+        }
34
+        void QDnsHeader::parse(QDataStream &dataStream)
30
         {
35
         {
31
-            QDnsHeader header;
32
-
33
             if (dataStream.device()->bytesAvailable() < 12)
36
             if (dataStream.device()->bytesAvailable() < 12)
34
             {
37
             {
35
-                header.m_isValid = false;
38
+                m_isValid = false;
36
             }
39
             }
37
             else
40
             else
38
             {
41
             {
39
-                dataStream >> header.m_id;
40
-                dataStream >> header.m_flags;
41
-                dataStream >> header.m_queryCount;
42
-                dataStream >> header.m_answerCount;
43
-                dataStream >> header.m_authorityCount;
44
-                dataStream >> header.m_additionalCount;
42
+                dataStream >> m_id;
43
+                dataStream >> m_flags;
44
+                dataStream >> m_queryCount;
45
+                dataStream >> m_answerCount;
46
+                dataStream >> m_authorityCount;
47
+                dataStream >> m_additionalCount;
45
             }
48
             }
46
-
47
-            return header;
48
         }
49
         }
49
 
50
 
50
         QByteArray QDnsHeader::serialize() const
51
         QByteArray QDnsHeader::serialize() const

+ 28
- 25
src/modules/dns-base/src/QDnsPacket.cpp View File

13
         {
13
         {
14
         }
14
         }
15
 
15
 
16
-        QDnsPacket QDnsPacket::parse(const QByteArray &data)
16
+        QDnsPacket::QDnsPacket(const QByteArray &data)
17
+                : QDnsPacket()
17
         {
18
         {
18
             QDataStream dataStream(data);
19
             QDataStream dataStream(data);
19
-            return parse(data, dataStream);
20
+            parse(data, dataStream);
20
         }
21
         }
21
 
22
 
22
-        QDnsPacket QDnsPacket::parse(const QByteArray &data, QDataStream &dataStream)
23
+        QDnsPacket::QDnsPacket(const QByteArray &data, QDataStream &dataStream)
24
+                : QDnsPacket()
23
         {
25
         {
24
-            QDnsPacket packet;
26
+            parse(data, dataStream);
27
+        }
25
 
28
 
26
-            packet.m_header = QDnsHeader::parse(dataStream);
27
-            if (!packet.m_header.isValid())
29
+        void QDnsPacket::parse(const QByteArray &data, QDataStream &dataStream)
30
+        {
31
+            m_header = QDnsHeader(dataStream);
32
+            if (!m_header.isValid())
28
             {
33
             {
29
-                packet.m_isValid = false;
34
+                m_isValid = false;
30
             }
35
             }
31
             else
36
             else
32
             {
37
             {
33
-                for (quint16 i = 0; i < packet.m_header.getQueryCount() && packet.m_isValid; ++i)
38
+                for (quint16 i = 0; i < m_header.getQueryCount() && m_isValid; ++i)
34
                 {
39
                 {
35
-                    auto entry = QDnsQuery::parse(data, dataStream);
40
+                    auto entry = QDnsQuery(data, dataStream);
36
                     if (!entry.isValid())
41
                     if (!entry.isValid())
37
                     {
42
                     {
38
-                        packet.m_isValid = false;
43
+                        m_isValid = false;
39
                     }
44
                     }
40
-                    packet.m_queries.append(entry);
45
+                    m_queries.append(entry);
41
                 }
46
                 }
42
-                for (quint16 i = 0; i < packet.m_header.getAnswerCount() && packet.m_isValid; ++i)
47
+                for (quint16 i = 0; i < m_header.getAnswerCount() && m_isValid; ++i)
43
                 {
48
                 {
44
-                    auto entry = QDnsResourceRecord::parse(data, dataStream);
49
+                    auto entry = QDnsResourceRecord(data, dataStream);
45
                     if (!entry.isValid())
50
                     if (!entry.isValid())
46
                     {
51
                     {
47
-                        packet.m_isValid = false;
52
+                        m_isValid = false;
48
                     }
53
                     }
49
-                    packet.m_answerRecords.append(entry);
54
+                    m_answerRecords.append(entry);
50
                 }
55
                 }
51
-                for (quint16 i = 0; i < packet.m_header.getAuthorityCount() && packet.m_isValid; ++i)
56
+                for (quint16 i = 0; i < m_header.getAuthorityCount() && m_isValid; ++i)
52
                 {
57
                 {
53
-                    auto entry = QDnsResourceRecord::parse(data, dataStream);
58
+                    auto entry = QDnsResourceRecord(data, dataStream);
54
                     if (!entry.isValid())
59
                     if (!entry.isValid())
55
                     {
60
                     {
56
-                        packet.m_isValid = false;
61
+                        m_isValid = false;
57
                     }
62
                     }
58
-                    packet.m_authorityRecords.append(entry);
63
+                    m_authorityRecords.append(entry);
59
                 }
64
                 }
60
-                for (quint16 i = 0; i < packet.m_header.getAdditionalCount() && packet.m_isValid; ++i)
65
+                for (quint16 i = 0; i < m_header.getAdditionalCount() && m_isValid; ++i)
61
                 {
66
                 {
62
-                    auto entry = QDnsResourceRecord::parse(data, dataStream);
67
+                    auto entry = QDnsResourceRecord(data, dataStream);
63
                     if (!entry.isValid())
68
                     if (!entry.isValid())
64
                     {
69
                     {
65
-                        packet.m_isValid = false;
70
+                        m_isValid = false;
66
                     }
71
                     }
67
-                    packet.m_additionalRecords.append(entry);
72
+                    m_additionalRecords.append(entry);
68
                 }
73
                 }
69
             }
74
             }
70
-
71
-            return packet;
72
         }
75
         }
73
 
76
 
74
         QByteArray QDnsPacket::serialize() const
77
         QByteArray QDnsPacket::serialize() const

+ 14
- 11
src/modules/dns-base/src/QDnsQuery.cpp View File

16
         {
16
         {
17
         }
17
         }
18
 
18
 
19
-        QDnsQuery QDnsQuery::parse(const QByteArray &packetData, quint32 pos)
19
+        QDnsQuery::QDnsQuery(const QByteArray &packetData, quint32 pos)
20
+                : QDnsQuery()
20
         {
21
         {
21
             QDataStream dataStream(packetData);
22
             QDataStream dataStream(packetData);
22
             dataStream.skipRawData(pos);
23
             dataStream.skipRawData(pos);
23
-            return parse(packetData, dataStream);
24
+            parse(packetData, dataStream);
24
         }
25
         }
25
 
26
 
26
-        QDnsQuery QDnsQuery::parse(const QByteArray &packetData, QDataStream &dataStream)
27
+        QDnsQuery::QDnsQuery(const QByteArray &packetData, QDataStream &dataStream)
28
+                : QDnsQuery()
27
         {
29
         {
28
-            QDnsQuery query;
30
+            parse(packetData, dataStream);
31
+        }
29
 
32
 
30
-            query.m_name = QDnsLabel::parse(packetData, dataStream);
31
-            if (query.m_name.isNull() || dataStream.device()->bytesAvailable() < 4)
33
+        void QDnsQuery::parse(const QByteArray &packetData, QDataStream &dataStream)
34
+        {
35
+            m_name = QDnsLabel::parse(packetData, dataStream);
36
+            if (m_name.isNull() || dataStream.device()->bytesAvailable() < 4)
32
             {
37
             {
33
-                query.m_isValid = false;
38
+                m_isValid = false;
34
             }
39
             }
35
             else
40
             else
36
             {
41
             {
37
-                dataStream >> query.m_type;
38
-                dataStream >> query.m_class;
42
+                dataStream >> m_type;
43
+                dataStream >> m_class;
39
             }
44
             }
40
-
41
-            return query;
42
         }
45
         }
43
 
46
 
44
         QByteArray QDnsQuery::serialize() const
47
         QByteArray QDnsQuery::serialize() const

+ 17
- 13
src/modules/dns-base/src/QDnsResourceRecord.cpp View File

14
         {
14
         {
15
         }
15
         }
16
 
16
 
17
-        QDnsResourceRecord QDnsResourceRecord::parse(const QByteArray &packetData, quint32 pos)
17
+        QDnsResourceRecord::QDnsResourceRecord(const QByteArray &packetData, quint32 pos)
18
+                : QDnsResourceRecord()
18
         {
19
         {
19
             QDataStream dataStream(packetData);
20
             QDataStream dataStream(packetData);
20
             dataStream.skipRawData(pos);
21
             dataStream.skipRawData(pos);
21
-            return parse(packetData, dataStream);
22
+            parse(packetData, dataStream);
22
         }
23
         }
23
 
24
 
24
-        QDnsResourceRecord QDnsResourceRecord::parse(const QByteArray &packetData, QDataStream &dataStream)
25
+        QDnsResourceRecord::QDnsResourceRecord(const QByteArray &packetData, QDataStream &dataStream)
26
+                : QDnsResourceRecord()
25
         {
27
         {
26
-            QDnsResourceRecord rr;
28
+            parse(packetData, dataStream);
29
+        }
27
 
30
 
28
-            rr.m_name = QDnsLabel::parse(packetData, dataStream);
29
-            if (rr.m_name.isNull() || dataStream.device()->bytesAvailable() < 10)
31
+        void QDnsResourceRecord::parse(const QByteArray &packetData, QDataStream &dataStream)
32
+        {
33
+            m_name = QDnsLabel::parse(packetData, dataStream);
34
+            if (m_name.isNull() || dataStream.device()->bytesAvailable() < 10)
30
             {
35
             {
31
-                rr.m_isValid = false;
36
+                m_isValid = false;
32
             }
37
             }
33
             else
38
             else
34
             {
39
             {
35
-                dataStream >> rr.m_type;
36
-                dataStream >> rr.m_class;
37
-                dataStream >> rr.m_ttl;
40
+                dataStream >> m_type;
41
+                dataStream >> m_class;
42
+                dataStream >> m_ttl;
38
                 quint16 length;
43
                 quint16 length;
39
                 dataStream >> length;
44
                 dataStream >> length;
40
                 if (dataStream.device()->bytesAvailable() < length)
45
                 if (dataStream.device()->bytesAvailable() < length)
41
                 {
46
                 {
42
-                    rr.m_isValid = false;
47
+                    m_isValid = false;
43
                 }
48
                 }
44
                 else
49
                 else
45
                 {
50
                 {
46
                     char data[length];
51
                     char data[length];
47
                     dataStream.readRawData(data, length);
52
                     dataStream.readRawData(data, length);
48
-                    rr.m_data.append(data, length);
53
+                    m_data.append(data, length);
49
                 }
54
                 }
50
             }
55
             }
51
-            return rr;
52
         }
56
         }
53
 
57
 
54
         QByteArray QDnsResourceRecord::serialize() const
58
         QByteArray QDnsResourceRecord::serialize() const

+ 1
- 1
src/modules/dns-base/tests/DnsHeader.cpp View File

40
 {
40
 {
41
     auto params = GetParam();
41
     auto params = GetParam();
42
     auto data = QByteArray::fromHex(params.hexData);
42
     auto data = QByteArray::fromHex(params.hexData);
43
-    auto header = QDns::Base::QDnsHeader::parse(data);
43
+    auto header = QDns::Base::QDnsHeader(data);
44
     ASSERT_EQ(header.isValid(), params.isValid);
44
     ASSERT_EQ(header.isValid(), params.isValid);
45
 
45
 
46
     if (header.isValid())
46
     if (header.isValid())

+ 2
- 2
src/modules/dns-base/tests/DnsPacket.cpp View File

22
 {
22
 {
23
     auto params = GetParam();
23
     auto params = GetParam();
24
     auto data = QByteArray::fromHex(params.hexData);
24
     auto data = QByteArray::fromHex(params.hexData);
25
-    auto packet = QDns::Base::QDnsPacket::parse(data);
25
+    auto packet = QDns::Base::QDnsPacket(data);
26
 
26
 
27
     ASSERT_EQ(packet.isValid(), params.isValid);
27
     ASSERT_EQ(packet.isValid(), params.isValid);
28
 
28
 
60
 {
60
 {
61
     auto params = GetParam();
61
     auto params = GetParam();
62
     auto data1 = QByteArray::fromHex(params.hexData1);
62
     auto data1 = QByteArray::fromHex(params.hexData1);
63
-    auto packet = QDns::Base::QDnsPacket::parse(data1);
63
+    auto packet = QDns::Base::QDnsPacket(data1);
64
 
64
 
65
     // TODO improve tests
65
     // TODO improve tests
66
     ASSERT_EQ(packet.serialize().toHex(), QString(params.hexData2).remove(" "));
66
     ASSERT_EQ(packet.serialize().toHex(), QString(params.hexData2).remove(" "));

+ 1
- 1
src/modules/dns-base/tests/DnsQuery.cpp View File

26
 {
26
 {
27
     auto params = GetParam();
27
     auto params = GetParam();
28
     auto data = QByteArray::fromHex(params.hexData);
28
     auto data = QByteArray::fromHex(params.hexData);
29
-    auto query = QDns::Base::QDnsQuery::parse(data, params.pos);
29
+    auto query = QDns::Base::QDnsQuery(data, params.pos);
30
 
30
 
31
     ASSERT_EQ(query.isValid(), params.isValid);
31
     ASSERT_EQ(query.isValid(), params.isValid);
32
 
32
 

+ 1
- 1
src/modules/dns-base/tests/DnsResourceRecord.cpp View File

28
 {
28
 {
29
     auto params = GetParam();
29
     auto params = GetParam();
30
     auto data = QByteArray::fromHex(params.hexData);
30
     auto data = QByteArray::fromHex(params.hexData);
31
-    auto rr = QDns::Base::QDnsResourceRecord::parse(data, params.pos);
31
+    auto rr = QDns::Base::QDnsResourceRecord(data, params.pos);
32
 
32
 
33
     ASSERT_EQ(rr.isValid(), params.isValid);
33
     ASSERT_EQ(rr.isValid(), params.isValid);
34
 
34
 

Loading…
Cancel
Save