public ActionResult EnableTwoFactorAuthentication()
        {
            Guid accountGuid             = Guid.Parse(this.CurrentUser.AccountName);
            OnionWalletEntities entities = new OnionWalletEntities();
            OnionUser           user     = entities.OnionUsers.FirstOrDefault(x => x.GUID == accountGuid);

            if (user == null)
            {
                TempData["ErrorMessage"] = "A general error occured. Please contact support at " + ConfigurationManager.AppSettings["SiteEmail"].ToString() + ".";
                return(RedirectToAction("Account", "Home"));
            }
            else if (user.TwoFactorGUID.HasValue)
            {
                TempData["ErrorMessage"] = "Two Factor Authentication already enabled!";
                return(RedirectToAction("Account", "Home"));
            }
            else
            {
                Guid secret = Guid.NewGuid();
                Session["secret"] = secret;

                TwoFactorAuthenticator tfa = new TwoFactorAuthenticator();
                var setupInfo = tfa.GenerateSetupCode(ConfigurationManager.AppSettings["SiteName"].ToString(), user.Email, secret.ToString(), 300, 300);

                ViewBag.KeyImage = setupInfo.QrCodeSetupImageUrl;
                ViewBag.KeyText  = setupInfo.ManualEntryKey;
            }

            return(View());
        }
示例#2
0
        private bool SignIn(OnionUser user)
        {
            new Thread(() =>
            {
                OnionWalletEntities threadEntities = new OnionWalletEntities();
                VisitorLog logEntry = new VisitorLog();

                if (user.DoLogIpAddresses)
                {
                    logEntry.IpAddress = Request.UserHostAddress;
                }

                logEntry.CreateDate  = DateTime.Now;
                logEntry.OnionUserID = user.OnionUserID;
                threadEntities.VisitorLogs.Add(logEntry);
                threadEntities.SaveChanges();
            }).Start();

            var identity = new ClaimsIdentity(new[] {
                new Claim(ClaimTypes.NameIdentifier, user.GUID.ToString()),
                new Claim("AccountName", user.GUID.ToString()),
                new Claim("Email", user.Email),
                new Claim("OnionAddress", user.OnionAddress)
            },
                                              "ApplicationCookie");

            var ctx         = Request.GetOwinContext();
            var authManager = ctx.Authentication;

            authManager.SignIn(identity);

            return(true);
        }
示例#3
0
        public static void Error(string message)
        {
            OnionWalletEntities entities = new OnionWalletEntities();

            Log log = new Log();

            log.CreateDate = DateTime.Now;
            log.Level      = 3;
            log.Type       = (int)LogTypeEnum.Error;

            entities.Logs.Add(log);
            entities.SaveChanges();
        }
        protected void Application_Error(object sender, EventArgs e)
        {
            Exception exception = Server.GetLastError();

            Server.ClearError();

            UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);

            try
            {
                OnionWalletEntities entities = new OnionWalletEntities();
                Log log = new Log();
                log.CreateDate = DateTime.Now;
                log.Level      = 3;
                log.Type       = 1;
                log.Message    = (exception != null) ? exception.Message : "Hmmm!?";
                log.Message    = log.Message + Environment.NewLine + Environment.NewLine +
                                 Context.Request.RequestContext.RouteData.Values["controller"].ToString() + "/" +
                                 Context.Request.RequestContext.RouteData.Values["action"].ToString();

                entities.Logs.Add(log);
            }
            catch (Exception ex)
            {
                //so what
            }
            finally
            {
                if (exception != null)
                {
                    if (((HttpException)exception).GetHttpCode() == 404)
                    {
                        Response.Redirect(url.Action("Error404", "Error"));
                    }
                    else if (((HttpException)exception).GetHttpCode() == 500)
                    {
                        Response.Redirect(url.Action("Error500", "Error"));
                    }
                    else
                    {
                        Response.Redirect(url.Action("Index", "Error"));
                    }
                }
                else
                {
                    Response.Redirect(url.Action("Index", "Error"));
                }
            }

            return;
        }
        public ActionResult StoreIP(string value)
        {
            Guid accountGuid             = Guid.Parse(this.CurrentUser.AccountName);
            OnionWalletEntities entities = new OnionWalletEntities();
            OnionUser           user     = entities.OnionUsers.FirstOrDefault(x => x.GUID == accountGuid);

            if (user == null)
            {
                TempData["ErrorMessage"] = "A general error occured. Please contact support at " + ConfigurationManager.AppSettings["SiteEmail"].ToString() + ".";
            }
            else
            {
                user.DoLogIpAddresses = (value == "on");
                entities.SaveChanges();
                TempData["SuccessMessage"] = "Log IP settings updated.";
            }

            return(RedirectToAction("Account", "Home"));
        }
        public ActionResult DisableTwoFactorAuthentication()
        {
            Guid accountGuid             = Guid.Parse(this.CurrentUser.AccountName);
            OnionWalletEntities entities = new OnionWalletEntities();
            OnionUser           user     = entities.OnionUsers.FirstOrDefault(x => x.GUID == accountGuid);

            if (user == null)
            {
                TempData["ErrorMessage"] = "A general error occured. Please contact support at " + ConfigurationManager.AppSettings["SiteEmail"].ToString() + ".";
            }
            else
            {
                user.TwoFactorGUID = null;
                entities.SaveChanges();
                TempData["SuccessMessage"] = "Two Factor Authentication is disabled.";
            }

            return(RedirectToAction("Account", "Home"));
        }
示例#7
0
        public ActionResult Login(IndexModel data)
        {
            if (!ModelState.IsValid)
            {
                return(View());
            }

            OnionWalletEntities entities = new OnionWalletEntities();

            OnionUser user = entities.OnionUsers.FirstOrDefault(x => x.Email == data.LoginEmail);

            if (user != null && user.CheckPassword(data.LoginPassword))
            {
                if (!user.IsEmailConfirmed)
                {
                    TempData["ErrorMessage"] = "Please confirm email before login.";
                    TempData["LoginEmail"]   = data.LoginEmail;
                    return(RedirectToAction("Index"));
                }

                if (user.TwoFactorGUID.HasValue)
                {
                    TwoFactorAuthenticator tfa = new TwoFactorAuthenticator();
                    if (string.IsNullOrEmpty(data.TwoFactorAuthentication) || !tfa.ValidateTwoFactorPIN(user.TwoFactorGUID.ToString(), data.TwoFactorAuthentication.Replace(" ", "")))
                    {
                        TempData["ErrorMessage"] = "2FA Code not correct.";
                        TempData["LoginEmail"]   = data.LoginEmail;
                        return(RedirectToAction("Index"));
                    }
                }

                if (SignIn(user))
                {
                    return(Redirect(GetRedirectUrl(data.ReturnUrl)));
                }
            }

            // Authentication failed, shouldn't get here.
            TempData["ErrorMessage"] = "Invalid email or password";
            TempData["LoginEmail"]   = data.LoginEmail;
            return(RedirectToAction("Index"));
        }
示例#8
0
        public ActionResult MailConfirmation(Guid?guid)
        {
            if (guid.HasValue)
            {
                OnionWalletEntities entities  = new OnionWalletEntities();
                OnionUser           onionUser = entities.OnionUsers.FirstOrDefault(x => x.EmailConfirmationGUID == guid.Value);

                if (onionUser != null)
                {
                    onionUser.IsEmailConfirmed = true;
                    entities.SaveChanges();
                    TempData["SuccessMessage"] = "Email confirmed, enjoy the party!";
                }
                else
                {
                    TempData["ErrorMessage"] = "Account not found!";
                }
            }

            return(RedirectToAction("Index"));
        }
示例#9
0
        public bool Load(Guid accountName)
        {
            OnionWalletEntities entities = new OnionWalletEntities();
            OnionUser           user     = entities.OnionUsers.FirstOrDefault(x => x.GUID == accountName);

            if (user != null)
            {
                this.PasswordRecovery = user.RecoveryGUID;
                this.Email            = user.Email;
                this.DoLogIpAddresses = user.DoLogIpAddresses;
                this.SignupDate       = user.CreateDate;
                this.TwoFactorGUID    = user.TwoFactorGUID;
                this.LastLogins       = entities.VisitorLogs.Where(x => x.OnionUserID == user.OnionUserID).OrderByDescending(x => x.CreateDate).Take(20).ToDictionary(x => x.CreateDate, y => y.IpAddress);

                return(true);
            }
            else
            {
                return(false);
            }
        }
        public ActionResult EnableTwoFactorAuthentication(string code)
        {
            Guid secret = Guid.Empty;

            if (Session["secret"] != null)
            {
                if (Guid.TryParse(Session["secret"].ToString(), out secret))
                {
                    Guid accountGuid             = Guid.Parse(this.CurrentUser.AccountName);
                    OnionWalletEntities entities = new OnionWalletEntities();
                    OnionUser           user     = entities.OnionUsers.FirstOrDefault(x => x.GUID == accountGuid);

                    if (user == null || string.IsNullOrEmpty(code))
                    {
                        TempData["ErrorMessage"] = "A general error occured. Please contact support at " + ConfigurationManager.AppSettings["SiteEmail"].ToString() + ".";
                    }
                    else
                    {
                        TwoFactorAuthenticator tfa = new TwoFactorAuthenticator();
                        if (tfa.ValidateTwoFactorPIN(secret.ToString(), code.Replace(" ", "")))
                        {
                            user.TwoFactorGUID = secret;
                            entities.SaveChanges();
                            TempData["SuccessMessage"] = "Two Factor Authentication enabled.";
                        }
                        else
                        {
                            TempData["ErrorMessage"] = "Wrong code. Authentication failed.";
                        }
                    }
                }
            }
            else
            {
                TempData["ErrorMessage"] = "A general error occured. Please contact support at " + ConfigurationManager.AppSettings["SiteEmail"].ToString() + ".";
            }

            return(RedirectToAction("Account", "Home"));
        }
        public ActionResult ChangePassword(string currentpassword, string newpassword, string retypedpassword)
        {
            if (string.IsNullOrEmpty(currentpassword) || string.IsNullOrEmpty(currentpassword) || string.IsNullOrEmpty(currentpassword))
            {
                TempData["ErrorMessage"] = "All password fields must be filled to change the password.";
            }
            else
            {
                Guid accountGuid             = Guid.Parse(this.CurrentUser.AccountName);
                OnionWalletEntities entities = new OnionWalletEntities();
                OnionUser           user     = entities.OnionUsers.FirstOrDefault(x => x.GUID == accountGuid);

                if (user == null)
                {
                    TempData["ErrorMessage"] = "A general error occured. Please contact support at " + ConfigurationManager.AppSettings["SiteEmail"].ToString() + ".";
                }
                else
                {
                    if (!user.CheckPassword(currentpassword))
                    {
                        TempData["ErrorMessage"] = "Current password does not match.";
                    }
                    else if (newpassword != retypedpassword)
                    {
                        TempData["ErrorMessage"] = "New passwords are not the same.";
                    }
                    else
                    {
                        user.SetPassword(newpassword);
                        entities.SaveChanges();
                        TempData["SuccessMessage"] = "Password updated.";
                    }
                }
            }

            return(RedirectToAction("Account", "Home"));
        }
示例#12
0
        public ActionResult Register(IndexModel data)
        {
            if (!ModelState.IsValid)
            {
                return(View(data));
            }

            if (data.RegisterPassword != data.RegisterRepeatPassword)
            {
                TempData["ErrorMessage"]  = "Passwords do not match.";
                TempData["RegisterEmail"] = data.RegisterEmail;
                return(RedirectToAction("Index"));
            }

            if (!data.RegisterAcceptTOS)
            {
                TempData["ErrorMessage"]  = "Please accept terms of service.";
                TempData["RegisterEmail"] = data.RegisterEmail;
                return(RedirectToAction("Index"));
            }

            OnionWalletEntities entities = new OnionWalletEntities();

            OnionUser existing = entities.OnionUsers.FirstOrDefault(x => x.Email == data.RegisterEmail.ToLower());

            if (existing != null)
            {
                TempData["ErrorMessage"]  = "Email already exists!";
                TempData["RegisterEmail"] = data.RegisterEmail;
                return(RedirectToAction("Index"));
            }

            OnionUser user = new OnionUser();

            user.InitGUIDs();

            user.Email = data.RegisterEmail;
            user.SetPassword(data.RegisterPassword);
            user.IsMailing    = data.RegisterIsMailing;
            user.OnionAddress = "gugus";
            user.IsActive     = true;
            user.CreateDate   = DateTime.Now;

            entities.OnionUsers.Add(user);
            entities.SaveChanges();

            string subject = "OnionWallet Email confirmation";
            string body    = "Hi" + Environment.NewLine + Environment.NewLine + "You have successfully created your Web OnionWallet on onionwallet.ch!" + Environment.NewLine + Environment.NewLine;

            body = body + "Please click the link below to activate your wallet:" + Environment.NewLine + Environment.NewLine;
            body = body + ConfigurationManager.AppSettings["BaseURL"].ToString() + "/mailconfirmation/" + user.EmailConfirmationGUID.ToString() + Environment.NewLine + Environment.NewLine;
            body = body + "Thanks and enjoy the Onion Party!";

            new Thread(() =>
            {
                OnionWalletEntities threadEntities = new OnionWalletEntities();

                try
                {
                    OnionUser threadUser = threadEntities.OnionUsers.FirstOrDefault(x => x.GUID == user.GUID);

                    OnionHandler onionHandler = new OnionHandler();
                    threadUser.OnionAddress   = onionHandler.CreateAccount(user.GUID.ToString());
                    threadEntities.SaveChanges();
                }
                catch (Exception ex)
                {
                    Log log        = new Log();
                    log.CreateDate = DateTime.Now;
                    log.Level      = 1;
                    log.Message    = ex.Message;
                    log.Type       = (int)LogTypeEnum.Error;
                    log.UserID     = 0;
                    threadEntities.Logs.Add(log);
                    threadEntities.SaveChanges();
                }
            }).Start();

            new Thread(() =>
            {
                try
                {
                    GmailHandler.SendMail(user.Email, subject, body);
                }
                catch (Exception ex)
                {
                    OnionWalletEntities threadEntities = new OnionWalletEntities();
                    Log log        = new Log();
                    log.CreateDate = DateTime.Now;
                    log.Level      = 1;
                    log.Message    = ex.Message;
                    log.Type       = (int)LogTypeEnum.Error;
                    log.UserID     = 0;
                    threadEntities.Logs.Add(log);
                    threadEntities.SaveChanges();
                }
            }).Start();

            TempData["SuccessMessage"] = "Party ticket booked! Please click link in confirmation email and log in to access your wallet. Check your spam folder, if you can't find the email.";

            return(RedirectToAction("Index"));
        }