Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

QDnsAxfrClient.cpp 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // Created by robin on 2/12/18.
  3. //
  4. #include "dns-client/QDnsAxfrClient.h"
  5. namespace QDns
  6. {
  7. namespace Client
  8. {
  9. QDnsAxfrClient::QDnsAxfrClient(const QString& zone, const QHostAddress& host, quint16 port, QObject *parent)
  10. : QObject(parent)
  11. , m_zone(zone)
  12. , m_status(AxfrStatus::FirstSOA)
  13. , m_udpClient(new QDns::Client::QDnsUdpClient(host, port, this))
  14. , m_tcpClient(new QDns::Client::QDnsTcpClient(host, port, this))
  15. {
  16. connect(m_udpClient, &QDnsClient::onStateChanged, this, &QDnsAxfrClient::onClientStateChanged);
  17. connect(m_tcpClient, &QDnsClient::onStateChanged, this, &QDnsAxfrClient::onClientStateChanged);
  18. connect(m_udpClient, &QDnsClient::onAnswer, this, &QDnsAxfrClient::onClientAnswer);
  19. connect(m_tcpClient, &QDnsClient::onAnswer, this, &QDnsAxfrClient::onClientAnswer);
  20. connect(m_udpClient, &QDnsClient::onError, this, &QDnsAxfrClient::onClientError);
  21. connect(m_tcpClient, &QDnsClient::onError, this, &QDnsAxfrClient::onClientError);
  22. }
  23. void QDnsAxfrClient::transfer()
  24. {
  25. m_status = AxfrStatus::FirstSOA;
  26. m_records.clear();
  27. m_udpClient->connectToHost();
  28. m_tcpClient->connectToHost();
  29. }
  30. void QDnsAxfrClient::onClientStateChanged(const QDnsClient::OnStateChangedParams& params)
  31. {
  32. if (m_udpClient->getState() == QDnsClient::ClientState::Connected
  33. && m_tcpClient->getState() == QDnsClient::ClientState::Connected)
  34. {
  35. auto axfrQuery = QDns::Base::QDnsPacket::makeSimpleQuery(m_zone, QDns::Base::QDnsBase::RecordType::AXFR);
  36. m_tcpClient->query(axfrQuery);
  37. }
  38. }
  39. void QDnsAxfrClient::onClientAnswer(const QDnsClient::OnAnswerParams& params)
  40. {
  41. processPacket(params.answer);
  42. }
  43. void QDnsAxfrClient::onClientError(const QDnsClient::OnErrorParams &params)
  44. {
  45. if (params.error == QDns::Client::QDnsClient::ErrorCode::UnknownId)
  46. {
  47. processPacket(params.answer);
  48. }
  49. else
  50. {
  51. emit onError(OnErrorParams
  52. {
  53. 0,
  54. ErrorCode::ClientError,
  55. params
  56. });
  57. }
  58. }
  59. void QDnsAxfrClient::processPacket(const QDns::Base::QDnsPacket& packet)
  60. {
  61. if (m_status == AxfrStatus::FirstSOA)
  62. {
  63. if (packet.getHeader().getAnswerCount() == 1 &&
  64. packet.getAnswerRecords().first().getType() == QDns::Base::QDnsBase::RecordType::SOA)
  65. {
  66. m_status = AxfrStatus::Records;
  67. m_records.append(packet.getAnswerRecords());
  68. }
  69. else
  70. {
  71. emit onError(OnErrorParams
  72. {
  73. 0,
  74. ErrorCode::NoFirstSOA
  75. });
  76. }
  77. }
  78. else if (m_status == AxfrStatus::Records)
  79. {
  80. if (packet.getHeader().getAnswerCount() == 1 &&
  81. packet.getAnswerRecords().first().getType() == QDns::Base::QDnsBase::RecordType::SOA)
  82. {
  83. m_status = AxfrStatus::LastSOA;
  84. m_udpClient->disconnectFromHost();
  85. m_tcpClient->disconnectFromHost();
  86. emit onAnswer(OnAnswerParams
  87. {
  88. 0,
  89. m_records
  90. });
  91. }
  92. else
  93. {
  94. m_records.append(packet.getAnswerRecords());
  95. }
  96. }
  97. else
  98. {
  99. emit onError(OnErrorParams
  100. {
  101. 0,
  102. ErrorCode::ExtraRecords
  103. });
  104. }
  105. }
  106. }
  107. }