diff options
Diffstat (limited to 'api/auth')
-rw-r--r-- | api/auth/signup.py | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/api/auth/signup.py b/api/auth/signup.py index d5d178a..e758a4e 100644 --- a/api/auth/signup.py +++ b/api/auth/signup.py @@ -6,17 +6,17 @@ import passwords import time import re -# Checks wheter the usename (at signup) exist of at least 3 and at most 35 charachters +# checks if the usename is between 3 and 35 charachters def validate_username(username): - return len(username) in range(3, 35 + 1) + return len(username) in range(3, 35 + 1) -# Checks if there's an '@' in the email (at signup) and if there's any input at all +# garbage email validation (see todo) def validate_email(email): #TODO: use node_modules/email-validator/index.js return len(email) > 1 and \ "@" in email -# Checks wheter the signed up password consist of an uppercase, lowercase and a digit & the minimal length is 8 charachters +# checks if the password is safe (regex explanation in pages/register.tsx) def validate_password(password): passwordRegex = r"^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$" # r"" = raw string return re.match(passwordRegex, password) @@ -25,41 +25,49 @@ signup = Blueprint('signup', __name__) @signup.route('/signup', methods = ['POST']) def index(): - # Requests information from endpoint 'signup', recieves username, email and password. It can also recieve an empty string, in that case the program will stop and return error code/http code '400' + # parse request data if the content-type header is set to application/json data = request.get_json() + # force string if {}.get(...) returns None username = data.get("username") or "" email = data.get("email") or "" password = data.get("password") or "" + # return 400 (malformed request) if any of the required data is missing if not username or \ not email or \ not password: return "", 400 - # + # return 403 (forbidden) if any of the required data is invalid if not validate_username(username) or \ not validate_email(email) or \ not validate_password(password): return {"error": "form_data_invalid"}, 403 + # check if username is taken if cursor.execute("select username from users where lower(username) = lower(?)", [username]).fetchone(): return {"error": "username_taken"}, 403 + # check if email is taken if cursor.execute("select email from users where email = ?", [email]).fetchone(): return {"error": "email_taken"}, 403 + # create new user_id, hash password and note timestamp user_id = new_uuid("users") password_hash = passwords.password_hash(password) registered = int( time.time() * 1000 ) + # write new user to database and commit cursor.execute("insert into users values (?, ?, ?, NULL, NULL, ?, ?, \"[]\", FALSE, \"user\", \"{}\", \"online\") ", (user_id, username, email, password_hash, registered)) connection.commit() + # create a new token for the user to use for authentication new_token = token.generate_token() token.add_token(user_id, token.hash_token(new_token)) + # create a flask response object to add the set-cookie header to res = make_response("", 200) res.set_cookie("token", new_token["token"], expires = int(new_token["expirationDate"] / 1000)) |