summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2025-09-08 17:39:14 +0200
committerDavid Lönnhager <david.l@mullvad.net>2025-09-12 11:40:46 +0200
commite1d02cc647fe792098fd80ccf8cbf0605963c994 (patch)
treeb88e5c16f11a5add30df49efab048c5184040bf2
parentd4a47dc1d9c54966f76380c1bfbbef5d0d13e8f5 (diff)
downloadmullvadvpn-e1d02cc647fe792098fd80ccf8cbf0605963c994.tar.xz
mullvadvpn-e1d02cc647fe792098fd80ccf8cbf0605963c994.zip
Delete all filters and sublayers based on provider UUID in WinFw
-rw-r--r--windows/winfw/src/winfw/objectpurger.cpp105
-rw-r--r--windows/winfw/src/winfw/objectpurger.h1
2 files changed, 73 insertions, 33 deletions
diff --git a/windows/winfw/src/winfw/objectpurger.cpp b/windows/winfw/src/winfw/objectpurger.cpp
index dce36c99c8..7baf0c4a22 100644
--- a/windows/winfw/src/winfw/objectpurger.cpp
+++ b/windows/winfw/src/winfw/objectpurger.cpp
@@ -5,6 +5,8 @@
#include "libwfp/filterengine.h"
#include "libwfp/objectdeleter.h"
#include "libwfp/transaction.h"
+#include "libwfp/objectenumerator.h"
+#include <set>
#include <algorithm>
namespace
@@ -12,45 +14,59 @@ namespace
using ObjectDeleter = std::function<void(wfp::FilterEngine &, const GUID &)>;
-template<typename TRange>
-void RemoveRange(wfp::FilterEngine &engine, ObjectDeleter deleter, TRange range)
+template<typename T>
+bool HasMullvadProvider(T obj)
{
- std::for_each(range.first, range.second, [&](const auto &record)
- {
- const GUID &objectId = record.second;
- deleter(engine, objectId);
- });
+ return nullptr != obj.providerKey && *obj.providerKey == MullvadGuids::Provider();
}
-} // anonymous namespace
-
-//static
-ObjectPurger::RemovalFunctor ObjectPurger::GetRemoveFiltersFunctor()
+template<typename T>
+bool HasPersistentMullvadProvider(const T &obj)
{
- return [](wfp::FilterEngine &engine)
- {
- const auto registry = MullvadGuids::DetailedRegistry(MullvadGuids::IdentityQualifier::IncludeAll);
-
- // Resolve correct overload.
- void (*deleter)(wfp::FilterEngine &, const GUID &) = wfp::ObjectDeleter::DeleteFilter;
-
- RemoveRange(engine, deleter, registry.equal_range(WfpObjectType::Filter));
- };
+ return nullptr != obj.providerKey && *obj.providerKey == MullvadGuids::ProviderPersistent();
}
+} // anonymous namespace
+
//static
ObjectPurger::RemovalFunctor ObjectPurger::GetRemoveAllFunctor()
{
return [](wfp::FilterEngine &engine)
{
- const auto registry = MullvadGuids::DetailedRegistry(MullvadGuids::IdentityQualifier::IncludeAll);
+ std::unordered_set<GUID> filtersToRemove;
+ wfp::ObjectEnumerator::Filters(engine, [&](const auto &filter) -> bool
+ {
+ // Delete both non-persistent and persistent filters
+ if (HasMullvadProvider(filter) || HasPersistentMullvadProvider(filter))
+ {
+ filtersToRemove.insert(filter.filterKey);
+ }
+ return true;
+ });
+
+ std::unordered_set<GUID> sublayersToRemove;
+ wfp::ObjectEnumerator::Sublayers(engine, [&](const auto &sublayer) -> bool
+ {
+ // Delete both non-persistent and persistent sublayers
+ if (HasMullvadProvider(sublayer) || HasPersistentMullvadProvider(sublayer))
+ {
+ sublayersToRemove.insert(sublayer.subLayerKey);
+ }
+ return true;
+ });
- // Resolve correct overload.
- void(*deleter)(wfp::FilterEngine &, const GUID &) = wfp::ObjectDeleter::DeleteFilter;
+ for (const auto &filter : filtersToRemove)
+ {
+ wfp::ObjectDeleter::DeleteFilter(engine, filter);
+ }
- RemoveRange(engine, deleter, registry.equal_range(WfpObjectType::Filter));
- RemoveRange(engine, wfp::ObjectDeleter::DeleteSublayer, registry.equal_range(WfpObjectType::Sublayer));
- RemoveRange(engine, wfp::ObjectDeleter::DeleteProvider, registry.equal_range(WfpObjectType::Provider));
+ for (const auto &sublayer : sublayersToRemove)
+ {
+ wfp::ObjectDeleter::DeleteSublayer(engine, sublayer);
+ }
+
+ wfp::ObjectDeleter::DeleteProvider(engine, MullvadGuids::Provider());
+ wfp::ObjectDeleter::DeleteProvider(engine, MullvadGuids::ProviderPersistent());
};
}
@@ -59,14 +75,39 @@ ObjectPurger::RemovalFunctor ObjectPurger::GetRemoveNonPersistentFunctor()
{
return [](wfp::FilterEngine &engine)
{
- const auto registry = MullvadGuids::DetailedRegistry(MullvadGuids::IdentityQualifier::IncludeDeprecated);
+ std::unordered_set<GUID> filtersToRemove;
+ wfp::ObjectEnumerator::Filters(engine, [&](const auto &filter) -> bool
+ {
+ // Delete only non-persistent filters
+ if (HasMullvadProvider(filter))
+ {
+ filtersToRemove.insert(filter.filterKey);
+ }
+ return true;
+ });
+
+ std::unordered_set<GUID> sublayersToRemove;
+ wfp::ObjectEnumerator::Sublayers(engine, [&](const auto &sublayer) -> bool
+ {
+ // Delete only non-persistent sublayers
+ if (HasMullvadProvider(sublayer))
+ {
+ sublayersToRemove.insert(sublayer.subLayerKey);
+ }
+ return true;
+ });
+
+ for (const auto &filter : filtersToRemove)
+ {
+ wfp::ObjectDeleter::DeleteFilter(engine, filter);
+ }
- // Resolve correct overload.
- void(*deleter)(wfp::FilterEngine &, const GUID &) = wfp::ObjectDeleter::DeleteFilter;
+ for (const auto &sublayer : sublayersToRemove)
+ {
+ wfp::ObjectDeleter::DeleteSublayer(engine, sublayer);
+ }
- RemoveRange(engine, deleter, registry.equal_range(WfpObjectType::Filter));
- RemoveRange(engine, wfp::ObjectDeleter::DeleteSublayer, registry.equal_range(WfpObjectType::Sublayer));
- RemoveRange(engine, wfp::ObjectDeleter::DeleteProvider, registry.equal_range(WfpObjectType::Provider));
+ wfp::ObjectDeleter::DeleteProvider(engine, MullvadGuids::Provider());
};
}
diff --git a/windows/winfw/src/winfw/objectpurger.h b/windows/winfw/src/winfw/objectpurger.h
index 7728aac694..91ed61ddaf 100644
--- a/windows/winfw/src/winfw/objectpurger.h
+++ b/windows/winfw/src/winfw/objectpurger.h
@@ -13,7 +13,6 @@ public:
using RemovalFunctor = std::function<void(wfp::FilterEngine &engine)>;
- static RemovalFunctor GetRemoveFiltersFunctor();
static RemovalFunctor GetRemoveAllFunctor();
static RemovalFunctor GetRemoveNonPersistentFunctor();