{% extends "base.html" %} {% set active_page = "admin_keys" %} {% if create %} {% set action_label = 'Create' %} {% set form_action = url_for('admin.edit_key') %} {% else %} {% set action_label = 'Edit' %} {% set form_action = url_for('admin.edit_key', key_id=key.id) %} {% endif %} {% if (key is not none and key.role.name != "User") %}{% set hide_opts = True %}{% else %} {% set hide_opts = False %}{% endif %} {% block title %}<title>{{ action_label }} API Key - {{ 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 }} API Key</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_keys') }}">API Keys</a></li> <li class="breadcrumb-item active">{{ action_label }} API Key</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"> <h3 class="card-title">API Key Editor</h3> </div> <!-- /.card-header --> <div class="card-body"> <div class="form-group has-feedback"> <label class="control-label" for="role">Role</label> <select class="key_role form-control" id="key_role" name="key_role"> {% for role in roles %} <option value="{{ role.name }}" {% if (key is not none) and (role.id==key.role.id) %}selected{% endif %} {% if (key is none) and (role.name=="User") %}selected{% endif %}> {{ role.name }} </option> {% endfor %} </select> </div> <!-- /.form-group --> <div class="form-group has-feedback"> <label class="control-label" for="description">Description</label> <input type="text" class="form-control" placeholder="Description" name="description" {% if key is not none %} value="{{ key.description }}" {% endif %}> <span class="glyphicon glyphicon-pencil form-control-feedback"></span> </div> <!-- /.form-group --> </div> <!-- /.card-body --> <div class="card-header key-opts"{% if hide_opts %} style="display: none;"{% endif %}> <h3 class="card-title">Accounts Access Control</h3> </div> <!-- /.card-header --> <div class="card-body key-opts"{% if hide_opts %} style="display: none;"{% endif %}> <p>This key will be linked to the accounts on the right,</p> <p>thus granting access to zones owned by the selected accounts.</p> <p>Click on accounts to move between the columns.</p> <div class="form-group col-2"> <select multiple="multiple" class="form-control" id="key_multi_account" name="key_multi_account"> {% for account in accounts %} <option {% if key and account in key.accounts %}selected{% endif %} value="{{ account.name }}">{{ account.name }}</option> {% endfor %} </select> </div> <!-- /.form-group --> </div> <!-- /.card-body --> <div class="card-header key-opts"{% if hide_opts %} style="display: none;"{% endif %}> <h3 class="card-title">Zone Access Control</h3> </div> <!-- /.card-header --> <div class="card-body key-opts"{% if hide_opts %} style="display: none;"{% endif %}> <p>This key will have access to the zones on the right.</p> <p>Click on zones to move between the columns.</p> <div class="form-group col-2"> <select multiple="multiple" class="form-control" id="key_multi_domain" name="key_multi_domain"> {% for domain in domains %} <option {% if key and domain in key.domains %}selected{% endif %} value="{{ domain.name }}">{{ domain.name }}</option> {% endfor %} </select> </div> </div> <!-- /.card-body --> <div class="card-footer"> <button type="button" class="btn btn-secondary float-left" title="Cancel" onclick="window.location.href='{{ url_for('admin.manage_keys') }}'"> <i class="fa-solid fa-window-close"></i> Cancel </button> <button type="submit" class="btn btn-primary float-right" title="{{ action_label }} API Key" id="key_submit"> <i class="fa-solid fa-save"></i> {{ action_label }} API Key </button> </div> <!-- /.card-footer --> </div> <!-- /.card --> </form> </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">API Key Editor Help</h3> </div> <!-- /.card-header --> <div class="card-body"> <p>Fill in all the fields in the form to the left.</p> <p><strong>Role</strong> The role of the key.</p> <p><strong>Description</strong> The key description.</p> <p><strong>Access Control</strong> The zones or accounts which the key has access to.</p> </div> <!-- /.card-body --> </div> <!-- /.card --> </div> <!-- /.col --> </div> <!-- /.row --> </div> <!-- /.container-fluid --> </section> {% endblock %} {% block extrascripts %} <script> $('form').submit(function (e) { var selectedRole = $("#key_role").val(); var selectedDomains = $("#key_multi_domain option:selected").length; var selectedAccounts = $("#key_multi_account option:selected").length; var warn_modal = $("#modal_warning"); if (selectedRole != "User" && selectedDomains > 0 && selectedAccounts > 0) { var warning = "Administrator and Operators have access to all zones. Your zone an account selection won't be saved."; e.preventDefault(e); warn_modal.modal('show'); } if (selectedRole == "User" && selectedDomains == 0 && selectedAccounts == 0) { var warning = "User role must have at least one account or one zone bound. None selected."; e.preventDefault(e); warn_modal.modal('show'); } warn_modal.find('.modal-body p').text(warning); warn_modal.find('#button_key_confirm_warn').click(clearModal); }); function clearModal() { $("#modal_warning").modal('hide'); } $('#key_role').on('change', function (e) { var optionSelected = $("option:selected", this); if (this.value != "User") { // Clear the visible list $('#ms-key_multi_domain .ms-selection li').each(function () { $(this).css('display', 'none'); }) $('#ms-key_multi_domain .ms-selectable li').each(function () { $(this).css('display', ''); }) $('#ms-key_multi_account .ms-selection li').each(function () { $(this).css('display', 'none'); }) $('#ms-key_multi_account .ms-selectable li').each(function () { $(this).css('display', ''); }) // Deselect invisible selectbox $('#key_multi_domain option:selected').each(function () { $(this).prop('selected', false); }) $('#key_multi_account option:selected').each(function () { $(this).prop('selected', false); }) // Hide the lists $(".key-opts").hide(); } else { $(".key-opts").show(); } }); $("#key_multi_domain").multiSelect({ selectableHeader: "<input type='text' class='search-input' autocomplete='off' placeholder='Zone Name'>", selectionHeader: "<input type='text' class='search-input' autocomplete='off' placeholder='Zone Name'>", afterInit: function (ms) { var that = this, $selectableSearch = that.$selectableUl.prev(), $selectionSearch = that.$selectionUl.prev(), selectableSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selectable:not(.ms-selected)', selectionSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selection.ms-selected'; that.qs1 = $selectableSearch.quicksearch(selectableSearchString) .on('keydown', function (e) { if (e.which === 40) { that.$selectableUl.focus(); return false; } }); that.qs2 = $selectionSearch.quicksearch(selectionSearchString) .on('keydown', function (e) { if (e.which == 40) { that.$selectionUl.focus(); return false; } }); }, afterSelect: function () { this.qs1.cache(); this.qs2.cache(); }, afterDeselect: function () { this.qs1.cache(); this.qs2.cache(); } }); $("#key_multi_account").multiSelect({ selectableHeader: "<input type='text' class='search-input' autocomplete='off' placeholder='Account Name'>", selectionHeader: "<input type='text' class='search-input' autocomplete='off' placeholder='Account Name'>", afterInit: function (ms) { var that = this, $selectableSearch = that.$selectableUl.prev(), $selectionSearch = that.$selectionUl.prev(), selectableSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selectable:not(.ms-selected)', selectionSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selection.ms-selected'; that.qs1 = $selectableSearch.quicksearch(selectableSearchString) .on('keydown', function (e) { if (e.which === 40) { that.$selectableUl.focus(); return false; } }); that.qs2 = $selectionSearch.quicksearch(selectionSearchString) .on('keydown', function (e) { if (e.which == 40) { that.$selectionUl.focus(); return false; } }); }, afterSelect: function () { this.qs1.cache(); this.qs2.cache(); }, afterDeselect: function () { this.qs1.cache(); this.qs2.cache(); } }); {% if plain_key %} $(document.body).ready(function () { var modal = $("#modal_show_key"); var info = "Please copy this key to a secure location. You will be unable to view it again once you close this window: {{ plain_key }}"; modal.find('.modal-body p').text(info); modal.find('#button_key_confirm').click(redirect_modal); modal.find('#button_close_modal').click(redirect_modal); modal.modal('show'); }); function redirect_modal() { window.location.href = '{{ url_for('admin.manage_keys') }}'; modal.modal('hide'); } {% endif %} </script> {% endblock %} {% block modals %} <div class="modal fade" id="modal_show_key"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">New API Key</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close" id="button_close_modal"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" id="button_key_confirm"> Confirm </button> </div> </div> </div> </div> <div class="modal fade" id="modal_warning"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">WARNING</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close" id="button_close_warn_modal"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary close" data-dismiss="modal" id="button_close_modal"> Close </button> <button type="button" class="btn btn-primary" id="button_key_confirm_warn"> OK </button> </div> </div> </div> </div> {% endblock %}