summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--windows/winfw/src/winfw/fwcontext.cpp11
-rw-r--r--windows/winfw/src/winfw/rules/baseline/permitping.cpp35
-rw-r--r--windows/winfw/src/winfw/rules/baseline/permitping.h6
-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
9 files changed, 101 insertions, 66 deletions
diff --git a/windows/winfw/src/winfw/fwcontext.cpp b/windows/winfw/src/winfw/fwcontext.cpp
index c5c4646082..54a7797a69 100644
--- a/windows/winfw/src/winfw/fwcontext.cpp
+++ b/windows/winfw/src/winfw/fwcontext.cpp
@@ -177,13 +177,10 @@ bool FwContext::applyPolicyConnecting
{
const auto &ph = pingableHosts.value();
- for (const auto &host : ph.hosts)
- {
- ruleset.emplace_back(std::make_unique<baseline::PermitPing>(
- ph.tunnelInterfaceAlias,
- host
- ));
- }
+ ruleset.emplace_back(std::make_unique<baseline::PermitPing>(
+ ph.tunnelInterfaceAlias,
+ ph.hosts
+ ));
}
return applyRuleset(ruleset);
diff --git a/windows/winfw/src/winfw/rules/baseline/permitping.cpp b/windows/winfw/src/winfw/rules/baseline/permitping.cpp
index 0fb388a953..d8849590eb 100644
--- a/windows/winfw/src/winfw/rules/baseline/permitping.cpp
+++ b/windows/winfw/src/winfw/rules/baseline/permitping.cpp
@@ -1,11 +1,13 @@
#include "stdafx.h"
#include "permitping.h"
#include <winfw/mullvadguids.h>
+#include <winfw/rules/shared.h>
#include <libwfp/filterbuilder.h>
#include <libwfp/conditionbuilder.h>
#include <libwfp/conditions/conditionip.h>
#include <libwfp/conditions/conditioninterface.h>
#include <libwfp/conditions/conditionprotocol.h>
+#include <libcommon/error.h>
using namespace wfp::conditions;
@@ -15,21 +17,32 @@ namespace rules::baseline
PermitPing::PermitPing
(
std::optional<std::wstring> interfaceAlias,
- const wfp::IpAddress &host
+ const std::vector<wfp::IpAddress> &hosts
)
: m_interfaceAlias(std::move(interfaceAlias))
- , m_host(host)
{
+ SplitAddresses(hosts, m_hostsIpv4, m_hostsIpv6);
}
bool PermitPing::apply(IObjectInstaller &objectInstaller)
{
- if (wfp::IpAddress::Type::Ipv4 == m_host.type())
+ if (false == m_hostsIpv4.empty())
{
- return applyIcmpv4(objectInstaller);
+ if (false == applyIcmpv4(objectInstaller))
+ {
+ return false;
+ }
}
- return applyIcmpv6(objectInstaller);
+ if (false == m_hostsIpv6.empty())
+ {
+ if (false == applyIcmpv6(objectInstaller))
+ {
+ return false;
+ }
+ }
+
+ return true;
}
bool PermitPing::applyIcmpv4(IObjectInstaller &objectInstaller) const
@@ -52,9 +65,13 @@ bool PermitPing::applyIcmpv4(IObjectInstaller &objectInstaller) const
wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_CONNECT_V4);
- conditionBuilder.add_condition(ConditionIp::Remote(m_host));
conditionBuilder.add_condition(ConditionProtocol::Icmp());
+ for (const auto &host : m_hostsIpv4)
+ {
+ conditionBuilder.add_condition(ConditionIp::Remote(host));
+ }
+
if (m_interfaceAlias.has_value())
{
conditionBuilder.add_condition(ConditionInterface::Alias(m_interfaceAlias.value()));
@@ -83,9 +100,13 @@ bool PermitPing::applyIcmpv6(IObjectInstaller &objectInstaller) const
wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_CONNECT_V6);
- conditionBuilder.add_condition(ConditionIp::Remote(m_host));
conditionBuilder.add_condition(ConditionProtocol::IcmpV6());
+ for (const auto &host : m_hostsIpv6)
+ {
+ conditionBuilder.add_condition(ConditionIp::Remote(host));
+ }
+
if (m_interfaceAlias.has_value())
{
conditionBuilder.add_condition(ConditionInterface::Alias(m_interfaceAlias.value()));
diff --git a/windows/winfw/src/winfw/rules/baseline/permitping.h b/windows/winfw/src/winfw/rules/baseline/permitping.h
index b7747296f7..438aafc3f9 100644
--- a/windows/winfw/src/winfw/rules/baseline/permitping.h
+++ b/windows/winfw/src/winfw/rules/baseline/permitping.h
@@ -4,6 +4,7 @@
#include <libwfp/ipaddress.h>
#include <string>
#include <optional>
+#include <vector>
namespace rules::baseline
{
@@ -12,14 +13,15 @@ class PermitPing : public IFirewallRule
{
public:
- PermitPing(std::optional<std::wstring> interfaceAlias, const wfp::IpAddress &host);
+ PermitPing(std::optional<std::wstring> interfaceAlias, const std::vector<wfp::IpAddress> &hosts);
bool apply(IObjectInstaller &objectInstaller) override;
private:
const std::optional<std::wstring> m_interfaceAlias;
- const wfp::IpAddress m_host;
+ std::vector<wfp::IpAddress> m_hostsIpv4;
+ std::vector<wfp::IpAddress> m_hostsIpv6;
bool applyIcmpv4(IObjectInstaller &objectInstaller) const;
bool applyIcmpv6(IObjectInstaller &objectInstaller) const;
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">