summaryrefslogtreecommitdiffhomepage
path: root/windows/windns/src
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2018-05-31 23:19:28 +0200
committerOdd Stranne <odd@mullvad.net>2018-06-18 08:45:15 +0200
commit1db7d45cfca452c61423f6748cf6280625bc645b (patch)
treeafcdc6639a0a1e5ff23cc7bd343381a417a75a29 /windows/windns/src
parent23525e2635b88a90813badf69a0569bcf3ffcb88 (diff)
downloadmullvadvpn-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.cpp21
-rw-r--r--windows/windns/src/windns/netconfigeventsink.h8
-rw-r--r--windows/windns/src/windns/windnscontext.cpp48
-rw-r--r--windows/windns/src/windns/windnscontext.h4
-rw-r--r--windows/windns/src/windns/wmi/notification.cpp8
-rw-r--r--windows/windns/src/windns/wmi/notification.h6
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;
};