From e96118247793fdf4b40dc61d7ebd2c19a64939a3 Mon Sep 17 00:00:00 2001 From: Tobias Markmann Date: Tue, 21 Oct 2014 23:36:09 +0200 Subject: Fix libunbound support in Swiften which was broken since API change in 8ec22a9. Test-Information: Build for Android 4.3 (arm) and successfully ran checker in emulator VM. Change-Id: Iedaae5df367ee86bfe2375879b0e0981deef9b0a diff --git a/Swiften/Network/BoostNetworkFactories.cpp b/Swiften/Network/BoostNetworkFactories.cpp index 72e826a..870ae97 100644 --- a/Swiften/Network/BoostNetworkFactories.cpp +++ b/Swiften/Network/BoostNetworkFactories.cpp @@ -44,7 +44,7 @@ BoostNetworkFactories::BoostNetworkFactories(EventLoop* eventLoop) : eventLoop(e idnConverter = PlatformIDNConverter::create(); #ifdef USE_UNBOUND // TODO: What to do about idnConverter. - domainNameResolver = new UnboundDomainNameResolver(ioServiceThread.getIOService(), eventLoop); + domainNameResolver = new UnboundDomainNameResolver(idnConverter, ioServiceThread.getIOService(), eventLoop); #else domainNameResolver = new PlatformDomainNameResolver(idnConverter, eventLoop); #endif diff --git a/Swiften/Network/UnboundDomainNameResolver.cpp b/Swiften/Network/UnboundDomainNameResolver.cpp index d986385..bc280eb 100755 --- a/Swiften/Network/UnboundDomainNameResolver.cpp +++ b/Swiften/Network/UnboundDomainNameResolver.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -173,7 +174,7 @@ class UnboundDomainNameAddressQuery : public DomainNameAddressQuery, public Unbo std::string name; }; -UnboundDomainNameResolver::UnboundDomainNameResolver(boost::shared_ptr ioService, EventLoop* eventLoop) : ioService(ioService), ubDescriptior(*ioService), eventLoop(eventLoop) { +UnboundDomainNameResolver::UnboundDomainNameResolver(IDNConverter* idnConverter, boost::shared_ptr ioService, EventLoop* eventLoop) : idnConverter(idnConverter), ioService(ioService), ubDescriptior(*ioService), eventLoop(eventLoop) { ubContext = ub_ctx_create(); if(!ubContext) { SWIFT_LOG(debug) << "could not create unbound context" << std::endl; @@ -186,11 +187,11 @@ UnboundDomainNameResolver::UnboundDomainNameResolver(boost::shared_ptr("/etc/resolv.conf"))) != 0) { - SWIFT_LOG(debug) << "error reading resolv.conf: " << ub_strerror(ret) << ". errno says: " << strerror(errno) << std::endl; + SWIFT_LOG(error) << "error reading resolv.conf: " << ub_strerror(ret) << ". errno says: " << strerror(errno) << std::endl; } /* read /etc/hosts for locally supplied host addresses */ if( (ret=ub_ctx_hosts(ubContext, const_cast("/etc/hosts"))) != 0) { - SWIFT_LOG(debug) << "error reading hosts: " << ub_strerror(ret) << ". errno says: " << strerror(errno) << std::endl; + SWIFT_LOG(error) << "error reading hosts: " << ub_strerror(ret) << ". errno says: " << strerror(errno) << std::endl; } ubDescriptior.assign(ub_fd(ubContext)); @@ -230,12 +231,17 @@ void UnboundDomainNameResolver::processData() { } } -boost::shared_ptr UnboundDomainNameResolver::createServiceQuery(const std::string& name) { - return boost::make_shared(this, ubContext, name); +boost::shared_ptr UnboundDomainNameResolver::createServiceQuery(const std::string& serviceLookupPrefix, const std::string& domain) { + boost::optional encodedDomain = idnConverter->getIDNAEncoded(domain); + std::string result; + if (encodedDomain) { + result = serviceLookupPrefix + *encodedDomain; + } + return boost::make_shared(this, ubContext, result); } boost::shared_ptr UnboundDomainNameResolver::createAddressQuery(const std::string& name) { - return boost::make_shared(this, ubContext, name); + return boost::make_shared(this, ubContext, idnConverter->getIDNAEncoded(name).get_value_or("")); } } diff --git a/Swiften/Network/UnboundDomainNameResolver.h b/Swiften/Network/UnboundDomainNameResolver.h index 0db8a66..6b78cf3 100755 --- a/Swiften/Network/UnboundDomainNameResolver.h +++ b/Swiften/Network/UnboundDomainNameResolver.h @@ -19,6 +19,7 @@ struct ub_result; namespace Swift { class EventLoop; + class IDNConverter; class TimerFactory; class UnboundDomainNameResolver; @@ -26,10 +27,10 @@ namespace Swift { class UnboundDomainNameResolver : public DomainNameResolver, public EventOwner, public boost::enable_shared_from_this { public: - UnboundDomainNameResolver(boost::shared_ptr ioService, EventLoop* eventLoop); + UnboundDomainNameResolver(IDNConverter* idnConverter, boost::shared_ptr ioService, EventLoop* eventLoop); virtual ~UnboundDomainNameResolver(); - virtual boost::shared_ptr createServiceQuery(const std::string& name); + virtual boost::shared_ptr createServiceQuery(const std::string& serviceLookupPrefix, const std::string& domain); virtual boost::shared_ptr createAddressQuery(const std::string& name); static void unbound_callback_wrapper(void* data, int err, ub_result* result); @@ -41,6 +42,7 @@ namespace Swift { void processData(); private: + IDNConverter* idnConverter; boost::shared_ptr eventOwner; boost::shared_ptr ioService; boost::asio::posix::stream_descriptor ubDescriptior; diff --git a/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp b/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp index 6d25f49..dcd2be8 100644 --- a/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp +++ b/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp @@ -55,10 +55,10 @@ class DomainNameResolverTest : public CppUnit::TestFixture { void setUp() { ioServiceThread = new BoostIOServiceThread(); eventLoop = new DummyEventLoop(); + idnConverter = boost::shared_ptr(PlatformIDNConverter::create()); #ifdef USE_UNBOUND - resolver = new UnboundDomainNameResolver(ioServiceThread->getIOService(), eventLoop); + resolver = new UnboundDomainNameResolver(idnConverter.get(), ioServiceThread->getIOService(), eventLoop); #else - idnConverter = boost::shared_ptr(PlatformIDNConverter::create()); resolver = new PlatformDomainNameResolver(idnConverter.get(), eventLoop); #endif resultsAvailable = false; -- cgit v0.10.2-6-g49f6