/// <summary>
 /// GetUserPasswordSalt Uses the UserAccount.Id to map to the Salt.Is on the DB
 ///
 /// </summary>
 /// <param name="userFromDataBase"></param>
 /// <returns>
 ///
 /// string with the value of the salt associated with the user to the Manager
 ///
 /// </returns>
 public ResponseDto <PasswordSalt> GetUserPasswordSalt(int?id)
 {
     try
     {
         var salt = (from salts in authenticationContext.PasswordSalts
                     where salts.Id == id
                     select salts.Salt).FirstOrDefault();
         var passwordSalt = new PasswordSalt
         {
             Salt = salt
         };
         return(new ResponseDto <PasswordSalt>
         {
             Data = passwordSalt
         });
     }
     catch (Exception)
     {
         return(new ResponseDto <PasswordSalt>()
         {
             Data = null,
             Error = GeneralErrorMessages.GENERAL_ERROR
         });
     }
 }
Esempio n. 2
0
        /// <summary>
        /// The CreateFirstTimeSsoUser method.
        /// Creates a first time user registered from the SSO.
        /// <para>
        /// @author: Jennifer Nguyen
        /// @updated: 04/09/2018
        /// </para>
        /// </summary>
        /// <param name="userAccountDto"></param>
        /// <returns></returns>
        public ResponseDto <bool> CreateFirstTimeSsoUser(UserAccountDto userAccountDto)
        {
            var createFirstTimeSsoUserPreLogicStrategy = new CreateFirstTimeSsoUserPreLogicValidationStrategy(userAccountDto);
            var saltGenerator = new SaltGenerator();
            var payloadHasher = new PayloadHasher();

            // Validate data transfer object
            var result = createFirstTimeSsoUserPreLogicStrategy.ExecuteStrategy();

            if (result.Error != null)
            {
                return(new ResponseDto <bool>
                {
                    Data = false,
                    Error = result.Error
                });
            }

            // Hash password
            var passwordSalt = new PasswordSalt(saltGenerator.GenerateSalt(128));
            var userAccount  = new UserAccount(username: userAccountDto.Username, password: userAccountDto.Password, isActive: true, isFirstTimeUser: true, roleType: userAccountDto.RoleType);

            userAccount.Password = payloadHasher.Sha256HashWithSalt(passwordSalt.Salt, userAccount.Password);

            // Validate domain models
            var createFirstTimeSsoUserPostLogicStrategy = new CreateFirstTimeSsoUserPostLogicValidationStrategy(userAccount, passwordSalt);

            result = createFirstTimeSsoUserPostLogicStrategy.ExecuteStrategy();
            if (result.Error != null)
            {
                return(new ResponseDto <bool>
                {
                    Data = false,
                    Error = result.Error
                });
            }

            // Store a user from Single Sign On registration request
            using (var userGateway = new UserGateway())
            {
                var gatewayResult = userGateway.StoreSsoUser(userAccount, passwordSalt);
                if (gatewayResult.Data == false)
                {
                    return(new ResponseDto <bool>()
                    {
                        Data = gatewayResult.Data,
                        Error = GeneralErrorMessages.GENERAL_ERROR
                    });
                }
            }

            return(new ResponseDto <bool>()
            {
                Data = true
            });
        }
Esempio n. 3
0
 public override int GetHashCode()
 {
     unchecked {
         int hashCode = typeof(User).GetHashCode();
         hashCode ^= 7 * hashCode + 11 * Name.GetHashCode();
         hashCode ^= 7 * hashCode + 11 * PasswordSalt.GetHashCode();
         hashCode ^= 7 * hashCode + 11 * PasswordHash.GetHashCode();
         return(hashCode);
     }
 }
Esempio n. 4
0
 /// <summary>
 /// Constructor for CreateIndividualPostLogicValidationStrategy
 /// <para>
 /// @author: Jennifer Nguyen
 /// @updated: 03/13/2018
 /// </para>
 /// </summary>
 /// <param name="userAccount"></param>
 /// <param name="securityQuestions"></param>
 /// <param name="securityAnswerSalts"></param>
 /// <param name="passwordSalt"></param>
 /// <param name="userClaims"></param>
 /// <param name="userProfile"></param>
 public CreateFirstTimeIndividualPostLogicValidationStrategy(UserAccount userAccount, PasswordSalt passwordSalt, UserClaims userClaims, UserProfile userProfile, IList <SecurityQuestion> securityQuestions, IList <SecurityAnswerSalt> securityAnswerSalts)
 {
     _userAccount                 = userAccount;
     _securityQuestions           = securityQuestions;
     _securityAnswerSalts         = securityAnswerSalts;
     _passwordSalt                = passwordSalt;
     _userClaims                  = userClaims;
     _userProfile                 = userProfile;
     _securityQuestionValidator   = new SecurityQuestionValidator();
     _securityAnswerSaltValidator = new SecurityAnswerSaltValidator();
     _userValidator               = new UserValidator();
 }
Esempio n. 5
0
 public override int GetHashCode()
 {
     unchecked
     {
         int hash = 17;
         hash = hash * 23 + (BusinessEntityId == default(int) ? 0 : BusinessEntityId.GetHashCode());
         hash = hash * 23 + (ModifiedDate == default(DateTime) ? 0 : ModifiedDate.GetHashCode());
         hash = hash * 23 + (PasswordHash == null ? 0 : PasswordHash.GetHashCode());
         hash = hash * 23 + (PasswordSalt == null ? 0 : PasswordSalt.GetHashCode());
         hash = hash * 23 + (Rowguid == default(Guid) ? 0 : Rowguid.GetHashCode());
         return(hash);
     }
 }
Esempio n. 6
0
        public void Should_PassValidation_When_GivenValidUserAccountAndPasswordSalt()
        {
            // Arrange
            var userAccount  = new UserAccount(username: "******", password: "******", isActive: false, isFirstTimeUser: true, roleType: "public");
            var passwordSalt = new PasswordSalt(salt: "@$!@#a2131asda@#!");
            var createFirstTimeSsoUserPostLogicValidationStrategy = new CreateFirstTimeSsoUserPostLogicValidationStrategy(userAccount, passwordSalt);

            // Act
            var result = createFirstTimeSsoUserPostLogicValidationStrategy.ExecuteStrategy();

            // Assert
            result.Data.Should().BeTrue();
            result.Error.Should().BeNull();
        }
Esempio n. 7
0
        public void Should_FailValidation_When_GivenEmptyUsername()
        {
            // Arrange
            var userAccount  = new UserAccount(username: "", password: "******", isActive: false, isFirstTimeUser: false, roleType: "public");
            var passwordSalt = new PasswordSalt(salt: "@$!@#a2131asda@#!");
            var createFirstTimeSsoUserPostLogicValidationStrategy = new CreateFirstTimeSsoUserPostLogicValidationStrategy(userAccount, passwordSalt);

            // Act
            var result = createFirstTimeSsoUserPostLogicValidationStrategy.ExecuteStrategy();

            // Assert
            result.Data.Should().BeFalse();
            result.Error.Should().Be("Something went wrong. Please try again later.");
        }
Esempio n. 8
0
 public User ToModel()
 {
     return(new User()
     {
         Id = Id,
         FirstName = FirstName,
         LastName = LastName,
         Username = Username,
         Password = Password,
         PasswordHash = PasswordHash.ToArray(),
         PasswordSalt = PasswordSalt.ToArray(),
         Role = Role.ToModel(),
         Enabled = Enabled,
     });
 }
Esempio n. 9
0
        public void Should_PassValidation_When_AllRulesPass()
        {
            // Arrange
            var passwordSaltValidator = new PasswordSaltValidator();
            var passwordSalt          = new PasswordSalt()
            {
                Salt = "!Q2w#E4r"
            };

            // Act
            var result  = passwordSaltValidator.Validate(passwordSalt);
            var isValid = result.IsValid;

            // Assert
            isValid.Should().Be(true);
        }
Esempio n. 10
0
        private string GetHashedPassword(string password)
        {
            string hashedPassword;

            using (var sha = SHA256.Create())
            {
                var computedHash = sha.ComputeHash(
                    PasswordSalt
                    .ToByteArray()
                    .Concat(Encoding.Unicode.GetBytes(PasswordSalt + password + _constantSalt)).ToArray());

                hashedPassword = Convert.ToBase64String(computedHash);
            }

            return(hashedPassword);
        }
Esempio n. 11
0
        public void Should_FailValidation_When_SaltIsNull()
        {
            // Arrange
            var passwordSaltValidator = new PasswordSaltValidator();
            var passwordSalt          = new PasswordSalt()
            {
                Salt = null
            };


            // Act
            var result  = passwordSaltValidator.Validate(passwordSalt);
            var isValid = result.IsValid;

            // Assert
            isValid.Should().Be(false);
        }
Esempio n. 12
0
        /// <summary>
        /// The UpdatePassword method.
        /// Update database models associated with updating a user's password.
        /// <para>
        /// @author: Jennifer Nguyen
        /// @updated: 04/22/2018
        /// </para>
        /// </summary>
        /// <param name="userAccount"></param>
        /// <param name="passwordSalt"></param>
        /// <returns>ResponseDto with true or false boolean</returns>
        public ResponseDto <bool> UpdatePassword(UserAccount userAccount, PasswordSalt passwordSalt)
        {
            using (var dbContextTransaction = context.Database.BeginTransaction())
            {
                try
                {
                    // Get Id from username
                    userAccount.Id = (from account in context.UserAccounts
                                      where account.Username == userAccount.Username
                                      select account.Id).FirstOrDefault();
                    context.SaveChanges();

                    // Set UserId to dependencies
                    passwordSalt.Id = userAccount.Id;
                    context.SaveChanges();

                    // Update UserAccount
                    context.UserAccounts.AddOrUpdate(userAccount);

                    // Update PasswordSalt
                    context.PasswordSalts.AddOrUpdate(passwordSalt);
                    context.SaveChanges();

                    // Commit transaction to database
                    dbContextTransaction.Commit();

                    // Return a true ResponseDto
                    return(new ResponseDto <bool>()
                    {
                        Data = true
                    });
                }
                catch (Exception)
                {
                    // Rolls back the changes saved in the transaction
                    dbContextTransaction.Rollback();
                    // Returns a false ResponseDto
                    return(new ResponseDto <bool>()
                    {
                        Data = false,
                        Error = GeneralErrorMessages.GENERAL_ERROR
                    });
                }
            }
        }
Esempio n. 13
0
        public bool CheckPassword(LoginRequestDto request)
        {
            using (var connection = new SqlConnection(connectionString))
                using (var command = new SqlCommand())
                {
                    command.Connection = connection;
                    connection.Open();

                    command.CommandText = "SELECT Password,Salt FROM Student WHERE IndexNumber=@number";
                    command.Parameters.AddWithValue("number", request.Login);

                    using var read = command.ExecuteReader();

                    if (read.Read())
                    {
                        return(PasswordSalt.Validate(request.Haslo, read["Salt"].ToString(), read["Password"].ToString()));
                    }
                    return(false);
                }
        }
Esempio n. 14
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="dto"></param>
        /// <param name="userAccount"></param>
        /// <param name="passwordSalt"></param>
        /// <param name="userProfile"></param>
        /// <param name="securityQuestions"></param>
        /// <param name="securityAnswerSalts"></param>
        /// <returns></returns>
        private ResponseDto <bool> MapUserDtoToModel(RegisterUserDto dto, out UserAccount userAccount, out PasswordSalt passwordSalt, out UserProfile userProfile, out IList <SecurityQuestion> securityQuestions, out IList <SecurityAnswerSalt> securityAnswerSalts)
        {
            // Map variables to the parameters
            userAccount = new UserAccount(
                username: dto.UserAccountDto.Username,
                password: dto.UserAccountDto.Password,
                isActive: true,
                isFirstTimeUser: false,
                roleType: RoleTypes.PUBLIC);

            securityQuestions = dto.SecurityQuestionDtos
                                .Select(securityQuestionDto => new SecurityQuestion(
                                            securityQuestionDto.Question, securityQuestionDto.Answer))
                                .ToList();

            userProfile = new UserProfile(
                displayPicture: ConfigurationManager.AppSettings["DefaultURLProfileImagePath"],
                displayName: dto.UserProfileDto.DisplayName);

            // Hash password and security questions
            var saltGenerator = new SaltGenerator();
            var payloadHasher = new PayloadHasher();

            passwordSalt         = new PasswordSalt(saltGenerator.GenerateSalt(128));
            userAccount.Password = payloadHasher.Sha256HashWithSalt(passwordSalt.Salt, userAccount.Password);

            securityAnswerSalts = new List <SecurityAnswerSalt>();

            for (var i = 0; i < securityQuestions.Count; i++)
            {
                securityAnswerSalts.Add(new SecurityAnswerSalt {
                    Salt = saltGenerator.GenerateSalt(128)
                });
                securityQuestions[i].Answer = payloadHasher.Sha256HashWithSalt(securityAnswerSalts[i].Salt, securityQuestions[i].Answer);
            }

            return(new ResponseDto <bool>()
            {
                Data = true
            });
        }
Esempio n. 15
0
        public void Should_StoreUser_When_ValidModelsArePassedIn()
        {
            // Arrange
            var userAccount = new UserAccount()
            {
                Username        = "******",
                Password        = "******",
                IsActive        = true,
                IsFirstTimeUser = false
            };
            var passwordSalt = new PasswordSalt()
            {
                Salt = "!@#$%^&*()"
            };
            var claims = new UserClaims()
            {
                Claims = new Collection <Claim>()
                {
                    new Claim("ReadIndividualProfile", "True"),
                    new Claim("UpdateIndividualProfile", "True"),
                    new Claim("ReadPreferences", "True"),
                    new Claim("UpdatePreferences", "True"),
                    new Claim("ReadBillSplitter", "True"),
                    new Claim("ReadMenu", "True"),
                    new Claim("ReadDictionary", "True"),
                    new Claim("UpdateDictionary", "True")
                }
            };
            var securityQuestions = new List <SecurityQuestion>()
            {
                new SecurityQuestion()
                {
                    Question = 1,
                    Answer   = "answer1",
                },
                new SecurityQuestion()
                {
                    Question = 2,
                    Answer   = "answer2",
                },
                new SecurityQuestion()
                {
                    Question = 3,
                    Answer   = "answer3",
                }
            };
            var securityAnswerSalts = new List <SecurityAnswerSalt>()
            {
                new SecurityAnswerSalt()
                {
                    Salt = "!Q2w#E4r"
                },
                new SecurityAnswerSalt()
                {
                    Salt = "%T6y&U8i"
                },
                new SecurityAnswerSalt()
                {
                    Salt = "&U8i(O0p"
                }
            };
            var userProfile = new UserProfile()
            {
                DisplayPicture = "www.img.com",
                DisplayName    = "displayName"
            };
            var userGateway = new UserGateway();

            // Act
            Action act = () => userGateway.StoreIndividualUser(userAccount, passwordSalt, claims, userProfile, securityQuestions, securityAnswerSalts);

            // Assert
            act.Should().NotThrow();
        }
Esempio n. 16
0
 public CreateFirstTimeSsoUserPostLogicValidationStrategy(UserAccount userAccount, PasswordSalt passwordSalt)
 {
     _userAccount  = userAccount;
     _passwordSalt = passwordSalt;
 }
 public ResetPasswordPostLogicValidationStrategy(UserAccount userAccount, PasswordSalt passwordSalt)
 {
     _userAccount  = userAccount;
     _passwordSalt = passwordSalt;
 }
Esempio n. 18
0
 public BusinessUserController(PasswordSalt PassSalt)
 {
     _salt = PassSalt.Salt;      // Set Salt
 }
Esempio n. 19
0
        public ResponseDto <ResetPasswordDto> SsoUpdatePassword()
        {
            var resetPasswordPreLogicValidationStrategy = new ResetPasswordPreLogicValidationStrategy(_resetPasswordDto,
                                                                                                      ResetPasswordValidationTypes.UpdatePasswordValidation);
            var         saltGenerator = new SaltGenerator();
            var         payloadHasher = new PayloadHasher();
            UserAccount userAccount;

            // Validate data transfer object
            var result = resetPasswordPreLogicValidationStrategy.ExecuteStrategy();

            if (result.Error != null)
            {
                return(new ResponseDto <ResetPasswordDto>
                {
                    Data = null,
                    Error = result.Error
                });
            }

            // Get the existing UserAccount model associated with the username
            using (var userGateway = new UserGateway())
            {
                var gatewayResult = userGateway.GetUserByUsername(_resetPasswordDto.Username);
                if (gatewayResult.Error != null)
                {
                    return(new ResponseDto <ResetPasswordDto>()
                    {
                        Data = null,
                        Error = GeneralErrorMessages.GENERAL_ERROR
                    });
                }

                userAccount = gatewayResult.Data;
            }

            // Set the new password to the UserAccount model
            userAccount.Password = _resetPasswordDto.Password;

            // Hash password
            var passwordSalt = new PasswordSalt(saltGenerator.GenerateSalt(128));

            userAccount.Password = payloadHasher.Sha256HashWithSalt(passwordSalt.Salt, userAccount.Password);

            // Update the password in the database
            using (var userGateway = new UserGateway())
            {
                var gatewayResult = userGateway.UpdatePassword(userAccount, passwordSalt);
                if (gatewayResult.Error != null)
                {
                    return(new ResponseDto <ResetPasswordDto>()
                    {
                        Data = null,
                        Error = GeneralErrorMessages.GENERAL_ERROR
                    });
                }
            }

            return(new ResponseDto <ResetPasswordDto>()
            {
                Data = _resetPasswordDto
            });
        }
Esempio n. 20
0
 public User NewUser(Name name, Email email, Password password, PasswordSalt passwordSalt)
 {
     return(new(UserId.NewUserId(), name, email, password, passwordSalt));
 }
Esempio n. 21
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="dto"></param>
        /// <param name="userAccount"></param>
        /// <param name="passwordSalt"></param>
        /// <param name="userClaims"></param>
        /// <param name="userProfile"></param>
        /// <param name="securityQuestions"></param>
        /// <param name="securityAnswerSalts"></param>
        /// <returns></returns>
        private ResponseDto <bool> MapIndividualDtoToModel(RegisterUserDto dto, out UserAccount userAccount, out PasswordSalt passwordSalt, out UserClaims userClaims, out UserProfile userProfile, out IList <SecurityQuestion> securityQuestions, out IList <SecurityAnswerSalt> securityAnswerSalts)
        {
            var mappingResult = MapUserDtoToModel(dto, out userAccount, out passwordSalt, out userProfile, out securityQuestions, out securityAnswerSalts);

            // If mapping failed, return early.
            if (!mappingResult.Data)
            {
                userClaims = null;
                return(mappingResult);
            }

            // Set user claims to be stored in UserClaims table
            var claimsFactory = new ClaimsFactory();

            userClaims = new UserClaims(claimsFactory.Create(AccountTypes.Individual));

            return(new ResponseDto <bool>()
            {
                Data = true
            });
        }
Esempio n. 22
0
        /// <summary>
        /// The StoreIndividualUser method.
        /// Contains logic for saving an individual user into the database.
        /// <para>
        /// @author: Jennifer Nguyen
        /// @updated: 03/13/2018
        /// </para>
        /// </summary>
        /// <param name="userAccount"></param>
        /// <param name="passwordSalt"></param>
        /// <param name="securityQuestions"></param>
        /// <param name="securityAnswerSalts"></param>
        /// <param name="claims"></param>
        /// <param name="userProfile"></param>
        /// <returns>ResponseDto with bool data</returns>
        public ResponseDto <bool> StoreIndividualUser(UserAccount userAccount, PasswordSalt passwordSalt, UserClaims userClaims, UserProfile userProfile, IList <SecurityQuestion> securityQuestions, IList <SecurityAnswerSalt> securityAnswerSalts)
        {
            using (var dbContextTransaction = context.Database.BeginTransaction())
            {
                try
                {
                    // Add UserAccount
                    context.UserAccounts.AddOrUpdate(userAccount);
                    context.SaveChanges();

                    // Get Id from UserAccount
                    var userId = (from account in context.UserAccounts
                                  where account.Username == userAccount.Username
                                  select account.Id).SingleOrDefault();

                    // Set UserId to dependencies
                    passwordSalt.Id = userId;
                    userClaims.Id   = userId;
                    userProfile.Id  = userId;

                    // Add SecurityQuestions
                    foreach (var securityQuestion in securityQuestions)
                    {
                        securityQuestion.UserId = userId;
                        context.SecurityQuestions.Add(securityQuestion);
                        context.SaveChanges();
                    }

                    // Get SecurityQuestions in database
                    var updatedSecurityQuestions = (from question in context.SecurityQuestions
                                                    where question.UserId == userId
                                                    select question).ToList();

                    // Add SecurityAnswerSalts
                    for (var i = 0; i < securityQuestions.Count; i++)
                    {
                        // Get SecurityQuestionId for each securityAnswerSalt
                        var securityQuestionId = (from query in updatedSecurityQuestions
                                                  where query.Question == securityQuestions[i].Question
                                                  select query.Id).SingleOrDefault();

                        // Set SecurityQuestionId for SecurityAnswerSalt
                        securityAnswerSalts[i].Id = securityQuestionId;
                        // Add SecurityAnswerSalt
                        context.SecurityAnswerSalts.Add(securityAnswerSalts[i]);
                        context.SaveChanges();
                    }
                    // Add PasswordSalt
                    context.PasswordSalts.AddOrUpdate(passwordSalt);

                    // Add UserClaims
                    context.UserClaims.Add(userClaims);

                    // Add UserProfile
                    context.UserProfiles.Add(userProfile);
                    context.SaveChanges();

                    // Commit transaction to database
                    dbContextTransaction.Commit();

                    // Return a true ResponseDto
                    return(new ResponseDto <bool>()
                    {
                        Data = true
                    });
                }
                catch (Exception)
                {
                    // Rolls back the changes saved in the transaction
                    dbContextTransaction.Rollback();
                    // Returns a false ResponseDto
                    return(new ResponseDto <bool>()
                    {
                        Data = false,
                        Error = GeneralErrorMessages.GENERAL_ERROR
                    });
                }
            }
        }
Esempio n. 23
0
        /// <summary>
        /// The StoreRestaurantUser method.
        /// Contains logic to store a restaurant user to the database.
        /// <para>
        /// @author: Jennifer Nguyen
        /// @updated: 03/13/2018
        /// </para>
        /// </summary>
        /// <param name="userAccount"></param>
        /// <param name="passwordSalt"></param>
        /// <param name="securityQuestions"></param>
        /// <param name="securityAnswerSalts"></param>
        /// <param name="claims"></param>
        /// <param name="userProfile"></param>
        /// <param name="restaurantProfile"></param>
        /// <param name="businessHours"></param>
        /// <param name="foodPreferences"></param>
        /// <returns>ResponseDto with bool data</returns>
        public ResponseDto <bool> StoreRestaurantUser(UserAccount userAccount, PasswordSalt passwordSalt, UserClaims userClaims, UserProfile userProfile, RestaurantProfile restaurantProfile, IList <SecurityQuestion> securityQuestions, IList <SecurityAnswerSalt> securityAnswerSalts, IList <FoodPreference> foodPreferences, IList <BusinessHour> businessHours)
        {
            using (var dbContextTransaction = context.Database.BeginTransaction())
            {
                try
                {
                    // Add UserAccount
                    context.UserAccounts.AddOrUpdate(userAccount);
                    context.SaveChanges();

                    // Get Id from UserAccount
                    var userId = (from account in context.UserAccounts
                                  where account.Username == userAccount.Username
                                  select account.Id).SingleOrDefault();

                    // Set UserId to dependencies
                    passwordSalt.Id      = userId;
                    userClaims.Id        = userId;
                    userProfile.Id       = userId;
                    restaurantProfile.Id = userId;

                    // Add FoodPreferences
                    foreach (var foodPreference in foodPreferences)
                    {
                        foodPreference.UserId = userId;
                        context.FoodPreferences.Add(foodPreference);
                        context.SaveChanges();
                    }

                    // Add SecurityQuestions
                    foreach (var securityQuestion in securityQuestions)
                    {
                        securityQuestion.UserId = userId;
                        context.SecurityQuestions.Add(securityQuestion);
                        context.SaveChanges();
                    }

                    // Get SecurityQuestions in database
                    var queryable = (from question in context.SecurityQuestions
                                     where question.UserId == userId
                                     select question).ToList();

                    // Add SecurityAnswerSalts
                    for (var i = 0; i < securityQuestions.Count; i++)
                    {
                        // Get SecurityQuestionId for each securityAnswerSalt
                        var securityQuestionId = (from query in queryable
                                                  where query.Question == securityQuestions[i].Question
                                                  select query.Id).SingleOrDefault();

                        // Set SecurityQuestionId for SecurityAnswerSalt
                        securityAnswerSalts[i].Id = securityQuestionId;
                        // Add SecurityAnswerSalt
                        context.SecurityAnswerSalts.Add(securityAnswerSalts[i]);
                        context.SaveChanges();
                    }

                    // Add PasswordSalt
                    context.PasswordSalts.AddOrUpdate(passwordSalt);

                    // Add UserClaims
                    context.UserClaims.Add(userClaims);

                    // Add UserProfile
                    context.UserProfiles.Add(userProfile);

                    // Add RestaurantProfile
                    context.RestaurantProfiles.Add(restaurantProfile);
                    context.SaveChanges();

                    // Add BusinessHours
                    foreach (var businessHour in businessHours)
                    {
                        businessHour.RestaurantId = userId;
                        context.BusinessHours.Add(businessHour);
                        context.SaveChanges();
                    }

                    // Add First Menu
                    // Find the corresponding profile
                    var dbRestaurantProfile = (from profile in context.RestaurantProfiles
                                               where profile.Id == userId
                                               select profile).SingleOrDefault();
                    var newMenu = new RestaurantMenu("Your First Menu", false, 0);

                    newMenu.RestaurantProfile = dbRestaurantProfile;
                    context.RestaurantMenus.Add(newMenu);
                    context.Entry(dbRestaurantProfile).State = System.Data.Entity.EntityState.Unchanged;
                    context.SaveChanges();

                    // Add First Menu Item
                    // Find the corresponding menu
                    var dbRestaurantMenu = (from menu in context.RestaurantMenus
                                            where menu.RestaurantId == restaurantProfile.Id
                                            select menu).SingleOrDefault();
                    var newMenuItem = new RestaurantMenuItem(itemName: "Your First Menu Item", itemPrice: 0, itemPicture: ConfigurationManager.AppSettings["DefaultURLMenuItemPath"], tag: "tag", description: "", isActive: false, flag: 0);
                    newMenuItem.RestaurantMenu = dbRestaurantMenu;
                    context.RestaurantMenuItems.Add(newMenuItem);
                    context.Entry(dbRestaurantMenu).State = System.Data.Entity.EntityState.Unchanged;
                    context.SaveChanges();

                    // Commit transaction to database
                    dbContextTransaction.Commit();

                    // Return a true ResponseDto
                    return(new ResponseDto <bool>()
                    {
                        Data = true
                    });
                }
                catch (Exception)
                {
                    // Rolls back the changes saved in the transaction
                    dbContextTransaction.Rollback();
                    // Return a false ResponseDto
                    return(new ResponseDto <bool>()
                    {
                        Data = false,
                        Error = GeneralErrorMessages.GENERAL_ERROR
                    });
                }
            }
        }
Esempio n. 24
0
        /// <summary>
        /// The CreateAdmin method.
        /// Contains business logic to create an admin user.
        /// <para>
        /// @author: Jennifer Nguyen, Angelica Salas
        /// @updated: 04/26/2018
        /// </para>
        /// </summary>
        /// <param name="registerUserDto"></param>
        /// <returns>ResponseDto</returns>
        public ResponseDto <RegisterUserDto> CreateAdmin(RegisterUserDto registerUserDto)
        {
            var createIndividualPreLogicValidationStrategy = new CreateIndividualPreLogicValidationStrategy(registerUserDto);
            var securityAnswerSalts = new List <SecurityAnswerSalt>();
            var saltGenerator       = new SaltGenerator();
            var payloadHasher       = new PayloadHasher();
            var claimsFactory       = new ClaimsFactory();

            // Validate data transfer object
            var result = createIndividualPreLogicValidationStrategy.ExecuteStrategy();

            if (result.Error != null)
            {
                return(new ResponseDto <RegisterUserDto>
                {
                    Data = registerUserDto,
                    Error = result.Error
                });
            }

            // Map data transfer object to domain models
            var userAccount       = new UserAccount(username: registerUserDto.UserAccountDto.Username, password: registerUserDto.UserAccountDto.Password, isActive: true, isFirstTimeUser: false, roleType: "private");
            var securityQuestions = registerUserDto.SecurityQuestionDtos
                                    .Select(securityQuestionDto => new SecurityQuestion(
                                                securityQuestionDto.Question, securityQuestionDto.Answer))
                                    .ToList();

            //Admin User Profile
            var displayImagePath = ConfigurationManager.AppSettings["DefaultURLProfileImagePath"];
            var userProfile      = new UserProfile(displayPicture: displayImagePath, displayName: registerUserDto.UserProfileDto.DisplayName);

            // Set user claims to be stored in UserClaims table as administrator
            var userClaims = new UserClaims(claimsFactory.Create(AccountTypes.Admin));

            // Hash password
            var passwordSalt = new PasswordSalt(saltGenerator.GenerateSalt(128));

            userAccount.Password = payloadHasher.Sha256HashWithSalt(passwordSalt.Salt, userAccount.Password);

            // Hash security answers
            for (var i = 0; i < securityQuestions.Count; i++)
            {
                securityAnswerSalts.Add(new SecurityAnswerSalt {
                    Salt = saltGenerator.GenerateSalt(128)
                });
                securityQuestions[i].Answer = payloadHasher.Sha256HashWithSalt(securityAnswerSalts[i].Salt, securityQuestions[i].Answer);
            }

            var createIndividualPostLogicValdiationStrategy = new CreateIndividualPostLogicValidationStrategy(userAccount, passwordSalt, userClaims, userProfile, securityQuestions, securityAnswerSalts);
            var validateResult = createIndividualPostLogicValdiationStrategy.ExecuteStrategy();

            if (!validateResult.Data)
            {
                return(new ResponseDto <RegisterUserDto>
                {
                    Data = registerUserDto,
                    Error = GeneralErrorMessages.GENERAL_ERROR
                });
            }

            // Store user in database
            using (var userGateway = new UserGateway())
            {
                var gatewayResult = userGateway.StoreIndividualUser(userAccount, passwordSalt, userClaims, userProfile, securityQuestions, securityAnswerSalts);
                if (gatewayResult.Data == false)
                {
                    return(new ResponseDto <RegisterUserDto>()
                    {
                        Data = registerUserDto,
                        Error = GeneralErrorMessages.GENERAL_ERROR
                    });
                }
            }

            return(new ResponseDto <RegisterUserDto>
            {
                Data = registerUserDto
            });
        }
Esempio n. 25
0
        /// <summary>
        /// Instantiate domain model equivalent of Dto's
        /// <para>
        /// @author: Brian Fann
        /// @updated: 4/25/18
        /// </para>
        /// </summary>
        /// <param name="dto">Dto to map</param>
        /// <param name="param">Parameter Object to map to</param>
        /// <returns></returns>
        private ResponseDto <bool> MapRestaurantDtoToModels(RegisterRestaurantDto dto, out UserAccount userAccount, out PasswordSalt passwordSalt, out UserClaims userClaims, out UserProfile userProfile, out IList <SecurityQuestion> securityQuestions, out IList <SecurityAnswerSalt> securityAnswerSalts, out RestaurantProfile restaurantProfile, out IList <BusinessHour> businessHours, out IList <FoodPreference> foodPreferences)
        {
            // Try to map user dto
            var mappingResult = MapUserDtoToModel(dto, out userAccount, out passwordSalt, out userProfile, out securityQuestions, out securityAnswerSalts);

            if (!mappingResult.Data)
            {
                restaurantProfile = null;
                foodPreferences   = null;
                businessHours     = null;
                userClaims        = null;

                return(mappingResult);
            }

            restaurantProfile = new RestaurantProfile(
                phoneNumber: dto.RestaurantProfileDto.PhoneNumber,
                address: dto.RestaurantProfileDto.Address,
                details: dto.RestaurantProfileDto.Details);

            // Call GeocodeService to get geocoordinates of the restaurant
            var geocodeService  = new GoogleGeocodeService();
            var geocodeResponse = geocodeService.Geocode(restaurantProfile.Address);

            var dateTimeService = new DateTimeService();

            businessHours = dto.BusinessHourDtos
                            .Select(businessHourDto => new BusinessHour(
                                        timeZone: dto.TimeZone,
                                        day: businessHourDto.Day,
                                        openTime: dateTimeService.ConvertLocalMeanTimeToUtc(dateTimeService.ConvertTimeToDateTimeUnspecifiedKind(businessHourDto.OpenTime), dto.TimeZone),
                                        closeTime: dateTimeService.ConvertLocalMeanTimeToUtc(dateTimeService.ConvertTimeToDateTimeUnspecifiedKind(businessHourDto.CloseTime), dto.TimeZone)))
                            .ToList();

            foodPreferences = new List <FoodPreference>();

            if (dto.FoodPreferences != null)
            {
                foodPreferences = dto.FoodPreferences.Select(foodPreference => new FoodPreference(foodPreference)).ToList();
            }

            // Set user claims to be stored in UserClaims table
            var claimsFactory = new ClaimsFactory();

            userClaims = new UserClaims(claimsFactory.Create(AccountTypes.Restaurant));

            if (geocodeResponse.Error != null)
            {
                return(new ResponseDto <bool>
                {
                    Data = false,
                    Error = geocodeResponse.Error
                });
            }

            restaurantProfile.GeoCoordinates = new GeoCoordinates(latitude: geocodeResponse.Data.Latitude, longitude: geocodeResponse.Data.Longitude);

            // Successful response
            return(new ResponseDto <bool>()
            {
                Data = true
            });
        }