]> granicus.if.org Git - pdns/commitdiff
make DomainInfo not carry IP addresses as strings. And some subsequent cleanups..
authorbert hubert <bert.hubert@netherlabs.nl>
Thu, 30 Nov 2017 22:22:26 +0000 (23:22 +0100)
committermind04 <mind04@monshouwer.org>
Sat, 31 Mar 2018 21:40:21 +0000 (23:40 +0200)
25 files changed:
modules/bindbackend/bindbackend2.cc
modules/bindbackend/bindbackend2.hh
modules/ldapbackend/ldapbackend.cc
modules/luabackend/private.cc
modules/opendbxbackend/odbxbackend.cc
modules/opendbxbackend/odbxprivate.cc
modules/remotebackend/remotebackend.cc
pdns/backends/gsql/gsqlbackend.cc
pdns/bindparser.yy
pdns/bindparserclasses.hh
pdns/communicator.hh
pdns/dbdnsseckeeper.cc
pdns/dnsbackend.hh
pdns/dnsseckeeper.hh
pdns/dynhandler.cc
pdns/iputils.hh
pdns/packethandler.cc
pdns/pdnsutil.cc
pdns/resolver.cc
pdns/resolver.hh
pdns/rfc2136handler.cc
pdns/slavecommunicator.cc
pdns/test-bindparser_cc.cc
pdns/ws-auth.cc
pdns/zone2sql.cc

index 28a5b429555f2deb53d7c3964fa26e50c17a57d8..3a1971fd2504793001fbe792dbceafdc94ed2ce2 100644 (file)
@@ -1299,7 +1299,7 @@ bool Bind2Backend::createSlaveDomain(const string &ip, const DNSName& domain, co
 
   BB2DomainInfo bbd = createDomainEntry(domain, filename);
   bbd.d_kind = DomainInfo::Slave;
-  bbd.d_masters.push_back(ip);
+  bbd.d_masters.push_back(ComboAddress(ip, 53));
   safePutBBDomainInfo(bbd);
   return true;
 }
index c85003eefc18214fc33a48e90f28fe6dd4ee6961..76ce499089b23be5c164f9e59013ab8b2bbc73dd 100644 (file)
@@ -162,7 +162,7 @@ public:
   DomainInfo::DomainKind d_kind; //!< the kind of domain
   string d_filename; //!< full absolute filename of the zone on disk
   string d_status; //!< message describing status of a domain, for human consumption
-  vector<string> d_masters;     //!< IP address of the master of this domain
+  vector<ComboAddress> d_masters;     //!< IP address of the master of this domain
   set<string> d_also_notify; //!< IP list of hosts to also notify
   LookButDontTouch<recordstorage_t> d_records;  //!< the actual records belonging to this domain
   time_t d_ctime;  //!< last known ctime of the file on disk
index f974b82c0d28019e1fa0b631a904786364003b34..428c94f40683847ab84363e90f942264af4f512b 100644 (file)
@@ -743,8 +743,10 @@ bool LdapBackend::getDomainInfo( const DNSName& domain, DomainInfo& di, bool get
     else
       di.notified_serial = 0;
 
-    if ( result.count( "PdnsDomainMaster" ) && !result["PdnsDomainMaster"].empty() )
-      di.masters = result["PdnsDomainMaster"];
+    if ( result.count( "PdnsDomainMaster" ) && !result["PdnsDomainMaster"].empty() ) {
+      for(const auto& m : result["PdnsDomainMaster"])
+        di.masters.emplace_back(m, 53);
+    }
 
     if ( result.count( "PdnsDomainType" ) && !result["PdnsDomainType"].empty() ) {
       string kind = result["PdnsDomainType"][0];
index 480a50e042b3280ff93549d07b6a1ff3c40ef0b2..78b2b5427a886a611bda324c0981bf49dc79ce9c 100644 (file)
@@ -72,7 +72,7 @@ bool LUABackend::domaininfo_from_table(DomainInfo *di) {
        while (lua_next(lua, -2)) {
            value = lua_tostring(lua, -1);
            lua_pop(lua,1);
-           di->masters.push_back(value);
+           di->masters.push_back(ComboAddress(value, 53));
        }    
     }
   
index 8187fa58a1147aaf1ea49e3502ee4bccd897758c..debfa508025379473b0d9e880ffc54832b2cdcfd 100644 (file)
@@ -141,7 +141,12 @@ bool OdbxBackend::getDomainInfo( const DNSName& domain, DomainInfo& di, bool get
 
                        if( ( tmp = odbx_field_value( m_result, 3 ) ) != NULL )
                        {
-                               stringtok(di.masters, string( tmp, odbx_field_length( m_result, 3 ) ), ", \t");
+                               vector<string> masters;
+                               stringtok(masters, string( tmp, odbx_field_length( m_result, 3 ) ), ", \t");
+                               for(const auto& m : masters)
+                               {
+                                       di.masters.emplace_back(m, 53);
+                               }
                        }
 
                        if( ( tmp = odbx_field_value( m_result, 2 ) ) != NULL )
index 0cf96a06d2cbbefdc6846070c7ae559bd26337de..03308d00bd9906497f6fa0b7756f31d0216633d4 100644 (file)
@@ -231,7 +231,12 @@ bool OdbxBackend::getDomainList( const string& stmt, vector<DomainInfo>* list, b
                {
                        if( ( tmp = odbx_field_value( m_result, 2 ) ) != NULL )
                        {
-                               stringtok(di.masters, string( tmp, odbx_field_length( m_result, 2 )), ", \t" );
+                               vector<string> masters;
+                               stringtok(masters, string( tmp, odbx_field_length( m_result, 2 )), ", \t" );
+                               for(const auto& m : masters)
+                               {
+                                       di.masters.emplace_back(m, 53);
+                               }
                        }
 
                        if( ( tmp = odbx_field_value( m_result, 1 ) ) != NULL )
index 31d4e80d313153433748d3c4a7f9b63167d2ba93..cc0af2adac79097acfafa55964014fa6ec58df54 100644 (file)
@@ -557,7 +557,7 @@ void RemoteBackend::parseDomainInfo(const Json &obj, DomainInfo &di)
    di.id = intFromJson(obj, "id", -1);
    di.zone = DNSName(stringFromJson(obj, "zone"));
    for(const auto& master: obj["masters"].array_items())
-     di.masters.push_back(master.string_value());
+     di.masters.push_back(ComboAddress(master.string_value(), 53));
 
    di.notified_serial = static_cast<unsigned int>(doubleFromJson(obj, "notified_serial", -1));
    di.serial = static_cast<unsigned int>(obj["serial"].number_value());
index 66ecb13b5c97995e3fd537e6e3138c91542c89b5..c20df873013dbf375797afe7bf0322bb187b8b40 100644 (file)
@@ -294,7 +294,10 @@ bool GSQLBackend::getDomainInfo(const DNSName &domain, DomainInfo &di, bool getS
   } catch (...) {
     return false;
   }
-  stringtok(di.masters, d_result[0][2], " ,\t");
+  vector<string> masters;
+  stringtok(masters, d_result[0][2], " ,\t");
+  for(const auto& m : masters)
+    di.masters.emplace_back(m, 53);
   di.last_check=pdns_stou(d_result[0][3]);
   di.notified_serial = pdns_stou(d_result[0][4]);
   string type=d_result[0][5];
@@ -347,7 +350,12 @@ void GSQLBackend::getUnfreshSlaveInfos(vector<DomainInfo> *unfreshDomains)
     } catch (...) {
       continue;
     }
-    stringtok(sd.masters, d_result[n][2], ", \t");
+
+    vector<string> masters;
+    stringtok(masters, d_result[n][2], ", \t");
+    for(const auto& m : masters)
+      sd.masters.emplace_back(m, 53);
+
     sd.last_check=pdns_stou(d_result[n][3]);
     sd.backend=this;
     sd.kind=DomainInfo::Slave;
@@ -1251,7 +1259,10 @@ void GSQLBackend::getAllDomains(vector<DomainInfo> *domains, bool include_disabl
       }
   
       if (!row[4].empty()) {
-        stringtok(di.masters, row[4], " ,\t");
+        vector<string> masters;
+        stringtok(masters, row[4], " ,\t");
+        for(const auto& m : masters)
+          di.masters.emplace_back(m, 53);
       }
 
       SOAData sd;
index 9f3bf4b8c7b36c76c7bff11e1ee595498dd66f02..df05341467d5178de4a6e22d201d3360b77e1ef1 100644 (file)
@@ -10,6 +10,7 @@
 #include "misc.hh"
 #include "pdnsexception.hh"
 #include "namespaces.hh"
+#include "iputils.hh"
 #define YYDEBUG 1
 extern int yydebug;
 #include "bindparserclasses.hh"
@@ -253,7 +254,7 @@ masters: /* empty */
 
 master: AWORD
        {
-               s_di.masters.push_back($1);
+               s_di.masters.push_back(ComboAddress($1, 53));
                free($1);
        }
        ;
index 33f7c6187795bf65f4198e54579603ddd710ed60..12e60c227e82a6c1998930b6e8e93be9697e5b2b 100644 (file)
@@ -48,7 +48,7 @@ public:
   DNSName name;
   string viewName;
   string filename;
-  vector<string> masters;
+  vector<ComboAddress> masters;
   set<string> alsoNotify;
   string type;
   bool hadFileDirective;
index 8991d6cc0569210e141750e01f770041a8e0be96..f853e69ae540442fe35bbadd58f316edd69e8f4e 100644 (file)
@@ -47,7 +47,7 @@ using namespace boost::multi_index;
 struct SuckRequest
 {
   DNSName domain;
-  string master;
+  ComboAddress master;
   bool operator<(const SuckRequest& b) const
   {
     return tie(domain, master) < tie(b.domain, b.master);
@@ -167,7 +167,7 @@ public:
   
   void drillHole(const DNSName &domain, const string &ip);
   bool justNotified(const DNSName &domain, const string &ip);
-  void addSuckRequest(const DNSName &domain, const string &master);
+  void addSuckRequest(const DNSName &domain, const ComboAddress& master);
   void addSlaveCheckRequest(const DomainInfo& di, const ComboAddress& remote);
   void addTrySuperMasterRequest(DNSPacket *p);
   void notify(const DNSName &domain, const string &ip);
@@ -193,7 +193,7 @@ private:
   int d_nsock4, d_nsock6;
   map<pair<DNSName,string>,time_t>d_holes;
   pthread_mutex_t d_holelock;
-  void suck(const DNSName &domain, const string &remote);
+  void suck(const DNSName &domain, const ComboAddress& remote);
   void ixfrSuck(const DNSName &domain, const TSIGTriplet& tt, const ComboAddress& laddr, const ComboAddress& remote, boost::scoped_ptr<AuthLua4>& pdl,
                 ZoneStatus& zs, vector<DNSRecord>* axfr);
 
index 39bad74aa1b91af7c84665c4534f49113783c2a2..415a5d07ac2aa1e78642e4f49354e4b71bdf17c9 100644 (file)
@@ -575,7 +575,7 @@ bool DNSSECKeeper::TSIGGrantsAccess(const DNSName& zone, const DNSName& keyname)
   return false;
 }
 
-bool DNSSECKeeper::getTSIGForAccess(const DNSName& zone, const string& master, DNSName* keyname)
+bool DNSSECKeeper::getTSIGForAccess(const DNSName& zone, const ComboAddress& master, DNSName* keyname)
 {
   vector<string> keynames;
   d_keymetadb->getDomainMetadata(zone, "AXFR-MASTER-TSIG", keynames);
index 0de177dd86b6881d566a1fbf816fcbc88cf3cfa6..e09e993068edae7ed0fc395af7a045e728c2bb3d 100644 (file)
@@ -52,7 +52,7 @@ struct DomainInfo
   DNSName zone;
   time_t last_check;
   string account;
-  vector<string> masters; // FIXME use ComboAddress
+  vector<ComboAddress> masters; 
   DNSBackend *backend;
 
   uint32_t id;
index 3e50a584f37d88557bc6bdf39a243368e4a8f703..d1fd12962279c1700171dc8ed7256f622fc48524 100644 (file)
@@ -210,7 +210,7 @@ public:
   bool unsetPublishCDS(const DNSName& zname);
 
   bool TSIGGrantsAccess(const DNSName& zone, const DNSName& keyname);
-  bool getTSIGForAccess(const DNSName& zone, const string& master, DNSName* keyname);
+  bool getTSIGForAccess(const DNSName& zone, const ComboAddress& master, DNSName* keyname);
   
   void startTransaction(const DNSName& zone, int zone_id)
   {
index 44564b23143eb4a0e5564e719aa27c558cf61eaf..90f01a913ca7dcf033f917484d16d5a8ff11e1c0 100644 (file)
@@ -252,7 +252,7 @@ string DLNotifyRetrieveHandler(const vector<string>&parts, Utility::pid_t ppid)
 
   random_shuffle(di.masters.begin(), di.masters.end());
   Communicator.addSuckRequest(domain, di.masters.front()); 
-  return "Added retrieval request for '"+domain.toString()+"' from master "+di.masters.front();
+  return "Added retrieval request for '"+domain.toString()+"' from master "+di.masters.front().toStringWithPortExcept(53);
 }
 
 string DLNotifyHostHandler(const vector<string>&parts, Utility::pid_t ppid)
index 1b8d7f84380d5e5773fa08f43fd4dd504a920b0b..6b265aca02174075bb279c8d1739138beddb740a 100644 (file)
@@ -284,6 +284,17 @@ union ComboAddress {
       return "["+toString() + "]:" + std::to_string(ntohs(sin4.sin_port));
   }
 
+  string toStringWithPortExcept(int port) const
+  {
+    if(ntohs(sin4.sin_port) == port)
+      return toString();
+    if(sin4.sin_family==AF_INET)
+      return toString() + ":" + std::to_string(ntohs(sin4.sin_port));
+    else
+      return "["+toString() + "]:" + std::to_string(ntohs(sin4.sin_port));
+  }
+
+  
   void truncate(unsigned int bits) noexcept;
 
   uint16_t getPort() const
index 17f3f0965afda04844945f39f6f428f920a74a44..d82744983c0bee6c32118eb58fd919257ddc6a06 100644 (file)
@@ -731,16 +731,16 @@ int PacketHandler::trySuperMaster(DNSPacket *p, const DNSName& tsigkeyname)
 
 int PacketHandler::trySuperMasterSynchronous(const DNSPacket *p, const DNSName& tsigkeyname)
 {
-  string remote = p->getRemote().toString();
-  if(p->hasEDNSSubnet() && ::arg().contains("trusted-notification-proxy", remote)) {
-    remote = p->getRealRemote().toStringNoMask();
+  ComboAddress remote = p->getRemote();
+  if(p->hasEDNSSubnet() && ::arg().contains("trusted-notification-proxy", remote.toString())) {
+    remote = p->getRealRemote().getNetwork();
   }
 
   Resolver::res_t nsset;
   try {
     Resolver resolver;
     uint32_t theirserial;
-    resolver.getSoaSerial(remote,p->qdomain, &theirserial);
+    resolver.getSoaSerial(remote, p->qdomain, &theirserial);
     resolver.resolve(remote, p->qdomain, QType::NS, &nsset);
   }
   catch(ResolverException &re) {
@@ -768,7 +768,7 @@ int PacketHandler::trySuperMasterSynchronous(const DNSPacket *p, const DNSName&
     return RCode::Refused;
   }
 
-  if(!B.superMasterBackend(remote, p->qdomain, nsset, &nameserver, &account, &db)) {
+  if(!B.superMasterBackend(remote.toString(), p->qdomain, nsset, &nameserver, &account, &db)) {
     g_log<<Logger::Error<<"Unable to find backend willing to host "<<p->qdomain<<" for potential supermaster "<<remote<<". Remote nameservers: "<<endl;
     for(const auto& rr: nsset) {
       if(rr.qtype==QType::NS)
index 61b51be8269e59795ebd403af42b0e0b7ffd3fbd..83cf5f85eaa7207fb5d6a51b6ceaa3b480613637 100644 (file)
@@ -1416,7 +1416,7 @@ bool showZone(DNSSECKeeper& dk, const DNSName& zone, bool exportDS = false)
     else if(di.kind == DomainInfo::Slave) {
       cout<<"Master"<<addS(di.masters)<<": ";
       for(const auto& m : di.masters)
-        cout<<m<<" ";
+        cout<<m.toStringWithPort()<<" ";
       cout<<endl;
       struct tm tm;
       localtime_r(&di.last_check, &tm);
@@ -3105,11 +3105,11 @@ try
       tgt->setAccount(di.zone,di.account);
       string masters="";
       bool first = true;
-      for(const string& master: di.masters) {
+      for(const auto& master: di.masters) {
         if (!first)
           masters += ", ";
         first = false;
-        masters += master;
+        masters += master.toStringWithPortExcept(53);
       }
       tgt->setMaster(di.zone, masters);
       // move records
index 24e9cc97924c9a08a89bec760b1aac66a8873356..98d26fce7a57ebcc4205586b07129421c93a8beb 100644 (file)
@@ -292,11 +292,9 @@ bool Resolver::tryGetSOASerial(DNSName *domain, ComboAddress* remote, uint32_t *
   return true;
 }
 
-int Resolver::resolve(const string &ipport, const DNSName &domain, int type, Resolver::res_t* res, const ComboAddress &local)
+int Resolver::resolve(const ComboAddress& to, const DNSName &domain, int type, Resolver::res_t* res, const ComboAddress &local)
 {
   try {
-    ComboAddress to(ipport, 53);
-
     int sock = -1;
     int id = sendResolve(to, local, domain, type, &sock);
     int err=waitForData(sock, 0, 3000000); 
@@ -323,38 +321,38 @@ int Resolver::resolve(const string &ipport, const DNSName &domain, int type, Res
     return parseResult(mdp, domain, type, id, res);
   }
   catch(ResolverException &re) {
-    throw ResolverException(re.reason+" from "+ipport);
+    throw ResolverException(re.reason+" from "+to.toStringWithPortExcept(53));
   }
   return -1;
 }
 
-int Resolver::resolve(const string &ipport, const DNSName &domain, int type, Resolver::res_t* res) {
+int Resolver::resolve(const ComboAddress& ipport, const DNSName &domain, int type, Resolver::res_t* res) {
   ComboAddress local;
   local.sin4.sin_family = 0;
   return resolve(ipport, domain, type, res, local);
 }
 
-void Resolver::getSoaSerial(const string &ipport, const DNSName &domain, uint32_t *serial)
+void Resolver::getSoaSerial(const ComboAddress& ipport, const DNSName &domain, uint32_t *serial)
 {
   vector<DNSResourceRecord> res;
   int ret = resolve(ipport, domain, QType::SOA, &res);
   
   if(ret || res.empty())
-    throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toLogString() + "' produced no answers");
+    throw ResolverException("Query to '" + ipport.toStringWithPortExcept(53) + "' for SOA of '" + domain.toString() + "' produced no answers");
 
   if(res[0].qtype.getCode() != QType::SOA) 
-    throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toLogString() + "' produced a "+res[0].qtype.getName()+" record");
+    throw ResolverException("Query to '" + ipport.toStringWithPortExcept(53) + "' for SOA of '" + domain.toString() + "' produced a "+res[0].qtype.getName()+" record");
 
   vector<string>parts;
   stringtok(parts, res[0].content);
   if(parts.size()<3)
-    throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toLogString() + "' produced an unparseable response");
+    throw ResolverException("Query to '" + ipport.toStringWithPortExcept(53) + "' for SOA of '" + domain.toString() + "' produced an unparseable response");
 
   try {
     *serial=pdns_stou(parts[2]);
   }
   catch(const std::out_of_range& oor) {
-    throw ResolverException("Query to '" + ipport + "' for SOA of '" + domain.toLogString() + "' produced an unparseable serial");
+    throw ResolverException("Query to '" + ipport.toStringWithPortExcept(53) + "' for SOA of '" + domain.toString() + "' produced an unparseable serial");
   }
 }
 
index 419aa032eaf3fb94d724a457be4bf4e12af5b808..375bf74d7a9afd3511c8a3466cd5b8facf78cf72 100644 (file)
@@ -60,9 +60,9 @@ public:
 
   typedef vector<DNSResourceRecord> res_t;
   //! synchronously resolve domain|type at IP, store result in result, rcode in ret
-  int resolve(const string &ip, const DNSName &domain, int type, res_t* result, const ComboAddress& local);
+  int resolve(const ComboAddress &ip, const DNSName &domain, int type, res_t* result, const ComboAddress& local);
 
-  int resolve(const string &ip, const DNSName &domain, int type, res_t* result);
+  int resolve(const ComboAddress &ip, const DNSName &domain, int type, res_t* result);
 
   //! only send out a resolution request
   uint16_t sendResolve(const ComboAddress& remote, const ComboAddress& local, const DNSName &domain, int type, int *localsock, bool dnssecOk=false,
@@ -72,7 +72,7 @@ public:
   bool tryGetSOASerial(DNSName *theirDomain, ComboAddress* remote, uint32_t* theirSerial, uint32_t* theirInception, uint32_t* theirExpire, uint16_t* id);
   
   //! convenience function that calls resolve above
-  void getSoaSerial(const string &, const DNSName &, uint32_t *);
+  void getSoaSerial(const ComboAddress&, const DNSName &, uint32_t *);
   
 private:
   std::map<std::string, int> locals;
index ed8e381ac2da5bd8f965da8bddade10c8d512c3a..ca84451795021f8527d4f9242a183427d8f564ed 100644 (file)
@@ -585,16 +585,8 @@ int PacketHandler::forwardPacket(const string &msgPrefix, DNSPacket *p, DomainIn
     return RCode::Refused;
   }
 
-  for(vector<string>::const_iterator master=di->masters.begin(); master != di->masters.end(); master++) {
-    g_log<<Logger::Notice<<msgPrefix<<"Forwarding packet to master "<<*master<<endl;
-    ComboAddress remote;
-    try {
-      remote = ComboAddress(*master, 53);
-    }
-    catch (...) {
-      g_log<<Logger::Error<<msgPrefix<<"Failed to parse "<<*master<<" as valid remote."<<endl;
-      continue;
-    }
+  for(const auto& remote : di->masters) {
+    g_log<<Logger::Notice<<msgPrefix<<"Forwarding packet to master "<<remote.toStringWithPortExcept(53)<<endl;
 
     ComboAddress local;
     if (remote.sin4.sin_family == AF_INET && !::arg()["query-local-address"].empty()) {
index 5bd485b231d0139c5ca1d2a9695409366c1106bf..d1aef8fe8721a6470c7ab8b44ce175d40e3bd98e 100644 (file)
@@ -49,7 +49,7 @@
 using boost::scoped_ptr;
 
 
-void CommunicatorClass::addSuckRequest(const DNSName &domain, const string &master)
+void CommunicatorClass::addSuckRequest(const DNSName &domain, const ComboAddress& master)
 {
   Lock l(&d_lock);
   SuckRequest sr;
@@ -288,7 +288,7 @@ static vector<DNSResourceRecord> doAxfr(const ComboAddress& raddr, const DNSName
 }   
 
 
-void CommunicatorClass::suck(const DNSName &domain, const string &remote)
+void CommunicatorClass::suck(const DNSName &domain, const ComboAddress& remote)
 {
   {
     Lock l(&d_lock);
@@ -299,7 +299,7 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
   }
   RemoveSentinel rs(domain, this); // this removes us from d_inprogress when we go out of scope
 
-  g_log<<Logger::Error<<"Initiating transfer of '"<<domain<<"' from remote '"<<remote<<"'"<<endl;
+  L<<Logger::Error<<"Initiating transfer of '"<<domain<<"' from remote '"<<remote.toStringWithPortExcept(53)<<"'"<<endl;
   UeberBackend B; // fresh UeberBackend
 
   DomainInfo di;
@@ -354,7 +354,7 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
 
     vector<string> localaddr;
     ComboAddress laddr;
-    ComboAddress raddr(remote, 53);
+
     if(B.getDomainMetadata(domain, "AXFR-SOURCE", localaddr) && !localaddr.empty()) {
       try {
         laddr = ComboAddress(localaddr[0]);
@@ -365,12 +365,12 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
         return;
       }
     } else {
-      if(raddr.sin4.sin_family == AF_INET && !::arg()["query-local-address"].empty()) {
+      if(remote.sin4.sin_family == AF_INET && !::arg()["query-local-address"].empty()) {
         laddr = ComboAddress(::arg()["query-local-address"]);
-      } else if(raddr.sin4.sin_family == AF_INET6 && !::arg()["query-local-address6"].empty()) {
+      } else if(remote.sin4.sin_family == AF_INET6 && !::arg()["query-local-address6"].empty()) {
         laddr = ComboAddress(::arg()["query-local-address6"]);
       } else {
-        bool isv6 = raddr.sin4.sin_family == AF_INET6;
+        bool isv6 = remote.sin4.sin_family == AF_INET6;
         g_log<<Logger::Error<<"Unable to AXFR, destination address is IPv" << (isv6 ? "6" : "4") << ", but query-local-address"<< (isv6 ? "6" : "") << " is unset!"<<endl;
         return;
       }
@@ -398,10 +398,10 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
       B.getDomainMetadata(domain, "IXFR", meta);
       if(!meta.empty() && meta[0]=="1") {
         vector<DNSRecord> axfr;
-        g_log<<Logger::Warning<<"Starting IXFR of '"<<domain<<"' from remote "<<raddr.toStringWithPort()<<endl;
-        ixfrSuck(domain, tt, laddr, raddr, pdl, zs, &axfr);
+        g_log<<Logger::Warning<<"Starting IXFR of '"<<domain<<"' from remote "<<remote.toStringWithPortExcept(53)<<endl;
+        ixfrSuck(domain, tt, laddr, remote, pdl, zs, &axfr);
         if(!axfr.empty()) {
-          g_log<<Logger::Warning<<"IXFR of '"<<domain<<"' from remote '"<<raddr.toStringWithPort()<<"' turned into an AXFR"<<endl;
+          g_log<<Logger::Warning<<"IXFR of '"<<domain<<"' from remote '"<<remote.toStringWithPortExcept(53)<<"' turned into an AXFR"<<endl;
           bool firstNSEC3=true;
           rrs.reserve(axfr.size());
           for(const auto& dr : axfr) {
@@ -426,9 +426,9 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote)
     }
 
     if(rrs.empty()) {
-      g_log<<Logger::Warning<<"Starting AXFR of '"<<domain<<"' from remote "<<raddr.toStringWithPort()<<endl;
-      rrs = doAxfr(raddr, domain, tt, laddr, pdl, zs);
-      g_log<<Logger::Warning<<"AXFR of '"<<domain<<"' from remote "<<raddr.toStringWithPort()<<" done"<<endl;
+      g_log<<Logger::Warning<<"Starting AXFR of '"<<domain<<"' from remote "<<remote.toStringWithPortExcept(53)<<endl;
+      rrs = doAxfr(remote, domain, tt, laddr, pdl, zs);
+      g_log<<Logger::Warning<<"AXFR of '"<<domain<<"' from remote "<<remote.toStringWithPortExcept(53)<<" done"<<endl;
     }
  
     if(zs.isNSEC3) {
@@ -665,10 +665,9 @@ struct SlaveSenderReceiver
   {
     random_shuffle(dni.di.masters.begin(), dni.di.masters.end());
     try {
-      ComboAddress remote(*dni.di.masters.begin(), 53);
       return std::make_tuple(dni.di.zone,
-                             remote,
-                             d_resolver.sendResolve(remote,
+                             *dni.di.masters.begin(),
+                             d_resolver.sendResolve(*dni.di.masters.begin(),
                                                     dni.localaddr,
                                                     dni.di.zone,
                                                     QType::SOA,
index 3779e33f01a3a8b953d14b44807ef9ca4fc1de6b..f345c10e1d1073074dc2b4fbc033c240129e071b 100644 (file)
@@ -13,6 +13,7 @@
 #include <cstdlib>
 #include "dnsname.hh"
 #include "bindparserclasses.hh"
+#include "iputils.hh"
 
 using std::string;
 
@@ -43,7 +44,7 @@ BOOST_AUTO_TEST_CASE(test_parser) {
 
         checkzone(0, example.com, "./zones//example.com", master, 0);
         checkzone(1, test.com, "./zones//test.com", slave, 1);
-        BOOST_CHECK_EQUAL(domains[1].masters[0], "1.2.3.4:5678");
+        BOOST_CHECK_EQUAL(domains[1].masters[0].toString(), ComboAddress("1.2.3.4", 5678).toString());
         checkzone(2, test.dyndns, "./zones//test.dyndns", garblewarble, 0);
         checkzone(3, wtest.com, "./zones//wtest.com", master, 0);
         checkzone(4, nztest.com, "./zones//nztest.com", master, 0);
index 72ecc517451258adc704c2585a6d6699cac5d28d..7bfc822150b55f41cce7785b0da04de7a327494e 100644 (file)
@@ -303,6 +303,10 @@ static inline string makeBackendRecordContent(const QType& qtype, const string&
 
 static Json::object getZoneInfo(const DomainInfo& di, DNSSECKeeper *dk) {
   string zoneId = apiZoneNameToId(di.zone);
+  vector<string> masters;
+  for(const auto& m : di.masters)
+    masters.push_back(m.toStringWithPortExcept(53));
+  
   return Json::object {
     // id is the canonical lookup key, which doesn't actually match the name (in some cases)
     { "id", zoneId },
@@ -311,7 +315,7 @@ static Json::object getZoneInfo(const DomainInfo& di, DNSSECKeeper *dk) {
     { "kind", di.getKindString() },
     { "dnssec", dk->isSecuredZone(di.zone) },
     { "account", di.account },
-    { "masters", di.masters },
+    { "masters", masters },
     { "serial", (double)di.serial },
     { "notified_serial", (double)di.notified_serial },
     { "last_check", (double)di.last_check }
@@ -1454,7 +1458,7 @@ static void apiServerZoneAxfrRetrieve(HttpRequest* req, HttpResponse* resp) {
 
   random_shuffle(di.masters.begin(), di.masters.end());
   Communicator.addSuckRequest(zonename, di.masters.front());
-  resp->setSuccessResult("Added retrieval request for '"+zonename.toString()+"' from master "+di.masters.front());
+  resp->setSuccessResult("Added retrieval request for '"+zonename.toString()+"' from master "+di.masters.front().toStringWithPortExcept(53));
 }
 
 static void apiServerZoneNotify(HttpRequest* req, HttpResponse* resp) {
index 7fa9eadb76dadb0ed724901fe274e6aedc3084a9..a87abadd18c16b2093b5f291a3874f616fcd0e1f 100644 (file)
@@ -111,7 +111,7 @@ static void startNewTransaction()
     cout<<"BEGIN TRANSACTION;"<<endl;
 }
 
-static void emitDomain(const DNSName& domain, const vector<string> *masters = 0) {
+static void emitDomain(const DNSName& domain, const vector<ComboAddress> *masters = 0) {
   string iDomain = domain.toStringRootDot();
   if(!::arg().mustDo("slave")) {
     if(g_mode==POSTGRES || g_mode==MYSQL || g_mode==SQLITE) {
@@ -130,8 +130,8 @@ static void emitDomain(const DNSName& domain, const vector<string> *masters = 0)
     if(g_mode==POSTGRES || g_mode==MYSQL || g_mode==SQLITE) {
       string mstrs;
       if (masters != 0 && ! masters->empty()) {
-        for(const string& mstr :  *masters) {
-          mstrs.append(mstr);
+        for(const auto& mstr :  *masters) {
+          mstrs.append(mstr.toStringWithPortExcept(53));
           mstrs.append(1, ' ');
         }
       }