Skip to content

Commit 651315f

Browse files
committed
Fix 0.3.8
- Fix #85 - Fix #87
1 parent 84aed21 commit 651315f

4 files changed

Lines changed: 81 additions & 38 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ Feel free to report your success or failure: [here](https://github.com/bitbeans/
9393

9494
# ![Alt text](img/icons/32x32.png "Requirements") Requirements
9595

96-
- This software targets .NET 4.5.
96+
- This software targets .NET 4.6.
9797
- It also requires Visual C++ Redistributable for Visual Studio 2015 x86.
9898

9999
# ![Alt text](img/icons/32x32.png "Translations") Translations

SimpleDnsCrypt/Models/DnsCryptProxyEntry.cs

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
using Caliburn.Micro;
1+
using System;
2+
using Caliburn.Micro;
23
using SimpleDnsCrypt.Tools;
34

45
namespace SimpleDnsCrypt.Models
56
{
67
/// <summary>
78
/// Class to represent an entry in the resolver list.
89
/// </summary>
9-
public class DnsCryptProxyEntry : PropertyChangedBase
10-
{
10+
public class DnsCryptProxyEntry : PropertyChangedBase, IEquatable<DnsCryptProxyEntry>
11+
{
1112
/// <summary>
1213
/// The short name of the resolver.
1314
/// </summary>
@@ -84,10 +85,13 @@ public class DnsCryptProxyEntry : PropertyChangedBase
8485
public int LocalPort { get; set; }
8586

8687
/// <summary>
87-
/// Some optional data.
88+
/// Some optional data.
8889
/// </summary>
8990
public DnsCryptProxyEntryExtra Extra { get; set; }
9091

92+
/// <summary>
93+
/// Formatted display name.
94+
/// </summary>
9195
public string DisplayName
9296
{
9397
get
@@ -96,18 +100,41 @@ public string DisplayName
96100
{
97101
if (DnssecValidation)
98102
{
99-
return string.Format("{0}ms - {1} [DNSSEC]", Extra.ResponseTime, FullName);
103+
return $"{Extra.ResponseTime}ms - {FullName} [DNSSEC]";
100104
}
101-
else
102-
{
103-
return string.Format("{0}ms - {1}", Extra.ResponseTime, FullName);
104-
}
105-
}
106-
else
107-
{
108-
return FullName;
105+
return $"{Extra.ResponseTime}ms - {FullName}";
109106
}
107+
return FullName;
110108
}
111109
}
112-
}
110+
111+
public bool Equals(DnsCryptProxyEntry other)
112+
{
113+
if (ReferenceEquals(other, null)) return false;
114+
if (ReferenceEquals(other, this)) return true;
115+
return Name == other.Name;
116+
}
117+
118+
public sealed override bool Equals(object obj)
119+
{
120+
var otherMyItem = obj as DnsCryptProxyEntry;
121+
if (ReferenceEquals(otherMyItem, null)) return false;
122+
return otherMyItem.Equals(this);
123+
}
124+
125+
public override int GetHashCode()
126+
{
127+
return Name.GetHashCode();
128+
}
129+
130+
public static bool operator ==(DnsCryptProxyEntry entry1, DnsCryptProxyEntry entry2)
131+
{
132+
return Equals(entry1, entry2);
133+
}
134+
135+
public static bool operator !=(DnsCryptProxyEntry entry1, DnsCryptProxyEntry entry2)
136+
{
137+
return !(entry1 == entry2);
138+
}
139+
}
113140
}

SimpleDnsCrypt/Tools/AnalyseProxy.cs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Diagnostics;
4+
using System.Linq;
35
using System.Text;
46
using DNS.Client;
57
using DNS.Protocol;
@@ -54,33 +56,45 @@ public static DnsCryptProxyEntryExtra Analyse(DnsCryptProxyEntry dnsCryptProxyEn
5456
var sw = Stopwatch.StartNew();
5557
var response = request.Resolve();
5658
sw.Stop();
57-
var data = response.AnswerRecords[0].Data;
5859

59-
if (Encoding.ASCII.GetString(ArrayHelper.SubArray(data, 0, 9)).Equals("|DNSC\0\u0001\0\0"))
60+
foreach (var answerRecord in response.AnswerRecords)
6061
{
61-
var certificate = ExtractCertificate(ArrayHelper.SubArray(data, 9), providerKey);
62-
if (certificate != null)
62+
var certificates = new List<Certificate>();
63+
var tr = Encoding.ASCII.GetString(ArrayHelper.SubArray(answerRecord.Data, 0, 9));
64+
if (tr.Equals("|DNSC\0\u0001\0\0") || tr.Equals("|DNSC\0\u0002\0\0"))
6365
{
64-
dnsCryptProxyEntryExtra.Certificate = certificate;
65-
if (certificate.Valid)
66+
var certificate = ExtractCertificate(ArrayHelper.SubArray(answerRecord.Data, 9), providerKey);
67+
if (certificate != null)
6668
{
69+
if (certificate.Valid)
70+
{
71+
certificates.Add(certificate);
72+
}
73+
}
74+
}
75+
if (certificates.Count > 0)
76+
{
77+
var newestCertificate = certificates.OrderByDescending(item => item.Serial).FirstOrDefault();
78+
if (newestCertificate != null)
79+
{
80+
dnsCryptProxyEntryExtra.Certificate = newestCertificate;
6781
dnsCryptProxyEntryExtra.Succeeded = true;
6882
}
6983
else
7084
{
71-
dnsCryptProxyEntryExtra.Succeeded = false;
85+
return null;
7286
}
7387
}
7488
else
7589
{
76-
dnsCryptProxyEntryExtra.Succeeded = false;
90+
return null;
7791
}
7892
}
7993
dnsCryptProxyEntryExtra.ResponseTime = sw.ElapsedMilliseconds;
8094
}
8195
catch (Exception)
8296
{
83-
dnsCryptProxyEntryExtra.Succeeded = false;
97+
return null;
8498
}
8599
return dnsCryptProxyEntryExtra;
86100
}

SimpleDnsCrypt/ViewModels/MainViewModel.cs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ public sealed class MainViewModel : Screen, IShell
3030
{
3131
public static MainViewModel Instance { get; set; }
3232

33-
3433
private readonly BindableCollection<LocalNetworkInterface> _localNetworkInterfaces =
3534
new BindableCollection<LocalNetworkInterface>();
3635

@@ -49,7 +48,7 @@ public sealed class MainViewModel : Screen, IShell
4948
private List<string> _plugins;
5049
private DnsCryptProxyEntry _primaryResolver;
5150
private string _primaryResolverTitle;
52-
private ObservableCollection<DnsCryptProxyEntry> _resolvers;
51+
private List<DnsCryptProxyEntry> _resolvers;
5352
private DnsCryptProxyEntry _secondaryResolver;
5453
private string _secondaryResolverTitle;
5554
private Language _selectedLanguage;
@@ -99,6 +98,7 @@ private MainViewModel(IWindowManager windowManager, IEventAggregator eventAggreg
9998
MessageBoxButton.OK, BoxType.Error);
10099
Environment.Exit(1);
101100
}
101+
102102
// do a simple check, if all needed files are available
103103
if (!ValidateDnsCryptProxyFolder())
104104
{
@@ -119,7 +119,7 @@ private MainViewModel(IWindowManager windowManager, IEventAggregator eventAggreg
119119
LocalizationEx.GetUiString("global_ipv6_disabled", Thread.CurrentThread.CurrentCulture));
120120
}
121121

122-
_resolvers = new ObservableCollection<DnsCryptProxyEntry>();
122+
_resolvers = new List<DnsCryptProxyEntry>();
123123
_updateResolverListOnStart = _userData.UpdateResolverListOnStart;
124124
_isWorkingOnPrimaryService = false;
125125
_isWorkingOnSecondaryService = false;
@@ -355,7 +355,7 @@ public bool IsOverlayVisible
355355
/// <summary>
356356
/// The list of loaded resolvers.
357357
/// </summary>
358-
public ObservableCollection<DnsCryptProxyEntry> Resolvers
358+
public List<DnsCryptProxyEntry> Resolvers
359359
{
360360
get { return _resolvers; }
361361
set
@@ -852,31 +852,31 @@ public async void AnalyseResolvers()
852852
try
853853
{
854854
IsAnalysing = true;
855+
var tmpResolvers = new List<DnsCryptProxyEntry>();
855856
await Task.Run(() =>
856857
{
857-
var tmpResolvers = _resolvers.ToList();
858-
for (var r = 0; r < tmpResolvers.Count; r++)
858+
for (var r = 0; r < _resolvers.Count; r++)
859859
{
860-
var dnsCryptProxyEntryExtra = AnalyseProxy.Analyse(tmpResolvers[r]);
860+
var dnsCryptProxyEntryExtra = AnalyseProxy.Analyse(_resolvers[r]);
861861
if (dnsCryptProxyEntryExtra != null)
862862
{
863-
tmpResolvers[r].Extra = dnsCryptProxyEntryExtra;
864-
if (!dnsCryptProxyEntryExtra.Succeeded)
863+
if (dnsCryptProxyEntryExtra.Succeeded && (dnsCryptProxyEntryExtra.ResponseTime > 0))
865864
{
866-
tmpResolvers.RemoveAt(r);
865+
var dnsCryptProxyEntry = _resolvers[r];
866+
dnsCryptProxyEntry.Extra = dnsCryptProxyEntryExtra;
867+
tmpResolvers.Add(dnsCryptProxyEntry);
867868
}
868869
}
869870
}
870871
tmpResolvers.Sort((a, b) => a.Extra.ResponseTime.CompareTo(b.Extra.ResponseTime));
871-
Resolvers = new ObservableCollection<DnsCryptProxyEntry>(tmpResolvers);
872872
}).ConfigureAwait(false);
873+
Resolvers = tmpResolvers;
873874
IsAnalysing = false;
874875
}
875876
catch (Exception)
876877
{
877878
IsAnalysing = false;
878879
}
879-
NotifyOfPropertyChange(() => Resolvers);
880880
}
881881

882882
#region Helper
@@ -1000,13 +1000,14 @@ await Task.Run(() =>
10001000
DnsCryptProxyListManager.ReadProxyList(proxyList, proxyListSignature, _userData.UseIpv6);
10011001
if (dnsProxyList != null && dnsProxyList.Any())
10021002
{
1003-
Resolvers.Clear();
1003+
var tmpResolvers = new List<DnsCryptProxyEntry>();
10041004
foreach (var dnsProxy in dnsProxyList)
10051005
{
10061006
if (
10071007
dnsProxy.ProviderPublicKey.Equals(
10081008
PrimaryDnsCryptProxyManager.DnsCryptProxy.Parameter.ProviderKey))
10091009
{
1010+
10101011
_primaryResolver = dnsProxy;
10111012
// restore the local port
10121013
_primaryResolver.LocalPort = PrimaryDnsCryptProxyManager.DnsCryptProxy.Parameter.LocalPort;
@@ -1017,8 +1018,9 @@ await Task.Run(() =>
10171018
{
10181019
_secondaryResolver = dnsProxy;
10191020
}
1020-
Resolvers.Add(dnsProxy);
1021+
tmpResolvers.Add(dnsProxy);
10211022
}
1023+
Resolvers = tmpResolvers;
10221024
}
10231025
}
10241026
else

0 commit comments

Comments
 (0)