EVOLUTION-MANAGER
Edit File: add-user-dialog.template
<!-- (C) 2022 - ntop.org Dialog used to add a new user in ntopng --> <div id="add_user_dialog" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="add_user_dialog_label" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class='modal-title' id="add_user_dialog_label">{* messages.ntopng *}</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <form data-bs-toggle="validator" id="form_add_user" method="post" accept-charset="UTF-8"> <div class="modal-body"> <div id="add_user_alert_placeholder"></div> <input name="csrf" type="hidden" value="{* csrf *}"/> <div class="form-group mb-3"> <label for="username_input">{* messages.username *}</label> <div class="input-group mb-6"> <span class="input-group-text"><i class="fas fa-user-circle" aria-hidden="true"></i></span> <input id="username_input" type="text" name="username" value="" class="form-control" data-pattern="username" required> </div> </div> <div class="form-group mb-3"> <label for="full_name_input">{* messages.full_name *}</label> <div class="input-group mb-6"> <span class="input-group-text"><i class="fas fa-user" aria-hidden="true"></i></span> <input id="full_name_input" type="text" name="full_name" value="" class="form-control"> </div> </div> <div class="form-group mb-3"> <label for="password_input">{* messages.password *}</label> <div class="input-group mb-6"> <span class="input-group-text"><i class="fas fa-lock"></i></span> <input id="password_input" type="password" name="password" value="" class="form-control" data-pattern="password" required> </div> </div> <div class="form-group mb-3"> <label for="confirm_password_input">{* messages.confirm_password *}</label> <div class="input-group mb-6"> <span class="input-group-text"><i class="fas fa-lock"></i></span> <input id="confirm_password_input" type="password" name="confirm_password" value="" class="form-control" data-pattern="password" required> </div> </div> <div class="form-group mb-3"> <label for="user_role">{* messages.user_role *}</label> <div class="input-group mb-6"> <select id="user_role" name="user_role" class="form-select" style="width:100%;"> <option value="unprivileged">{* messages.non_privileged_user *}</option> <option value="administrator">{* messages.administrator *}</option> </select> </div> </div> <div id="unprivileged_input"> <div class="form-group mb-3"> <label for="allowed_interface_input">{* messages.allowed_interface *}</label> <div class="input-group mb-6"> <select id="allowed_interface_input" name="allowed_interface" class="form-select "> <option value="">{* messages.any_interface *}</option> {% for _, interface in pairsByKeys(interfaces_names, asc) do %} <option value="{* interface.id *}">{* interface.label *}</option> {% end %} </select> </div> </div> <div class="form-group mb-3"> <label for="allowed_networks_input">{* messages.allowed_networks *}</label> <div class="input-group mb-6"> <input id="allowed_networks_input" type="text" name="allowed_networks" value="" class="form-control"> <small>{* messages.allowed_networks_descr *}</small> </div> </div> <div class="form-group mb-3"> <label for="allow_alerts">{* messages.allow_alerts *}</label> <div class="form-check form-switch"> <input class="form-check-input" type="checkbox" name="allow_alerts" value="1"> <small>{* messages.allow_alerts_descr *}</small> </div> </div> {% if clickhouse_enabled then %} <div class="form-group mb-3"> <label for="allow_historical_flows">{* messages.allow_historical_flows *}</label> <div class="form-check form-switch"> <input class="form-check-input" type="checkbox" name="allow_historical_flows" value="1"> <small>{* messages.allow_historical_flows_descr *}</small> </div> </div> {% end %} {% if is_pcap_download_available then %} <div class="form-group mb-3"> <label for="allow_pcap_download">{* messages.allow_pcap_download *}</label> <div class="form-check form-switch"> <input class="form-check-input" type="checkbox" name="allow_pcap_download" value="1"> <small>{* messages.allow_pcap_download_descr *}</small> </div> </div> {% end %} </div> <div class="form-group mb-3"> <label for="add_user_language">{* messages.language *}</label> <div class="input-group mb-3"> <span class="input-group-text"><i class="fas fa-language" aria-hidden="true"></i></span> <select id="add_user_language" name="add_user_language" class="form-select"> {% for _, lang in ipairs(available_locales) do %} <option value="{* lang.code *}">{* lang.label *}</option> {% end %} </select> </div> </div> </div> <!-- modal-body --> <div class='modal-footer'> <button id="add_user_submit" class="btn btn-primary btn-block">{* messages.add_new_user *}</button> </div> </form> </div> </div> </div> <!-- add_user_dialog --> <script type="text/javascript"> const add_user_alert = { error: function(message, no_close) { $('#add_user_alert_placeholder').html('<div class="alert alert-dismissible alert-danger">' + message + (no_close ? '' : '<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>') + '</div>'); }, success: function(message) { $('#add_user_alert_placeholder').html('<div class="alert alert-success">' + message); } } /* Reset modal on close */ $("#add_user_dialog").on('hidden.bs.modal', function() { frmadduser[0].reset(); }) /* Reset modal on open */ $("#add_user_dialog").on('show.bs.modal', function() { resetAddUserForm(); }) $("#user_role").change(function() { if ($(this).val() == "unprivileged") $('#unprivileged_input').show(); else $('#unprivileged_input').hide(); }); $("#add_lifetime_selection_table label").attr("disabled", "disabled"); $("#add_lifetime_selection_table input").attr("disabled", "disabled"); $("#add_lifetime_unlimited").click(function(){ $("#add_lifetime_selection_table label").attr("disabled", "disabled"); $("#add_lifetime_selection_table input").attr("disabled", "disabled"); $("#add_lifetime_limited").removeAttr("checked").prop("checked", false); }); $("#add_lifetime_limited").click(function() { $("#add_lifetime_selection_table label").removeAttr("disabled"); $("#add_lifetime_selection_table input").removeAttr("disabled"); $("#add_lifetime_unlimited").removeAttr("checked").prop("checked", false); }); var frmadduser = $('#form_add_user'); function resetAddUserForm() { $("#username_input").val(""); $("#full_name_input").val(""); $("#password_input").val(""); $("#confirm_password_input").val(""); $("#allowed_networks_input").val("0.0.0.0/0,::/0"); } resetAddUserForm(); $(`#add_user_submit`).on('click', function () { if(!isValidPassword($("#password_input").val())) { add_user_alert.error("{* i18n("invalid_password") *}"); return(false); } if(isDefaultPassword($("#password_input").val())) { add_user_alert.error("Password is weak. Please choose a stronger password."); return(false); } if(!isValid($("#username_input").val())) { add_user_alert.error("Username must contain only letters and numbers"); return(false); } if($("#username_input").val().length < 5) { add_user_alert.error("Username too short (5 or more characters)"); return(false); } if($("#full_name_input").val().length < 5) { add_user_alert.error("Full Name too short (5 or more characters)"); return(false); } if($("#password_input").val().length < 5) { add_user_alert.error("Password too short (5 or more characters)"); return(false); } if($("#password_input").val() != $("#confirm_password_input").val()) { add_user_alert.error("Password don't match"); return(false); } if($("#allowed_networks_input").val().length == 0) { add_user_alert.error("Network list not specified"); return(false); } else { var arrayOfStrings = $("#allowed_networks_input").val().split(","); for (var i=0; i < arrayOfStrings.length; i++) { if(!NtopUtils.is_network_mask(arrayOfStrings[i])) { add_user_alert.error("Invalid network list specified ("+arrayOfStrings[i]+")"); return(false); } } } $.getJSON('{* http_prefix *}/lua/admin/validate_new_user.lua?username='+$("#username_input").val()+"&allowed_networks="+$("#allowed_networks_input").val(), function(data){ if (!data.valid) { add_user_alert.error(data.msg); } else { $.ajax({ type: frmadduser.attr('method'), url: '{* add_user_endpoint *}', data: frmadduser.serialize(), success: function (data) { const tmp = '{* location_href *}' frmadduser[0].reset(); window.location.href = tmp; }, error: function (data) { add_user_alert.error("Error while adding the user, please check again the informations and retry."); } }); } }); return false; }); </script>