diff options
| author | Odd Stranne <odd@mullvad.net> | 2018-05-31 23:19:28 +0200 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2018-06-18 08:45:15 +0200 |
| commit | 1db7d45cfca452c61423f6748cf6280625bc645b (patch) | |
| tree | afcdc6639a0a1e5ff23cc7bd343381a417a75a29 /windows/windns/src | |
| parent | 23525e2635b88a90813badf69a0569bcf3ffcb88 (diff) | |
| download | mullvadvpn-1db7d45cfca452c61423f6748cf6280625bc645b.tar.xz mullvadvpn-1db7d45cfca452c61423f6748cf6280625bc645b.zip | |
Adapt code to new interfaces and updated prototypes
Diffstat (limited to 'windows/windns/src')
| -rw-r--r-- | windows/windns/src/windns/netconfigeventsink.cpp | 21 | ||||
| -rw-r--r-- | windows/windns/src/windns/netconfigeventsink.h | 8 | ||||
| -rw-r--r-- | windows/windns/src/windns/windnscontext.cpp | 48 | ||||
| -rw-r--r-- | windows/windns/src/windns/windnscontext.h | 4 | ||||
| -rw-r--r-- | windows/windns/src/windns/wmi/notification.cpp | 8 | ||||
| -rw-r--r-- | windows/windns/src/windns/wmi/notification.h | 6 |
6 files changed, 34 insertions, 61 deletions
diff --git a/windows/windns/src/windns/netconfigeventsink.cpp b/windows/windns/src/windns/netconfigeventsink.cpp index 6a506e3f3f..117775a18e 100644 --- a/windows/windns/src/windns/netconfigeventsink.cpp +++ b/windows/windns/src/windns/netconfigeventsink.cpp @@ -8,24 +8,23 @@ NetConfigEventSink::NetConfigEventSink(std::shared_ptr<wmi::IConnection> connect { } -void NetConfigEventSink::update(CComPtr<IWbemClassObject> instance) +void NetConfigEventSink::update(CComPtr<IWbemClassObject> previous, CComPtr<IWbemClassObject> target) { - DnsConfig config(instance); - ConfigManager::Mutex mutex(*m_configManager); // // This is OK because the config manager will reject updates // that set our DNS servers. // - auto updated = m_configManager->updateConfig(std::move(config)); - - if (updated) + if (ConfigManager::UpdateType::WinDnsEnforced == m_configManager->updateConfig(DnsConfig(previous), DnsConfig(target))) { - // - // Override current settings to use our DNS servers. - // - auto servers = m_configManager->getServers(); - nchelpers::SetDnsServers(*m_connection, instance, &servers); + return; } + + // + // The update was initiated from an external source. + // Override current settings to enforce our selected DNS servers. + // + auto servers = m_configManager->getServers(); + nchelpers::SetDnsServers(*m_connection, target, &servers); } diff --git a/windows/windns/src/windns/netconfigeventsink.h b/windows/windns/src/windns/netconfigeventsink.h index 35ab829a08..994fac860c 100644 --- a/windows/windns/src/windns/netconfigeventsink.h +++ b/windows/windns/src/windns/netconfigeventsink.h @@ -1,17 +1,17 @@ #pragma once -#include "windns/wmi/eventsink.h" +#include "windns/wmi/ieventsink.h" #include "windns/wmi/iconnection.h" #include "windns/configmanager.h" #include <memory> -class NetConfigEventSink : public wmi::IEventSink +class NetConfigEventSink : public wmi::IModificationEventSink { public: - explicit NetConfigEventSink(std::shared_ptr<wmi::IConnection> connection, std::shared_ptr<ConfigManager> configManager); + NetConfigEventSink(std::shared_ptr<wmi::IConnection> connection, std::shared_ptr<ConfigManager> configManager); - void update(CComPtr<IWbemClassObject> instance) override; + void update(CComPtr<IWbemClassObject> previous, CComPtr<IWbemClassObject> target) override; private: diff --git a/windows/windns/src/windns/windnscontext.cpp b/windows/windns/src/windns/windnscontext.cpp index c7cc10c4b9..8daff46145 100644 --- a/windows/windns/src/windns/windnscontext.cpp +++ b/windows/windns/src/windns/windnscontext.cpp @@ -9,32 +9,20 @@ WinDnsContext::WinDnsContext() m_connection = std::make_shared<wmi::Connection>(wmi::Connection::Namespace::Cimv2); } -bool WinDnsContext::set(const std::vector<std::wstring> &servers, WinDnsErrorSink /*errorSink*/, void * /*errorContext*/) +bool WinDnsContext::set(const std::vector<std::wstring> &servers, const ClientSinkInfo &sinkInfo) { - m_configManager = std::make_shared<ConfigManager>(servers); - - // - // See test app for details. - // - // Discover all active interface configurations. - // + m_sinkInfo = sinkInfo; - auto resultSet = m_connection->query(L"SELECT * from Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"); - - while (resultSet.advance()) - { - auto config = DnsConfig(resultSet.result()); - m_configManager->updateConfig(std::move(config)); - } + m_configManager = std::make_shared<ConfigManager>(servers); // // Register interface configuration monitoring. // auto eventSink = std::make_shared<NetConfigEventSink>(m_connection, m_configManager); - auto eventSinkWrapper = CComPtr<wmi::EventSink>(new wmi::EventSink(eventSink)); + auto eventDispatcher = CComPtr<wmi::IEventDispatcher>(new wmi::ModificationEventDispatcher(eventSink)); - m_notification = std::make_unique<wmi::Notification>(m_connection, eventSinkWrapper); + m_notification = std::make_unique<wmi::Notification>(m_connection, eventDispatcher); m_notification->activate ( @@ -46,30 +34,14 @@ bool WinDnsContext::set(const std::vector<std::wstring> &servers, WinDnsErrorSin ); // - // Apply our DNS settings + // Discover all active interfaces and apply our DNS settings. // - { - ConfigManager::Mutex mutex(*m_configManager); - - m_configManager->processConfigs([&](const DnsConfig &config) - { - std::wstringstream ss; - - ss << L"SELECT * FROM Win32_NetworkAdapterConfiguration " - << L"WHERE SettingID = '" << config.id() << L"'"; - - auto resultSet = m_connection->query(ss.str().c_str()); - - if (resultSet.advance()) - { - auto activeConfig = resultSet.result(); - nchelpers::SetDnsServers(*m_connection, activeConfig, &servers); - } + auto resultSet = m_connection->query(L"SELECT * from Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"); - // Continue with the next interface configuration. - return true; - }); + while (resultSet.advance()) + { + nchelpers::SetDnsServers(*m_connection, resultSet.result(), &servers); } return true; diff --git a/windows/windns/src/windns/windnscontext.h b/windows/windns/src/windns/windnscontext.h index 086969cc76..d6d3ad5a56 100644 --- a/windows/windns/src/windns/windnscontext.h +++ b/windows/windns/src/windns/windnscontext.h @@ -4,6 +4,7 @@ #include "wmi/connection.h" #include "wmi/notification.h" #include "configmanager.h" +#include "clientsinkinfo.h" #include <vector> #include <string> #include <memory> @@ -20,7 +21,7 @@ public: reset(); } - bool set(const std::vector<std::wstring> &servers, WinDnsErrorSink errorSink, void *errorContext); + bool set(const std::vector<std::wstring> &servers, const ClientSinkInfo &sinkInfo); bool reset(); private: @@ -28,4 +29,5 @@ private: std::shared_ptr<wmi::Connection> m_connection; std::shared_ptr<ConfigManager> m_configManager; std::unique_ptr<wmi::Notification> m_notification; + ClientSinkInfo m_sinkInfo; }; diff --git a/windows/windns/src/windns/wmi/notification.cpp b/windows/windns/src/windns/wmi/notification.cpp index a9427f6520..b78a0aa298 100644 --- a/windows/windns/src/windns/wmi/notification.cpp +++ b/windows/windns/src/windns/wmi/notification.cpp @@ -5,9 +5,9 @@ namespace wmi { -Notification::Notification(std::shared_ptr<IConnection> connection, CComPtr<EventSink> eventSink) +Notification::Notification(std::shared_ptr<IConnection> connection, CComPtr<IEventDispatcher> dispatcher) : m_connection(connection) - , m_eventSink(eventSink) + , m_dispatcher(dispatcher) { } @@ -28,7 +28,7 @@ void Notification::activate(const std::wstring &query) CComPtr<IUnknown> unknownEventSink; - status = m_eventSink->QueryInterface(IID_IUnknown, (void**)&unknownEventSink); + status = m_dispatcher->QueryInterface(IID_IUnknown, (void**)&unknownEventSink); VALIDATE_COM(status, "Retrieve IUnkown interface for event sink"); CComPtr<IUnknown> unknownForwarder; @@ -63,7 +63,7 @@ void Notification::deactivate() // // Using a Sleep() here is preferable to introducing a critical section in the callback. // - while (m_eventSink->processing()) + while (m_dispatcher->processing()) { Sleep(100); } diff --git a/windows/windns/src/windns/wmi/notification.h b/windows/windns/src/windns/wmi/notification.h index 40a57f1e57..8c9a4f2643 100644 --- a/windows/windns/src/windns/wmi/notification.h +++ b/windows/windns/src/windns/wmi/notification.h @@ -1,7 +1,7 @@ #pragma once #include "iconnection.h" -#include "eventsink.h" +#include "eventdispatcher.h" #include <atlbase.h> #include <memory> @@ -12,7 +12,7 @@ class Notification { public: - Notification(std::shared_ptr<IConnection> connection, CComPtr<EventSink> eventSink); + Notification(std::shared_ptr<IConnection> connection, CComPtr<IEventDispatcher> dispatcher); ~Notification(); Notification(const Notification &) = delete; @@ -26,7 +26,7 @@ public: private: std::shared_ptr<IConnection> m_connection; - CComPtr<EventSink> m_eventSink; + CComPtr<IEventDispatcher> m_dispatcher; CComPtr<IWbemObjectSink> m_forwarder; }; |
