5
\$\begingroup\$

I made code for signing in users and storing data about them. Everything is fully encrypted and secure also, it is meant to be imported into other code. I'm looking for ways to improve it and to fix any bugs people might find.

import pickle
import base64

class user():
    def __init__(self, username, password, user_data):
        self.username = username
        self.password = password
        self.user_data = user_data

def get_user():
    try:
        user_saves = open("users", 'rb')
        users = dict(pickle.load(user_saves))
        user_saves.close
        name, password, users = sign_in(users)
    except:
        name, password, users = new_user(True)

    name = base64.b64decode(name.decode('utf-8'))
    password = base64.b64decode(password.decode('utf-8'))
    return name, password, users

def new_user(is_first = False, users=None):
    print('Creating account... ')
    if users != None:
        loop = True
        while loop:
            name = input('What is your username: ')
            name = base64.b64encode(name.encode('utf-8'))
            if name in users: 
                print('Already taken.') 
            else: 
                loop = False
                password = input('What is your password: ')
                password = base64.b64encode(password.encode('utf-8'))
    else:
        name = input('What is your username: ')
        name = base64.b64encode(name.encode('utf-8'))
        password = input('What is your password: ')
        password = base64.b64encode(password.encode('utf-8'))
    if is_first == True:
        user = {name:password}
        user_saves = open("users", 'wb')
        pickle.dump(user, user_saves)
        add_user_data('', password, True)
        return name, password, user
    else:
        add_user_data('', password)
        users.update({name:password})
        user_saves = open("users", 'wb')
        pickle.dump(users, user_saves)
        return name, password, users
    user_saves.close

def sign_in(users):
    nsi = True #not signed in
    while nsi == True:
        username = input('What is your username: ')
        username = base64.b64encode(username.encode('utf-8'))
        if username in users:
            password = input('What is your password: ')
            password = base64.b64encode(password.encode('utf-8'))
            if password == users.get(username):
                print('working')
                nsi = False
                return username, password
            else:
                print('Wrong password.')
        else:
            yn = y_or_n('y or n, are you a new user: ')
            if yn == True:
                nsi = False
                name, password = new_user(users=users)
                return name, password

def y_or_n(promt):
    ni = True #no input
    while ni: 
        yn = input(promt).lower()
        if yn == 'y':
            return True
        elif yn == 'n':
            return False
        else:
            print('y or n')

def add_user_data(data, password, is_first=False):
    password = base64.b64encode(password.encode('utf-8'))
    data = base64.b64encode(data.encode('utf-8'))
    if is_first == True:
        user_data = {password:data}
        users_data = open("users_data", 'wb')
        pickle.dump(user_data, users_data)
    else:
        user_data.update({password:data})
        users_data = open("users_data", 'wb')
        pickle.dump(user_data, users_data)
    users_data.close

def get_user_data(password):
    password = base64.b64encode(password.encode('utf-8'))
    user_data = pickle.load('user_data')
    user_data = base64.b64decode(user_data.decode('utf-8'))
    return user_data

def delete_user(name, data, ):
    data.pop('name', None)


name, password, users = get_user()
data = get_user_data(password)
print(data)
user_stats = user(name, password, data)
\$\endgroup\$

1 Answer 1

4
\$\begingroup\$

Security

Everything is fully encrypted and secure

Oh, really? I hope that you aren't confusing encoding with encryption. I don't see any encryption taking place.

This is a huge topic, so you have some reading to do - but the bar for 'secure password store' is significantly above where this program currently resides.

Class syntax

This:

class user():

should be

class User:

Also, you're currently using it as a struct with no methods. That should change - you should move some of your code to be methods on that class.

Break

This:

loop = True
while loop:

should be reworked. You can use a while True, and replace the loop = False with a break at the end of that if block.

File handles

Rather than explicitly closing your files, you should usually use them in a with block. Also, this:

user_saves.close

doesn't do what you think it does; in fact it does nothing. For the function call to occur, you need to add ().

Redundant else

This:

    return name, password, user
else:

doesn't need an else, because you've returned in the previous block.

Write a main method

...to pull this code out of global scope:

name, password, users = get_user()
data = get_user_data(password)
print(data)
user_stats = user(name, password, data)
\$\endgroup\$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.