From 6be082e0a9b2c89f505802afd9411f83f7b92d5a Mon Sep 17 00:00:00 2001 From: bunkerity Date: Fri, 9 Jul 2021 12:18:42 +0200 Subject: [PATCH] UI - init work on admin account --- ui/entrypoint.py | 41 ++++++++++++++++++++++++++++++++++++++++- ui/requirements.txt | 2 ++ ui/src/User.py | 16 ++++++++++++++++ ui/utils.py | 3 +++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 ui/src/User.py diff --git a/ui/entrypoint.py b/ui/entrypoint.py index a088519..cb9dbf1 100644 --- a/ui/entrypoint.py +++ b/ui/entrypoint.py @@ -1,27 +1,64 @@ #!/usr/bin/python3 -from flask import Flask, render_template, current_app, request +from flask import Flask, render_template, current_app, request, redirect +from flask_login import LoginManager, login_required, login_user, logout_user from src.Instances import Instances +from src.User import User from Docker import Docker from Config import Config import utils import os, json, re, copy, traceback +# Flask app app = Flask(__name__, static_url_path="/", static_folder="static", template_folder="templates") +# Set variables and instantiate objects vars = utils.get_variables() +app.secret_key = vars["FLASK_SECRET"] app.config["ABSOLUTE_URI"] = vars["ABSOLUTE_URI"] app.config["INSTANCES"] = Instances(vars["DOCKER_HOST"], vars["API_URI"]) app.config["CONFIG"] = Config() + +# Declare functions for jinja2 app.jinja_env.globals.update(env_to_summary_class=utils.env_to_summary_class) app.jinja_env.globals.update(form_service_gen=utils.form_service_gen) app.jinja_env.globals.update(form_service_gen_multiple=utils.form_service_gen_multiple) app.jinja_env.globals.update(form_service_gen_multiple_values=utils.form_service_gen_multiple_values) +# Login management +login_manager = LoginManager() +login_manager.init_app(app) +user = User(vars["ADMIN_USERNAME"], vars["ADMIN_PASSWRD"]) +app.config["USER"] = user + +@login_manager.user_loader +def load_user(user_id): + return User.get(user_id) + +@app.route('/login', methods=["GET", "POST"]) +def login() : + fail = False + if request.method == "POST" and "username" in request.form and "password" in request.form : + if app.config["USER"].get_id() == request.form["username"] and app.config["USER"].check_password(request.form["password"]) : + login_user(app.config["USER"]) + return redirect("/") + else : + fail = True + if fail : + return render_template("login.html", title="Login", fail=True), 401 + return render_template("login.html", title="Login", fail=False) + +@app.route("/logout") +@login_required +def logout() : + logout_user() + return redirect("/login") + @app.route('/') @app.route('/home') +@login_required def home() : try : instances_number = len(app.config["INSTANCES"].get_instances()) @@ -31,6 +68,7 @@ def home() : return render_template("error.html", title="Error", error=e) @app.route('/instances', methods=["GET", "POST"]) +@login_required def instances() : try : # Manage instances @@ -64,6 +102,7 @@ def instances() : @app.route('/services', methods=["GET", "POST"]) +@login_required def services(): try : # Manage services diff --git a/ui/requirements.txt b/ui/requirements.txt index e4999bb..9665571 100644 --- a/ui/requirements.txt +++ b/ui/requirements.txt @@ -1,3 +1,5 @@ flask requests docker +flask-login +bcrypt \ No newline at end of file diff --git a/ui/src/User.py b/ui/src/User.py new file mode 100644 index 0000000..075bcfd --- /dev/null +++ b/ui/src/User.py @@ -0,0 +1,16 @@ +import flask_login, bcrypt + +class User(flask_login.UserMixin) : + + def __init__(self, id, password) : + self.is_authenticated = True + self.is_active = True + self.is_anonymous = False + self.__id = id + self.__password = bcrypt.hashpw(password, bcrypt.gensalt()) + + def get_id(self) : + return self.__id + + def check_password(self, password) : + return bcrypt.checkpw(password, self.__password) \ No newline at end of file diff --git a/ui/utils.py b/ui/utils.py index f28c6bd..8c778c0 100644 --- a/ui/utils.py +++ b/ui/utils.py @@ -7,6 +7,9 @@ def get_variables() : vars["DOCKER_HOST"] = "unix:///var/run/docker.sock" vars["API_URI"] = "" vars["ABSOLUTE_URI"] = "" + vars["FLASK_SECRET"] = os.urandom(32) + vars["ADMIN_USERNAME"] = "admin" + vars["ADMIN_PASSWORD"] = "changeme" for k in vars : if k in os.environ : vars[k] = os.environ[k]