From: Neil Cook Date: Wed, 23 Aug 2017 16:48:12 +0000 (+0100) Subject: Support for identifying devices by id such as mac address X-Git-Tag: rec-4.1.0-rc1~54^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=590388d2caf2196a598da16def01497f95f1d135;p=thirdparty%2Fpdns.git Support for identifying devices by id such as mac address --- diff --git a/pdns/dnsmessage.proto b/pdns/dnsmessage.proto index d64de370c8..f61bfca1e4 100644 --- a/pdns/dnsmessage.proto +++ b/pdns/dnsmessage.proto @@ -75,4 +75,5 @@ message PBDNSMessage { optional bytes originalRequestorSubnet = 14; // EDNS Client Subnet value optional string requestorId = 15; // Username of the requestor optional bytes initialRequestId = 16; // UUID of the incoming query that initiated this outgoing query or incoming response + optional bytes deviceId = 17; // Device ID of the requestor (could be mac address IP address or e.g. IMEI) } diff --git a/pdns/lua-recursor4.cc b/pdns/lua-recursor4.cc index 192eb2d187..b05af21a94 100644 --- a/pdns/lua-recursor4.cc +++ b/pdns/lua-recursor4.cc @@ -597,7 +597,7 @@ bool RecursorLua4::ipfilter(const ComboAddress& remote, const ComboAddress& loca return false; // don't block } -unsigned int RecursorLua4::gettag(const ComboAddress& remote, const Netmask& ednssubnet, const ComboAddress& local, const DNSName& qname, uint16_t qtype, std::vector* policyTags, LuaContext::LuaObject& data, const std::map& ednsOptions, bool tcp, std::string& requestorId) +unsigned int RecursorLua4::gettag(const ComboAddress& remote, const Netmask& ednssubnet, const ComboAddress& local, const DNSName& qname, uint16_t qtype, std::vector* policyTags, LuaContext::LuaObject& data, const std::map& ednsOptions, bool tcp, std::string& requestorId, std::string& deviceId) { if(d_gettag) { auto ret = d_gettag(remote, ednssubnet, local, qname, qtype, ednsOptions, tcp); @@ -618,6 +618,10 @@ unsigned int RecursorLua4::gettag(const ComboAddress& remote, const Netmask& edn if (reqIdret) { requestorId = *reqIdret; } + const auto deviceIdret = std::get<4>(ret); + if (deviceIdret) { + deviceId = *deviceIdret; + } return std::get<0>(ret); } return 0; diff --git a/pdns/lua-recursor4.hh b/pdns/lua-recursor4.hh index adfeaedfcc..db6966adbd 100644 --- a/pdns/lua-recursor4.hh +++ b/pdns/lua-recursor4.hh @@ -71,6 +71,7 @@ public: std::vector* policyTags{nullptr}; std::unordered_map* discardedPolicies{nullptr}; std::string requestorId; + std::string deviceId; bool& variable; bool& wantsRPZ; unsigned int tag{0}; @@ -102,7 +103,7 @@ public: DNSName followupName; }; - unsigned int gettag(const ComboAddress& remote, const Netmask& ednssubnet, const ComboAddress& local, const DNSName& qname, uint16_t qtype, std::vector* policyTags, LuaContext::LuaObject& data, const std::map&, bool tcp, std::string& requestorId); + unsigned int gettag(const ComboAddress& remote, const Netmask& ednssubnet, const ComboAddress& local, const DNSName& qname, uint16_t qtype, std::vector* policyTags, LuaContext::LuaObject& data, const std::map&, bool tcp, std::string& requestorId, std::string& deviceId); bool prerpz(DNSQuestion& dq, int& ret); bool preresolve(DNSQuestion& dq, int& ret); @@ -122,7 +123,7 @@ public: d_postresolve); } - typedef std::function >,boost::optional,boost::optional >(ComboAddress, Netmask, ComboAddress, DNSName, uint16_t, const std::map&, bool)> gettag_t; + typedef std::function >,boost::optional,boost::optional,boost::optional >(ComboAddress, Netmask, ComboAddress, DNSName, uint16_t, const std::map&, bool)> gettag_t; gettag_t d_gettag; // public so you can query if we have this hooked private: diff --git a/pdns/pdns_recursor.cc b/pdns/pdns_recursor.cc index 8e84f339d0..c61e766035 100644 --- a/pdns/pdns_recursor.cc +++ b/pdns/pdns_recursor.cc @@ -206,6 +206,7 @@ struct DNSComboWriter { #ifdef HAVE_PROTOBUF boost::uuids::uuid d_uuid; string d_requestorId; + string d_deviceId; #endif EDNSSubnetOpts d_ednssubnet; bool d_ecsFound{false}; @@ -647,13 +648,14 @@ catch(...) } #ifdef HAVE_PROTOBUF -static void protobufLogQuery(const std::shared_ptr& logger, uint8_t maskV4, uint8_t maskV6, const boost::uuids::uuid& uniqueId, const ComboAddress& remote, const ComboAddress& local, const Netmask& ednssubnet, bool tcp, uint16_t id, size_t len, const DNSName& qname, uint16_t qtype, uint16_t qclass, const std::vector& policyTags, const std::string& requestorId) +static void protobufLogQuery(const std::shared_ptr& logger, uint8_t maskV4, uint8_t maskV6, const boost::uuids::uuid& uniqueId, const ComboAddress& remote, const ComboAddress& local, const Netmask& ednssubnet, bool tcp, uint16_t id, size_t len, const DNSName& qname, uint16_t qtype, uint16_t qclass, const std::vector& policyTags, const std::string& requestorId, const std::string& deviceId) { Netmask requestorNM(remote, remote.sin4.sin_family == AF_INET ? maskV4 : maskV6); const ComboAddress& requestor = requestorNM.getMaskedNetwork(); RecProtoBufMessage message(DNSProtoBufMessage::Query, uniqueId, &requestor, &local, qname, qtype, qclass, id, tcp, len); message.setEDNSSubnet(ednssubnet, ednssubnet.isIpv4() ? maskV4 : maskV6); message.setRequestorId(requestorId); + message.setDeviceId(deviceId); if (!policyTags.empty()) { message.setPolicyTags(policyTags); @@ -816,6 +818,7 @@ static void startDoResolve(void *p) dq.data = dc->d_data; #ifdef HAVE_PROTOBUF dq.requestorId = dc->d_requestorId; + dq.deviceId = dc->d_deviceId; #endif if(dc->d_mdp.d_qtype==QType::ANY && !dc->d_tcp && g_anyToTcp) { @@ -1150,6 +1153,7 @@ static void startDoResolve(void *p) pbMessage.setPolicyTags(dc->d_policyTags); pbMessage.setQueryTime(dc->d_now.tv_sec, dc->d_now.tv_usec); pbMessage.setRequestorId(dq.requestorId); + pbMessage.setDeviceId(dq.deviceId); protobufLogResponse(luaconfsLocal->protobufServer, pbMessage); } #endif @@ -1416,6 +1420,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var) uint16_t qclass=0; bool needECS = false; string requestorId; + string deviceId; #ifdef HAVE_PROTOBUF auto luaconfsLocal = g_luaconfs.getLocal(); if (luaconfsLocal->protobufServer) { @@ -1432,7 +1437,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var) if(t_pdl && t_pdl->d_gettag) { try { - dc->d_tag = t_pdl->gettag(conn->d_remote, dc->d_ednssubnet.source, dest, qname, qtype, &dc->d_policyTags, dc->d_data, ednsOptions, true, requestorId); + dc->d_tag = t_pdl->gettag(conn->d_remote, dc->d_ednssubnet.source, dest, qname, qtype, &dc->d_policyTags, dc->d_data, ednsOptions, true, requestorId, deviceId); } catch(std::exception& e) { if(g_logCommonErrors) @@ -1449,6 +1454,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var) #ifdef HAVE_PROTOBUF if(luaconfsLocal->protobufServer || luaconfsLocal->outgoingProtobufServer) { dc->d_requestorId = requestorId; + dc->d_deviceId = deviceId; dc->d_uuid = (*t_uuidGenerator)(); } @@ -1457,7 +1463,7 @@ static void handleRunningTCPQuestion(int fd, FDMultiplexer::funcparam_t& var) const struct dnsheader* dh = (const struct dnsheader*) conn->data; if (!luaconfsLocal->protobufTaggedOnly) { - protobufLogQuery(luaconfsLocal->protobufServer, luaconfsLocal->protobufMaskV4, luaconfsLocal->protobufMaskV6, dc->d_uuid, conn->d_remote, dest, dc->d_ednssubnet.source, true, dh->id, conn->qlen, qname, qtype, qclass, dc->d_policyTags, dc->d_requestorId); + protobufLogQuery(luaconfsLocal->protobufServer, luaconfsLocal->protobufMaskV4, luaconfsLocal->protobufMaskV6, dc->d_uuid, conn->d_remote, dest, dc->d_ednssubnet.source, true, dh->id, conn->qlen, qname, qtype, qclass, dc->d_policyTags, dc->d_requestorId, dc->d_deviceId); } } catch(std::exception& e) { @@ -1567,6 +1573,7 @@ static string* doProcessUDPQuestion(const std::string& question, const ComboAddr std::vector policyTags; LuaContext::LuaObject data; string requestorId; + string deviceId; #ifdef HAVE_PROTOBUF boost::uuids::uuid uniqueId; auto luaconfsLocal = g_luaconfs.getLocal(); @@ -1607,7 +1614,7 @@ static string* doProcessUDPQuestion(const std::string& question, const ComboAddr if(t_pdl && t_pdl->d_gettag) { try { - ctag=t_pdl->gettag(fromaddr, ednssubnet.source, destaddr, qname, qtype, &policyTags, data, ednsOptions, false, requestorId); + ctag=t_pdl->gettag(fromaddr, ednssubnet.source, destaddr, qname, qtype, &policyTags, data, ednsOptions, false, requestorId, deviceId); } catch(std::exception& e) { if(g_logCommonErrors) @@ -1627,7 +1634,7 @@ static string* doProcessUDPQuestion(const std::string& question, const ComboAddr #ifdef HAVE_PROTOBUF if(luaconfsLocal->protobufServer) { if (!luaconfsLocal->protobufTaggedOnly || !policyTags.empty()) { - protobufLogQuery(luaconfsLocal->protobufServer, luaconfsLocal->protobufMaskV4, luaconfsLocal->protobufMaskV6, uniqueId, fromaddr, destaddr, ednssubnet.source, false, dh->id, question.size(), qname, qtype, qclass, policyTags, requestorId); + protobufLogQuery(luaconfsLocal->protobufServer, luaconfsLocal->protobufMaskV4, luaconfsLocal->protobufMaskV6, uniqueId, fromaddr, destaddr, ednssubnet.source, false, dh->id, question.size(), qname, qtype, qclass, policyTags, requestorId, deviceId); } } #endif /* HAVE_PROTOBUF */ @@ -1648,6 +1655,7 @@ static string* doProcessUDPQuestion(const std::string& question, const ComboAddr pbMessage.setEDNSSubnet(ednssubnet.source, ednssubnet.source.isIpv4() ? luaconfsLocal->protobufMaskV4 : luaconfsLocal->protobufMaskV6); pbMessage.setQueryTime(g_now.tv_sec, g_now.tv_usec); pbMessage.setRequestorId(requestorId); + pbMessage.setDeviceId(deviceId); protobufLogResponse(luaconfsLocal->protobufServer, pbMessage); } #endif /* HAVE_PROTOBUF */ @@ -1718,6 +1726,7 @@ static string* doProcessUDPQuestion(const std::string& question, const ComboAddr dc->d_uuid = uniqueId; } dc->d_requestorId = requestorId; + dc->d_deviceId = deviceId; #endif MT->makeThread(startDoResolve, (void*) dc); // deletes dc diff --git a/pdns/protobuf.cc b/pdns/protobuf.cc index f3bf4c63d4..3c9b49a0b3 100644 --- a/pdns/protobuf.cc +++ b/pdns/protobuf.cc @@ -236,6 +236,13 @@ void DNSProtoBufMessage::setRequestorId(const std::string& requestorId) #endif /* HAVE_PROTOBUF */ } +void DNSProtoBufMessage::setDeviceId(const std::string& deviceId) +{ +#ifdef HAVE_PROTOBUF + d_message.set_deviceid(deviceId); +#endif /* HAVE_PROTOBUF */ +} + void DNSProtoBufMessage::setResponder(const std::string& responder) { #ifdef HAVE_PROTOBUF diff --git a/pdns/protobuf.hh b/pdns/protobuf.hh index 0783cf9036..0fab8fa3ac 100644 --- a/pdns/protobuf.hh +++ b/pdns/protobuf.hh @@ -69,6 +69,7 @@ public: void setResponder(const std::string& responder); void setResponder(const ComboAddress& responder); void setRequestorId(const std::string& requestorId); + void setDeviceId(const std::string& deviceId); std::string toDebugString() const; void addTag(const std::string& strValue); void addRR(const DNSName& qame, uint16_t utype, uint16_t uClass, uint32_t uTTl, const std::string& strBlob);