mirror of https://github.com/CIRCL/AIL-framework
chg: [settings] refactor old settings blueprint module
parent
8a0c18c575
commit
2bc6555ee2
|
@ -85,6 +85,13 @@ def hashing_password(password):
|
||||||
|
|
||||||
## --PASSWORDS-- ##
|
## --PASSWORDS-- ##
|
||||||
|
|
||||||
|
def check_email(email):
|
||||||
|
email_regex = re.compile(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}')
|
||||||
|
result = email_regex.match(email)
|
||||||
|
if result:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
#### TOKENS ####
|
#### TOKENS ####
|
||||||
|
|
||||||
|
@ -315,6 +322,20 @@ def api_get_users_meta():
|
||||||
meta['users'].append(user.get_meta(options=options))
|
meta['users'].append(user.get_meta(options=options))
|
||||||
return meta
|
return meta
|
||||||
|
|
||||||
|
def api_get_user_profile(user_id):
|
||||||
|
options = {'api_key', 'role'}
|
||||||
|
user = AILUser(user_id)
|
||||||
|
if not user.exists():
|
||||||
|
return {'status': 'error', 'reason': 'User not found'}, 404
|
||||||
|
meta = user.get_meta(options=options)
|
||||||
|
return meta, 200
|
||||||
|
|
||||||
|
def api_create_user_api_key_self(user_id): # TODO LOG USER ID
|
||||||
|
user = AILUser(user_id)
|
||||||
|
if not user.exists():
|
||||||
|
return {'status': 'error', 'reason': 'User not found'}, 404
|
||||||
|
return user.new_api_key(), 200
|
||||||
|
|
||||||
def api_create_user_api_key(user_id, admin_id): # TODO LOG ADMIN ID
|
def api_create_user_api_key(user_id, admin_id): # TODO LOG ADMIN ID
|
||||||
user = AILUser(user_id)
|
user = AILUser(user_id)
|
||||||
if not user.exists():
|
if not user.exists():
|
||||||
|
@ -348,7 +369,7 @@ def get_users_metadata(list_users):
|
||||||
users.append(get_user_metadata(user))
|
users.append(get_user_metadata(user))
|
||||||
return users
|
return users
|
||||||
|
|
||||||
def create_user(user_id, password=None, chg_passwd=True, role=None):
|
def create_user(user_id, password=None, chg_passwd=True, role=None): # TODO ###############################################################
|
||||||
# # TODO: check password strength
|
# # TODO: check password strength
|
||||||
if password:
|
if password:
|
||||||
new_password = password
|
new_password = password
|
||||||
|
|
|
@ -21,6 +21,7 @@ sys.path.append(os.environ['AIL_BIN'])
|
||||||
##################################
|
##################################
|
||||||
from lib import ail_updates
|
from lib import ail_updates
|
||||||
from lib import ail_users
|
from lib import ail_users
|
||||||
|
from lib import d4
|
||||||
from packages import git_status
|
from packages import git_status
|
||||||
|
|
||||||
# ============ BLUEPRINT ============
|
# ============ BLUEPRINT ============
|
||||||
|
@ -30,6 +31,7 @@ settings_b = Blueprint('settings_b', __name__, template_folder=os.path.join(os.e
|
||||||
# bootstrap_label = Flask_config.bootstrap_label
|
# bootstrap_label = Flask_config.bootstrap_label
|
||||||
|
|
||||||
# ============ FUNCTIONS ============
|
# ============ FUNCTIONS ============
|
||||||
|
|
||||||
def create_json_response(data, status_code):
|
def create_json_response(data, status_code):
|
||||||
return Response(json.dumps(data, indent=2, sort_keys=True), mimetype='application/json'), status_code
|
return Response(json.dumps(data, indent=2, sort_keys=True), mimetype='application/json'), status_code
|
||||||
|
|
||||||
|
@ -62,7 +64,24 @@ def settings_modules():
|
||||||
@login_required
|
@login_required
|
||||||
@login_read_only
|
@login_read_only
|
||||||
def user_profile():
|
def user_profile():
|
||||||
|
user_id = current_user.get_user_id()
|
||||||
acl_admin = current_user.is_in_role('admin')
|
acl_admin = current_user.is_in_role('admin')
|
||||||
|
r = ail_users.api_get_user_profile(user_id)
|
||||||
|
if r[1] != 200:
|
||||||
|
return create_json_response(r[0], r[1])
|
||||||
|
meta = r[0]
|
||||||
|
return render_template("user_profile.html", meta=meta, acl_admin=acl_admin)
|
||||||
|
|
||||||
|
@settings_b.route("/settings/user/api_key/new", methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
@login_read_only
|
||||||
|
def new_token_user_self():
|
||||||
|
user_id = current_user.get_user_id()
|
||||||
|
r = ail_users.api_create_user_api_key_self(user_id)
|
||||||
|
if r[1] != 200:
|
||||||
|
return create_json_response(r[0], r[1])
|
||||||
|
else:
|
||||||
|
return redirect(url_for('settings_b.user_profile'))
|
||||||
|
|
||||||
@settings_b.route("/settings/new_user_api_key", methods=['GET'])
|
@settings_b.route("/settings/new_user_api_key", methods=['GET'])
|
||||||
@login_required
|
@login_required
|
||||||
|
@ -76,6 +95,78 @@ def new_token_user():
|
||||||
else:
|
else:
|
||||||
return redirect(url_for('settings_b.users_list'))
|
return redirect(url_for('settings_b.users_list'))
|
||||||
|
|
||||||
|
@settings_b.route("/settings/create_user", methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
@login_admin
|
||||||
|
def create_user():
|
||||||
|
user_id = request.args.get('user_id')
|
||||||
|
error = request.args.get('error')
|
||||||
|
error_mail = request.args.get('error_mail')
|
||||||
|
meta = {}
|
||||||
|
if user_id:
|
||||||
|
r = ail_users.api_get_user_profile(user_id)
|
||||||
|
if r[1] != 200:
|
||||||
|
return create_json_response(r[0], r[1])
|
||||||
|
meta = r[0]
|
||||||
|
all_roles = ail_users.get_all_roles()
|
||||||
|
return render_template("create_user.html", all_roles=all_roles, meta=meta,
|
||||||
|
error=error, error_mail=error_mail,
|
||||||
|
acl_admin=True)
|
||||||
|
|
||||||
|
@settings_b.route("/settings/edit_user", methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
@login_admin
|
||||||
|
def edit_user():
|
||||||
|
user_id = request.args.get('user_id')
|
||||||
|
return redirect(url_for('settings_b.create_user', user_id=user_id))
|
||||||
|
|
||||||
|
|
||||||
|
@settings_b.route("/settings/create_user_post", methods=['POST'])
|
||||||
|
@login_required
|
||||||
|
@login_admin
|
||||||
|
def create_user_post():
|
||||||
|
# Admin ID
|
||||||
|
admin_id = current_user.get_user_id()
|
||||||
|
|
||||||
|
email = request.form.get('username')
|
||||||
|
role = request.form.get('user_role')
|
||||||
|
password1 = request.form.get('password1')
|
||||||
|
password2 = request.form.get('password2')
|
||||||
|
|
||||||
|
all_roles = ail_users.get_all_roles()
|
||||||
|
|
||||||
|
if email and len(email) < 300 and ail_users.check_email(email) and role:
|
||||||
|
if role in all_roles:
|
||||||
|
# password set
|
||||||
|
if password1 and password2:
|
||||||
|
if password1 == password2:
|
||||||
|
if ail_users.check_password_strength(password1):
|
||||||
|
password = password1
|
||||||
|
else:
|
||||||
|
return render_template("create_user.html", all_roles=all_roles, error="Incorrect Password", acl_admin=True)
|
||||||
|
else:
|
||||||
|
return render_template("create_user.html", all_roles=all_roles, error="Passwords don't match", acl_admin=True)
|
||||||
|
# generate password
|
||||||
|
else:
|
||||||
|
password = ail_users.gen_password()
|
||||||
|
|
||||||
|
if current_user.is_in_role('admin'):
|
||||||
|
str_password = password
|
||||||
|
if ail_users.exists_user(email):
|
||||||
|
if not password1 and not password2:
|
||||||
|
password = None
|
||||||
|
str_password = 'Password not changed'
|
||||||
|
ail_users.create_user(email, password=password, role=role)
|
||||||
|
new_user = {'email': email, 'password': str_password}
|
||||||
|
return render_template("create_user.html", new_user=new_user, meta={}, all_roles=all_roles, acl_admin=True)
|
||||||
|
|
||||||
|
else:
|
||||||
|
return render_template("create_user.html", all_roles=all_roles, acl_admin=True)
|
||||||
|
else:
|
||||||
|
return render_template("create_user.html", all_roles=all_roles, error_mail=True, acl_admin=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@settings_b.route("/settings/delete_user", methods=['GET'])
|
@settings_b.route("/settings/delete_user", methods=['GET'])
|
||||||
@login_required
|
@login_required
|
||||||
@login_admin
|
@login_admin
|
||||||
|
@ -93,12 +184,29 @@ def delete_user():
|
||||||
@login_admin
|
@login_admin
|
||||||
def users_list():
|
def users_list():
|
||||||
meta = ail_users.api_get_users_meta()
|
meta = ail_users.api_get_users_meta()
|
||||||
new_user = {}
|
return render_template("users_list.html", meta=meta, acl_admin=True)
|
||||||
return render_template("users_list.html", meta=meta, new_user=new_user, acl_admin=True)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
|
|
||||||
|
@settings_b.route("/settings/passivedns", methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
@login_read_only
|
||||||
|
def passive_dns():
|
||||||
|
passivedns_enabled = d4.is_passive_dns_enabled()
|
||||||
|
return render_template("passive_dns.html", passivedns_enabled=passivedns_enabled)
|
||||||
|
|
||||||
|
|
||||||
|
@settings_b.route("/settings/passivedns/change_state", methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
@login_admin
|
||||||
|
def passive_dns_change_state():
|
||||||
|
new_state = request.args.get('state') == 'enable'
|
||||||
|
passivedns_enabled = d4.change_passive_dns_state(new_state)
|
||||||
|
return redirect(url_for('settings_b.passive_dns'))
|
||||||
|
|
||||||
|
# @settings.route("/settings/ail", methods=['GET'])
|
||||||
|
# @login_required
|
||||||
|
# @login_admin
|
||||||
|
# def ail_configs():
|
||||||
|
# return render_template("ail_configs.html", passivedns_enabled=None)
|
||||||
|
|
||||||
|
|
|
@ -1,172 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
# -*-coding:UTF-8 -*
|
|
||||||
|
|
||||||
'''
|
|
||||||
Flask functions and routes for the settings modules page
|
|
||||||
'''
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from flask import Flask, render_template, jsonify, request, Blueprint, redirect, url_for
|
|
||||||
from flask_login import login_required, current_user
|
|
||||||
|
|
||||||
from Role_Manager import login_admin, login_analyst, login_user, login_read_only
|
|
||||||
|
|
||||||
sys.path.append(os.environ['AIL_BIN'])
|
|
||||||
##################################
|
|
||||||
# Import Project packages
|
|
||||||
##################################
|
|
||||||
from lib import d4
|
|
||||||
from lib import Users
|
|
||||||
|
|
||||||
# ============ VARIABLES ============
|
|
||||||
import Flask_config
|
|
||||||
|
|
||||||
app = Flask_config.app
|
|
||||||
baseUrl = Flask_config.baseUrl
|
|
||||||
r_serv_db = Flask_config.r_serv_db
|
|
||||||
REPO_ORIGIN = Flask_config.REPO_ORIGIN
|
|
||||||
dict_update_description = Flask_config.dict_update_description
|
|
||||||
email_regex = Flask_config.email_regex
|
|
||||||
|
|
||||||
settings = Blueprint('settings', __name__, template_folder='templates')
|
|
||||||
|
|
||||||
|
|
||||||
# ============ FUNCTIONS ============
|
|
||||||
|
|
||||||
def check_email(email):
|
|
||||||
result = email_regex.match(email)
|
|
||||||
if result:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
# ============= ROUTES ==============
|
|
||||||
|
|
||||||
@settings.route("/settings/edit_profile", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_read_only
|
|
||||||
def edit_profile():
|
|
||||||
user_metadata = Users.get_user_metadata(current_user.get_id())
|
|
||||||
admin_level = current_user.is_in_role('admin')
|
|
||||||
return render_template("edit_profile.html", user_metadata=user_metadata,
|
|
||||||
admin_level=admin_level)
|
|
||||||
|
|
||||||
|
|
||||||
@settings.route("/settings/new_token", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_user
|
|
||||||
def new_token():
|
|
||||||
Users.generate_new_token(current_user.get_id())
|
|
||||||
return redirect(url_for('settings.edit_profile'))
|
|
||||||
|
|
||||||
@settings.route("/settings/create_user", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_admin
|
|
||||||
def create_user():
|
|
||||||
user_id = request.args.get('user_id')
|
|
||||||
error = request.args.get('error')
|
|
||||||
error_mail = request.args.get('error_mail')
|
|
||||||
role = None
|
|
||||||
if user_id:
|
|
||||||
user = Users.User(user_id)
|
|
||||||
if user.exists():
|
|
||||||
role = user.get_role()
|
|
||||||
all_roles = Users.get_all_roles()
|
|
||||||
return render_template("create_user.html", all_roles=all_roles, user_id=user_id, user_role=role,
|
|
||||||
error=error, error_mail=error_mail,
|
|
||||||
admin_level=True)
|
|
||||||
|
|
||||||
|
|
||||||
@settings.route("/settings/create_user_post", methods=['POST'])
|
|
||||||
@login_required
|
|
||||||
@login_admin
|
|
||||||
def create_user_post():
|
|
||||||
email = request.form.get('username')
|
|
||||||
role = request.form.get('user_role')
|
|
||||||
password1 = request.form.get('password1')
|
|
||||||
password2 = request.form.get('password2')
|
|
||||||
|
|
||||||
all_roles = Users.get_all_roles()
|
|
||||||
|
|
||||||
if email and len(email) < 300 and check_email(email) and role:
|
|
||||||
if role in all_roles:
|
|
||||||
# password set
|
|
||||||
if password1 and password2:
|
|
||||||
if password1 == password2:
|
|
||||||
if Users.check_password_strength(password1):
|
|
||||||
password = password1
|
|
||||||
else:
|
|
||||||
return render_template("create_user.html", all_roles=all_roles, error="Incorrect Password",
|
|
||||||
admin_level=True)
|
|
||||||
else:
|
|
||||||
return render_template("create_user.html", all_roles=all_roles, error="Passwords don't match",
|
|
||||||
admin_level=True)
|
|
||||||
# generate password
|
|
||||||
else:
|
|
||||||
password = Users.gen_password()
|
|
||||||
|
|
||||||
if current_user.is_in_role('admin'):
|
|
||||||
str_password = password
|
|
||||||
if Users.exists_user(email):
|
|
||||||
if not password1 and not password2:
|
|
||||||
password = None
|
|
||||||
str_password = 'Password not changed'
|
|
||||||
Users.create_user(email, password=password, role=role)
|
|
||||||
return redirect(url_for('settings.users_list', new_user=email, new_user_password=str_password))
|
|
||||||
|
|
||||||
else:
|
|
||||||
return render_template("create_user.html", all_roles=all_roles, admin_level=True)
|
|
||||||
else:
|
|
||||||
return render_template("create_user.html", all_roles=all_roles, error_mail=True, admin_level=True)
|
|
||||||
|
|
||||||
|
|
||||||
# @settings.route("/settings/users_list", methods=['GET'])
|
|
||||||
# @login_required
|
|
||||||
# @login_admin
|
|
||||||
# def users_list():
|
|
||||||
# all_users = Users.get_users_metadata(Users.get_all_users())
|
|
||||||
# new_user = request.args.get('new_user')
|
|
||||||
# new_user_dict = {}
|
|
||||||
# if new_user:
|
|
||||||
# new_user_dict['email'] = new_user
|
|
||||||
# new_user_dict['edited'] = request.args.get('new_user_edited')
|
|
||||||
# new_user_dict['password'] = request.args.get('new_user_password')
|
|
||||||
# return render_template("users_list.html", all_users=all_users, new_user=new_user_dict, admin_level=True)
|
|
||||||
|
|
||||||
|
|
||||||
@settings.route("/settings/edit_user", methods=['POST'])
|
|
||||||
@login_required
|
|
||||||
@login_admin
|
|
||||||
def edit_user():
|
|
||||||
user_id = request.form.get('user_id')
|
|
||||||
return redirect(url_for('settings.create_user', user_id=user_id))
|
|
||||||
|
|
||||||
|
|
||||||
@settings.route("/settings/passivedns", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_read_only
|
|
||||||
def passive_dns():
|
|
||||||
passivedns_enabled = d4.is_passive_dns_enabled()
|
|
||||||
return render_template("passive_dns.html", passivedns_enabled=passivedns_enabled)
|
|
||||||
|
|
||||||
|
|
||||||
@settings.route("/settings/passivedns/change_state", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_admin
|
|
||||||
def passive_dns_change_state():
|
|
||||||
new_state = request.args.get('state') == 'enable'
|
|
||||||
passivedns_enabled = d4.change_passive_dns_state(new_state)
|
|
||||||
return redirect(url_for('settings.passive_dns'))
|
|
||||||
|
|
||||||
|
|
||||||
@settings.route("/settings/ail", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_admin
|
|
||||||
def ail_configs():
|
|
||||||
return render_template("ail_configs.html", passivedns_enabled=None)
|
|
||||||
|
|
||||||
|
|
||||||
# ========= REGISTRATION =========
|
|
||||||
app.register_blueprint(settings, url_prefix=baseUrl)
|
|
|
@ -1,153 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<title>Server Management - AIL</title>
|
|
||||||
<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}">
|
|
||||||
|
|
||||||
<!-- Core CSS -->
|
|
||||||
<link href="{{ url_for('static', filename='css/bootstrap4.min.css') }}" rel="stylesheet">
|
|
||||||
<link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="stylesheet">
|
|
||||||
<link href="{{ url_for('static', filename='css/dataTables.bootstrap4.min.css') }}" rel="stylesheet">
|
|
||||||
|
|
||||||
<!-- JS -->
|
|
||||||
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/jquery.dataTables.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.min.js')}}"></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
{% include 'nav_bar.html' %}
|
|
||||||
|
|
||||||
<div class="container-fluid">
|
|
||||||
<div class="row">
|
|
||||||
|
|
||||||
{% include 'settings/menu_sidebar.html' %}
|
|
||||||
|
|
||||||
<div class="col-12 col-lg-10" id="core_content">
|
|
||||||
|
|
||||||
<form class="form-signin" action="{{ url_for('settings.create_user_post')}}" autocomplete="off" method="post">
|
|
||||||
|
|
||||||
<h1 class="h3 mt-1 mb-3 text-center text-secondary">Create User</h1>
|
|
||||||
<label for="inputEmail" class="sr-only">Email address</label>
|
|
||||||
<input type="email" id="inputEmail" name="username" class="form-control {% if error_mail %}is-invalid{% endif %}" placeholder="Email address" autocomplete="off" required {% if user_id %}value="{{user_id}}"{% else %}{% endif %}>
|
|
||||||
{% if error_mail %}
|
|
||||||
<div class="invalid-feedback">
|
|
||||||
Please provide a valid email address
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<label class="mt-3" for="role_selector">User Role</label>
|
|
||||||
<select class="custom-select" id="role_selector" name="user_role">
|
|
||||||
{% for role in all_roles %}
|
|
||||||
{% if role == user_role %}
|
|
||||||
<option value="{{role}}" selected>{{role}}</option>
|
|
||||||
{% else %}
|
|
||||||
<option value="{{role}}">{{role}}</option>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<div class="custom-control custom-switch mt-4 mb-3">
|
|
||||||
<input type="checkbox" class="custom-control-input" id="set_manual_password" value="" onclick="toggle_password_fields();">
|
|
||||||
<label class="custom-control-label" for="set_manual_password">Set Password</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="password-section">
|
|
||||||
<h1 class="h3 mb-3 text-center text-secondary">Create Password</h1>
|
|
||||||
<label for="inputPassword1" class="sr-only">Password</label>
|
|
||||||
<input type="password" id="inputPassword1" name="password1" class="form-control {% if error %}is-invalid{% endif %}" placeholder="Password" autocomplete="new-password">
|
|
||||||
<label for="inputPassword2" class="sr-only">Confirm Password</label>
|
|
||||||
<input type="password" id="inputPassword2" name="password2" class="form-control {% if error %}is-invalid{% endif %}" placeholder="Confirm Password" value="" autocomplete="new-password">
|
|
||||||
{% if error %}
|
|
||||||
<div class="invalid-feedback">
|
|
||||||
{{error}}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<button class="btn btn-lg btn-primary btn-block mt-3" type="submit">Submit</button>
|
|
||||||
|
|
||||||
<div id="password-section-info">
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<h5 class="h3 mb-3 text-center text-secondary">Password Requirements</h5>
|
|
||||||
<ul class="list-group">
|
|
||||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
||||||
Minimal length
|
|
||||||
<span class="badge badge-primary badge-pill">10</span>
|
|
||||||
</li>
|
|
||||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
||||||
Upper characters: A-Z
|
|
||||||
<span class="badge badge-primary badge-pill">1</span>
|
|
||||||
</li>
|
|
||||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
||||||
Lower characters: a-z
|
|
||||||
<span class="badge badge-primary badge-pill">1</span>
|
|
||||||
</li>
|
|
||||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
||||||
Digits: 0-9
|
|
||||||
<span class="badge badge-primary badge-pill">2</span>
|
|
||||||
</li>
|
|
||||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
||||||
Maximum length
|
|
||||||
<span class="badge badge-primary badge-pill">100</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
$(document).ready(function(){
|
|
||||||
$("#password-section").hide();
|
|
||||||
$("#password-section-info").hide();
|
|
||||||
$("#nav_create_user").addClass("active");
|
|
||||||
$("#nav_user_management").removeClass("text-muted");
|
|
||||||
|
|
||||||
{% if error %}
|
|
||||||
toggle_password_fields();
|
|
||||||
{% endif %}
|
|
||||||
} );
|
|
||||||
|
|
||||||
function toggle_sidebar(){
|
|
||||||
if($('#nav_menu').is(':visible')){
|
|
||||||
$('#nav_menu').hide();
|
|
||||||
$('#side_menu').removeClass('border-right')
|
|
||||||
$('#side_menu').removeClass('col-lg-2')
|
|
||||||
$('#core_content').removeClass('col-lg-10')
|
|
||||||
}else{
|
|
||||||
$('#nav_menu').show();
|
|
||||||
$('#side_menu').addClass('border-right')
|
|
||||||
$('#side_menu').addClass('col-lg-2')
|
|
||||||
$('#core_content').addClass('col-lg-10')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggle_password_fields() {
|
|
||||||
var password_div = $("#password-section");
|
|
||||||
if(password_div.is(":visible")){
|
|
||||||
$("#password-section").hide();
|
|
||||||
$("#password-section-info").hide();
|
|
||||||
$("#inputPassword1").prop('required',false);
|
|
||||||
$("#inputPassword2").prop('required',false);
|
|
||||||
} else {
|
|
||||||
$("#password-section").show();
|
|
||||||
$("#password-section-info").show();
|
|
||||||
$("#inputPassword1").prop('required',true);
|
|
||||||
$("#inputPassword2").prop('required',true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</html>
|
|
|
@ -1,111 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<title>Server Management - AIL</title>
|
|
||||||
<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}">
|
|
||||||
|
|
||||||
<!-- Core CSS -->
|
|
||||||
<link href="{{ url_for('static', filename='css/bootstrap4.min.css') }}" rel="stylesheet">
|
|
||||||
<link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="stylesheet">
|
|
||||||
<link href="{{ url_for('static', filename='css/dataTables.bootstrap4.min.css') }}" rel="stylesheet">
|
|
||||||
|
|
||||||
<!-- JS -->
|
|
||||||
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/jquery.dataTables.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.min.js')}}"></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
{% include 'nav_bar.html' %}
|
|
||||||
|
|
||||||
<div class="container-fluid">
|
|
||||||
<div class="row">
|
|
||||||
|
|
||||||
{% include 'settings/menu_sidebar.html' %}
|
|
||||||
|
|
||||||
<div class="col-12 col-lg-10" id="core_content">
|
|
||||||
|
|
||||||
<div class="card mb-3 mt-1">
|
|
||||||
<div class="card-header text-white bg-dark pb-1">
|
|
||||||
<h5 class="card-title">My Profile :</h5>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xl-6">
|
|
||||||
<div class="card text-center border-secondary">
|
|
||||||
<div class="card-body px-1 py-0">
|
|
||||||
<table class="table table-sm">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>Email</td>
|
|
||||||
<td>{{user_metadata['email']}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Role</td>
|
|
||||||
<td>{{user_metadata['role']}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>API Key</td>
|
|
||||||
<td>
|
|
||||||
<span id="censored_key">
|
|
||||||
{{user_metadata['api_key'][:4]}}*********************************{{user_metadata['api_key'][-4:]}}
|
|
||||||
</span>
|
|
||||||
<span id="uncensored_key" style="display: none;">
|
|
||||||
{{user_metadata['api_key']}}
|
|
||||||
</span>
|
|
||||||
<a class="ml-3" href="{{url_for('settings.new_token')}}"><i class="fa fa-random"></i></a>
|
|
||||||
<span class="btn btn-outline-secondary ml-1 px-1 py-0" id="btn_key" onclick="show_api_key();">
|
|
||||||
<i class="fas fa-eye"></i>
|
|
||||||
</span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
$(document).ready(function(){
|
|
||||||
$("#nav_edit_profile").addClass("active");
|
|
||||||
$("#nav_my_profile").removeClass("text-muted");
|
|
||||||
} );
|
|
||||||
|
|
||||||
function toggle_sidebar(){
|
|
||||||
if($('#nav_menu').is(':visible')){
|
|
||||||
$('#nav_menu').hide();
|
|
||||||
$('#side_menu').removeClass('border-right')
|
|
||||||
$('#side_menu').removeClass('col-lg-2')
|
|
||||||
$('#core_content').removeClass('col-lg-10')
|
|
||||||
}else{
|
|
||||||
$('#nav_menu').show();
|
|
||||||
$('#side_menu').addClass('border-right')
|
|
||||||
$('#side_menu').addClass('col-lg-2')
|
|
||||||
$('#core_content').addClass('col-lg-10')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function show_api_key() {
|
|
||||||
$('#censored_key').hide();
|
|
||||||
$('#btn_key').hide();
|
|
||||||
$('#uncensored_key').show();
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</html>
|
|
|
@ -1 +0,0 @@
|
||||||
<li id='page-hiddenServices'><a href="{{ url_for('settings_b.settings_page') }}"><i class="fa fa-cog"></i> Server Management </a></li>
|
|
|
@ -1,202 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<title>Server Management - AIL</title>
|
|
||||||
<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}">
|
|
||||||
|
|
||||||
<!-- Core CSS -->
|
|
||||||
<link href="{{ url_for('static', filename='css/bootstrap4.min.css') }}" rel="stylesheet">
|
|
||||||
<link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="stylesheet">
|
|
||||||
<link href="{{ url_for('static', filename='css/dataTables.bootstrap4.min.css') }}" rel="stylesheet">
|
|
||||||
|
|
||||||
<!-- JS -->
|
|
||||||
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/jquery.dataTables.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.min.js')}}"></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
{% include 'nav_bar.html' %}
|
|
||||||
|
|
||||||
<div class="container-fluid">
|
|
||||||
<div class="row">
|
|
||||||
|
|
||||||
{% include 'settings/menu_sidebar.html' %}
|
|
||||||
|
|
||||||
<div class="col-12 col-lg-10" id="core_content">
|
|
||||||
|
|
||||||
<div class="card mb-3 mt-1">
|
|
||||||
<div class="card-header text-white bg-dark pb-1">
|
|
||||||
<h5 class="card-title">AIL-framework Status :</h5>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xl-6">
|
|
||||||
<div class="card text-center border-secondary">
|
|
||||||
<div class="card-body px-1 py-0">
|
|
||||||
<table class="table table-sm">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>AIL Version</td>
|
|
||||||
{%if ail_version is not none %}
|
|
||||||
<td>{{current_version}}<a target="_blank" href="https://github.com/ail-project/ail-framework/releases/tag/{{current_version}}" class="text-info"><small> (release note)</small></a></td>
|
|
||||||
{%else%}
|
|
||||||
<td>{{git_metadata['current_branch']}}</td>
|
|
||||||
{%endif%}
|
|
||||||
</tr>
|
|
||||||
<tr
|
|
||||||
{%if git_metadata['current_branch'] != 'master'%}
|
|
||||||
class="table-danger"
|
|
||||||
{%endif%}
|
|
||||||
>
|
|
||||||
<td>Current Branch</td>
|
|
||||||
<td>
|
|
||||||
{%if git_metadata['current_branch'] != 'master'%}
|
|
||||||
<i class="fas fa-times-circle text-danger" data-toggle="tooltip" data-placement="top" title="Please checkout the master branch"></i>
|
|
||||||
{%endif%}
|
|
||||||
{{git_metadata['current_branch']}}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr
|
|
||||||
{%if git_metadata['new_git_update_available']%}
|
|
||||||
class="table-warning"
|
|
||||||
{%endif%}
|
|
||||||
>
|
|
||||||
<td>Current Commit ID</td>
|
|
||||||
<td>
|
|
||||||
{%if git_metadata['new_git_update_available']%}
|
|
||||||
<i class="fas fa-exclamation-triangle text-secondary" data-toggle="tooltip" data-placement="top" title="A New Update Is Available"></i>
|
|
||||||
{%endif%}
|
|
||||||
{{git_metadata['current_commit']}}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr
|
|
||||||
{%if git_metadata['new_git_version_available']%}
|
|
||||||
class="table-danger"
|
|
||||||
{%endif%}
|
|
||||||
>
|
|
||||||
<td>Current Tag</td>
|
|
||||||
<td>
|
|
||||||
{%if git_metadata['new_git_version_available']%}
|
|
||||||
<i class="fas fa-exclamation-circle text-danger" data-toggle="tooltip" data-placement="top" title="A New Version Is Available"></i>
|
|
||||||
{%endif%}
|
|
||||||
{{git_metadata['last_local_tag']}}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-xl-6">
|
|
||||||
<div class="card text-center border-success" id="card_progress">
|
|
||||||
<div class="card-body" id="card_progress_body">
|
|
||||||
<h5 class="card-title">Backgroud Update: <span id="backgroud_update_version"></span></h5>
|
|
||||||
<div class="progress">
|
|
||||||
<div class="progress-bar bg-danger" role="progressbar" id="update_global_progress" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
|
|
||||||
</div>
|
|
||||||
<hr class="my-1">
|
|
||||||
Updating: <strong id="backgroud_update_name"></strong> ...
|
|
||||||
<div class="progress">
|
|
||||||
<div class="progress-bar progress-bar-striped bg-warning progress-bar-animated" role="progressbar" id="update_background_progress" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
|
|
||||||
</div>
|
|
||||||
<div class="text-danger" id="update_error_div">
|
|
||||||
<hr>
|
|
||||||
<h5 class="card-title"><i class="fas fa-times-circle text-danger"></i> Update Error:</h5>
|
|
||||||
<p id="update_error_mess"></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{%if git_metadata['new_git_version_available']%}
|
|
||||||
<div class="alert alert-danger" role="alert">
|
|
||||||
<h4 class="alert-heading">New Version Available!</h4>
|
|
||||||
<hr class="my-0">
|
|
||||||
<p>A new version is available, new version: <strong>{{git_metadata['last_remote_tag']}}</strong></p>
|
|
||||||
<a target="_blank" href="https://github.com/ail-project/ail-framework/releases/tag/{{git_metadata['last_remote_tag']}}"> Check last release note.</a>
|
|
||||||
</div>
|
|
||||||
{%endif%}
|
|
||||||
|
|
||||||
{%if git_metadata['new_git_update_available']%}
|
|
||||||
<div class="alert alert-warning" role="alert">
|
|
||||||
<h4 class="alert-heading">New Update Available!</h4>
|
|
||||||
<hr class="my-0">
|
|
||||||
<p>A new update is available, new commit ID: <strong>{{git_metadata['last_remote_commit']}}</strong></p>
|
|
||||||
<a target="_blank" href="https://github.com/ail-project/ail-framework/commit/{{git_metadata['last_remote_commit']}}"> Check last commit content.</a>
|
|
||||||
</div>
|
|
||||||
{%endif%}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
$(document).ready(function(){
|
|
||||||
$("#nav_server_status").addClass("active");
|
|
||||||
$("#nav_server").removeClass("text-muted");
|
|
||||||
} );
|
|
||||||
|
|
||||||
function toggle_sidebar(){
|
|
||||||
if($('#nav_menu').is(':visible')){
|
|
||||||
$('#nav_menu').hide();
|
|
||||||
$('#side_menu').removeClass('border-right')
|
|
||||||
$('#side_menu').removeClass('col-lg-2')
|
|
||||||
$('#core_content').removeClass('col-lg-10')
|
|
||||||
}else{
|
|
||||||
$('#nav_menu').show();
|
|
||||||
$('#side_menu').addClass('border-right')
|
|
||||||
$('#side_menu').addClass('col-lg-2')
|
|
||||||
$('#core_content').addClass('col-lg-10')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_progress(){
|
|
||||||
$.getJSON("{{ url_for('settings.get_background_update_stats_json') }}", function(data){
|
|
||||||
if(! jQuery.isEmptyObject(data)){
|
|
||||||
$('#card_progress').show();
|
|
||||||
$('#backgroud_update_version').text(data['update_version']);
|
|
||||||
$('#backgroud_update_name').text(data['background_name']);
|
|
||||||
|
|
||||||
$('#update_global_progress').attr('aria-valuenow', data['update_stat']).width(data['update_stat']+'%').text(data['update_stat_label']);
|
|
||||||
$('#update_background_progress').attr('aria-valuenow', data['background_stats']).width(data['background_stats']+'%').text(data['background_stats']+'%');
|
|
||||||
|
|
||||||
if(data['error']){
|
|
||||||
$('#update_error_div').show();
|
|
||||||
$('#update_error_mess').text(data['error_message']);
|
|
||||||
$('#card_progress').removeClass("border-success");
|
|
||||||
$('#card_progress').addClass("border-danger");
|
|
||||||
} else {
|
|
||||||
$('#update_error_div').hide();
|
|
||||||
$('#card_progress').removeClass("border-danger");
|
|
||||||
$('#card_progress').add("border-success");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$('#card_progress').hide();
|
|
||||||
clearInterval(progress_interval);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
update_progress();
|
|
||||||
//Interval
|
|
||||||
var progress_interval = setInterval(function(){
|
|
||||||
update_progress()
|
|
||||||
}, 4000);
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</html>
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
<div id="password-section-info">
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<h5 class="h3 mb-3 text-center text-secondary">Password Requirements</h5>
|
||||||
|
<ul class="list-group">
|
||||||
|
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||||
|
Minimal length
|
||||||
|
<span class="badge badge-primary badge-pill">10</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||||
|
Upper characters: A-Z
|
||||||
|
<span class="badge badge-primary badge-pill">1</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||||
|
Lower characters: a-z
|
||||||
|
<span class="badge badge-primary badge-pill">1</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||||
|
Digits: 0-9
|
||||||
|
<span class="badge badge-primary badge-pill">2</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||||
|
Maximum length
|
||||||
|
<span class="badge badge-primary badge-pill">100</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Create User - AIL</title>
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}">
|
||||||
|
|
||||||
|
<!-- Core CSS -->
|
||||||
|
<link href="{{ url_for('static', filename='css/bootstrap4.min.css') }}" rel="stylesheet">
|
||||||
|
<link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="stylesheet">
|
||||||
|
<link href="{{ url_for('static', filename='css/dataTables.bootstrap.min.css') }}" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- JS -->
|
||||||
|
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/jquery.dataTables.min.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.min.js')}}"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
{% include 'nav_bar.html' %}
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
{% include 'settings/menu_sidebar.html' %}
|
||||||
|
<div class="col-12 col-lg-10" id="core_content">
|
||||||
|
|
||||||
|
{% if new_user %}
|
||||||
|
<div class="text-center my-3 ">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
{% if new_user['edited']=='True' %}
|
||||||
|
<h5 class="card-title">User Edited</h5>
|
||||||
|
{% else %}
|
||||||
|
<h5 class="card-title">User Created</h5>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<p>User: {{new_user['email']}}</p>
|
||||||
|
<p>Password: {{new_user['password']}}</p>
|
||||||
|
<a href="{{url_for('settings_b.users_list')}}" class="btn btn-primary"><i class="fas fa-eye-slash"></i> Hide</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<form class="form-signin" action="{{ url_for('settings_b.create_user_post')}}" autocomplete="off" method="post">
|
||||||
|
|
||||||
|
<h1 class="h3 mt-1 mb-3 text-center text-secondary">{% if meta['id'] %}Edit{% else %}Create{% endif %} User</h1>
|
||||||
|
<label for="inputEmail" class="sr-only">Email address</label>
|
||||||
|
<input type="email" id="inputEmail" name="username" class="form-control {% if error_mail %}is-invalid{% endif %}" placeholder="Email address" autocomplete="off" required {% if meta['id'] %}value="{{ meta['id'] }}"{% endif %} {% if meta['id'] %}disabled{% endif %}>
|
||||||
|
{% if error_mail %}
|
||||||
|
<div class="invalid-feedback">Please provide a valid email address</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<label class="mt-3" for="role_selector">User Role</label>
|
||||||
|
<select class="custom-select" id="role_selector" name="user_role">
|
||||||
|
{% for role in all_roles %}
|
||||||
|
{% if role == meta['role'] %}
|
||||||
|
<option value="{{role}}" selected>{{role}}</option>
|
||||||
|
{% else %}
|
||||||
|
<option value="{{role}}">{{role}}</option>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<div class="custom-control custom-switch mt-4 mb-3">
|
||||||
|
<input type="checkbox" class="custom-control-input" id="set_manual_password" value="" onclick="toggle_password_fields();">
|
||||||
|
<label class="custom-control-label" for="set_manual_password">{% if meta['id'] %}Reset{% else %}Set{% endif %} Password</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="password-section">
|
||||||
|
<h1 class="h3 mb-3 text-center text-secondary">Create Password</h1>
|
||||||
|
<label for="inputPassword1" class="sr-only">Password</label>
|
||||||
|
<input type="password" id="inputPassword1" name="password1" class="form-control {% if error %}is-invalid{% endif %}" placeholder="Password" autocomplete="new-password">
|
||||||
|
<label for="inputPassword2" class="sr-only">Confirm Password</label>
|
||||||
|
<input type="password" id="inputPassword2" name="password2" class="form-control {% if error %}is-invalid{% endif %}" placeholder="Confirm Password" value="" autocomplete="new-password">
|
||||||
|
{% if error %}
|
||||||
|
<div class="invalid-feedback">{{error}}</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="btn btn-lg btn-primary btn-block mt-3" type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{% include 'settings/block_password_requirements.html' %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
$("#password-section").hide();
|
||||||
|
$("#password-section-info").hide();
|
||||||
|
$("#nav_create_user").addClass("active");
|
||||||
|
$("#nav_user_management").removeClass("text-muted");
|
||||||
|
|
||||||
|
{% if error %}
|
||||||
|
toggle_password_fields();
|
||||||
|
{% endif %}
|
||||||
|
} );
|
||||||
|
|
||||||
|
function toggle_sidebar(){
|
||||||
|
if($('#nav_menu').is(':visible')){
|
||||||
|
$('#nav_menu').hide();
|
||||||
|
$('#side_menu').removeClass('border-right')
|
||||||
|
$('#side_menu').removeClass('col-lg-2')
|
||||||
|
$('#core_content').removeClass('col-lg-10')
|
||||||
|
}else{
|
||||||
|
$('#nav_menu').show();
|
||||||
|
$('#side_menu').addClass('border-right')
|
||||||
|
$('#side_menu').addClass('col-lg-2')
|
||||||
|
$('#core_content').addClass('col-lg-10')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggle_password_fields() {
|
||||||
|
var password_div = $("#password-section");
|
||||||
|
if(password_div.is(":visible")){
|
||||||
|
$("#password-section").hide();
|
||||||
|
$("#password-section-info").hide();
|
||||||
|
$("#inputPassword1").prop('required',false);
|
||||||
|
$("#inputPassword2").prop('required',false);
|
||||||
|
} else {
|
||||||
|
$("#password-section").show();
|
||||||
|
$("#password-section-info").show();
|
||||||
|
$("#inputPassword1").prop('required',true);
|
||||||
|
$("#inputPassword2").prop('required',true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</html>
|
|
@ -44,23 +44,23 @@
|
||||||
<span>Settings</span>
|
<span>Settings</span>
|
||||||
</h5>
|
</h5>
|
||||||
<ul class="nav flex-md-column flex-row navbar-nav justify-content-between w-100"> <!--nav-pills-->
|
<ul class="nav flex-md-column flex-row navbar-nav justify-content-between w-100"> <!--nav-pills-->
|
||||||
<!-- <li class="nav-item">
|
{# <li class="nav-item">#}
|
||||||
<a class="nav-link" href="{{url_for('settings.ail_configs')}}" id="nav_ail_configs">
|
{# <a class="nav-link" href="{{url_for('settings_b.ail_configs')}}" id="nav_ail_configs">#}
|
||||||
<img src="{{ url_for('static', filename='image/ail.png')}}" alt="AIL servers" style="width:25px;">
|
{# <img src="{{ url_for('static', filename='image/ail.png')}}" alt="AIL servers" style="width:25px;">#}
|
||||||
<span>AIL Configs</span>
|
{# <span>AIL Configs</span>#}
|
||||||
</a>
|
{# </a>#}
|
||||||
</li> -->
|
{# </li>#}
|
||||||
<!-- <li class="nav-item">
|
{# <li class="nav-item">#}
|
||||||
<a class="nav-link" href="{{url_for('settings.passive_dns')}}" id="nav_data_retention">
|
{# <a class="nav-link" href="{{url_for('settings_b.passive_dns')}}" id="nav_data_retention">#}
|
||||||
<i class="fas fa-database"></i>
|
{# <i class="fas fa-database"></i>#}
|
||||||
<i class="fas fa-hourglass"></i>
|
{# <i class="fas fa-hourglass"></i>#}
|
||||||
<i class="fas fa-clock"></i>
|
{# <i class="fas fa-clock"></i>#}
|
||||||
<i class="fas fa-stopwatch"></i>
|
{# <i class="fas fa-stopwatch"></i>#}
|
||||||
<span>Data Retention</span>
|
{# <span>Data Retention</span>#}
|
||||||
</a>
|
{# </a>#}
|
||||||
</li> -->
|
{# </li>#}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{{url_for('settings.passive_dns')}}" id="passive_dns">
|
<a class="nav-link" href="{{url_for('settings_b.passive_dns')}}" id="passive_dns">
|
||||||
<img src="{{ url_for('static', filename='image/d4-logo.png')}}" alt="D4 project" style="width:25px;">
|
<img src="{{ url_for('static', filename='image/d4-logo.png')}}" alt="D4 project" style="width:25px;">
|
||||||
<span>Passive DNS</span>
|
<span>Passive DNS</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -71,7 +71,7 @@
|
||||||
</h5>
|
</h5>
|
||||||
<ul class="nav flex-md-column flex-row navbar-nav justify-content-between w-100"> <!--nav-pills-->
|
<ul class="nav flex-md-column flex-row navbar-nav justify-content-between w-100"> <!--nav-pills-->
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{{url_for('settings.edit_profile')}}" id="nav_edit_profile">
|
<a class="nav-link" href="{{url_for('settings_b.user_profile')}}" id="nav_edit_profile">
|
||||||
<i class="fas fa-user-edit"></i>
|
<i class="fas fa-user-edit"></i>
|
||||||
<span>My Profile</span>
|
<span>My Profile</span>
|
||||||
</a>
|
</a>
|
||||||
|
@ -89,7 +89,7 @@
|
||||||
</h5>
|
</h5>
|
||||||
<ul class="nav flex-md-column flex-row navbar-nav justify-content-between w-100"> <!--nav-pills-->
|
<ul class="nav flex-md-column flex-row navbar-nav justify-content-between w-100"> <!--nav-pills-->
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="{{url_for('settings.create_user')}}" id="nav_create_user">
|
<a class="nav-link" href="{{url_for('settings_b.create_user')}}" id="nav_create_user">
|
||||||
<i class="fas fa-user-plus"></i>
|
<i class="fas fa-user-plus"></i>
|
||||||
<span>Create User</span>
|
<span>Create User</span>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -55,13 +55,13 @@
|
||||||
|
|
||||||
|
|
||||||
{% if passivedns_enabled %}
|
{% if passivedns_enabled %}
|
||||||
<a href="{{ url_for('settings.passive_dns_change_state') }}?state=disable">
|
<a href="{{ url_for('settings_b.passive_dns_change_state') }}?state=disable">
|
||||||
<button class="btn btn-danger mx-4 my-2">
|
<button class="btn btn-danger mx-4 my-2">
|
||||||
Disable D4 Client
|
Disable D4 Client
|
||||||
</button>
|
</button>
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href="{{ url_for('settings.passive_dns_change_state') }}?state=enable">
|
<a href="{{ url_for('settings_b.passive_dns_change_state') }}?state=enable">
|
||||||
<button class="btn btn-primary mx-4 my-2">
|
<button class="btn btn-primary mx-4 my-2">
|
||||||
Enable D4 Client
|
Enable D4 Client
|
||||||
</button>
|
</button>
|
|
@ -0,0 +1,107 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>User Profile - AIL</title>
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}">
|
||||||
|
|
||||||
|
<!-- Core CSS -->
|
||||||
|
<link href="{{ url_for('static', filename='css/bootstrap4.min.css') }}" rel="stylesheet">
|
||||||
|
<link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="stylesheet">
|
||||||
|
<link href="{{ url_for('static', filename='css/dataTables.bootstrap.min.css') }}" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- JS -->
|
||||||
|
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/jquery.dataTables.min.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.min.js')}}"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
{% include 'nav_bar.html' %}
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
{% include 'settings/menu_sidebar.html' %}
|
||||||
|
|
||||||
|
<div class="col-12 col-lg-10" id="core_content">
|
||||||
|
|
||||||
|
<div class="card mb-3 mt-1">
|
||||||
|
<div class="card-header text-white bg-dark pb-1">
|
||||||
|
<h5 class="card-title">My Profile :</h5>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xl-6">
|
||||||
|
<div class="card text-center border-secondary">
|
||||||
|
<div class="card-body px-1 py-0">
|
||||||
|
<table class="table table-sm">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Email</td>
|
||||||
|
<td>{{meta['id']}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Role</td>
|
||||||
|
<td>{{meta['role']}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>API Key</td>
|
||||||
|
<td>
|
||||||
|
<span id="censored_key">
|
||||||
|
{{meta['api_key'][:4]}}*********************************{{meta['api_key'][-4:]}}
|
||||||
|
</span>
|
||||||
|
<span id="uncensored_key" style="display: none;">
|
||||||
|
{{meta['api_key']}}
|
||||||
|
</span>
|
||||||
|
<a class="ml-3" href="{{url_for('settings_b.new_token_user_self')}}"><i class="fa fa-random"></i></a>
|
||||||
|
<span class="btn btn-outline-secondary ml-1 px-1 py-0" id="btn_key" onclick="show_api_key();">
|
||||||
|
<i class="fas fa-eye"></i>
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
$("#nav_edit_profile").addClass("active");
|
||||||
|
$("#nav_my_profile").removeClass("text-muted");
|
||||||
|
} );
|
||||||
|
|
||||||
|
function toggle_sidebar(){
|
||||||
|
if($('#nav_menu').is(':visible')){
|
||||||
|
$('#nav_menu').hide();
|
||||||
|
$('#side_menu').removeClass('border-right')
|
||||||
|
$('#side_menu').removeClass('col-lg-2')
|
||||||
|
$('#core_content').removeClass('col-lg-10')
|
||||||
|
}else{
|
||||||
|
$('#nav_menu').show();
|
||||||
|
$('#side_menu').addClass('border-right')
|
||||||
|
$('#side_menu').addClass('col-lg-2')
|
||||||
|
$('#core_content').addClass('col-lg-10')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_api_key() {
|
||||||
|
$('#censored_key').hide();
|
||||||
|
$('#btn_key').hide();
|
||||||
|
$('#uncensored_key').show();
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</html>
|
|
@ -27,25 +27,6 @@
|
||||||
{% include 'settings/menu_sidebar.html' %}
|
{% include 'settings/menu_sidebar.html' %}
|
||||||
<div class="col-12 col-lg-10" id="core_content">
|
<div class="col-12 col-lg-10" id="core_content">
|
||||||
|
|
||||||
{% if new_user %}
|
|
||||||
<div class="text-center my-3 ">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-header">
|
|
||||||
{% if new_user['edited']=='True' %}
|
|
||||||
<h5 class="card-title">User Edited</h5>
|
|
||||||
{% else %}
|
|
||||||
<h5 class="card-title">User Created</h5>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<p>User: {{new_user['email']}}</p>
|
|
||||||
<p>Password: {{new_user['password']}}</p>
|
|
||||||
<a href="{{url_for('settings.users_list')}}" class="btn btn-primary"><i class="fas fa-eye-slash"></i> Hide</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<h3>AIL Users:</h3>
|
<h3>AIL Users:</h3>
|
||||||
<table id="tableusers" class="table table-hover table-striped">
|
<table id="tableusers" class="table table-hover table-striped">
|
||||||
<thead class="thead-dark">
|
<thead class="thead-dark">
|
||||||
|
@ -80,12 +61,9 @@
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="d-flex justify-content-start">
|
<div class="d-flex justify-content-start">
|
||||||
<form action="{{ url_for('settings.edit_user') }}" id="post_edit_user" method=POST>
|
<a class="btn btn-outline-primary ml-3 px-1 py-0" href="{{ url_for('settings_b.edit_user', user_id=user['id']) }}">
|
||||||
<input type="hidden" name="user_id" value="{{user['id']}}">
|
|
||||||
<button class="btn btn-outline-primary ml-3 px-1 py-0" type="submit">
|
|
||||||
<i class="fas fa-pencil-alt"></i>
|
<i class="fas fa-pencil-alt"></i>
|
||||||
</button>
|
</a>
|
||||||
</form>
|
|
||||||
<a class="btn btn-outline-danger ml-3 px-1 py-0" href="{{ url_for('settings_b.delete_user', user_id=user['id']) }}">
|
<a class="btn btn-outline-danger ml-3 px-1 py-0" href="{{ url_for('settings_b.delete_user', user_id=user['id']) }}">
|
||||||
<i class="fas fa-trash-alt"></i>
|
<i class="fas fa-trash-alt"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
Loading…
Reference in New Issue