def setUp(self):
        self.password_repository = PasswordRepository(test_database_connection())
        self.password_service = PasswordService(self.password_repository)
        self.password_repository.delete_all_passwords()

        self.user_repository = UserRepository(test_database_connection())
        self.user_service = UserService(self.user_repository)

        self.test_user_one = User("test_user_one", "test_pw1")
        self.test_user_two = User("test_user_two", "test_pw2")
        self.user_service.create_user(self.test_user_one)
        self.user_service.create_user(self.test_user_two)
Beispiel #2
0
 def __init__(self, root, handle_user_view, user=None):
     """Konstruktori, luo uuden salasanojen lisäyksestä vastaavan näkymän
     
     Args:
         root: Juurielementti, joka hallitsee nykyistä näkymää
         handle_user_view: UI-luokan metodi, joka siirtää näkymän UserViewiin
         user: Kirjautunut käyttäjä, oletusarvoltaan None
     """
     self._root = root
     self._frame = None
     self.user = user
     self._handle_user_view = handle_user_view
     self._password_service = PasswordService()
     self._initialize()
class TestPasswordService(unittest.TestCase):
    def setUp(self):
        self.password_repository = PasswordRepository(test_database_connection())
        self.password_service = PasswordService(self.password_repository)
        self.password_repository.delete_all_passwords()

        self.user_repository = UserRepository(test_database_connection())
        self.user_service = UserService(self.user_repository)

        self.test_user_one = User("test_user_one", "test_pw1")
        self.test_user_two = User("test_user_two", "test_pw2")
        self.user_service.create_user(self.test_user_one)
        self.user_service.create_user(self.test_user_two)

    def test_num_of_users_correct(self):
        users = self.user_repository.get_all_users()

        self.assertEqual(len(users), 2)

    def test_add_new_password(self):
        user_for_password = self.user_repository.get_single_user(self.test_user_one)
        password_to_add = Password(
            "test_username",
            "test_pw",
            "test_site",
            user_for_password.user_id
        )
        added_password = self.password_service.add_new_password(password_to_add)

        self.assertEqual(added_password.user_id, user_for_password.user_id)
        self.assertEqual(added_password, password_to_add)

    def test_get_passwords_by_user(self):
        user_for_password = self.user_repository.get_single_user(self.test_user_one)

        for i in range(5):
            password_to_add = Password(
                f"test_username{i}",
                f"test_pw{i}",
                f"test_site{i}",
                user_for_password.user_id
            )
            self.password_service.add_new_password(password_to_add)

        passwords_by_user = self.password_service.get_passwords_by_user(user_for_password)

        self.assertEqual(len(passwords_by_user), 5)
        self.assertEqual(passwords_by_user[0].username, "test_username0")
Beispiel #4
0
    def handle_sign_in(self):
        """
        Handle logging to existing user
        """
        RootView.display_sign_menu(False)

        logged_in = False
        while not logged_in:

            login, password = RootView.get_user_login_password()
            password = PasswordService.encrypt_password(password)
            user = self.user_container.get_user(login, password)

            if user:

                logged_in = True
                if isinstance(user, Student):
                    StudentController(user).start()
                elif isinstance(user, Mentor):
                    MentorController().start()
                elif isinstance(user, Manager):
                    ManagerController(user).start()
                elif isinstance(user, Employee):
                    EmployeeController(user).start()
                elif isinstance(user, User):
                    RootView.display_error_user_singin()

            else:
                RootView.display_user_not_exist()
Beispiel #5
0
    def handle_sign_up(self):
        """
        Handle creating new User
        """
        RootView.display_sign_menu(True)

        user_created = False
        while not user_created:

            login = RootView.create_user_login()
            password = RootView.create_user_password()
            hashed_password = PasswordService.encrypt_password(password)

            if self.user_container.get_user_by_login_or_email(login):
                RootView.display_user_already_exists()

            else:
                phone_number = RootView.create_user_phone_number()
                email = RootView.create_user_email()
                name = RootView.add_user_name()

                self.user_container.add_user(
                    User(login, hashed_password, phone_number, email, name))
                RootView.display_user_created(login, phone_number, email, name)
                user_created = True
                self.send_user_has_registered_succesfully_email(name, email)
    def __init__(self, root, user, handle_login_view,
                 handle_add_password_view):
        """Käyttäjänäkymästä vastaava käyttöliittymäluokka

        Args:
            root: Juurielementti, joka hallitsee nykyistä näkymää
            user: User-luokan olio
            handle_login_view: UI-luokan metodi, joka siirtää näkymän LoginViewiin
            handle_add_password_view: UI-luokan metodi, joka siirtää näkymän AddPasswordViewiin
        """
        self._root = root
        self._frame = None
        self.user = user
        self._password_service = PasswordService()
        self._handle_login_view = handle_login_view
        self._handle_add_password_view = handle_add_password_view
        self._initialize()
Beispiel #7
0
 def change_password(self, password: str, token: str):
     """
     Method changes password.
     :param password: str -> user's new password
     :param token: str -> token needed to auth
     :return: None
     """
     self.raise_exception_if_user_token_is_not_correct(token)
     self.user.password = PasswordService.encrypt_password(password)
     delattr(self.user, 'token')
     UserContainer.get_instance().save_users_to_file()
    def get_user_login_password():
        """
        Param: none
        Return: tuple

        Method take users login and password and return it as a tuple.
        """
        user_login = RootView.get_user_login()
        user_password = PasswordService.get_password_with_asterisks()
        login_password = (user_login, user_password)
        return login_password
    def post(self):
        password_config = get_password_config()
        user_type = _USER_TYPE_INVEST

        argument_dict, aes_share_key, aes_nonce = self.get_argument_dict(
            must_keys=['user_id', 'old_password', 'new_password'],
            api_type=_USER_TYPE_INVEST,
            request_type=_REQUEST_TYPE_LOGIN,
            check_form_token=True)

        if 'change_method' in password_config and password_config[
                'change_method'] != "":
            password_check_service = PasswordService(
                aes_share_key=aes_share_key, aes_nonce=aes_nonce)
            # 自己的修改密码方法
            if hasattr(password_check_service,
                       password_config['change_method']):
                method_name = password_config['change_method']
                tmp_method = eval('password_check_service.' + method_name)
                r = tmp_method(argument_dict, user_type=user_type)
            else:
                r = password_check_service.base_check_method(
                    argument_dict, user_type=user_type)
            if r['status'] == _PASSWORD_CHECK_TYPE_SUCCESS:
                return r, aes_share_key, aes_nonce
            elif r['status'] == _PASSWORD_CHECK_TYPE_REDIRECT:
                return redirect(r['rediret_url'])
            else:
                self.return_error(30211)

        user_id = argument_dict['user_id']
        old_password = argument_dict['old_password']
        new_password = argument_dict['new_password']

        r = UserBaseService(aes_share_key=aes_share_key, aes_nonce=aes_nonce).\
            change_login_password(user_id, old_password, new_password)
        return r, aes_share_key, aes_nonce
    def create_user_password():
        """
        Arguments: none
        Return: none

        Method let to create user his account password and check if it contain requirements.
        """
        incorrect_password = True
        user_password = ''
        while incorrect_password:
            print(
                ColorfulView.format_string_to_yellow(
                    'Enter your password(it must contain big, small characters and '
                    'digit, it must contain min 6 chars and '
                    'it cant be longer than 30 characters): '))
            user_password = PasswordService.get_password_with_asterisks()
            if re.match(r'^(?=.*?\d)(?=.*?[A-Z])(?=.*?[a-z])[A-Za-z\d]{6,30}$',
                        user_password):
                incorrect_password = False

        return user_password
Beispiel #11
0
class AddPasswordView:
    """Salasanojen lisäyksestä vastaava käyttöliittymäluokka"""
    def __init__(self, root, handle_user_view, user=None):
        """Konstruktori, luo uuden salasanojen lisäyksestä vastaavan näkymän
        
        Args:
            root: Juurielementti, joka hallitsee nykyistä näkymää
            handle_user_view: UI-luokan metodi, joka siirtää näkymän UserViewiin
            user: Kirjautunut käyttäjä, oletusarvoltaan None
        """
        self._root = root
        self._frame = None
        self.user = user
        self._handle_user_view = handle_user_view
        self._password_service = PasswordService()
        self._initialize()

    def pack(self):
        """Pakkaa käyttöliittymän komponentit ennen renderöintiä"""
        self._frame.pack(fill=constants.X)

    def destroy(self):
        """Tuhoaa tämänhetkisen näkymän"""
        self._frame.destroy()

    def handle_back_to_user_view(self):
        """Palauttaa näkymän UserViewiin """
        self._handle_user_view(self.user)

    def handle_add_new_password(self, site, username, password):
        """Lisää uuden salasanan järjestelmään

        Args:
            site: String, sivusto johon salasana sekä käyttäjänimi liittyvät
            username: String, käyttäjänimi sivustolle
            password: String, salasana sivustolle
        """
        if not site or not username or not password:
            return messagebox.showerror('Error', 'No empty fields allowed')

        user_id = self.user.user_id
        new_password = Password(username, password, site, user_id)
        result = self._password_service.add_new_password(new_password)

        messagebox.showinfo('Info', 'Password added')

        self.site_entry.delete(0, "end")
        self.username_entry.delete(0, "end")
        self.password_entry.delete(0, "end")

        return result

    def _initialize(self):
        """Initialisoi näkymän"""
        self._frame = ttk.Frame(master=self._root)

        heading_label = ttk.Label(master=self._frame,
                                  text="Add new credentials",
                                  font=(None, 20))
        site_label = ttk.Label(master=self._frame,
                               text="site",
                               font=(None, 10))
        self.site_entry = ttk.Entry(master=self._frame)
        username_label = ttk.Label(master=self._frame,
                                   text="username",
                                   font=(None, 10))
        self.username_entry = ttk.Entry(master=self._frame)
        password_label = ttk.Label(master=self._frame,
                                   text="password",
                                   font=(None, 10))
        self.password_entry = ttk.Entry(master=self._frame, show="*")
        submit_button = ttk.Button(
            master=self._frame,
            text="Submit",
            command=lambda: self.handle_add_new_password(
                self.site_entry.get(), self.username_entry.get(),
                self.password_entry.get()))
        cancel_button = ttk.Button(
            master=self._frame,
            text="Cancel",
            command=lambda: self.handle_back_to_user_view())

        heading_label.grid(row=0,
                           column=0,
                           columnspan=2,
                           sticky=constants.W,
                           padx=5,
                           pady=5)

        site_label.grid(row=1, column=0)
        self.site_entry.grid(row=1,
                             column=1,
                             sticky=(constants.E, constants.W),
                             padx=2,
                             pady=2,
                             ipady=5)

        username_label.grid(row=2, column=0)
        self.username_entry.grid(row=2,
                                 column=1,
                                 sticky=(constants.E, constants.W),
                                 padx=2,
                                 pady=2,
                                 ipady=5)

        password_label.grid(row=3, column=0)
        self.password_entry.grid(row=3,
                                 column=1,
                                 sticky=(constants.E, constants.W),
                                 padx=2,
                                 pady=2,
                                 ipady=5)

        submit_button.grid(row=4,
                           column=0,
                           sticky=constants.E,
                           padx=2,
                           pady=5,
                           ipady=5)
        cancel_button.grid(row=4,
                           column=1,
                           sticky=constants.W,
                           padx=2,
                           pady=5,
                           ipady=5)

        self._frame.grid_columnconfigure(1, weight=1, minsize=400)
class UserView:
    def __init__(self, root, user, handle_login_view,
                 handle_add_password_view):
        """Käyttäjänäkymästä vastaava käyttöliittymäluokka

        Args:
            root: Juurielementti, joka hallitsee nykyistä näkymää
            user: User-luokan olio
            handle_login_view: UI-luokan metodi, joka siirtää näkymän LoginViewiin
            handle_add_password_view: UI-luokan metodi, joka siirtää näkymän AddPasswordViewiin
        """
        self._root = root
        self._frame = None
        self.user = user
        self._password_service = PasswordService()
        self._handle_login_view = handle_login_view
        self._handle_add_password_view = handle_add_password_view
        self._initialize()

    def pack(self):
        """Pakkaa käyttöliittymän komponentit ennen renderöintiä"""
        self._frame.pack(fill=constants.X)

    def destroy(self):
        """Tuhoaa tämänhetkisen näkymän"""
        self._frame.destroy()

    def handle_logout(self):
        """Kirjaa käyttäjän ulos järjestelmästä"""
        message_box = tk.messagebox.askquestion(
            'Info', f'Log out user {self.user.username}?')

        if message_box == 'yes':
            self._handle_login_view()
        else:
            return

    def handle_move_to_add_view(self, user):
        """Siirtää näkymän AddPasswordViewiin kun nappia painetaan"""
        self._handle_add_password_view(user)

    def insert_to_tree(self):
        """Luo näkymän käyttäjien lisäämille salasanoille"""
        passwords = self._password_service.get_passwords_by_user(self.user)

        self.numOfPasswords = 1
        self.iid = 0

        for x in passwords:
            self.tree.insert('',
                             'end',
                             iid=self.iid,
                             text=self.numOfPasswords,
                             values=(x.site, x.username, x.password))

            self.iid = self.iid + 1
            self.numOfPasswords = self.numOfPasswords + 1

    def _initialize(self):
        """Initialisoi näkymän"""
        self._frame = ttk.Frame(master=self._root)
        style = ttk.Style()

        style.configure('Treeview', rowheight=40)

        add_password_button = ttk.Button(
            master=self._frame,
            text="Add password",
            command=lambda: self._handle_add_password_view(self.user))
        logout_button = ttk.Button(master=self._frame,
                                   text="Logout",
                                   command=lambda: self.handle_logout())
        data_label = ttk.Label(master=self._frame,
                               text="Saved passwords",
                               font=(None, 20))

        add_password_button.grid(row=0,
                                 column=0,
                                 sticky=constants.W,
                                 padx=5,
                                 pady=5)
        logout_button.grid(row=0, column=1, sticky=constants.E, padx=5, pady=5)
        data_label.grid(row=1,
                        column=0,
                        sticky=(constants.E, constants.W),
                        pady=20)

        self.tree = ttk.Treeview(self._frame,
                                 columns=('Site', 'Username', 'Password'))
        self.tree.heading('#0', text='#')
        self.tree.heading('#1', text='Site')
        self.tree.heading('#2', text='Username')
        self.tree.heading('#3', text="Password")

        self.tree.column('#0', width=30)

        self.tree.grid(row=2, columnspan=4, sticky='nsew')

        self._frame.columnconfigure(0, weight=1, minsize=400)

        self.insert_to_tree()