Example #1
0
        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});
        }
Example #2
0
        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 });
        }
Example #3
0
 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);
 }
Example #4
0
        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();

            }
        }
Example #5
0
 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();
             }
         }
     }
 }
Example #6
0
        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});
        }
Example #7
0
        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);
        }
Example #8
0
 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();
             }
         }
     }
 }
Example #9
0
        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);
        }
Example #10
0
 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();
             }
         }
     }
 }
Example #11
0
        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();
                    }
                }
            }
        }
Example #12
0
        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);
        }
Example #13
0
        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)
                    });
            }
        }
Example #14
0
        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);
        }
Example #15
0
        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);
        }
Example #16
0
        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);
        }