public JsonResult ArchiveMail(string[] messageIds, string folderName) { var successful = false; if (Request.IsAuthenticated) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var user = uow.UserRepository.GetUserByUsername(User.Identity.Name); if (DateTime.Compare(DateTime.Now, user.OAuthAccessTokenExpiration) < 0) { using ( var imap = new ImapClient("imap.gmail.com", user.EmailAddress, user.CurrentOAuthAccessToken, AuthMethods.SaslOAuth, 993, true, true)) { imap.SelectMailbox(folderName); foreach (var messageId in messageIds) { imap.MoveMessage(messageId, "[Gmail]/All Mail"); } imap.Expunge(); successful = true; } } } } return Json(new {Result = successful}); }
public JsonResult AddNewGadget(int gadgetId) { if (Request.IsAuthenticated) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var gadget = uow.GadgetRepository.GetGadgetById(gadgetId); if (gadget != null) { var userGadget = new UserGadget { User = uow.UserRepository.GetUserById((int)Membership.GetUser().ProviderUserKey), Gadget = gadget, GadgetSettings = gadget.DefaultSettings, DisplayColumn = 1 }; userGadget.DisplayOrdinal = uow.UserGadgetRepository.GetNextOrdinal(userGadget.User.UserId, userGadget.DisplayColumn); uow.UserGadgetRepository.UserGadgets.Add(userGadget); uow.UserGadgetRepository.SaveChanges(); return Json(new { Success = true, UserGadgetId = userGadget.UserGadgetId, HasSettings = (gadget.SettingsSchema.Length > 2) }); } } } return Json(new { Success = false }); }
public ActionResult AddGadget() { IList<DataAccess.Models.Gadget> gadgets = new List<DataAccess.Models.Gadget>(); if (Request.IsAuthenticated) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { gadgets = uow.GadgetRepository.GetAllAvailableGadgets(); } } return View(gadgets); }
private void LoadGadgets() { // ReSharper disable once SuspiciousTypeConversion.Global var gadgetInstances =((SimpleInjectorDependencyResolver)DependencyResolver.Current).Container.GetAllInstances<IGadget>(); using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { foreach (var currentGadget in uow.GadgetRepository.Gadgets) { currentGadget.AssemblyPresent = false; } foreach (var gadget in gadgetInstances) { var currentGadget = uow.GadgetRepository.GetGadgetByName(gadget.GetType().Name); if (currentGadget != null) { currentGadget.AssemblyPresent = true; currentGadget.GadgetTitle = gadget.Title; currentGadget.GadgetDescription = gadget.Description; currentGadget.RequiresValidGoogleAccessToken = gadget.RequiresValidGoogleAccessToken; currentGadget.InBeta = gadget.InBeta; currentGadget.GadgetVersion = gadget.GetType().Assembly.GetName().Version.ToString(); currentGadget.DefaultSettings = gadget.DefaultSettings; currentGadget.SettingsSchema = JsonConvert.SerializeObject(gadget.SettingsSchema); } else { uow.GadgetRepository.Gadgets.Add( new DataAccess.Models.Gadget { GadgetName = gadget.GetType().Name, AssemblyPresent = true, GadgetTitle = gadget.Title, GadgetDescription = gadget.Description, RequiresValidGoogleAccessToken = gadget.RequiresValidGoogleAccessToken, InBeta = gadget.InBeta, GadgetVersion = gadget.GetType().Assembly.GetName().Version.ToString(), DefaultSettings = gadget.DefaultSettings, SettingsSchema = JsonConvert.SerializeObject(gadget.SettingsSchema) }); } GlobalConfig.GadgetTypes.TryAdd(gadget.GetType().Name, gadget.GetType()); } uow.UserGadgetRepository.SaveChanges(); } }
public void DeleteGadget(int userGadgetId) { if (Request.IsAuthenticated) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var userGadget = uow.UserGadgetRepository.GetUserGadgetById(userGadgetId); if (userGadget.User.UserId == (int)Membership.GetUser().ProviderUserKey) { uow.UserGadgetRepository.UserGadgets.Remove(userGadget); uow.UserGadgetRepository.SaveChanges(); } } } }
public JsonResult DeleteMail(string[] messageIds, string folderName) { var successful = false; if (Request.IsAuthenticated) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var user = uow.UserRepository.GetUserByUsername(User.Identity.Name); if (DateTime.Compare(DateTime.Now, user.OAuthAccessTokenExpiration) < 0) { using ( var imap = new ImapClient("imap.gmail.com", user.EmailAddress, user.CurrentOAuthAccessToken, AuthMethods.SaslOAuth, 993, true, true)) { imap.SelectMailbox(folderName); foreach (var messageId in messageIds) { try { imap.MoveMessage(messageId, "[Gmail]/Trash"); } // ReSharper disable once EmptyGeneralCatchClause catch (Exception) //Deleting always throws excptions { } finally { imap.Expunge(); } } successful = true; } } } } return Json(new {Result = successful}); }
public ActionResult Index() { var hasLinkedGoogleAccount = false; var activeGadgets = new List<IGadget>(); var layout = 0; using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { IList<UserGadget> gadgetsForUser; if (Request.IsAuthenticated) { gadgetsForUser = uow.UserGadgetRepository.GetAllUserGadgetsForUser(User.Identity.Name); //refresh oauth access token if needed if (gadgetsForUser.Count > 0) { layout = gadgetsForUser.First().User.LayoutId; if (OAuthWebSecurity.GetAccountsFromUserName(User.Identity.Name).Count > 0) { hasLinkedGoogleAccount = true; if (DateTime.Compare(DateTime.Now, gadgetsForUser.First().User.OAuthAccessTokenExpiration) > 0 && gadgetsForUser.Any(g => g.Gadget.RequiresValidGoogleAccessToken)) { return new AccountController.ExternalLoginResult("google", Url.Action("ExternalLoginCallback", "Account", new {ReturnUrl = ""})); } } } } else { gadgetsForUser = uow.GadgetRepository.GetDefaultGadgets(); } switch (layout) { case 0: case 1: ViewBag.ColumnCount = 3; break; case 2: case 3: case 4: ViewBag.ColumnCount = 2; break; case 5: ViewBag.ColumnCount = 1; break; } ViewBag.ColumnCss = "Layout" + layout + ".css"; ViewBag.LayoutId = layout; foreach (var g in gadgetsForUser) { if (g.Gadget.RequiresValidGoogleAccessToken && !hasLinkedGoogleAccount) { activeGadgets.Add(new RequiresOAuthGadget { UserGadget = g }); } else if (g.Gadget.AssemblyPresent && GlobalConfig.GadgetTypes.ContainsKey(g.Gadget.GadgetName)) { var newGadget = (IGadget)((SimpleInjectorDependencyResolver)DependencyResolver.Current).Container.GetInstance(GlobalConfig.GadgetTypes[g.Gadget.GadgetName]); newGadget.UserGadget = g; activeGadgets.Add(newGadget); } else { activeGadgets.Add(new NotAvailableGadget { UserGadget = g }); } } } return View(activeGadgets); }
public void UpdateSettings(int? layoutId) { if (layoutId != null && Request.IsAuthenticated) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var user = uow.UserRepository.GetUserByUsername(User.Identity.Name); if (user != null) { user.LayoutId = layoutId.Value; uow.UserRepository.SaveChanges(); } } } }
public JsonResult GetGadgetSettings(int userGadgetId) { var gadgetSettings = ""; var settingSchema = ""; var gadgetName = ""; if (Request.IsAuthenticated) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var userGadget = uow.UserGadgetRepository.GetUserGadgetById(userGadgetId); settingSchema = userGadget.Gadget.SettingsSchema; if (userGadget.User.UserId == (int)Membership.GetUser().ProviderUserKey) { gadgetName = userGadget.Gadget.GadgetTitle; if (!string.IsNullOrEmpty(userGadget.GadgetSettings)) { gadgetSettings = userGadget.GadgetSettings; } else { gadgetSettings = userGadget.Gadget.DefaultSettings; } } } } return Json(new { GadgetSettings = gadgetSettings, SettingsSchema = settingSchema, GadgetName = gadgetName }, JsonRequestBehavior.AllowGet); }
public void UpdateGadgetSettings(int userGadgetId, string newSettings) { if (Request.IsAuthenticated) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var userGadget = uow.UserGadgetRepository.GetUserGadgetById(userGadgetId); if (userGadget.User.UserId == (int)Membership.GetUser().ProviderUserKey) { userGadget.GadgetSettings = newSettings; uow.UserGadgetRepository.SaveChanges(); } } } }
public void UpdateGadgetPositions(List<GadgetPosition> gadgetPositions) { if (Request.IsAuthenticated) { if (gadgetPositions != null && gadgetPositions.Count > 0) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var userGadgets = uow.UserGadgetRepository.GetAllUserGadgetsForUser(User.Identity.Name); foreach (var gadgetPosition in gadgetPositions) { var userGadgetToUpdate = userGadgets.Single(g => g.UserGadgetId == gadgetPosition.UserGadgetId); userGadgetToUpdate.DisplayColumn = gadgetPosition.DisplayColumn; userGadgetToUpdate.DisplayOrdinal = gadgetPosition.DisplayOrdinal; } uow.UserGadgetRepository.SaveChanges(); } } } }
public JsonResult GetMail(int? timezoneOffset, bool showUnreadOnly, bool showPreview, string folderName) { var successful = false; var output = new List<GmailThread>(); var unreadCount = 0; var folders = new List<string>(); if (Request.IsAuthenticated) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var user = uow.UserRepository.GetUserByUsername(User.Identity.Name); if (DateTime.Compare(DateTime.Now, user.OAuthAccessTokenExpiration) < 0) { using ( var imap = new ImapClient("imap.gmail.com", user.EmailAddress, user.CurrentOAuthAccessToken, AuthMethods.SaslOAuth, 993, true, true)) { imap.SelectMailbox(folderName); var listMailboxes = imap.ListMailboxes(string.Empty, "*"); foreach (var listMailbox in listMailboxes) { if (!listMailbox.Name.StartsWith("[Gmail]") && String.Compare(listMailbox.Name, folderName, StringComparison.OrdinalIgnoreCase) != 0) { folders.Add(listMailbox.Name); } } var searchCondition = SearchCondition.Undeleted(); if (showUnreadOnly) { searchCondition = searchCondition.And(SearchCondition.Unseen()); } //Get messages and organize into threads var uidCollection = imap.Search(searchCondition); var messages = new List<GmailMessage>(); foreach (var uid in uidCollection) { var cacheKey = "gmail_" + uid + (showPreview ? "_WPrev" : ""); var mailMessageBytes = HttpContext.Cache.Get(cacheKey) as byte[]; if (mailMessageBytes == null) { var mailMessage = new GmailMessage(imap.GetMessage(uid, !showPreview, false)); var encryptedMessage = GlobalConfig.Encryptor.EncryptString(JsonConvert.SerializeObject(mailMessage)); HttpContext.Cache.Insert(cacheKey, encryptedMessage); messages.Add(mailMessage); } else { var decryptedMessage = GlobalConfig.Encryptor.DecryptString(mailMessageBytes); var mailMessage = JsonConvert.DeserializeObject<GmailMessage>(decryptedMessage); messages.Add(mailMessage); } } var threads = new Dictionary<long, GmailMessage>(); var threadMessages = new Dictionary<long, List<long>>(); var threadCounts = new Dictionary<long, int>(); foreach (var m in messages.OrderByDescending(m => m.MessageDate)) { var headers = m.Headers; var gmailThreadId = long.Parse(headers["X-GM-THRID"]); if (!threads.ContainsKey(gmailThreadId)) { threads.Add(gmailThreadId, m); threadCounts.Add(gmailThreadId, 1); threadMessages.Add(gmailThreadId, new List<long> {m.Uid}); } else { threadCounts[gmailThreadId] += 1; threadMessages[gmailThreadId].Add(m.Uid); } } //Bundle threads foreach (var thread in threads) { var messageDate = (thread.Value.MessageDate.Ticks > 0 ? (timezoneOffset.HasValue ? thread.Value.MessageDate.ToUniversalTime().AddMinutes(timezoneOffset.Value) : thread.Value.MessageDate.ToUniversalTime()) : new DateTime(1900, 1, 1)); var messageDateString = (DateTime.Compare(messageDate.Date, DateTime.Now.Date) == 0 ? messageDate.ToShortTimeString() : messageDate.ToShortDateString()); var unread = !(thread.Value.MessageFlags.HasFlag(GmailMessage.Flags.Seen)); if (unread) { unreadCount++; } output.Add(new GmailThread { Subject = thread.Value.Subject, From = thread.Value.FromDisplayName + (threadCounts[thread.Key] > 1 ? " (" + threadCounts[thread.Key] + ")" : ""), ThreadIdHex = thread.Key.ToString("X").ToLower(), ThreadId = thread.Key, ThreadMessageIds = string.Join(",", threadMessages[thread.Key].ToArray()), Date = messageDateString, Preview = (showPreview ? getPreview(thread.Value.Body) : ""), Unread = unread, Important = (thread.Value.Headers.ContainsKey("X-GM-LABELS") && thread.Value.Headers["X-GM-LABELS"].Equals("\"\\\\Important\"")) }); } successful = true; } } } } return Json( new {Result = successful, Data = output, UnreadCount = unreadCount, Folders = folders.ToArray()}, JsonRequestBehavior.AllowGet); }
public ActionResult ExternalLoginCallback(string returnUrl) { GoogleOAuth2Client.RewriteRequest(); var result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl })); if (!result.IsSuccessful) { return RedirectToAction("ExternalLoginFailure"); } if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: true)) { //update oauth token using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var email = result.ExtraData["email"]; var user = uow.UserRepository.GetUserByEmailAddress(email); if (user != null) { user.CurrentOAuthAccessToken = result.ExtraData["accesstoken"]; user.OAuthAccessTokenExpiration = DateTime.Now.AddMinutes(55); user.LastLoginTime = DateTime.Now; uow.UserRepository.SaveChanges(); } else { // User is new, ask for their desired membership name var loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId); ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName; ViewBag.ReturnUrl = returnUrl; return View("ExternalLoginConfirmation", new RegisterExternalLoginModel { UserName = result.ExtraData["email"], ExternalLoginData = loginData, ExtraData = JsonConvert.SerializeObject(result.ExtraData) }); } } return RedirectToLocal(returnUrl); } if (User.Identity.IsAuthenticated) { // If the current user is logged in add the new account OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, User.Identity.Name); using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var user = uow.UserRepository.GetUserByUsername(User.Identity.Name); if (user != null) { user.EmailAddress = result.ExtraData["email"]; user.CurrentOAuthAccessToken = result.ExtraData["accesstoken"]; user.OAuthAccessTokenExpiration = DateTime.Now.AddMinutes(55); user.LastLoginTime = DateTime.Now; uow.UserRepository.SaveChanges(); } } return RedirectToLocal(returnUrl); } // ReSharper disable once RedundantIfElseBlock else { // User is new, ask for their desired membership name var loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId); ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName; ViewBag.ReturnUrl = returnUrl; return View("ExternalLoginConfirmation", new RegisterExternalLoginModel { UserName = result.ExtraData["email"], ExternalLoginData = loginData, ExtraData = JsonConvert.SerializeObject(result.ExtraData) }); } }
public ActionResult Register(RegisterModel model) { if (ModelState.IsValid) { // Attempt to register the user try { WebSecurity.CreateUserAndAccount(model.UserName, model.Password); WebSecurity.Login(model.UserName, model.Password); using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var gadgets = uow.GadgetRepository.GetDefaultGadgets(); var user = uow.UserRepository.GetUserByUsername(model.UserName); foreach (var gadget in gadgets) { gadget.User = user; uow.UserGadgetRepository.UserGadgets.Add(gadget); } uow.UserGadgetRepository.SaveChanges(); } return RedirectToAction("Index", "Home"); } catch (MembershipCreateUserException e) { ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); } } // If we got this far, something failed, redisplay form return View(model); }
public ActionResult Login(LoginModel model, string returnUrl) { if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)) { using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var user = uow.UserRepository.GetUserByUsername(model.UserName); if (user != null) { user.LastLoginTime = DateTime.Now; uow.UserRepository.SaveChanges(); } } return RedirectToLocal(returnUrl); } // If we got this far, something failed, redisplay form ModelState.AddModelError("", "The user name or password provided is incorrect."); return View(model); }
public ActionResult ExternalLoginConfirmation(RegisterExternalLoginModel model, string returnUrl) { string provider; string providerUserId; if (User.Identity.IsAuthenticated || !OAuthWebSecurity.TryDeserializeProviderUserId(model.ExternalLoginData, out provider, out providerUserId)) { return RedirectToAction("Manage"); } if (ModelState.IsValid) { // Insert a new user into the database using (var uow = new UnitOfWork(GlobalConfig.ConnectionString)) { var user = uow.UserRepository.GetUserByUsername(model.UserName); // Check if user already exists if (user == null) { var extraData = JsonConvert.DeserializeObject<Dictionary<string, string>>(model.ExtraData); // Insert name into the profile table uow.UserRepository.Users.Add(new User { UserName = model.UserName, EmailAddress = extraData["email"], CurrentOAuthAccessToken = extraData["accesstoken"], OAuthAccessTokenExpiration = DateTime.Now.AddMinutes(55), LastLoginTime = DateTime.Now, LayoutId = 0 }); uow.UserRepository.SaveChanges(); OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName); OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: true); var gadgets = uow.GadgetRepository.GetDefaultGadgets(); var nhUser = uow.UserRepository.GetUserByUsername(model.UserName); foreach (var gadget in gadgets) { gadget.User = nhUser; uow.UserGadgetRepository.UserGadgets.Add(gadget); } uow.UserGadgetRepository.SaveChanges(); return RedirectToLocal(returnUrl); } ModelState.AddModelError("UserName", "User name already exists. Please enter a different user name."); } } ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(provider).DisplayName; ViewBag.ReturnUrl = returnUrl; return View(model); }