diff options
| author | Odd Stranne <odd@mullvad.net> | 2018-10-01 22:51:26 +0200 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2018-10-03 23:13:56 +0200 |
| commit | 74e4492f4607d19594034b1bcd202fbcefc1175c (patch) | |
| tree | 2d03d4a3cb6f8fea7bdd9a75541ad6ce81780ba5 | |
| parent | 3291c2c839aea203686737c12cd0bd22a0dd20f6 (diff) | |
| download | mullvadvpn-74e4492f4607d19594034b1bcd202fbcefc1175c.tar.xz mullvadvpn-74e4492f4607d19594034b1bcd202fbcefc1175c.zip | |
Add 'verifier' tool for snapshotting and comparing DNS configurations
| -rw-r--r-- | windows/windns/extras.sln | 13 | ||||
| -rw-r--r-- | windows/windns/src/extras/verifier/stdafx.cpp | bin | 0 -> 592 bytes | |||
| -rw-r--r-- | windows/windns/src/extras/verifier/stdafx.h | bin | 0 -> 642 bytes | |||
| -rw-r--r-- | windows/windns/src/extras/verifier/targetver.h | bin | 0 -> 630 bytes | |||
| -rw-r--r-- | windows/windns/src/extras/verifier/verifier.cpp | 163 | ||||
| -rw-r--r-- | windows/windns/src/extras/verifier/verifier.vcxproj | 190 | ||||
| -rw-r--r-- | windows/windns/src/extras/verifier/verifier.vcxproj.filters | 22 |
7 files changed, 388 insertions, 0 deletions
diff --git a/windows/windns/extras.sln b/windows/windns/extras.sln index ca9347638e..36b98f06c1 100644 --- a/windows/windns/extras.sln +++ b/windows/windns/extras.sln @@ -15,6 +15,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "windns", "src\windns\windns EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcommon", "..\windows-libraries\src\libcommon\libcommon.vcxproj", "{B52E2D10-A94A-4605-914A-2DCEF6A757EF}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "verifier", "src\extras\verifier\verifier.vcxproj", "{1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}" + ProjectSection(ProjectDependencies) = postProject + {B52E2D10-A94A-4605-914A-2DCEF6A757EF} = {B52E2D10-A94A-4605-914A-2DCEF6A757EF} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -47,6 +52,14 @@ Global {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Release|x64.Build.0 = Release|x64 {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Release|x86.ActiveCfg = Release|Win32 {B52E2D10-A94A-4605-914A-2DCEF6A757EF}.Release|x86.Build.0 = Release|Win32 + {1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}.Debug|x64.ActiveCfg = Debug|x64 + {1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}.Debug|x64.Build.0 = Debug|x64 + {1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}.Debug|x86.ActiveCfg = Debug|Win32 + {1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}.Debug|x86.Build.0 = Debug|Win32 + {1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}.Release|x64.ActiveCfg = Release|x64 + {1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}.Release|x64.Build.0 = Release|x64 + {1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}.Release|x86.ActiveCfg = Release|Win32 + {1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/windows/windns/src/extras/verifier/stdafx.cpp b/windows/windns/src/extras/verifier/stdafx.cpp Binary files differnew file mode 100644 index 0000000000..41d5cbabaa --- /dev/null +++ b/windows/windns/src/extras/verifier/stdafx.cpp diff --git a/windows/windns/src/extras/verifier/stdafx.h b/windows/windns/src/extras/verifier/stdafx.h Binary files differnew file mode 100644 index 0000000000..94d4ed877d --- /dev/null +++ b/windows/windns/src/extras/verifier/stdafx.h diff --git a/windows/windns/src/extras/verifier/targetver.h b/windows/windns/src/extras/verifier/targetver.h Binary files differnew file mode 100644 index 0000000000..567cd346ef --- /dev/null +++ b/windows/windns/src/extras/verifier/targetver.h diff --git a/windows/windns/src/extras/verifier/verifier.cpp b/windows/windns/src/extras/verifier/verifier.cpp new file mode 100644 index 0000000000..c7404a7060 --- /dev/null +++ b/windows/windns/src/extras/verifier/verifier.cpp @@ -0,0 +1,163 @@ +#include "stdafx.h" + +#include <libcommon/registry/registry.h> + +#include <vector> +#include <string> +#include <iostream> +#include <algorithm> + +// Use source files directly from windns. +#include "../../windns/interfacesnap.h" +#include "../../windns/registrypaths.h" +#include "../../windns/types.h" + +struct InterfaceData +{ + InterfaceData(const std::wstring &_interfaceGuid, InterfaceSnap _snap) + : interfaceGuid(_interfaceGuid) + , snap(_snap) + { + } + + std::wstring interfaceGuid; + InterfaceSnap snap; +}; + +std::vector<std::wstring> DiscoverInterfaces(Protocol protocol) +{ + auto regKey = common::registry::Registry::OpenKey(HKEY_LOCAL_MACHINE, RegistryPaths::InterfaceRoot(protocol)); + + std::vector<std::wstring> interfaces; + + interfaces.reserve(20); + + regKey->enumerateSubKeys([&interfaces](const std::wstring &keyName) + { + interfaces.push_back(keyName); + return true; + }); + + return interfaces; +} + +std::vector<InterfaceData> CreateInterfaceRecords(Protocol protocol, const std::vector<std::wstring> &interfaces) +{ + std::vector<InterfaceData> records; + + records.reserve(interfaces.size()); + + for (const auto &iface : interfaces) + { + records.emplace_back(iface, InterfaceSnap(protocol, iface)); + } + + return records; +} + +void CreateSnapshots(std::vector<InterfaceData> &v4, std::vector<InterfaceData> &v6) +{ + v4 = CreateInterfaceRecords(Protocol::IPv4, DiscoverInterfaces(Protocol::IPv4)); + v6 = CreateInterfaceRecords(Protocol::IPv6, DiscoverInterfaces(Protocol::IPv6)); +} + +void VerifyProtocolSnapshots(const std::vector<InterfaceData> &first, const std::vector<InterfaceData> &second) +{ + for (const auto &firstRecord : first) + { + const auto interfaceGuid = firstRecord.interfaceGuid; + + auto secondRecord = std::find_if(second.begin(), second.end(), [&interfaceGuid](const InterfaceData &candidate) + { + return interfaceGuid == candidate.interfaceGuid; + }); + + if (second.end() == secondRecord) + { + std::wcout << L"Interface " << interfaceGuid << L" has been removed from the system" << std::endl; + continue; + } + + const auto serversBefore = firstRecord.snap.nameServers(); + const auto serversAfter = secondRecord->snap.nameServers(); + + if (serversBefore == serversAfter) + { + continue; + } + + std::wcout << L"Interface " << interfaceGuid << L" has been updated" << std::endl; + std::wcout << L"before:" << std::endl; + + for (const auto &server : serversBefore) + { + std::wcout << L" " << server << std::endl; + } + + std::wcout << L"after:" << std::endl; + + for (const auto &server : serversAfter) + { + std::wcout << L" " << server << std::endl; + } + } +} + +void VerifySnapshots(const std::vector<InterfaceData> &v4, const std::vector<InterfaceData> &v6) +{ + std::vector<InterfaceData> updatedV4, updatedV6; + + CreateSnapshots(updatedV4, updatedV6); + + VerifyProtocolSnapshots(v4, updatedV4); + VerifyProtocolSnapshots(v6, updatedV6); +} + +int main() +{ + std::vector<InterfaceData> v4records, v6records; + + for (;;) + { + std::wcout << L"(T)ake interface settings snapshot" << std::endl + << L"(C)ompare current settings to snapshot" << std::endl + << L"(Q)uit" << std::endl; + + std::wcout << L"?: "; + + auto answer = _getwch(); + + std::wcout << std::endl; + + // + // Branch on selected command. + // + + if ('t' == towlower(answer)) + { + CreateSnapshots(v4records, v6records); + + std::wcout << L"Created new snapshot" << std::endl; + + continue; + } + + if ('c' == towlower(answer)) + { + VerifySnapshots(v4records, v6records); + + std::wcout << L"Comparison completed" << std::endl; + + continue; + } + + if ('q' == towlower(answer)) + { + break; + } + + std::wcout << L"Unrecognized option" << std::endl; + } + + return 0; +} diff --git a/windows/windns/src/extras/verifier/verifier.vcxproj b/windows/windns/src/extras/verifier/verifier.vcxproj new file mode 100644 index 0000000000..f0342db79c --- /dev/null +++ b/windows/windns/src/extras/verifier/verifier.vcxproj @@ -0,0 +1,190 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\windns\interfacesnap.cpp" /> + <ClCompile Include="..\..\windns\registrypaths.cpp" /> + <ClCompile Include="stdafx.cpp" /> + <ClCompile Include="verifier.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="stdafx.h" /> + <ClInclude Include="targetver.h" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <VCProjectVersion>15.0</VCProjectVersion> + <ProjectGuid>{1A035E4B-3C83-4AD0-AB13-D19FB5FC9428}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>verifier</RootNamespace> + <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="Shared"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir> + <IntDir>$(SolutionDir)bin\temp\$(Platform)-$(Configuration)\$(ProjectName)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir> + <IntDir>$(SolutionDir)bin\temp\$(Platform)-$(Configuration)\$(ProjectName)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir> + <IntDir>$(SolutionDir)bin\temp\$(Platform)-$(Configuration)\$(ProjectName)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir> + <IntDir>$(SolutionDir)bin\temp\$(Platform)-$(Configuration)\$(ProjectName)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader>Create</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <Optimization>Disabled</Optimization> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>$(ProjectDir)../../../../windows-libraries/src/</AdditionalIncludeDirectories> + <LanguageStandard>stdcpplatest</LanguageStandard> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader>Create</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <Optimization>Disabled</Optimization> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>$(ProjectDir)../../../../windows-libraries/src/</AdditionalIncludeDirectories> + <LanguageStandard>stdcpplatest</LanguageStandard> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <PrecompiledHeader>Create</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>$(ProjectDir)../../../../windows-libraries/src/</AdditionalIncludeDirectories> + <LanguageStandard>stdcpplatest</LanguageStandard> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <PrecompiledHeader>Create</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>$(ProjectDir)../../../../windows-libraries/src/</AdditionalIncludeDirectories> + <LanguageStandard>stdcpplatest</LanguageStandard> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>libcommon.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)bin\$(Platform)-$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/windows/windns/src/extras/verifier/verifier.vcxproj.filters b/windows/windns/src/extras/verifier/verifier.vcxproj.filters new file mode 100644 index 0000000000..f5d6b7adfc --- /dev/null +++ b/windows/windns/src/extras/verifier/verifier.vcxproj.filters @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="stdafx.cpp" /> + <ClCompile Include="verifier.cpp" /> + <ClCompile Include="..\..\windns\interfacesnap.cpp"> + <Filter>borrowed</Filter> + </ClCompile> + <ClCompile Include="..\..\windns\registrypaths.cpp"> + <Filter>borrowed</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="stdafx.h" /> + <ClInclude Include="targetver.h" /> + </ItemGroup> + <ItemGroup> + <Filter Include="borrowed"> + <UniqueIdentifier>{2950faf7-32b2-4f62-9470-974c71724d40}</UniqueIdentifier> + </Filter> + </ItemGroup> +</Project>
\ No newline at end of file |
