Winify – Blame information for rev 14

Subversion Repositories:
Rev:
Rev Author Line No. Line
4 office 1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Xml;
7 using System.Xml.Schema;
8 using System.Xml.Serialization;
14 office 9 using Servers;
10 using Winify.Utilities;
4 office 11  
8 office 12 namespace Winify.Servers.Serialization
4 office 13 {
14 public static class ServersSerialization
15 {
16 #region Public Enums, Properties and Fields
17  
18 /// <summary>
19 /// Cached XML serializer for the configuration.
20 /// </summary>
8 office 21 public static XmlSerializer XmlSerializer { get; } = new XmlSerializer(typeof(global::Servers.Servers));
4 office 22  
23 #endregion
24  
25 #region Public Methods
26  
8 office 27 public static async Task<ServersSerializationState> Deserialize(string file)
4 office 28 {
29 var validationEventArgs = new List<ValidationEventArgs>();
30  
31 void XmlReaderSettingsValidationEventHandler(object sender, ValidationEventArgs e)
32 {
33 validationEventArgs.Add(e);
34 }
35  
8 office 36 global::Servers.Servers servers;
4 office 37  
38 var settings = new XmlReaderSettings();
39  
40 try
41 {
42 settings.Async = true;
43 settings.DtdProcessing = DtdProcessing.Parse;
44 settings.ValidationType = ValidationType.Schema;
45  
46 settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema |
47 XmlSchemaValidationFlags.ProcessSchemaLocation |
48 XmlSchemaValidationFlags.ReportValidationWarnings |
49 XmlSchemaValidationFlags.ProcessIdentityConstraints;
50  
51 settings.Schemas = new XmlSchemaSet();
52  
53 settings.ValidationEventHandler += XmlReaderSettingsValidationEventHandler;
54  
55 settings.Schemas.Add("urn:winify-servers-schema", "Servers.xsd");
56  
57 using (var fileStream =
58 new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
59 {
60 using (var xmlReader = XmlReader.Create(fileStream,
61 settings))
62 {
63 var stringBuilder = new StringBuilder();
64  
65 using (var stringWriter = new StringWriter(stringBuilder))
66 {
67 while (await xmlReader.ReadAsync())
68 {
69 await stringWriter.WriteAsync(await xmlReader.ReadOuterXmlAsync());
70 }
71 }
72  
73 using (var stringReader = new StringReader(stringBuilder.ToString()))
74 {
75 servers =
8 office 76 (global::Servers.Servers) XmlSerializer
4 office 77 .Deserialize(stringReader);
78 }
79 }
80 }
81 }
82 catch (Exception ex)
83 {
8 office 84 return new ServersSerializationFailure(ex, validationEventArgs);
4 office 85 }
86 finally
87 {
88 settings.ValidationEventHandler -=
89 XmlReaderSettingsValidationEventHandler;
90 }
91  
14 office 92 // Decrypt password.
93 var deviceId = Miscellaneous.GetMachineGuid();
94 var protectedServers = new global::Servers.Servers
95 {
96 Server = new BindingListWithCollectionChanged<Server>()
97 };
98 foreach (var server in servers.Server)
99 {
100 var unarmored = Convert.FromBase64String(server.Password);
101 var decrypted = Encoding.UTF8.GetString(AES.Decrypt(unarmored, deviceId));
102  
103 protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, decrypted));
104 }
105  
106 return new ServersSerializationSuccess(protectedServers, validationEventArgs);
4 office 107 }
108  
8 office 109 public static async Task<ServersSerializationState> Serialize(global::Servers.Servers servers, string file)
4 office 110 {
111 try
112 {
113 using (var memoryStream = new MemoryStream())
114 {
115 using (var xmlWriter =
116 XmlWriter.Create(memoryStream,
117 new XmlWriterSettings
118 {
119 Async = true,
120 Indent = true,
121 IndentChars = " ",
122 OmitXmlDeclaration = false
123 }))
124 {
125 await xmlWriter.WriteDocTypeAsync("Servers",
126 null,
127 null,
128 "<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>");
129  
14 office 130 // Encrypt password for all servers.
131 var deviceId = Miscellaneous.GetMachineGuid();
132 var protectedServers = new global::Servers.Servers
133 {
134 Server = new BindingListWithCollectionChanged<Server>()
135 };
136 foreach (var server in servers.Server)
137 {
138 var encrypted = AES.Encrypt(Encoding.UTF8.GetBytes(server.Password), deviceId);
139 var armored = Convert.ToBase64String(encrypted);
4 office 140  
14 office 141 protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, armored));
142 }
143  
144 XmlSerializer.Serialize(xmlWriter, protectedServers);
145  
4 office 146 using (var fileStream =
147 new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
148 {
149 memoryStream.Position = 0L;
150  
151 await memoryStream.CopyToAsync(fileStream);
152 }
153 }
154 }
155 }
156 catch (Exception ex)
157 {
8 office 158 return new ServersSerializationFailure(ex);
4 office 159 }
160  
8 office 161 return new ServersSerializationSuccess();
4 office 162 }
163  
8 office 164 public static async Task<ServersSerializationState> Serialize(global::Servers.Servers servers,
165 MemoryStream outputStream)
4 office 166 {
167 try
168 {
169 using (var memoryStream = new MemoryStream())
170 {
171 using (var xmlWriter =
172 XmlWriter.Create(memoryStream,
173 new XmlWriterSettings
174 {
175 Async = true,
176 Indent = true,
177 IndentChars = " ",
178 OmitXmlDeclaration = false
179 }))
180 {
181 await xmlWriter.WriteDocTypeAsync("Servers",
182 null,
183 null,
184 "<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>");
185  
14 office 186 // Encrypt password for all servers.
187 var deviceId = Miscellaneous.GetMachineGuid();
188 var protectedServers = new global::Servers.Servers
189 {
190 Server = new BindingListWithCollectionChanged<Server>()
191 };
192 foreach (var server in servers.Server)
193 {
194 var encrypted = AES.Encrypt(Encoding.UTF8.GetBytes(server.Password), deviceId);
195 var armored = Convert.ToBase64String(encrypted);
4 office 196  
14 office 197 protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, armored));
198 }
199  
200 XmlSerializer.Serialize(xmlWriter, protectedServers);
201  
4 office 202 memoryStream.Position = 0L;
203  
204 await memoryStream.CopyToAsync(outputStream);
205 }
206 }
207 }
208 catch (Exception ex)
209 {
8 office 210 return new ServersSerializationFailure(ex);
4 office 211 }
212  
8 office 213 return new ServersSerializationSuccess();
4 office 214 }
215  
216 #endregion
217 }
218 }