private char[] GetRandomPass(PasswordViewModel viewModel) { char[] pass = new char[viewModel.Length]; var valid = new StringBuilder(); var startIndex = 0; // Satisfy all conditions on password if (viewModel.LowerChars) { SatisfyCondition(_lowerChar, ref valid, ref startIndex, ref pass); } if (viewModel.UpperChars) { SatisfyCondition(_upperChar, ref valid, ref startIndex, ref pass); } if (viewModel.Digits) { SatisfyCondition(_digit, ref valid, ref startIndex, ref pass); } if (viewModel.Symbols) { SatisfyCondition(_nonAlphaNum, ref valid, ref startIndex, ref pass); } // Construct the rest of the password with random valid characters for (int i = startIndex; i < viewModel.Length; i++) { pass[i] = valid[GetNextInt(valid.Length)]; } // Shuffle return(pass.OrderBy(x => GetNextInt(Int32.MaxValue)).ToArray()); }
public async Task <JsonResult> Post([FromBody] PasswordViewModel viewModel) { Logger.Fatal(this.Request.Log()); if (ModelState.IsValid) { var plain = new string(GetRandomPass(viewModel)); var encrypted = plain.Encrypt(_configuration.GetConnectionString("Enc")); var password = new Password() { PasswordText = encrypted, DateCreated = DateTime.Now, Hint = viewModel.Hint }; var user = await _userManager.GetUser(User.Identity.Name); if (user == null) { return(new JsonResult(new { Success = true, Password = plain, DateCreated = password.DateCreated })); } await SavePassword(password, user); return(new JsonResult(new { Success = true, Id = password.Id, Password = plain, Hint = password.Hint, UserId = password.UserId, DateCreated = password.DateCreated })); } else { var allErrors = ModelState.ValidationErrors(); var ret = new JsonResult(new { Success = false, Verbose = allErrors }); ret.StatusCode = 400; return(ret); } }