Winify

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 14  →  ?path2? @ 15
File deleted
\ No newline at end of file
/trunk/Winify/Servers/Serialization/ServersSerializationState.cs
File deleted
\ No newline at end of file
/trunk/Winify/Servers/Serialization/ServersSerializationFailure.cs
File deleted
\ No newline at end of file
/trunk/Winify/Servers/Serialization/ServersSerializationSuccess.cs
/trunk/Winify/Servers/Serialization/SerializationFailure.cs
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Xml.Schema;
 
namespace Winify.Servers.Serialization
{
public class SerializationFailure : SerializationState
{
#region Public Enums, Properties and Fields
 
public Exception Exception { get; set; }
 
public List<ValidationEventArgs> ValidationEventArgs { get; }
 
#endregion
 
#region Constructors, Destructors and Finalizers
 
public SerializationFailure(Exception exception)
{
Exception = exception;
}
 
public SerializationFailure(Exception exception, List<ValidationEventArgs> validationEventArgs) :
this(exception)
{
ValidationEventArgs = validationEventArgs;
}
 
#endregion
}
}
/trunk/Winify/Servers/Serialization/SerializationState.cs
@@ -0,0 +1,6 @@
namespace Winify.Servers.Serialization
{
public class SerializationState
{
}
}
/trunk/Winify/Servers/Serialization/SerializationSuccess.cs
@@ -0,0 +1,35 @@
using System.Collections.Generic;
using System.Xml.Schema;
 
namespace Winify.Servers.Serialization
{
public class SerializationSuccess<T> : SerializationState
{
#region Public Enums, Properties and Fields
 
public T Result { get; }
 
public List<ValidationEventArgs> ValidationEventArgs { get; }
 
#endregion
 
#region Constructors, Destructors and Finalizers
 
public SerializationSuccess()
{
}
 
public SerializationSuccess(T result) : this()
{
Result = result;
}
 
public SerializationSuccess(T result,
List<ValidationEventArgs> validationEventArgs) : this(result)
{
ValidationEventArgs = validationEventArgs;
}
 
#endregion
}
}
/trunk/Winify/Servers/Serialization/ServersSerialization.cs
@@ -6,26 +6,18 @@
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using Servers;
using Winify.Utilities;
 
namespace Winify.Servers.Serialization
{
public static class ServersSerialization
{
#region Public Enums, Properties and Fields
 
/// <summary>
/// Cached XML serializer for the configuration.
/// </summary>
public static XmlSerializer XmlSerializer { get; } = new XmlSerializer(typeof(global::Servers.Servers));
 
#endregion
 
#region Public Methods
 
public static async Task<ServersSerializationState> Deserialize(string file)
public static async Task<SerializationState> Deserialize<T>(string file, string targetNamespace,
string schemeUri)
{
var xmlSerializer = new XmlSerializer(typeof(T));
 
var validationEventArgs = new List<ValidationEventArgs>();
 
void XmlReaderSettingsValidationEventHandler(object sender, ValidationEventArgs e)
@@ -33,7 +25,7 @@
validationEventArgs.Add(e);
}
 
global::Servers.Servers servers;
T servers;
 
var settings = new XmlReaderSettings();
 
@@ -52,7 +44,7 @@
 
settings.ValidationEventHandler += XmlReaderSettingsValidationEventHandler;
 
settings.Schemas.Add("urn:winify-servers-schema", "Servers.xsd");
settings.Schemas.Add(targetNamespace, schemeUri);
 
using (var fileStream =
new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
@@ -73,7 +65,7 @@
using (var stringReader = new StringReader(stringBuilder.ToString()))
{
servers =
(global::Servers.Servers) XmlSerializer
(T) xmlSerializer
.Deserialize(stringReader);
}
}
@@ -81,7 +73,7 @@
}
catch (Exception ex)
{
return new ServersSerializationFailure(ex, validationEventArgs);
return new SerializationFailure(ex, validationEventArgs);
}
finally
{
@@ -89,25 +81,13 @@
XmlReaderSettingsValidationEventHandler;
}
 
// Decrypt password.
var deviceId = Miscellaneous.GetMachineGuid();
var protectedServers = new global::Servers.Servers
{
Server = new BindingListWithCollectionChanged<Server>()
};
foreach (var server in servers.Server)
{
var unarmored = Convert.FromBase64String(server.Password);
var decrypted = Encoding.UTF8.GetString(AES.Decrypt(unarmored, deviceId));
 
protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, decrypted));
}
 
return new ServersSerializationSuccess(protectedServers, validationEventArgs);
return new SerializationSuccess<T>(servers, validationEventArgs);
}
 
public static async Task<ServersSerializationState> Serialize(global::Servers.Servers servers, string file)
public static async Task<SerializationState> Serialize<T>(T servers, string file, string name, string subset)
{
var xmlSerializer = new XmlSerializer(typeof(T));
 
try
{
using (var memoryStream = new MemoryStream())
@@ -122,27 +102,13 @@
OmitXmlDeclaration = false
}))
{
await xmlWriter.WriteDocTypeAsync("Servers",
await xmlWriter.WriteDocTypeAsync(name,
null,
null,
"<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>");
subset);
 
// Encrypt password for all servers.
var deviceId = Miscellaneous.GetMachineGuid();
var protectedServers = new global::Servers.Servers
{
Server = new BindingListWithCollectionChanged<Server>()
};
foreach (var server in servers.Server)
{
var encrypted = AES.Encrypt(Encoding.UTF8.GetBytes(server.Password), deviceId);
var armored = Convert.ToBase64String(encrypted);
xmlSerializer.Serialize(xmlWriter, servers);
 
protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, armored));
}
 
XmlSerializer.Serialize(xmlWriter, protectedServers);
 
using (var fileStream =
new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
{
@@ -155,64 +121,12 @@
}
catch (Exception ex)
{
return new ServersSerializationFailure(ex);
return new SerializationFailure(ex);
}
 
return new ServersSerializationSuccess();
return new SerializationSuccess<T>();
}
 
public static async Task<ServersSerializationState> Serialize(global::Servers.Servers servers,
MemoryStream outputStream)
{
try
{
using (var memoryStream = new MemoryStream())
{
using (var xmlWriter =
XmlWriter.Create(memoryStream,
new XmlWriterSettings
{
Async = true,
Indent = true,
IndentChars = " ",
OmitXmlDeclaration = false
}))
{
await xmlWriter.WriteDocTypeAsync("Servers",
null,
null,
"<!ATTLIST Servers xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>");
 
// Encrypt password for all servers.
var deviceId = Miscellaneous.GetMachineGuid();
var protectedServers = new global::Servers.Servers
{
Server = new BindingListWithCollectionChanged<Server>()
};
foreach (var server in servers.Server)
{
var encrypted = AES.Encrypt(Encoding.UTF8.GetBytes(server.Password), deviceId);
var armored = Convert.ToBase64String(encrypted);
 
protectedServers.Server.Add(new Server(server.Name, server.Url, server.Username, armored));
}
 
XmlSerializer.Serialize(xmlWriter, protectedServers);
 
memoryStream.Position = 0L;
 
await memoryStream.CopyToAsync(outputStream);
}
}
}
catch (Exception ex)
{
return new ServersSerializationFailure(ex);
}
 
return new ServersSerializationSuccess();
}
 
#endregion
}
}