PageRenderTime 56ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/mesoBoard/branches/ConfigsBBCodesPlugins/mesoBoard.Web/Controllers/InstallController.cs

#
C# | 284 lines | 235 code | 49 blank | 0 comment | 10 complexity | a3b008555f2ddf16cbca4fd92c5657b6 MD5 | raw file
Possible License(s): BSD-3-Clause, MPL-2.0-no-copyleft-exception
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using System.Web.Mvc.Ajax;
  7. using mesoBoard.Web.Core;
  8. using System.Text.RegularExpressions;
  9. using mesoBoard.Data;
  10. using mesoBoard.Web;
  11. using mesoBoard.Services;
  12. using mesoBoard.Web.Models;
  13. using System.IO;
  14. using Ninject;
  15. using mesoBoard.Data.Repositories;
  16. using System.Xml.Linq;
  17. using System.Data.SqlClient;
  18. using System.Net.Mail;
  19. using System.Net.Sockets;
  20. using System.Configuration;
  21. using System.Web.Configuration;
  22. using System.Net.Configuration;
  23. namespace mesoBoard.Web.Controllers
  24. {
  25. public class InstallController : Controller
  26. {
  27. protected override void ExecuteCore()
  28. {
  29. if (bool.Parse(ConfigurationManager.AppSettings["Installed"]))
  30. {
  31. View("AlreadyInstalled").ExecuteResult(ControllerContext);
  32. }
  33. else
  34. base.ExecuteCore();
  35. }
  36. protected override void Execute(System.Web.Routing.RequestContext requestContext)
  37. {
  38. requestContext.HttpContext.Items["mbThemeFolder"] = "Default";
  39. base.Execute(requestContext);
  40. }
  41. public ActionResult Index()
  42. {
  43. ViewData["BreadCrumb"] = "Welcome";
  44. return View();
  45. }
  46. [HttpGet]
  47. public ActionResult Step1()
  48. {
  49. ViewData["StepNumber"] = 1;
  50. SQLInstallViewModel model = new SQLInstallViewModel
  51. {
  52. SQLServerAddress = "localhost",
  53. SQLUseDefaultCredentials = false,
  54. };
  55. return View(model);
  56. }
  57. [HttpPost]
  58. public ActionResult Step1(SQLInstallViewModel info)
  59. {
  60. ViewData["StepNumber"] = 1;
  61. if (info.SQLUseDefaultCredentials)
  62. {
  63. ModelState.Remove("SQLLogin");
  64. ModelState.Remove("SQLPassword");
  65. }
  66. if (ModelState.IsValid)
  67. {
  68. SqlConnectionStringBuilder connectionString = new SqlConnectionStringBuilder();
  69. connectionString.DataSource = info.SQLServerAddress;
  70. connectionString.InitialCatalog = info.DatabaseName;
  71. connectionString.MultipleActiveResultSets = true;
  72. connectionString.IntegratedSecurity = info.SQLUseDefaultCredentials; ;
  73. if (!info.SQLUseDefaultCredentials)
  74. {
  75. connectionString.UserID = info.SQLLogin;
  76. connectionString.Password = info.SQLPassword;
  77. }
  78. SqlConnection connection = new SqlConnection(connectionString.ToString());
  79. try
  80. {
  81. connection.Open();
  82. string sql = System.IO.File.ReadAllText(Server.MapPath("~/Install/mesoBoardFresh.sql"));
  83. string[] cmds = sql.Split(new string[] { "GO" }, StringSplitOptions.RemoveEmptyEntries);
  84. SqlCommand command = new SqlCommand();
  85. command.Connection = connection;
  86. foreach (string cmd in cmds)
  87. {
  88. command.CommandText = cmd;
  89. command.ExecuteNonQuery();
  90. }
  91. var configuration = WebConfigurationManager.OpenWebConfiguration("~");
  92. configuration.ConnectionStrings.ConnectionStrings["cleanConnectionString"].ConnectionString = connectionString.ToString();
  93. configuration.ConnectionStrings.ConnectionStrings["cleanConnectionString"].ProviderName = "System.Data.SqlClient";
  94. configuration.ConnectionStrings.ConnectionStrings["mbEntities"].ConnectionString = "metadata=res://*/mbEntities.csdl|res://*/mbEntities.ssdl|res://*/mbEntities.msl;provider=System.Data.SqlClient;provider connection string=\"" + connectionString.ToString()+"\"";
  95. configuration.ConnectionStrings.ConnectionStrings["mbEntities"].ProviderName = "System.Data.EntityClient";
  96. configuration.Save();
  97. connection.Dispose();
  98. return RedirectToAction("Step2");
  99. }
  100. catch
  101. {
  102. TempData["Notice"] = "Unable to connect to SQL server, check connection information";
  103. }
  104. finally
  105. {
  106. connection.Dispose();
  107. }
  108. return View(info);
  109. }
  110. else
  111. {
  112. return View(info);
  113. }
  114. }
  115. [HttpGet]
  116. public ActionResult Step2()
  117. {
  118. ViewData["StepNumber"] = 2;
  119. ViewData["Success"] = "Successfully connected to database and created tables";
  120. MailInstallViewModel model = new MailInstallViewModel
  121. {
  122. MailServerAddress = "mail." + Request.Url.Host,
  123. MailUseDefaultCredentials = false,
  124. PortNumber = 25
  125. };
  126. return View(model);
  127. }
  128. [HttpPost]
  129. public ActionResult Step2(MailInstallViewModel info)
  130. {
  131. ViewData["StepNumber"] = 2;
  132. if (info.MailUseDefaultCredentials)
  133. {
  134. ModelState.Remove("MailLogin");
  135. ModelState.Remove("MailPassword");
  136. }
  137. if (ModelState.IsValid)
  138. {
  139. TcpClient client = new TcpClient();
  140. try
  141. {
  142. client.Connect(info.MailServerAddress, info.PortNumber);
  143. client.Close();
  144. }
  145. catch (Exception ex)
  146. {
  147. ViewData["Notice"] = "Error connecting to SMTP server, a " + ex.GetType().ToString() + " exception was raised";
  148. return View(info);
  149. }
  150. var configuration = WebConfigurationManager.OpenWebConfiguration("~");
  151. MailSettingsSectionGroup settings = (MailSettingsSectionGroup)configuration.GetSectionGroup("system.net/mailSettings");
  152. SmtpSection smtp = settings.Smtp;
  153. smtp.From = "no-reply@" + Request.Url.Host;
  154. smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
  155. smtp.Network.Host = info.MailServerAddress;
  156. smtp.Network.DefaultCredentials = info.MailUseDefaultCredentials;
  157. smtp.Network.Port = info.PortNumber;
  158. smtp.Network.UserName = info.MailLogin;
  159. smtp.Network.Password = info.MailPassword;
  160. configuration.Save();
  161. ConfigRepository configs = new ConfigRepository(new mbEntities(configuration.ConnectionStrings.ConnectionStrings["mbEntities"].ConnectionString));
  162. configs.UpdateConfig("AutomatedFromEmail", smtp.From);
  163. TempData["Success"] = "Successfully connected to mail server";
  164. return RedirectToAction("Step3");
  165. }
  166. else
  167. {
  168. return View(info);
  169. }
  170. }
  171. [HttpGet]
  172. public ActionResult Step3()
  173. {
  174. ViewData["StepNumber"] = 3;
  175. return View();
  176. }
  177. [HttpPost]
  178. public ActionResult Step3(string username, string email)
  179. {
  180. if (string.IsNullOrWhiteSpace(username))
  181. ModelState.AddModelError("username", "Enter an admin username");
  182. if (string.IsNullOrWhiteSpace(username) || !RegEx.IsValidEmail(email))
  183. ModelState.AddModelError("email", "Enter a valid email address");
  184. if (ModelState.IsValid)
  185. {
  186. string password = Randoms.RandomPassword();
  187. var configuration = WebConfigurationManager.OpenWebConfiguration("~");
  188. mbEntities db = new mbEntities(configuration.ConnectionStrings.ConnectionStrings["mbEntities"].ConnectionString);
  189. RepositoriesWrapper Repositories = new RepositoriesWrapper(db);
  190. ServicesWrapper mbServices = new ServicesWrapper(Repositories);
  191. User defaultUser = Repositories.Users.GetUser(1);
  192. defaultUser.Username = username;
  193. defaultUser.UsernameLower = username.ToLower();
  194. Repositories.Users.UpdateUser(defaultUser);
  195. mbServices.Users.UpdatePassword(1, password);
  196. defaultUser.Email = email;
  197. Repositories.Configs.UpdateConfig("BoardURL", Request.Url.Host);
  198. Repositories.Users.UpdateUser(defaultUser);
  199. configuration.AppSettings.Settings["Installed"].Value = "true";
  200. configuration.Save();
  201. MailSettingsSectionGroup settings = (MailSettingsSectionGroup)configuration.GetSectionGroup("system.net/mailSettings");
  202. SmtpClient smtp = new SmtpClient();
  203. try
  204. {
  205. smtp.Send(Repositories.Configs.Value("AutomatedFromEmail"),
  206. email,
  207. "mesoBoard Installation",
  208. "Username: " + username + Environment.NewLine +
  209. "Password: " + password);
  210. }
  211. catch
  212. {
  213. ViewData["Error"] = "Couldn't send email. Please store the information below for your records";
  214. }
  215. ViewData["Username"] = username;
  216. ViewData["Password"] = password;
  217. ViewData["Email"] = email;
  218. ViewData["Success"] = "mesoBoard installation complete";
  219. try
  220. {
  221. SiteConfig.UpdateCache();
  222. }
  223. catch
  224. {
  225. ViewData["Notice"] = "Configuration Cache did not update. Please update manually through the Admin Control Panel";
  226. }
  227. return View("InstallationComplete");
  228. }
  229. else
  230. {
  231. return View();
  232. }
  233. }
  234. }
  235. }