summaryrefslogtreecommitdiffhomepage
path: root/windows
diff options
context:
space:
mode:
Diffstat (limited to 'windows')
-rw-r--r--windows/winfw/src/winfw/rules/dns/permitnontunnel.cpp27
-rw-r--r--windows/winfw/src/winfw/rules/dns/permittunnel.cpp27
-rw-r--r--windows/winfw/src/winfw/rules/shared.cpp40
-rw-r--r--windows/winfw/src/winfw/rules/shared.h13
-rw-r--r--windows/winfw/src/winfw/winfw.vcxproj2
-rw-r--r--windows/winfw/src/winfw/winfw.vcxproj.filters6
6 files changed, 65 insertions, 50 deletions
diff --git a/windows/winfw/src/winfw/rules/dns/permitnontunnel.cpp b/windows/winfw/src/winfw/rules/dns/permitnontunnel.cpp
index 0af09a2d8b..729254d1f4 100644
--- a/windows/winfw/src/winfw/rules/dns/permitnontunnel.cpp
+++ b/windows/winfw/src/winfw/rules/dns/permitnontunnel.cpp
@@ -2,6 +2,7 @@
#include "permitnontunnel.h"
#include <winfw/mullvadguids.h>
#include <winfw/rules/ports.h>
+#include <winfw/rules/shared.h>
#include <libwfp/filterbuilder.h>
#include <libwfp/conditionbuilder.h>
#include <libwfp/conditions/conditionport.h>
@@ -17,31 +18,7 @@ namespace rules::dns
PermitNonTunnel::PermitNonTunnel(std::optional<std::wstring> tunnelInterfaceAlias, const std::vector<wfp::IpAddress> &hosts)
: m_tunnelInterfaceAlias(std::move(tunnelInterfaceAlias))
{
- if (hosts.empty())
- {
- THROW_ERROR("Invalid argument: No hosts specified");
- }
-
- for (const auto &host : hosts)
- {
- switch (host.type())
- {
- case wfp::IpAddress::Type::Ipv4:
- {
- m_hostsIpv4.push_back(host);
- break;
- }
- case wfp::IpAddress::Type::Ipv6:
- {
- m_hostsIpv6.push_back(host);
- break;
- }
- default:
- {
- THROW_ERROR("Missing case handler in switch clause");
- }
- }
- }
+ SplitAddresses(hosts, m_hostsIpv4, m_hostsIpv6);
}
bool PermitNonTunnel::apply(IObjectInstaller &objectInstaller)
diff --git a/windows/winfw/src/winfw/rules/dns/permittunnel.cpp b/windows/winfw/src/winfw/rules/dns/permittunnel.cpp
index 64211ef17f..cc1af84223 100644
--- a/windows/winfw/src/winfw/rules/dns/permittunnel.cpp
+++ b/windows/winfw/src/winfw/rules/dns/permittunnel.cpp
@@ -2,6 +2,7 @@
#include "permittunnel.h"
#include <winfw/mullvadguids.h>
#include <winfw/rules/ports.h>
+#include <winfw/rules/shared.h>
#include <libwfp/filterbuilder.h>
#include <libwfp/conditionbuilder.h>
#include <libwfp/conditions/conditionport.h>
@@ -17,31 +18,7 @@ namespace rules::dns
PermitTunnel::PermitTunnel(const std::wstring &tunnelInterfaceAlias, const std::vector<wfp::IpAddress> &hosts)
: m_tunnelInterfaceAlias(tunnelInterfaceAlias)
{
- if (hosts.empty())
- {
- THROW_ERROR("Invalid argument: No hosts specified");
- }
-
- for (const auto &host : hosts)
- {
- switch (host.type())
- {
- case wfp::IpAddress::Type::Ipv4:
- {
- m_hostsIpv4.push_back(host);
- break;
- }
- case wfp::IpAddress::Type::Ipv6:
- {
- m_hostsIpv6.push_back(host);
- break;
- }
- default:
- {
- THROW_ERROR("Missing case handler in switch clause");
- }
- }
- }
+ SplitAddresses(hosts, m_hostsIpv4, m_hostsIpv6);
}
bool PermitTunnel::apply(IObjectInstaller &objectInstaller)
diff --git a/windows/winfw/src/winfw/rules/shared.cpp b/windows/winfw/src/winfw/rules/shared.cpp
new file mode 100644
index 0000000000..66cbbdfc83
--- /dev/null
+++ b/windows/winfw/src/winfw/rules/shared.cpp
@@ -0,0 +1,40 @@
+#include "stdafx.h"
+#include "shared.h"
+#include <libcommon/error.h>
+
+namespace rules
+{
+
+void SplitAddresses(const IpSet &in, IpSet &outIpv4, IpSet &outIpv6)
+{
+ if (in.empty())
+ {
+ THROW_ERROR("Invalid argument: No hosts specified");
+ }
+
+ outIpv4.clear();
+ outIpv6.clear();
+
+ for (const auto &host : in)
+ {
+ switch (host.type())
+ {
+ case wfp::IpAddress::Type::Ipv4:
+ {
+ outIpv4.push_back(host);
+ break;
+ }
+ case wfp::IpAddress::Type::Ipv6:
+ {
+ outIpv6.push_back(host);
+ break;
+ }
+ default:
+ {
+ THROW_ERROR("Missing case handler in switch clause");
+ }
+ }
+ }
+}
+
+}
diff --git a/windows/winfw/src/winfw/rules/shared.h b/windows/winfw/src/winfw/rules/shared.h
new file mode 100644
index 0000000000..1b08d3ed02
--- /dev/null
+++ b/windows/winfw/src/winfw/rules/shared.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <vector>
+#include <libwfp/ipaddress.h>
+
+namespace rules
+{
+
+using IpSet = std::vector<wfp::IpAddress>;
+
+void SplitAddresses(const IpSet &in, IpSet &outIpv4, IpSet &outIpv6);
+
+}
diff --git a/windows/winfw/src/winfw/winfw.vcxproj b/windows/winfw/src/winfw/winfw.vcxproj
index c3805cfec8..c999f5aaca 100644
--- a/windows/winfw/src/winfw/winfw.vcxproj
+++ b/windows/winfw/src/winfw/winfw.vcxproj
@@ -38,6 +38,7 @@
<ClCompile Include="rules\dns\blockall.cpp" />
<ClCompile Include="rules\dns\permitnontunnel.cpp" />
<ClCompile Include="rules\dns\permittunnel.cpp" />
+ <ClCompile Include="rules\shared.cpp" />
<ClCompile Include="sessioncontroller.cpp" />
<ClCompile Include="sessionrecord.cpp" />
<ClCompile Include="stdafx.cpp">
@@ -71,6 +72,7 @@
<ClInclude Include="rules\dns\permitnontunnel.h" />
<ClInclude Include="rules\dns\permittunnel.h" />
<ClInclude Include="rules\ports.h" />
+ <ClInclude Include="rules\shared.h" />
<ClInclude Include="wfpobjecttype.h" />
<ClInclude Include="rules\ifirewallrule.h" />
<ClInclude Include="sessioncontroller.h" />
diff --git a/windows/winfw/src/winfw/winfw.vcxproj.filters b/windows/winfw/src/winfw/winfw.vcxproj.filters
index 40d7c95067..46c0594c10 100644
--- a/windows/winfw/src/winfw/winfw.vcxproj.filters
+++ b/windows/winfw/src/winfw/winfw.vcxproj.filters
@@ -55,6 +55,9 @@
<ClCompile Include="rules\dns\permittunnel.cpp">
<Filter>rules\dns</Filter>
</ClCompile>
+ <ClCompile Include="rules\shared.cpp">
+ <Filter>rules</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h" />
@@ -120,6 +123,9 @@
<ClInclude Include="rules\dns\permittunnel.h">
<Filter>rules\dns</Filter>
</ClInclude>
+ <ClInclude Include="rules\shared.h">
+ <Filter>rules</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="rules">