Winify – Diff between revs 14 and 15
?pathlinks?
Rev 14 | Rev 15 | |||
---|---|---|---|---|
Line 4... | Line 4... | |||
4 | using System.Text; |
4 | using System.Text; |
|
5 | using System.Threading.Tasks; |
5 | using System.Threading.Tasks; |
|
6 | using System.Xml; |
6 | using System.Xml; |
|
7 | using System.Xml.Schema; |
7 | using System.Xml.Schema; |
|
8 | using System.Xml.Serialization; |
8 | using System.Xml.Serialization; |
|
9 | using Servers; |
- | ||
10 | using Winify.Utilities; |
- | ||
Line 11... | Line 9... | |||
11 | |
9 | |
|
12 | namespace Winify.Servers.Serialization |
10 | namespace Winify.Servers.Serialization |
|
13 | { |
11 | { |
|
14 | public static class ServersSerialization |
12 | public static class ServersSerialization |
|
15 | { |
- | ||
16 | #region Public Enums, Properties and Fields |
- | ||
17 | |
- | ||
18 | /// <summary> |
- | ||
19 | /// Cached XML serializer for the configuration. |
- | ||
20 | /// </summary> |
- | ||
21 | public static XmlSerializer XmlSerializer { get; } = new XmlSerializer(typeof(global::Servers.Servers)); |
- | ||
22 | |
- | ||
23 | #endregion |
- | ||
24 | |
13 | { |
|
Line 25... | Line 14... | |||
25 | #region Public Methods |
14 | #region Public Methods |
|
- | 15 | |
||
26 | |
16 | public static async Task<SerializationState> Deserialize<T>(string file, string targetNamespace, |
|
- | 17 | string schemeUri) |
||
- | 18 | { |
||
27 | public static async Task<ServersSerializationState> Deserialize(string file) |
19 | var xmlSerializer = new XmlSerializer(typeof(T)); |
|
Line 28... | Line 20... | |||
28 | { |
20 | |
|
29 | var validationEventArgs = new List<ValidationEventArgs>(); |
21 | var validationEventArgs = new List<ValidationEventArgs>(); |
|
30 | |
22 | |
|
31 | void XmlReaderSettingsValidationEventHandler(object sender, ValidationEventArgs e) |
23 | void XmlReaderSettingsValidationEventHandler(object sender, ValidationEventArgs e) |
|
Line 32... | Line 24... | |||
32 | { |
24 | { |
|
Line 33... | Line 25... | |||
33 | validationEventArgs.Add(e); |
25 | validationEventArgs.Add(e); |
|
Line 34... | Line 26... | |||
34 | } |
26 | } |
|
35 | |
27 | |
|
Line 50... | Line 42... | |||
50 | |
42 | |
|
Line 51... | Line 43... | |||
51 | settings.Schemas = new XmlSchemaSet(); |
43 | settings.Schemas = new XmlSchemaSet(); |
|
Line 52... | Line 44... | |||
52 | |
44 | |
|
Line 53... | Line 45... | |||
53 | settings.ValidationEventHandler += XmlReaderSettingsValidationEventHandler; |
45 | settings.ValidationEventHandler += XmlReaderSettingsValidationEventHandler; |
|
54 | |
46 | |
|
55 | settings.Schemas.Add("urn:winify-servers-schema", "Servers.xsd"); |
47 | settings.Schemas.Add(targetNamespace, schemeUri); |
|
56 | |
48 | |
|
Line 71... | Line 63... | |||
71 | } |
63 | } |
|
Line 72... | Line 64... | |||
72 | |
64 | |
|
73 | using (var stringReader = new StringReader(stringBuilder.ToString())) |
65 | using (var stringReader = new StringReader(stringBuilder.ToString())) |
|
74 | { |
66 | { |
|
75 | servers = |
67 | servers = |
|
76 | (global::Servers.Servers) XmlSerializer |
68 | (T) xmlSerializer |
|
77 | .Deserialize(stringReader); |
69 | .Deserialize(stringReader); |
|
78 | } |
70 | } |
|
79 | } |
71 | } |
|
80 | } |
72 | } |
|
81 | } |
73 | } |
|
82 | catch (Exception ex) |
74 | catch (Exception ex) |
|
83 | { |
75 | { |
|
84 | return new ServersSerializationFailure(ex, validationEventArgs); |
76 | return new SerializationFailure(ex, validationEventArgs); |
|
85 | } |
77 | } |
|
86 | finally |
78 | finally |
|
87 | { |
79 | { |
|
88 | settings.ValidationEventHandler -= |
80 | settings.ValidationEventHandler -= |
|
89 | XmlReaderSettingsValidationEventHandler; |
81 | XmlReaderSettingsValidationEventHandler; |
|
Line 90... | Line -... | |||
90 | } |
- | ||
91 | |
- | ||
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 | } |
82 | } |
|
105 | |
83 | |
|
Line 106... | Line 84... | |||
106 | return new ServersSerializationSuccess(protectedServers, validationEventArgs); |
84 | return new SerializationSuccess<T>(servers, validationEventArgs); |
|
107 | } |
85 | } |
|
- | 86 | |
||
- | 87 | public static async Task<SerializationState> Serialize<T>(T servers, string file, string name, string subset) |
||
108 | |
88 | { |
|
109 | public static async Task<ServersSerializationState> Serialize(global::Servers.Servers servers, string file) |
89 | var xmlSerializer = new XmlSerializer(typeof(T)); |
|
110 | { |
90 | |
|
111 | try |
91 | try |
|
112 | { |
92 | { |
|
Line 120... | Line 100... | |||
120 | Indent = true, |
100 | Indent = true, |
|
121 | IndentChars = " ", |
101 | IndentChars = " ", |
|
122 | OmitXmlDeclaration = false |
102 | OmitXmlDeclaration = false |
|
123 | })) |
103 | })) |
|
124 | { |
104 | { |
|
125 | await xmlWriter.WriteDocTypeAsync("Servers", |
105 | await xmlWriter.WriteDocTypeAsync(name, |
|
126 | null, |
106 | null, |
|
127 | null, |
107 | null, |
|
128 | "<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>"); |
108 | subset); |
|
Line 129... | Line -... | |||
129 | |
- | ||
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); |
- | ||
140 | |
- | ||
141 | protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, armored)); |
- | ||
142 | } |
- | ||
143 | |
109 | |
|
Line 144... | Line 110... | |||
144 | XmlSerializer.Serialize(xmlWriter, protectedServers); |
110 | xmlSerializer.Serialize(xmlWriter, servers); |
|
145 | |
111 | |
|
146 | using (var fileStream = |
112 | using (var fileStream = |
|
147 | new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) |
113 | new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) |
|
Line 153... | Line 119... | |||
153 | } |
119 | } |
|
154 | } |
120 | } |
|
155 | } |
121 | } |
|
156 | catch (Exception ex) |
122 | catch (Exception ex) |
|
157 | { |
123 | { |
|
158 | return new ServersSerializationFailure(ex); |
- | ||
159 | } |
- | ||
160 | |
- | ||
161 | return new ServersSerializationSuccess(); |
- | ||
162 | } |
- | ||
163 | |
- | ||
164 | public static async Task<ServersSerializationState> Serialize(global::Servers.Servers servers, |
- | ||
165 | MemoryStream outputStream) |
- | ||
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 | |
- | ||
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); |
- | ||
196 | |
- | ||
197 | protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, armored)); |
- | ||
198 | } |
- | ||
199 | |
- | ||
200 | XmlSerializer.Serialize(xmlWriter, protectedServers); |
- | ||
201 | |
- | ||
202 | memoryStream.Position = 0L; |
- | ||
203 | |
- | ||
204 | await memoryStream.CopyToAsync(outputStream); |
- | ||
205 | } |
- | ||
206 | } |
- | ||
207 | } |
- | ||
208 | catch (Exception ex) |
- | ||
209 | { |
- | ||
210 | return new ServersSerializationFailure(ex); |
124 | return new SerializationFailure(ex); |
|
211 | } |
125 | } |
|
Line 212... | Line 126... | |||
212 | |
126 | |
|
213 | return new ServersSerializationSuccess(); |
127 | return new SerializationSuccess<T>(); |
|
Line 214... | Line 128... | |||
214 | } |
128 | } |
|
215 | |
129 | |
|
216 | #endregion |
130 | #endregion |
|
217 | } |
131 | } |