{% extends "base.html" %} {% set active_page = "admin_users" %} {% if create %} {% set action_label = 'Create' %} {% set form_action = url_for('admin.edit_user') %} {% else %} {% set action_label = 'Edit' %} {% set form_action = url_for('admin.edit_user', user_username=user.username) %} {% endif %} {% block title %}<title>{{ action_label }} User - {{ SITE_NAME }}</title>{% endblock %} {% block dashboard_stat %} <div class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1 class="m-0 text-dark">{{ action_label }} User</h1> </div> <div class="col-sm-6"> <ol class="breadcrumb float-sm-right"> <li class="breadcrumb-item"><a href="{{ url_for('dashboard.dashboard') }}">Dashboard</a></li> <li class="breadcrumb-item"><a href="{{ url_for('admin.manage_user') }}">Users</a></li> <li class="breadcrumb-item active">{{ action_label }} User</li> </ol> </div> </div> </div> </div> {% endblock %} {% block content %} <section class="content"> <div class="container-fluid"> <div class="row"> <div class="col-12 col-sm-6 col-lg-4"> <form role="form" method="post" action="{{ form_action }}"> <input type="hidden" name="_csrf_token" value="{{ csrf_token() }}"> <input type="hidden" name="create" value="{{ create }}"> <div class="card card-outline card-primary shadow"> <div class="card-header with-border"> <h3 class="card-title">User Editor</h3> </div> <!-- /.card-header --> <div class="card-body"> {% if error %} <div class="alert alert-danger alert-dismissible"> <button type="button" class="close" data-dismiss="alert" aria-hidden="true"> × </button> <h4><i class="fa-solid fa-ban"></i> Error!</h4> {{ error }} </div> <span class="help-block">{{ error }}</span> {% endif %} <div class="form-group has-feedback"> <label class="control-label" for="firstname">First Name</label> <input type="text" class="form-control" placeholder="First Name" name="firstname" id="firstname" {% if user %}value="{{ user.firstname }}" {% endif %}> <span class="form-control-feedback"></span> </div> <div class="form-group has-feedback"> <label class="control-label" for="lastname">Last Name</label> <input type="text" class="form-control" placeholder="Last name" name="lastname" id="lastname" {% if user %}value="{{ user.lastname }}" {% endif %}> <span class="form-control-feedback"></span> </div> <div class="form-group has-feedback"> <label class="control-label" for="email">E-mail address</label> <input type="email" class="form-control" placeholder="Email" name="email" id="email" {% if user %}value="{{ user.email }}" {% endif %}> <span class="form-control-feedback"></span> </div> <div class="form-group has-feedback"> <label class="control-label" for="username">Username</label> <input type="text" class="form-control" placeholder="Username" name="username" id="username" {% if user %}value="{{ user.username }}" {% endif %} {% if not create %}disabled{% endif %}> <span class="form-control-feedback"></span> </div> <div class="form-group has-feedback {% if blank_password %}has-error{% endif %}"> <label class="control-label" for="password">Password</label> <input type="password" class="form-control" placeholder="Password {% if create %}(Required){% else %}(Leave blank to keep unchanged){% endif %}" name="password" id="password"> <span class="form-control-feedback"></span> {% if blank_password %} <span class="help-block">The password cannot be blank.</span> {% endif %} </div> </div> <!-- /.card-body --> <div class="card-footer"> <button type="submit" class="btn btn-primary" title="{{ action_label }} User"> {{ action_label }} User </button> </div> <!-- /.card-footer --> </div> </form> {% if not create %} {% if user.otp_secret %} <div class="card"> <div class="card-header"> <h3 class="card-title">Two Factor Authentication</h3> </div> <div class="card-body"> <p>If two-factor authentication is configured for this user and is causing problems due to a lost device or technical issue, it can be disabled here. </p> <p>The user will need to reconfigure two-factor authentication, to re-enable it.</p> <p><strong>Beware: This could compromise security!</strong></p> </div> <div class="card-footer"> <button type="button" class="btn btn-warning button_otp_disable" id="{{ user.username }}"> Disable Two Factor Authentication </button> </div> </div> {% endif %} {% endif %} </div> <!-- /.col --> <div class="col-12 col-sm-6 col-lg-8"> <div class="card card-outline card-secondary shadow"> <div class="card-header"> <h3 class="card-title">User Editor Help</h3> </div> <!-- /.card-header --> <div class="card-body"> <p>Fill in all the fields to the in the form to the left.</p> {% if create %} <p><strong>Newly created users do not have access to any domains.</strong> You will need to grant access to the user once it is created via the domain management buttons on the dashboard. </p> {% else %} <p><strong>Username</strong> cannot be changed.</p> <p><strong>Password</strong> can be left empty to keep the current password.</p> {% endif %} </div> <!-- /.card-body --> </div> <!-- /.card --> </div> <!-- /.col --> </div> <!-- /.row --> </div> <!-- /.container-fluid --> </section> {% endblock %} {% block extrascripts %} <script> // handle disabling two-factor authentication $(document.body).on('click', '.button_otp_disable', function () { var modal = $("#modal_otp_disable"); var username = $(this).prop('id'); var info = "Are you sure you want to disable two factor authentication for user " + username + "?"; modal.find('.modal-body p').text(info); modal.find('#button_otp_disable_confirm').click(function () { var postdata = { 'action': 'user_otp_disable', 'data': username, '_csrf_token': '{{ csrf_token() }}' } applyChanges(postdata, $SCRIPT_ROOT + '/admin/manage-user', false, true); }) modal.modal('show'); }); </script> {% endblock %} {% block modals %} <div class="modal fade modal-warning" id="modal_otp_disable"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h4 class="modal-title">Confirmation</h4> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal"> Close </button> <button type="button" class="btn btn-danger float-right" id="button_otp_disable_confirm"> Disable Two Factor Authentication </button> </div> </div> </div> </div> {% endblock %}