added a user login

This commit is contained in:
Daniel Schick 2023-06-23 15:20:26 +02:00
parent 15cc4bf8da
commit b9d35b9244
8 changed files with 106 additions and 11 deletions

32
misc/add_user.py Normal file
View File

@ -0,0 +1,32 @@
import mysql.connector
import os
import json
import bcrypt
config_path = '../src/server/BreCal/connection_data.json'
print (os.getcwd())
if not os.path.exists(config_path):
print ('cannot find ' + config_path)
exit(1)
f = open(config_path);
connection_data = json.load(f)
mydb = mysql.connector.connect(host=connection_data["host"], user=connection_data["user"],
password = connection_data["password"], database=connection_data["database"])
print(mydb)
# insert a new user
participant_id = 1
first_name = "Londo"
last_name = "Mollari"
user_name = "Londo"
user_email = "l.mollari@centauri.gov"
user_phone = "+01 555 324 2313"
password = "Hallowach"
password_hash = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt( 12 )).decode('utf8')
query = "INSERT INTO user (participant_id, first_name, last_name, user_name, user_email, user_phone, password_hash) VALUES (" + str(participant_id) + ",\"" + first_name + "\",\"" + last_name + "\",\"" + user_name + "\",\"" + user_email + "\",\"" + user_phone + "\",\"" + password_hash + "\")"
with mydb.cursor() as cursor:
cursor.execute(query)
mydb.commit()

View File

@ -19,6 +19,8 @@ CREATE TABLE `user` (
`first_name` varchar(45) DEFAULT NULL, `first_name` varchar(45) DEFAULT NULL,
`last_name` varchar(45) DEFAULT NULL, `last_name` varchar(45) DEFAULT NULL,
`user_name` varchar(45) DEFAULT NULL, `user_name` varchar(45) DEFAULT NULL,
`user_email` varchar(128) DEFAULT NULL,
`user_phone` varchar(128) DEFAULT NULL,
`password_hash` varchar(128) DEFAULT NULL, `password_hash` varchar(128) DEFAULT NULL,
`api_key` varchar(256) DEFAULT NULL, `api_key` varchar(256) DEFAULT NULL,
`created` DATETIME NULL DEFAULT current_timestamp(), `created` DATETIME NULL DEFAULT current_timestamp(),

View File

@ -12,6 +12,7 @@ from .api import times
from .api import notifications from .api import notifications
from .api import berths from .api import berths
from .api import ships from .api import ships
from .api import login
sessions = dict() sessions = dict()
@ -40,6 +41,7 @@ def create_app(test_config=None):
app.register_blueprint(notifications.bp) app.register_blueprint(notifications.bp)
app.register_blueprint(berths.bp) app.register_blueprint(berths.bp)
app.register_blueprint(ships.bp) app.register_blueprint(ships.bp)
app.register_blueprint(login.bp)
logging.basicConfig(filename='brecal.log', level=logging.DEBUG, format='%(asctime)s | %(name)s | %(levelname)s | %(message)s') logging.basicConfig(filename='brecal.log', level=logging.DEBUG, format='%(asctime)s | %(name)s | %(levelname)s | %(message)s')
local_db.initPool() local_db.initPool()

View File

@ -0,0 +1,16 @@
from flask import Blueprint, request
from flask_jwt_extended import create_access_token
from webargs.flaskparser import parser
from ..schemas import model
from .. import impl
import json
import logging
bp = Blueprint('login', __name__)
@bp.route('/login', methods=['post'])
def Logon():
options = request.get_json(force=True)
return impl.login.GetUser(options)

View File

@ -5,3 +5,4 @@ from . import shipcalls
from . import times from . import times
from . import verify from . import verify
from . import ships from . import ships
from . import login

View File

@ -0,0 +1,40 @@
import json
import logging
import pydapper
import bcrypt
from ..schemas import model
from .. import local_db
def GetUser(options):
try:
if "password" in options and "username" in options:
hash = bcrypt.hashpw(options["password"].encode('utf-8'), bcrypt.gensalt( 12 )).decode('utf8')
commands = pydapper.using(local_db.connection_pool)
data = commands.query("SELECT id, participant_id, first_name, last_name, user_name, user_email, user_phone, password_hash, api_key FROM user WHERE user_name = ?username? OR user_email = ?username?",
model=model.User, param={"username" : options["username"]})
print(data)
if len(data) == 1:
if bcrypt.checkpw(options["password"].encode("utf-8"), bytes(data[0].password_hash, "utf-8")):
return json.dumps({ "id": data[0].id,
"participant_id": data[0].participant_id,
"first_name": data[0].first_name,
"last_name": data[0].last_name,
"user_name": data[0].user_name,
"user_phone": data[0].user_phone}), 200
if len(data) > 1:
return json.dumps("credential lookup mismatch"), 500
return json.dumps("invalid credentials"), 403
except Exception as ex:
logging.error(ex)
print(ex)
return json.dumps("call failed"), 500
# $2b$12$uWLE0r32IrtCV30WkMbVwOdltgeibymZyYAf4ZnQb2Bip8hrkGGwG
# $2b$12$.vEapj9xU8z0RK0IpIGeYuRIl0ktdMt4XdJQBhVn.3K2hmvm7qD3y
# $2b$12$yL3PiseU70ciwEuMVM4OtuMwR6tNuIT9vvBiBG/uyMrPxa16E2Zqu

View File

@ -22,7 +22,7 @@ def initPool():
connection_pool = mysql.connector.connect(**connection_data) connection_pool = mysql.connector.connect(**connection_data)
commands = pydapper.using(connection_pool) commands = pydapper.using(connection_pool)
data = commands.query_single("SELECT id from `user`") data = commands.query("SELECT id from `user`")
print("DB connection successful") print("DB connection successful")
except mysql.connector.PoolError as e: except mysql.connector.PoolError as e:

View File

@ -142,7 +142,18 @@ class Times:
created: datetime created: datetime
modified: datetime modified: datetime
@dataclass
class User:
id: int
participant_id: int
first_name: str
last_name: str
user_name: str
user_email: str
user_phone: str
password_hash: str
api_key: str
@dataclass @dataclass
class Ship(Schema): class Ship(Schema):
@ -173,12 +184,3 @@ class Shipcalls(Shipcall):
class TimesList(Times): class TimesList(Times):
pass pass
class User(Schema):
id = fields.Int()
participant_id = fields.Int()
first_name = fields.String()
last_name = fields.String()
user_name = fields.String()
password_hash = fields.String()
api_key = fields.String()