initial source commit

This commit is contained in:
Gary Sharp
2013-02-01 12:35:28 +11:00
parent 543a005d31
commit 0a93429800
1103 changed files with 285609 additions and 0 deletions
@@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.IO;
namespace Disco.Web.Models.InitialConfig
{
public class CompleteModel
{
public Tuple<IPHostEntry, Exception> DiscoDnsTestResult { get; set; }
public Exception RegistryDatabaseResult { get; set; }
public Exception DiscoIctComAuWebResult { get; set; }
public bool LaunchAllowed
{
get
{
return (RegistryDatabaseResult == null);
}
}
public void PerformTests()
{
#region DNS for 'Disco'
try
{
// Try and Resolve 'disco'
DiscoDnsTestResult = new Tuple<IPHostEntry, Exception>(Dns.GetHostEntry("disco"), null);
}
catch (Exception ex)
{
DiscoDnsTestResult = new Tuple<IPHostEntry, Exception>(null, ex);
}
#endregion
#region Write Database to Registry
try
{
// Make Connection String Persistent
Disco.Data.Repository.DiscoDatabaseConnectionFactory.SetDiscoDataContextConnectionString(
Disco.Data.Repository.DiscoDatabaseConnectionFactory.DiscoDataContextConnectionString, true);
RegistryDatabaseResult = null;
}
catch (Exception ex)
{
RegistryDatabaseResult = ex;
}
#endregion
#region Communicate with http://discoict.com.au/
try
{
Dns.GetHostEntry("discoict.com.au");
try
{
HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://discoict.com.au/");
wReq.Method = WebRequestMethods.Http.Get;
wReq.UserAgent = string.Format("Disco/{0} (Initial Config; Org: {1})", DiscoApplication.Version, DiscoApplication.OrganisationName);
using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse())
{
if (wRes.StatusCode == HttpStatusCode.OK)
{
DiscoIctComAuWebResult = null;
}
else
{
DiscoIctComAuWebResult = new Exception(string.Format("Server returned response: [{0}] {1}", wRes.StatusCode, wRes.StatusDescription));
}
}
}
catch (Exception ex)
{
DiscoIctComAuWebResult = new WebException("DNS Resolved the host 'discoict.com.au' but could not establish a connection.", ex);
}
}
catch (Exception ex)
{
DiscoIctComAuWebResult = new Exception("Could not resolve the name 'discoict.com.au'", ex);
throw;
}
#endregion
}
}
}
@@ -0,0 +1,111 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Disco.Web.Models.InitialConfig
{
public class DatabaseModel
{
public DatabaseModel()
{
// Set Defaults
this.Server = "(local)";
this.DatabaseName = "Disco";
this.AuthMethod = "SSPI";
}
public static DatabaseModel FromConnectionString(string ConnectionString)
{
var result = new DatabaseModel();
try
{
var csb = new SqlConnectionStringBuilder(ConnectionString);
if (!string.IsNullOrEmpty(csb.DataSource))
result.Server = csb.DataSource;
if (!string.IsNullOrEmpty(csb.InitialCatalog))
result.DatabaseName = csb.InitialCatalog;
if (csb.IntegratedSecurity)
{
result.AuthMethod = "SSPI";
}
else
{
result.AuthMethod = "SQL";
result.Auth_SQL_Username = csb.UserID;
result.Auth_SQL_Password = csb.Password;
}
}
catch (Exception)
{
// Ignore Parsing errors
}
return result;
}
public SqlConnectionStringBuilder ToConnectionString()
{
var csb = new SqlConnectionStringBuilder()
{
DataSource = this.Server,
InitialCatalog = this.DatabaseName,
IntegratedSecurity = (this.AuthMethod.Equals("SSPI", StringComparison.InvariantCultureIgnoreCase)),
UserID = (this.AuthMethod.Equals("SQL", StringComparison.InvariantCultureIgnoreCase)) ? this.Auth_SQL_Username : string.Empty,
Password = (this.AuthMethod.Equals("SQL", StringComparison.InvariantCultureIgnoreCase)) ? this.Auth_SQL_Password : string.Empty,
ApplicationName = "Disco WebApp",
MultipleActiveResultSets = true,
Pooling = true
};
return csb;
}
[Required(ErrorMessage = "The Server name is required")]
public string Server { get; set; }
[Required(ErrorMessage = "The Database name is required")]
public string DatabaseName { get; set; }
[Required(ErrorMessage = "The Authentication Method is required")]
public string AuthMethod { get; set; }
[CustomValidation(typeof(DatabaseModel), "SqlAuthRequired", ErrorMessage = "When using SQL Authentication a Username is required")]
public string Auth_SQL_Username { get; set; }
[DataType(DataType.Password), CustomValidation(typeof(DatabaseModel), "SqlAuthRequired", ErrorMessage="When using SQL Authentication a Password is required")]
public string Auth_SQL_Password { get; set; }
public List<SelectListItem> AuthMethods
{
get
{
return new List<SelectListItem>(){
new SelectListItem(){
Value="SSPI", Text="Integrated Authentication", Selected=true
},
new SelectListItem(){
Value="SQL", Text="SQL Authentication", Selected=false
}
};
}
}
public static ValidationResult SqlAuthRequired(object value, ValidationContext validationContext)
{
var instance = validationContext.ObjectInstance as DatabaseModel;
if (instance != null && instance.AuthMethod != null && instance.AuthMethod.Equals("SQL", StringComparison.InvariantCultureIgnoreCase))
{
var stringValue = value as string;
if (string.IsNullOrWhiteSpace(stringValue))
return null; // Invalid
}
return ValidationResult.Success;
}
}
}
@@ -0,0 +1,181 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security;
using System.Security.Permissions;
using System.Security.Principal;
using System.Web;
namespace Disco.Web.Models.InitialConfig
{
public class FileStoreModel
{
public FileStoreModel()
{
DirectoryModel = FileStoreModel.FileStoreDirectoryModel.DirectoryRoots();
}
[Required(), CustomValidation(typeof(FileStoreModel), "DirectoryPermissionRequired")]
public string FileStoreLocation { get; set; }
public FileStoreDirectoryModel DirectoryModel { get; set; }
public void ExpandDirectoryModel()
{
if (!string.IsNullOrWhiteSpace(FileStoreLocation))
{
var branches = this.FileStoreLocation.ToUpper().Split(Path.DirectorySeparatorChar);
var branchesCase = this.FileStoreLocation.Split(Path.DirectorySeparatorChar);
FileStoreDirectoryModel branchModel;
FileStoreDirectoryModel branchParent = this.DirectoryModel;
for (int i = 0; i < branches.Length; i++)
{
var branch = branches[i];
if (branchParent.SubDirectories.TryGetValue(branch, out branchModel))
{
branchModel.ExpandSubDirectories();
}
else
{
// New
branchModel = FileStoreDirectoryModel.FromNew(branchesCase[i], Path.Combine(branchParent.Path, branchesCase[i]));
branchParent.SubDirectories.Add(branchModel.Name.ToUpper(), branchModel);
}
branchParent = branchModel;
}
}
}
public static ValidationResult DirectoryPermissionRequired(object value, ValidationContext validationContext)
{
var instance = validationContext.ObjectInstance as FileStoreModel;
if (instance != null && !string.IsNullOrEmpty(instance.FileStoreLocation))
{
var stringValue = value as string;
DirectoryInfo info = new DirectoryInfo(stringValue);
if (!info.Exists)
{
// Try and Create
try
{
info.Create();
}
catch (Exception ex)
{
return new ValidationResult(string.Format("Unable to Create Directory '{0}'; [{1}] {2}", info.FullName, ex.GetType().Name, ex.Message));
}
}
}
return ValidationResult.Success;
}
public class FileStoreDirectoryModel
{
public string Name { get; set; }
public string Path { get; set; }
public bool IsNew { get; set; }
public bool Selectable { get; set; }
public Dictionary<string, FileStoreDirectoryModel> SubDirectories { get; set; }
internal static FileStoreDirectoryModel FromInfo(DirectoryInfo info)
{
return new FileStoreDirectoryModel()
{
Name = info.Name,
Path = info.FullName,
IsNew = false,
Selectable = (info.Root.Name != info.Name)
};
}
internal static FileStoreDirectoryModel FromNew(string Name, string FullPath)
{
return new FileStoreDirectoryModel()
{
Name = Name,
Path = FullPath,
IsNew = true,
Selectable = true,
SubDirectories = new Dictionary<string, FileStoreDirectoryModel>()
};
}
internal static FileStoreDirectoryModel FromInfo(DriveInfo info)
{
return new FileStoreDirectoryModel()
{
Name = info.Name.Substring(0, 2),
Path = info.RootDirectory.Name,
IsNew = false,
Selectable = false
};
}
internal static FileStoreDirectoryModel FromPath(string DirectoryPath, bool ExpandSubDirectories)
{
DirectoryInfo info = new DirectoryInfo(DirectoryPath);
if (info.Exists)
{
var fsd = FromInfo(info);
if (ExpandSubDirectories)
fsd.ExpandSubDirectories();
return fsd;
}
else
return null;
}
internal static FileStoreDirectoryModel DirectoryRoots()
{
var root = new FileStoreDirectoryModel()
{
Name = "ROOT",
Path = null,
IsNew = false,
Selectable = false,
SubDirectories = new Dictionary<string, FileStoreDirectoryModel>()
};
foreach (var driveInfo in DriveInfo.GetDrives())
{
if (driveInfo.DriveType == DriveType.Fixed)
root.SubDirectories.Add(driveInfo.Name.Substring(0, 2).ToUpper(), FileStoreDirectoryModel.FromInfo(driveInfo));
}
return root;
}
internal void ExpandSubDirectories()
{
if (this.SubDirectories == null)
{
this.SubDirectories = new Dictionary<string, FileStoreDirectoryModel>();
if (!this.IsNew)
{
var dirInfo = new DirectoryInfo(Path);
if (dirInfo.Exists)
{
foreach (var subDir in dirInfo.EnumerateDirectories())
{
this.SubDirectories.Add(subDir.Name.ToUpper(), FileStoreDirectoryModel.FromInfo(subDir));
}
}
else
{
this.IsNew = true;
}
}
}
}
}
}
}
@@ -0,0 +1,90 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Net;
using System.Xml.Linq;
using System.IO;
using System.Globalization;
namespace Disco.Web.Models.InitialConfig
{
public class WelcomeModel
{
[Required(ErrorMessage="The Organisation Name is required.")]
public string OrganisationName { get; set; }
private static string _OrganisationNameCache;
public bool AutodetectOrganisation()
{
if (_OrganisationNameCache != null)
{
this.OrganisationName = _OrganisationNameCache;
return true;
}
// DnsQuery for broadband.doe.wan
IPHostEntry doeWanDnsEntry;
try
{
doeWanDnsEntry = Dns.GetHostEntry("broadband.doe.wan");
}
catch (Exception)
{ return false; } // Fail on error
// Try using IPSearch feature
XDocument doeWanIPSearchResult = TryDownloadDoeIPSearch(true);
if (doeWanIPSearchResult == null)
doeWanIPSearchResult = TryDownloadDoeIPSearch(false);
if (doeWanIPSearchResult == null)
return false;
try
{
var siteName = doeWanIPSearchResult.Element("resultset").Element("site").Element("name").Value.ToLower();
this.OrganisationName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(siteName);
_OrganisationNameCache = this.OrganisationName;
return true;
}
catch (Exception)
{ return false; } // Fail on error
}
private XDocument TryDownloadDoeIPSearch(bool useProxy)
{
try
{
HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://broadband.doe.wan/ipsearch/showresult.php");
if (!useProxy)
wReq.Proxy = new WebProxy(); // Empty Proxy Config
wReq.Method = WebRequestMethods.Http.Post;
wReq.ContentType = "application/x-www-form-urlencoded";
wReq.UserAgent = string.Format("Disco/{0}", DiscoApplication.Version);
using (var wrStream = wReq.GetRequestStream())
{
using (var wrStreamWriter = new StreamWriter(wrStream))
{
wrStreamWriter.Write("mode=whoami");
}
}
using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse())
{
if (wRes.StatusCode == HttpStatusCode.OK)
{
using (var wResStream = wRes.GetResponseStream())
{
return XDocument.Load(wResStream);
}
}
else
return null;
}
}
catch (Exception)
{ return null; } // Fail on error
}
}
}