Winify – Blame information for rev 14
?pathlinks?
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 | } |