Winify – Diff between revs 40 and 41

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 40 Rev 41
1 using System; 1 using System;
2 using System.Collections.Concurrent; 2 using System.Collections.Concurrent;
3 using System.ComponentModel; 3 using System.ComponentModel;
4 using System.Drawing; 4 using System.Drawing;
5 using System.IO; 5 using System.IO;
6 using System.Reflection; 6 using System.Reflection;
7 using System.Text; 7 using System.Text;
8 using System.Threading; 8 using System.Threading;
9 using System.Threading.Tasks; 9 using System.Threading.Tasks;
10 using System.Windows.Forms; 10 using System.Windows.Forms;
11 using NetSparkleUpdater; 11 using NetSparkleUpdater;
12 using NetSparkleUpdater.Enums; 12 using NetSparkleUpdater.Enums;
13 using NetSparkleUpdater.SignatureVerifiers; 13 using NetSparkleUpdater.SignatureVerifiers;
14 using NetSparkleUpdater.UI.WinForms; 14 using NetSparkleUpdater.UI.WinForms;
15 using Serilog; 15 using Serilog;
16 using Servers; 16 using Servers;
17 using Toasts; 17 using Toasts;
18 using Winify.Gotify; 18 using Winify.Gotify;
19 using Winify.Settings; 19 using Winify.Settings;
20 using Winify.Utilities; 20 using Winify.Utilities;
21 using Winify.Utilities.Serialization; 21 using Winify.Utilities.Serialization;
22   22  
23 namespace Winify 23 namespace Winify
24 { 24 {
25 public partial class MainForm : Form 25 public partial class MainForm : Form
26 { 26 {
27 #region Public Enums, Properties and Fields 27 #region Public Enums, Properties and Fields
28   28  
29 public Configuration.Configuration Configuration { get; set; } 29 public Configuration.Configuration Configuration { get; set; }
30   30  
31 public ScheduledContinuation ChangedConfigurationContinuation { get; set; } 31 public ScheduledContinuation ChangedConfigurationContinuation { get; set; }
32   32  
33 #endregion 33 #endregion
34   34  
35 #region Private Delegates, Events, Enums, Properties, Indexers and Fields 35 #region Private Delegates, Events, Enums, Properties, Indexers and Fields
36   36  
37 private AboutForm _aboutForm; 37 private AboutForm _aboutForm;
38   38  
39 private ConcurrentBag<GotifyConnection> _gotifyConnections; 39 private ConcurrentBag<GotifyConnection> _gotifyConnections;
40   40  
41 private SettingsForm _settingsForm; 41 private SettingsForm _settingsForm;
42   42  
43 private readonly SparkleUpdater _sparkle; 43 private readonly SparkleUpdater _sparkle;
44   44  
45 private readonly CancellationTokenSource _cancellationTokenSource; 45 private readonly CancellationTokenSource _cancellationTokenSource;
46   46  
47 private readonly CancellationToken _cancellationToken; 47 private readonly CancellationToken _cancellationToken;
48   48  
49 #endregion 49 #endregion
50   50  
51 #region Constructors, Destructors and Finalizers 51 #region Constructors, Destructors and Finalizers
52   52  
53 public MainForm() 53 public MainForm()
54 { 54 {
55 _cancellationTokenSource = new CancellationTokenSource(); 55 _cancellationTokenSource = new CancellationTokenSource();
56 _cancellationToken = _cancellationTokenSource.Token; 56 _cancellationToken = _cancellationTokenSource.Token;
57   57  
58 ChangedConfigurationContinuation = new ScheduledContinuation(); 58 ChangedConfigurationContinuation = new ScheduledContinuation();
59 } 59 }
60   60  
61 public MainForm(Mutex mutex) : this() 61 public MainForm(Mutex mutex) : this()
62 { 62 {
63 InitializeComponent(); 63 InitializeComponent();
64   64  
65 Log.Logger = new LoggerConfiguration() 65 Log.Logger = new LoggerConfiguration()
66 .MinimumLevel.Debug() 66 .MinimumLevel.Debug()
67 .WriteTo.File(Path.Combine(Constants.UserApplicationDirectory, "Logs", $"{Constants.AssemblyName}.log"), 67 .WriteTo.File(Path.Combine(Constants.UserApplicationDirectory, "Logs", $"{Constants.AssemblyName}.log"),
68 rollingInterval: RollingInterval.Day) 68 rollingInterval: RollingInterval.Day)
69 .CreateLogger(); 69 .CreateLogger();
70   70  
71 // Start application update. 71 // Start application update.
72 var manifestModuleName = Assembly.GetEntryAssembly().ManifestModule.FullyQualifiedName; 72 var manifestModuleName = Assembly.GetEntryAssembly().ManifestModule.FullyQualifiedName;
73 var icon = Icon.ExtractAssociatedIcon(manifestModuleName); 73 var icon = Icon.ExtractAssociatedIcon(manifestModuleName);
74   74  
75 _sparkle = new SparkleUpdater("https://winify.grimore.org/update/appcast.xml", 75 _sparkle = new SparkleUpdater("https://winify.grimore.org/update/appcast.xml",
76 new Ed25519Checker(SecurityMode.Strict, "LonrgxVjSF0GnY4hzwlRJnLkaxnDn2ikdmOifILzLJY=")) 76 new Ed25519Checker(SecurityMode.Strict, "LonrgxVjSF0GnY4hzwlRJnLkaxnDn2ikdmOifILzLJY="))
77 { 77 {
78 UIFactory = new UIFactory(icon), 78 UIFactory = new UIFactory(icon),
79 RelaunchAfterUpdate = true 79 RelaunchAfterUpdate = true
80 }; 80 };
81 _sparkle.StartLoop(true, true); 81 _sparkle.StartLoop(true, true);
82 } 82 }
83   83  
84 /// <summary> 84 /// <summary>
85 /// Clean up any resources being used. 85 /// Clean up any resources being used.
86 /// </summary> 86 /// </summary>
87 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 87 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
88 protected override void Dispose(bool disposing) 88 protected override void Dispose(bool disposing)
89 { 89 {
90 if (disposing && components != null) components.Dispose(); 90 if (disposing && components != null) components.Dispose();
91   91  
92 base.Dispose(disposing); 92 base.Dispose(disposing);
93 } 93 }
94   94  
95 #endregion 95 #endregion
96   96  
97 #region Event Handlers 97 #region Event Handlers
98   98  
99 private async void MainForm_Load(object sender, EventArgs e) 99 private async void MainForm_Load(object sender, EventArgs e)
100 { 100 {
101 Configuration = await LoadConfiguration(); 101 Configuration = await LoadConfiguration();
102   102  
103 var servers = await LoadServers(); 103 var servers = await LoadServers();
104 _gotifyConnections = new ConcurrentBag<GotifyConnection>(); 104 _gotifyConnections = new ConcurrentBag<GotifyConnection>();
105 foreach (var server in servers.Server) 105 foreach (var server in servers.Server)
106 { 106 {
107 var gotifyConnection = new GotifyConnection(server); 107 var gotifyConnection = new GotifyConnection(server);
108 gotifyConnection.GotifyNotification += GotifyConnection_GotifyNotification; 108 gotifyConnection.GotifyNotification += GotifyConnection_GotifyNotification;
109 gotifyConnection.Start(); 109 gotifyConnection.Start();
110 _gotifyConnections.Add(gotifyConnection); 110 _gotifyConnections.Add(gotifyConnection);
111 } 111 }
112 } 112 }
113   113  
114 private async void SettingsToolStripMenuItem_Click(object sender, EventArgs e) 114 private async void SettingsToolStripMenuItem_Click(object sender, EventArgs e)
115 { 115 {
116 if (_settingsForm == null) 116 if (_settingsForm == null)
117 { 117 {
118 var servers = await LoadServers(); 118 var servers = await LoadServers();
119 var announcements = await LoadAnnouncements(); 119 var announcements = await LoadAnnouncements();
120   120  
121 _settingsForm = new SettingsForm(this, servers, announcements, _cancellationToken); 121 _settingsForm = new SettingsForm(this, servers, announcements, _cancellationToken);
122 _settingsForm.Save += SettingsForm_Save; 122 _settingsForm.Save += SettingsForm_Save;
123 _settingsForm.Closing += SettingsForm_Closing; 123 _settingsForm.Closing += SettingsForm_Closing;
124 _settingsForm.Show(); 124 _settingsForm.Show();
125 } 125 }
126 } 126 }
127   127  
128 private async void SettingsForm_Save(object sender, SettingsSavedEventArgs e) 128 private async void SettingsForm_Save(object sender, SettingsSavedEventArgs e)
129 { 129 {
130 // Save the servers. 130 // Save the servers.
131 await Task.WhenAll(SaveServers(e.Servers), SaveAnnouncements(e.Announcements)); 131 await Task.WhenAll(SaveServers(e.Servers), SaveAnnouncements(e.Announcements));
132   132  
133 // Update connections to gotify servers. 133 // Update connections to gotify servers.
134 while (_gotifyConnections.TryTake(out var gotifyConnection)) 134 while (_gotifyConnections.TryTake(out var gotifyConnection))
135 { 135 {
136 gotifyConnection.GotifyNotification -= GotifyConnection_GotifyNotification; 136 gotifyConnection.GotifyNotification -= GotifyConnection_GotifyNotification;
137 gotifyConnection.Stop(); 137 gotifyConnection.Stop();
138 gotifyConnection.Dispose(); 138 gotifyConnection.Dispose();
139 gotifyConnection = null; 139 gotifyConnection = null;
140 } 140 }
141   141  
142 foreach (var server in e.Servers.Server) 142 foreach (var server in e.Servers.Server)
143 { 143 {
144 var gotifyConnection = new GotifyConnection(server); 144 var gotifyConnection = new GotifyConnection(server);
145 gotifyConnection.GotifyNotification += GotifyConnection_GotifyNotification; 145 gotifyConnection.GotifyNotification += GotifyConnection_GotifyNotification;
146 gotifyConnection.Start(); 146 gotifyConnection.Start();
147 _gotifyConnections.Add(gotifyConnection); 147 _gotifyConnections.Add(gotifyConnection);
148 } 148 }
149 } 149 }
150   150  
151 private async void GotifyConnection_GotifyNotification(object sender, GotifyNotificationEventArgs e) 151 private async void GotifyConnection_GotifyNotification(object sender, GotifyNotificationEventArgs e)
152 { 152 {
153 var announcements = await LoadAnnouncements(); 153 var announcements = await LoadAnnouncements();
154   154  
155 foreach (var announcement in announcements.Announcement) 155 foreach (var announcement in announcements.Announcement)
156 { 156 {
157 if (announcement.AppId == e.Notification.AppId) 157 if (announcement.AppId == e.Notification.AppId)
158 { 158 {
159 var configuredNotification = new ToastForm( 159 var configuredNotification = new ToastForm(
160 $"{e.Notification.Title} ({e.Notification.Server.Name}/{e.Notification.AppId})", 160 $"{e.Notification.Title} ({e.Notification.Server.Name}/{e.Notification.AppId})",
161 e.Notification.Message, announcement.LingerTime, e.Image); 161 e.Notification.Message, announcement.LingerTime, e.Image);
162   162  
163 configuredNotification.Show(); 163 configuredNotification.Show();
164   164  
165 return; 165 return;
166 } 166 }
167 } 167 }
168   168  
169 var notification = new ToastForm( 169 var notification = new ToastForm(
170 $"{e.Notification.Title} ({e.Notification.Server.Name}/{e.Notification.AppId})", 170 $"{e.Notification.Title} ({e.Notification.Server.Name}/{e.Notification.AppId})",
171 e.Notification.Message, 5000, e.Image); 171 e.Notification.Message, 5000, e.Image);
172   172  
173 notification.Show(); 173 notification.Show();
174 } 174 }
175   175  
176 private void SettingsForm_Closing(object sender, CancelEventArgs e) 176 private void SettingsForm_Closing(object sender, CancelEventArgs e)
177 { 177 {
178 if (_settingsForm == null) return; 178 if (_settingsForm == null) return;
179   179  
180 _settingsForm.Save -= SettingsForm_Save; 180 _settingsForm.Save -= SettingsForm_Save;
181 _settingsForm.Closing -= SettingsForm_Closing; 181 _settingsForm.Closing -= SettingsForm_Closing;
182 _settingsForm.Dispose(); 182 _settingsForm.Dispose();
183 _settingsForm = null; 183 _settingsForm = null;
184 } 184 }
185   185  
186 private void AboutToolStripMenuItem_Click(object sender, EventArgs e) 186 private void AboutToolStripMenuItem_Click(object sender, EventArgs e)
187 { 187 {
188 if (_aboutForm != null) return; 188 if (_aboutForm != null) return;
189   189  
190 _aboutForm = new AboutForm(); 190 _aboutForm = new AboutForm();
191 _aboutForm.Closing += AboutForm_Closing; 191 _aboutForm.Closing += AboutForm_Closing;
192 _aboutForm.Show(); 192 _aboutForm.Show();
193 } 193 }
194   194  
195 private void AboutForm_Closing(object sender, CancelEventArgs e) 195 private void AboutForm_Closing(object sender, CancelEventArgs e)
196 { 196 {
197 if (_aboutForm == null) return; 197 if (_aboutForm == null) return;
198   198  
199 _aboutForm.Closing -= AboutForm_Closing; 199 _aboutForm.Closing -= AboutForm_Closing;
200 _aboutForm.Dispose(); 200 _aboutForm.Dispose();
201 _aboutForm = null; 201 _aboutForm = null;
202 } 202 }
203   203  
204 private void QuitToolStripMenuItem_Click(object sender, EventArgs e) 204 private void QuitToolStripMenuItem_Click(object sender, EventArgs e)
205 { 205 {
206 Close(); 206 Close();
207 } 207 }
208   208  
209 private async void UpdateToolStripMenuItem_Click(object sender, EventArgs e) 209 private async void UpdateToolStripMenuItem_Click(object sender, EventArgs e)
210 { 210 {
211 // Manually check for updates, this will not show a ui 211 // Manually check for updates, this will not show a ui
212 var result = await _sparkle.CheckForUpdatesQuietly(); 212 var result = await _sparkle.CheckForUpdatesQuietly();
213 if (result.Status == UpdateStatus.UpdateAvailable) 213 if (result.Status == UpdateStatus.UpdateAvailable)
214 { 214 {
215 // if update(s) are found, then we have to trigger the UI to show it gracefully 215 // if update(s) are found, then we have to trigger the UI to show it gracefully
216 _sparkle.ShowUpdateNeededUI(); 216 _sparkle.ShowUpdateNeededUI();
217 return; 217 return;
218 } 218 }
219   219  
220 MessageBox.Show("No updates available at this time.", "Horizon", MessageBoxButtons.OK, 220 MessageBox.Show("No updates available at this time.", "Horizon", MessageBoxButtons.OK,
221 MessageBoxIcon.Asterisk, 221 MessageBoxIcon.Asterisk,
222 MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly, false); 222 MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly, false);
223 } 223 }
224   224  
225 #endregion 225 #endregion
226   226  
227 #region Public Methods 227 #region Public Methods
228   228  
229 public async Task SaveConfiguration() 229 public async Task SaveConfiguration()
230 { 230 {
231 if (!Directory.Exists(Constants.UserApplicationDirectory)) 231 if (!Directory.Exists(Constants.UserApplicationDirectory))
232 Directory.CreateDirectory(Constants.UserApplicationDirectory); 232 Directory.CreateDirectory(Constants.UserApplicationDirectory);
233   233  
234 switch (await Serialization.Serialize(Configuration, Constants.ConfigurationFile, "Configuration", 234 switch (await Serialization.Serialize(Configuration, Constants.ConfigurationFile, "Configuration",
235 "<!ATTLIST Configuration xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>", 235 "<!ATTLIST Configuration xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>",
236 CancellationToken.None)) 236 CancellationToken.None))
237 { 237 {
238 case SerializationSuccess<Configuration.Configuration> _: 238 case SerializationSuccess<Configuration.Configuration> _:
239 Log.Information("Serialized configuration."); 239 Log.Information("Serialized configuration.");
240 break; 240 break;
241 case SerializationFailure serializationFailure: 241 case SerializationFailure serializationFailure:
242 Log.Warning(serializationFailure.Exception.Message, "Failed to serialize configuration."); 242 Log.Warning(serializationFailure.Exception.Message, "Failed to serialize configuration.");
243 break; 243 break;
244 } 244 }
245 } 245 }
246   246  
247 public static async Task<Configuration.Configuration> LoadConfiguration() 247 public static async Task<Configuration.Configuration> LoadConfiguration()
248 { 248 {
249 if (!Directory.Exists(Constants.UserApplicationDirectory)) 249 if (!Directory.Exists(Constants.UserApplicationDirectory))
250 Directory.CreateDirectory(Constants.UserApplicationDirectory); 250 Directory.CreateDirectory(Constants.UserApplicationDirectory);
251   251  
252 var deserializationResult = 252 var deserializationResult =
253 await Serialization.Deserialize<Configuration.Configuration>(Constants.ConfigurationFile, 253 await Serialization.Deserialize<Configuration.Configuration>(Constants.ConfigurationFile,
254 Constants.ConfigurationNamespace, Constants.ConfigurationXsd, CancellationToken.None); 254 Constants.ConfigurationNamespace, Constants.ConfigurationXsd, CancellationToken.None);
255   255  
256 switch (deserializationResult) 256 switch (deserializationResult)
257 { 257 {
258 case SerializationSuccess<Configuration.Configuration> serializationSuccess: 258 case SerializationSuccess<Configuration.Configuration> serializationSuccess:
259 return serializationSuccess.Result; 259 return serializationSuccess.Result;
260 case SerializationFailure serializationFailure: 260 case SerializationFailure serializationFailure:
261 Log.Warning(serializationFailure.Exception, "Failed to load configuration."); 261 Log.Warning(serializationFailure.Exception, "Failed to load configuration.");
262 return new Configuration.Configuration(); 262 return new Configuration.Configuration();
263 default: 263 default:
264 return new Configuration.Configuration(); 264 return new Configuration.Configuration();
265 } 265 }
266 } 266 }
267   267  
268 #endregion 268 #endregion
269   269  
270 #region Private Methods 270 #region Private Methods
271   271  
272 private static async Task SaveAnnouncements(Announcements.Announcements announcements) 272 private static async Task SaveAnnouncements(Announcements.Announcements announcements)
273 { 273 {
274 switch (await Serialization.Serialize(announcements, Constants.AnnouncementsFile, "Announcements", 274 switch (await Serialization.Serialize(announcements, Constants.AnnouncementsFile, "Announcements",
275 "<!ATTLIST Announcements xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>", 275 "<!ATTLIST Announcements xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>",
276 CancellationToken.None)) 276 CancellationToken.None))
277 { 277 {
278 case SerializationFailure serializationFailure: 278 case SerializationFailure serializationFailure:
279 Log.Warning(serializationFailure.Exception, "Unable to serialize announcements."); 279 Log.Warning(serializationFailure.Exception, "Unable to serialize announcements.");
280 break; 280 break;
281 } 281 }
282 } 282 }
283   283  
284 private static async Task SaveServers(Servers.Servers servers) 284 private static async Task SaveServers(Servers.Servers servers)
285 { 285 {
286 // Encrypt password for all servers. 286 // Encrypt password for all servers.
287 var deviceId = Miscellaneous.GetMachineGuid(); 287 var deviceId = Miscellaneous.GetMachineGuid();
288 var @protected = new Servers.Servers 288 var @protected = new Servers.Servers
289 { 289 {
290 Server = new BindingListWithCollectionChanged<Server>() 290 Server = new BindingListWithCollectionChanged<Server>()
291 }; 291 };
292 foreach (var server in servers.Server) 292 foreach (var server in servers.Server)
293 { 293 {
294 var encrypted = AES.Encrypt(Encoding.UTF8.GetBytes(server.Password), deviceId); 294 var password = Encoding.UTF8.GetBytes(server.Password);
-   295 var encrypted = await AES.Encrypt(password, deviceId);
295 var armored = Convert.ToBase64String(encrypted); 296 var armored = Convert.ToBase64String(encrypted);
296   297  
297 @protected.Server.Add(new Server(server.Name, server.Url, server.Username, armored)); 298 @protected.Server.Add(new Server(server.Name, server.Url, server.Username, armored));
298 } 299 }
299   300  
300 switch (await Serialization.Serialize(@protected, Constants.ServersFile, "Servers", 301 switch (await Serialization.Serialize(@protected, Constants.ServersFile, "Servers",
301 "<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>", 302 "<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>",
302 CancellationToken.None)) 303 CancellationToken.None))
303 { 304 {
304 case SerializationFailure serializationFailure: 305 case SerializationFailure serializationFailure:
305 Log.Warning(serializationFailure.Exception, "Unable to serialize servers."); 306 Log.Warning(serializationFailure.Exception, "Unable to serialize servers.");
306 break; 307 break;
307 } 308 }
308 } 309 }
309   310  
310 private static async Task<Announcements.Announcements> LoadAnnouncements() 311 private static async Task<Announcements.Announcements> LoadAnnouncements()
311 { 312 {
312 if (!Directory.Exists(Constants.UserApplicationDirectory)) 313 if (!Directory.Exists(Constants.UserApplicationDirectory))
313 Directory.CreateDirectory(Constants.UserApplicationDirectory); 314 Directory.CreateDirectory(Constants.UserApplicationDirectory);
314   315  
315 var deserializationResult = 316 var deserializationResult =
316 await Serialization.Deserialize<Announcements.Announcements>(Constants.AnnouncementsFile, 317 await Serialization.Deserialize<Announcements.Announcements>(Constants.AnnouncementsFile,
317 "urn:winify-announcements-schema", "Announcements.xsd", CancellationToken.None); 318 "urn:winify-announcements-schema", "Announcements.xsd", CancellationToken.None);
318   319  
319 switch (deserializationResult) 320 switch (deserializationResult)
320 { 321 {
321 case SerializationSuccess<Announcements.Announcements> serializationSuccess: 322 case SerializationSuccess<Announcements.Announcements> serializationSuccess:
322 return serializationSuccess.Result; 323 return serializationSuccess.Result;
323 case SerializationFailure serializationFailure: 324 case SerializationFailure serializationFailure:
324 Log.Warning(serializationFailure.Exception, "Unable to load announcements."); 325 Log.Warning(serializationFailure.Exception, "Unable to load announcements.");
325 return new Announcements.Announcements(); 326 return new Announcements.Announcements();
326 default: 327 default:
327 return new Announcements.Announcements(); 328 return new Announcements.Announcements();
328 } 329 }
329 } 330 }
330   331  
331 private static async Task<Servers.Servers> LoadServers() 332 private static async Task<Servers.Servers> LoadServers()
332 { 333 {
333 if (!Directory.Exists(Constants.UserApplicationDirectory)) 334 if (!Directory.Exists(Constants.UserApplicationDirectory))
334 Directory.CreateDirectory(Constants.UserApplicationDirectory); 335 Directory.CreateDirectory(Constants.UserApplicationDirectory);
335   336  
336 var deserializationResult = 337 var deserializationResult =
337 await Serialization.Deserialize<Servers.Servers>(Constants.ServersFile, 338 await Serialization.Deserialize<Servers.Servers>(Constants.ServersFile,
338 "urn:winify-servers-schema", "Servers.xsd", CancellationToken.None); 339 "urn:winify-servers-schema", "Servers.xsd", CancellationToken.None);
339   340  
340 switch (deserializationResult) 341 switch (deserializationResult)
341 { 342 {
342 case SerializationSuccess<Servers.Servers> serializationSuccess: 343 case SerializationSuccess<Servers.Servers> serializationSuccess:
343 // Decrypt password. 344 // Decrypt password.
344 var deviceId = Miscellaneous.GetMachineGuid(); 345 var deviceId = Miscellaneous.GetMachineGuid();
345 var @protected = new Servers.Servers 346 var @protected = new Servers.Servers
346 { 347 {
347 Server = new BindingListWithCollectionChanged<Server>() 348 Server = new BindingListWithCollectionChanged<Server>()
348 }; 349 };
349 foreach (var server in serializationSuccess.Result.Server) 350 foreach (var server in serializationSuccess.Result.Server)
350 { 351 {
351 var unarmored = Convert.FromBase64String(server.Password); 352 var unarmored = Convert.FromBase64String(server.Password);
352 var decrypted = Encoding.UTF8.GetString(AES.Decrypt(unarmored, deviceId)); 353 var result = await AES.Decrypt(unarmored, deviceId);
-   354 var decrypted = Encoding.UTF8.GetString(result);
353   355  
354 @protected.Server.Add(new Server(server.Name, server.Url, server.Username, decrypted)); 356 @protected.Server.Add(new Server(server.Name, server.Url, server.Username, decrypted));
355 } 357 }
356   358  
357 return @protected; 359 return @protected;
358   360  
359 case SerializationFailure serializationFailure: 361 case SerializationFailure serializationFailure:
360 Log.Warning(serializationFailure.Exception, "Unable to load servers."); 362 Log.Warning(serializationFailure.Exception, "Unable to load servers.");
361 return new Servers.Servers(); 363 return new Servers.Servers();
362   364  
363 default: 365 default:
364 return new Servers.Servers(); 366 return new Servers.Servers();
365 } 367 }
366 } 368 }
367   369  
368 #endregion 370 #endregion
369 } 371 }
370 } 372 }
371   373  
372
Generated by GNU Enscript 1.6.5.90.
374
Generated by GNU Enscript 1.6.5.90.
373   375  
374   376  
375   377