diff --git a/src/dashboard.py b/src/dashboard.py index d5ce4f4..7ca3d68 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -883,10 +883,8 @@ def switch(config_name): check=True, shell=True, capture_output=True).stdout except subprocess.CalledProcessError: return redirect('/') - return redirect(request.referrer) - # Add peer @app.route('/add_peer/', methods=['POST']) def add_peer(config_name): @@ -1315,7 +1313,7 @@ Dashboard Tools Related def get_ping_ip(): config = request.form['config'] sem.acquire(timeout=1) - db = TinyDB(os.path.join(db_path, config_name + ".json")) + db = TinyDB(os.path.join(db_path, config + ".json")) html = "" for i in db.all(): html += '' @@ -1411,7 +1409,7 @@ def init_dashboard(): config['Server']['dashboard_refresh_interval'] = '60000' if 'dashboard_sort' not in config['Server']: config['Server']['dashboard_sort'] = 'status' - # Defualt dashboard peers setting + # Default dashboard peers setting if "Peers" not in config: config['Peers'] = {} if 'peer_global_DNS' not in config['Peers']: @@ -1454,7 +1452,7 @@ if __name__ == "__main__": UPDATE = check_update() configuration_settings = get_dashboard_conf() app_ip = configuration_settings.get("Server", "app_ip") - app_port = configuration_settings.get("Server", "app_port") + app_port = int(configuration_settings.get("Server", "app_port")) wg_conf_path = configuration_settings.get("Server", "wg_conf_path") configuration_settings.clear() - app.run(host=app_ip, debug=False, port=app_port) \ No newline at end of file + app.run(host=app_ip, debug=False, port=app_port) diff --git a/src/static/js/configuration.js b/src/static/js/configuration.js index cc86563..8f27d03 100644 --- a/src/static/js/configuration.js +++ b/src/static/js/configuration.js @@ -1,27 +1,26 @@ let $body = $("body"); // Progress Bar -let $progress_bar = $(".progress-bar") +let $progress_bar = $(".progress-bar"); function startProgressBar(){ $progress_bar.css("width","0%") - $progress_bar.css("opacity", "100") - $progress_bar.css("background", "rgb(255,69,69)") - $progress_bar.css("background", "linear-gradient(145deg, rgba(255,69,69,1) 0%, rgba(0,115,186,1) 100%)") - $progress_bar.css("width","25%") + .css("opacity", "100") + .css("background", "rgb(255,69,69)") + .css("background", + "linear-gradient(145deg, rgba(255,69,69,1) 0%, rgba(0,115,186,1) 100%)") + .css("width","25%"); setTimeout(function(){ stillLoadingProgressBar(); - },300) + },300); } function stillLoadingProgressBar(){ - $progress_bar.css("transition", "3s ease-in-out") - $progress_bar.css("width", "75%") + $progress_bar.css("transition", "3s ease-in-out").css("width", "75%"); } function endProgressBar(){ - $progress_bar.css("transition", "0.3s ease-in-out") - $progress_bar.css("width","100%") + $progress_bar.css("transition", "0.3s ease-in-out").css("width","100%"); setTimeout(function(){ - $progress_bar.css("opacity", "0") - },250) + $progress_bar.css("opacity", "0"); + },250); } @@ -34,9 +33,9 @@ function showToast(msg) { // Config Toggle $body.on("click", ".switch", function (){ $(this).siblings($(".spinner-border")).css("display", "inline-block"); - $(this).remove() + $(this).remove(); location.replace("/switch/"+$(this).attr('id')); -}) +}); // Generating Keys function generate_key(){ @@ -44,12 +43,12 @@ function generate_key(){ "url": "/generate_peer", "method": "GET", }).done(function(res){ - $("#private_key").val(res.private_key) - $("#public_key").val(res.public_key) - $("#preshare_key").val(res.preshared_key) + $("#private_key").val(res.private_key); + $("#public_key").val(res.public_key); + $("#preshare_key").val(res.preshared_key); $("#add_peer_alert").addClass("d-none"); - $("#re_generate_key i").removeClass("rotating") - }) + $("#re_generate_key i").removeClass("rotating"); + }); } function generate_public_key(){ $.ajax({ @@ -58,53 +57,59 @@ function generate_public_key(){ "headers":{"Content-Type": "application/json"}, "data": JSON.stringify({"private_key": $("#private_key").val()}) }).done(function(res){ - if(res['status'] === "failed"){ - $("#add_peer_alert").html(res['msg']); - $("#add_peer_alert").removeClass("d-none"); + if(res.status === "failed"){ + $("#add_peer_alert").html(res.msg).removeClass("d-none"); }else{ $("#add_peer_alert").addClass("d-none"); } - $("#public_key").val(res['data']) - $("#re_generate_key i").removeClass("rotating") - }) + $("#public_key").val(res.data); + $("#re_generate_key i").removeClass("rotating"); + }); } // Add Peer $("#private_key").on("change",function(){ - if ($("#private_key").val().length > 0){ - $("#re_generate_key i").addClass("rotating") - generate_public_key() + if ($(this).val().length > 0){ + $("#re_generate_key i").addClass("rotating"); + generate_public_key(); }else{ - $("#public_key").removeAttr("disabled") - $("#public_key").val("") + $("#public_key").removeAttr("disabled").val(""); } -}) +}); + $('#add_modal').on('show.bs.modal', function (event) { - generate_key() -}) -$("#re_generate_key").click(function (){ - $("#public_key").attr("disabled","disabled") - $("#re_generate_key i").addClass("rotating") - generate_key() -}) + generate_key(); +}); +$("#re_generate_key").on("click",function (){ + $("#public_key").attr("disabled","disabled"); + $("#re_generate_key i").addClass("rotating"); + generate_key(); +}); let addModal = new bootstrap.Modal(document.getElementById('add_modal'), { keyboard: false -}) +}); $(".add_btn").on("click", function(){ addModal.toggle(); -}) +}); $("#save_peer").on("click",function(){ - $(this).attr("disabled","disabled") - $(this).html("Saving...") + let $public_key = $("#public_key"); + let $private_key = $("#private_key"); + let $allowed_ips = $("#allowed_ips"); + let $new_add_DNS = $("#new_add_DNS"); + let $new_add_endpoint_allowed_ip = $("#new_add_endpoint_allowed_ip"); + let $new_add_name = $("#new_add_name"); + let $new_add_MTU = $("#new_add_MTU"); + let $new_add_keep_alive = $("#new_add_keep_alive"); + let $enable_preshare_key = $("#enable_preshare_key"); - if ($("#allowed_ips").val() !== "" && $("#public_key").val() !== "" && $("#new_add_DNS").val() !== "" && $("#new_add_endpoint_allowed_ip").val() != ""){ - var conf = $(this).attr('conf_id') - var data_list = [$("#private_key"), $("#allowed_ips"), $("#new_add_name"), $("#new_add_DNS"), $("#new_add_endpoint_allowed_ip"),$("#new_add_MTU"),$("#new_add_keep_alive")] - for (var i = 0; i < data_list.length; i++){ - data_list[i].attr("disabled", "disabled") - } + $(this).attr("disabled","disabled"); + $(this).html("Saving..."); + if ($allowed_ips.val() !== "" && $public_key.val() !== "" && $new_add_DNS.val() !== "" && $new_add_endpoint_allowed_ip.val() !== ""){ + let conf = $(this).attr('conf_id'); + let data_list = [$private_key, $allowed_ips, $new_add_name, $new_add_DNS, $new_add_endpoint_allowed_ip,$new_add_MTU, $new_add_keep_alive]; + data_list.forEach((ele) => ele.attr("disabled", "disabled")); $.ajax({ method: "POST", url: "/add_peer/"+conf, @@ -112,71 +117,67 @@ $("#save_peer").on("click",function(){ "Content-Type": "application/json" }, data: JSON.stringify({ - "private_key":$("#private_key").val(), - "public_key":$("#public_key").val(), - "allowed_ips": $("#allowed_ips").val(), - "name":$("#new_add_name").val(), - "DNS": $("#new_add_DNS").val(), - "endpoint_allowed_ip": $("#new_add_endpoint_allowed_ip").val(), - "MTU": $("#new_add_MTU").val(), - "keep_alive": $("#new_add_keep_alive").val(), - "enable_preshared_key": $("#enable_preshare_key").prop("checked"), + "private_key":$private_key.val(), + "public_key":$public_key.val(), + "allowed_ips": $allowed_ips.val(), + "name":$new_add_name.val(), + "DNS": $new_add_DNS.val(), + "endpoint_allowed_ip": $new_add_endpoint_allowed_ip.val(), + "MTU": $new_add_MTU.val(), + "keep_alive": $new_add_keep_alive.val(), + "enable_preshared_key": $enable_preshare_key.prop("checked"), }), success: function (response){ - if(response != "true"){ - $("#add_peer_alert").html(response); - $("#add_peer_alert").removeClass("d-none"); - for (var i = 0; i < data_list.length; i++){ - data_list[i].removeAttr("disabled", "disabled") - } - $("#save_peer").removeAttr("disabled") - $("#save_peer").html("Save") + if(response !== "true"){ + $("#add_peer_alert").html(response).removeClass("d-none"); + data_list.forEach((ele) => ele.removeAttr("disabled")); + $("#save_peer").removeAttr("disabled").html("Save"); } else{ load_data(""); - addModal.hide(); + addModal.toggle(); } } - }) + }); }else{ - $("#add_peer_alert").html("Please fill in all required box."); - $("#add_peer_alert").removeClass("d-none"); - $(this).removeAttr("disabled") - $(this).html("Save") + $("#add_peer_alert").html("Please fill in all required box.").removeClass("d-none"); + $(this).removeAttr("disabled"); + $(this).html("Save"); } -}) -var qrcodeModal = new bootstrap.Modal(document.getElementById('qrcode_modal'), { - keyboard: false -}) +}); + +let qrcodeModal = new bootstrap.Modal(document.getElementById('qrcode_modal'), { + keyboard: false +}); // QR Code $body.on("click", ".btn-qrcode-peer", function (){ - var src = $(this).attr('img_src'); + let src = $(this).attr('img_src'); $.ajax({ "url": src, "method": "GET" }).done(function(res){ - $("#qrcode_img").attr('src', res) + $("#qrcode_img").attr('src', res); qrcodeModal.toggle(); - }) -}) + }); +}); // Delete Peer Modal -var deleteModal = new bootstrap.Modal(document.getElementById('delete_modal'), { +let deleteModal = new bootstrap.Modal(document.getElementById('delete_modal'), { keyboard: false }); $body.on("click", ".btn-delete-peer", function(){ - var peer_id = $(this).attr("id"); + let peer_id = $(this).attr("id"); $("#delete_peer").attr("peer_id", peer_id); deleteModal.toggle(); -}) +}); -$("#delete_peer").click(function(){ - $(this).attr("disabled","disabled") - $(this).html("Deleting...") - var peer_id = $(this).attr("peer_id"); - var config = $(this).attr("conf_id"); +$("#delete_peer").on("click",function(){ + $(this).attr("disabled","disabled"); + $(this).html("Deleting..."); + let peer_id = $(this).attr("peer_id"); + let config = $(this).attr("conf_id"); $.ajax({ method: "POST", url: "/remove_peer/"+config, @@ -186,28 +187,26 @@ $("#delete_peer").click(function(){ data: JSON.stringify({"action": "delete", "peer_id": peer_id}), success: function (response){ if(response !== "true"){ - $("#remove_peer_alert").html(response+$("#add_peer_alert").html()); - $("#remove_peer_alert").removeClass("d-none"); + $("#remove_peer_alert").html(response+$("#add_peer_alert").html()).removeClass("d-none"); } else{ deleteModal.toggle(); load_data($('#search_peer_textbox').val()); $('#alertToast').toast('show'); $('#alertToast .toast-body').html("Peer deleted!"); - $("#delete_peer").removeAttr("disabled") - $("#delete_peer").html("Delete") + $("#delete_peer").removeAttr("disabled").html("Delete"); } } - }) + }); }); // Peer Setting Modal -var settingModal = new bootstrap.Modal(document.getElementById('setting_modal'), { +let settingModal = new bootstrap.Modal(document.getElementById('setting_modal'), { keyboard: false -}) +}); $body.on("click", ".btn-setting-peer", function(){ - startProgressBar() - var peer_id = $(this).attr("id"); + startProgressBar(); + let peer_id = $(this).attr("id"); $("#save_peer_setting").attr("peer_id", peer_id); $.ajax({ method: "POST", @@ -217,63 +216,65 @@ $body.on("click", ".btn-setting-peer", function(){ }, data: JSON.stringify({"id": peer_id}), success: function(response){ - var peer_name = ((response['name'] === "") ? "Untitled Peer" : response['name']) + let peer_name = ((response.name === "") ? "Untitled Peer" : response.name); $("#setting_modal .peer_name").html(peer_name); - $("#setting_modal #peer_name_textbox").val(response['name']) - $("#setting_modal #peer_private_key_textbox").val(response['private_key']) - $("#setting_modal #peer_DNS_textbox").val(response['DNS']) - $("#setting_modal #peer_allowed_ip_textbox").val(response['allowed_ip']) - $("#setting_modal #peer_endpoint_allowed_ips").val(response['endpoint_allowed_ip']) - $("#setting_modal #peer_mtu").val(response['mtu']) - $("#setting_modal #peer_keep_alive").val(response['keep_alive']) - $("#setting_modal #peer_preshared_key_textbox").val(response["preshared_key"]) + $("#setting_modal #peer_name_textbox").val(response.name); + $("#setting_modal #peer_private_key_textbox").val(response.private_key); + $("#setting_modal #peer_DNS_textbox").val(response.DNS); + $("#setting_modal #peer_allowed_ip_textbox").val(response.allowed_ip); + $("#setting_modal #peer_endpoint_allowed_ips").val(response.endpoint_allowed_ip); + $("#setting_modal #peer_mtu").val(response.mtu); + $("#setting_modal #peer_keep_alive").val(response.keep_alive); + $("#setting_modal #peer_preshared_key_textbox").val(response.preshared_key); settingModal.toggle(); - endProgressBar() + endProgressBar(); } - }) + }); }); $('#setting_modal').on('hidden.bs.modal', function (event) { $("#setting_peer_alert").addClass("d-none"); -}) +}); -$("#peer_private_key_textbox").change(function(){ +$("#peer_private_key_textbox").on("change",function(){ + let $save_peer_setting = $("#save_peer_setting"); if ($(this).val().length > 0){ $.ajax({ - "url": "/check_key_match/"+$("#save_peer_setting").attr("conf_id"), + "url": "/check_key_match/"+$save_peer_setting.attr("conf_id"), "method": "POST", "headers":{"Content-Type": "application/json"}, "data": JSON.stringify({ "private_key": $("#peer_private_key_textbox").val(), - "public_key": $("#save_peer_setting").attr("peer_id") + "public_key": $save_peer_setting.attr("peer_id") }) }).done(function(res){ - if(res['status'] == "failed"){ - $("#setting_peer_alert").html(res['msg']); - $("#setting_peer_alert").removeClass("d-none"); + if(res.status === "failed"){ + $("#setting_peer_alert").html(res.status).removeClass("d-none"); }else{ $("#setting_peer_alert").addClass("d-none"); } - }) + }); } -}) +}); -$("#save_peer_setting").click(function (){ - $(this).attr("disabled","disabled") - $(this).html("Saving...") - if ($("#peer_DNS_textbox").val() !== "" && - $("#peer_allowed_ip_textbox").val() !== "" && - $("#peer_endpoint_allowed_ips").val() != "" - ){ - var peer_id = $(this).attr("peer_id"); - var conf_id = $(this).attr("conf_id"); - var data_list = [ - $("#peer_name_textbox"), $("#peer_DNS_textbox"), $("#peer_private_key_textbox"), $("#peer_preshared_key_textbox"), - $("#peer_allowed_ip_textbox"), $("#peer_endpoint_allowed_ips"), $("#peer_mtu"), $("#peer_keep_alive") - ] - for (var i = 0; i < data_list.length; i++){ - data_list[i].attr("disabled", "disabled") - } +$("#save_peer_setting").on("click",function (){ + $(this).attr("disabled","disabled"); + $(this).html("Saving..."); + let $peer_DNS_textbox = $("#peer_DNS_textbox"); + let $peer_allowed_ip_textbox = $("#peer_allowed_ip_textbox"); + let $peer_endpoint_allowed_ips = $("#peer_endpoint_allowed_ips"); + let $peer_name_textbox = $("#peer_name_textbox"); + let $peer_private_key_textbox = $("#peer_private_key_textbox"); + let $peer_preshared_key_textbox = $("#peer_preshared_key_textbox"); + let $peer_mtu = $("#peer_mtu"); + let $peer_keep_alive = $("#peer_keep_alive"); + + if ($peer_DNS_textbox.val() !== "" && + $peer_allowed_ip_textbox.val() !== "" && $peer_endpoint_allowed_ips.val() !== ""){ + let peer_id = $(this).attr("peer_id"); + let conf_id = $(this).attr("conf_id"); + let data_list = [$peer_name_textbox, $peer_DNS_textbox, $peer_private_key_textbox, $peer_preshared_key_textbox, $peer_allowed_ip_textbox, $peer_endpoint_allowed_ips, $peer_mtu, $peer_keep_alive]; + data_list.forEach((ele) => ele.attr("disabled","disabled")); $.ajax({ method: "POST", url: "/save_peer_setting/"+conf_id, @@ -282,54 +283,47 @@ $("#save_peer_setting").click(function (){ }, data: JSON.stringify({ id: peer_id, - name: $("#peer_name_textbox").val(), - DNS: $("#peer_DNS_textbox").val(), - private_key: $("#peer_private_key_textbox").val(), - allowed_ip: $("#peer_allowed_ip_textbox").val(), - endpoint_allowed_ip: $("#peer_endpoint_allowed_ips").val(), - MTU: $("#peer_mtu").val(), - keep_alive: $("#peer_keep_alive").val(), - preshared_key: $("#peer_preshared_key_textbox").val() + name: $peer_name_textbox.val(), + DNS: $peer_DNS_textbox.val(), + private_key: $peer_private_key_textbox.val(), + allowed_ip: $peer_allowed_ip_textbox.val(), + endpoint_allowed_ip: $peer_endpoint_allowed_ips.val(), + MTU: $peer_mtu.val(), + keep_alive: $peer_keep_alive.val(), + preshared_key: $peer_preshared_key_textbox.val() }), success: function (response){ - if (response['status'] === "failed"){ - $("#setting_peer_alert").html(response['msg']); - $("#setting_peer_alert").removeClass("d-none"); + if (response.status === "failed"){ + $("#setting_peer_alert").html(response.msg).removeClass("d-none"); }else{ settingModal.toggle(); - load_data($('#search_peer_textbox').val()) + load_data($('#search_peer_textbox').val()); $('#alertToast').toast('show'); $('#alertToast .toast-body').html("Peer Saved!"); } - $("#save_peer_setting").removeAttr("disabled") - $("#save_peer_setting").html("Save") - for (var i = 0; i < data_list.length; i++){ - data_list[i].removeAttr("disabled") - } + $("#save_peer_setting").removeAttr("disabled").html("Save"); + data_list.forEach((ele) => ele.removeAttr("disabled")); } - }) + }); }else{ - $("#setting_peer_alert").html("Please fill in all required box."); - $("#setting_peer_alert").removeClass("d-none"); - $("#save_peer_setting").removeAttr("disabled") - $("#save_peer_setting").html("Save") + $("#setting_peer_alert").html("Please fill in all required box.").removeClass("d-none"); + $("#save_peer_setting").removeAttr("disabled").html("Save"); } +}); - -}) - -$(".peer_private_key_textbox_switch").click(function (){ - let mode = (($("#peer_private_key_textbox").attr('type') === 'password') ? "text":"password") - let icon = (($("#peer_private_key_textbox").attr('type') === 'password') ? "bi bi-eye-slash-fill":"bi bi-eye-fill") - $("#peer_private_key_textbox").attr('type',mode) - $(".peer_private_key_textbox_switch i").removeClass().addClass(icon) -}) +$(".peer_private_key_textbox_switch").on("click",function (){ + let $peer_private_key_textbox = $("#peer_private_key_textbox"); + let mode = (($peer_private_key_textbox.attr('type') === 'password') ? "text":"password"); + let icon = (($peer_private_key_textbox.attr('type') === 'password') ? "bi bi-eye-slash-fill":"bi bi-eye-fill"); + $peer_private_key_textbox.attr('type',mode); + $(".peer_private_key_textbox_switch i").removeClass().addClass(icon); +}); // Search Peer -var typingTimer; -var doneTypingInterval = 200; -var $input = $('#search_peer_textbox'); +let typingTimer; +let doneTypingInterval = 200; +let $input = $('#search_peer_textbox'); $input.on('keyup', function () { clearTimeout(typingTimer); typingTimer = setTimeout(doneTyping, doneTypingInterval); @@ -338,9 +332,10 @@ $input.on('keydown', function () { clearTimeout(typingTimer); }); function doneTyping () { - load_data($('#search_peer_textbox').val()); + load_data($input.val()); } + // Sorting $body.on("change", "#sort_by_dropdown", function (){ $.ajax({ @@ -349,33 +344,38 @@ $body.on("change", "#sort_by_dropdown", function (){ headers:{"Content-Type": "application/json"}, url: "/update_dashboard_sort", success: function (res){ - load_data($('#search_peer_textbox').val()) + load_data($('#search_peer_textbox').val()); } - }) -}) + }); +}); -// Click key to copy +// Click key to copy animation $body.on("mouseenter", ".key", function(){ - var label = $(this).parent().siblings().children()[1] - label.style.opacity = "100" + let label = $(this).parent().siblings().children()[1]; + label.style.opacity = "100"; }) $body.on("mouseout", ".key", function(){ - var label = $(this).parent().siblings().children()[1] - label.style.opacity = "0" + let label = $(this).parent().siblings().children()[1]; + label.style.opacity = "0"; setTimeout(function (){ - label.innerHTML = "CLICK TO COPY" - },200) - + label.innerHTML = "CLICK TO COPY"; + },200); }); + $body.on("click", ".key", function(){ - var label = $(this).parent().siblings().children()[1] - copyToClipboard($(this)) - label.innerHTML = "COPIED!" -}) + var label = $(this).parent().siblings().children()[1]; + copyToClipboard($(this)); + label.innerHTML = "COPIED!"; +}); + +/** + * CopyToClipboard + * @param element + */ function copyToClipboard(element) { - var $temp = $(""); + let $temp = $(""); $body.append($temp); - $temp.val($(element).text()).select(); + $temp.val($(element).text()).trigger( "select" ); document.execCommand("copy"); $temp.remove(); } @@ -384,7 +384,7 @@ function copyToClipboard(element) { $body.on("click", ".update_interval", function(){ let prev = $(".interval-btn-group.active button"); $(".interval-btn-group button").removeClass("active"); - let _new = $(this) + let _new = $(this); _new.addClass("active"); let interval = $(this).data("refresh-interval"); $.ajax({ @@ -407,12 +407,13 @@ $body.on("click", ".update_interval", function(){ } }) }); + +// Refresh Button $body.on("click", ".refresh", function (){ load_data($('#search_peer_textbox').val()); }); - // Switch display mode $body.on("click", ".display_mode", function(){ $(".display-btn-group button").removeClass("active"); @@ -426,7 +427,7 @@ $body.on("click", ".display_mode", function(){ if (display_mode === "list"){ Array($(".peer_list").children()).forEach(function(child){ $(child).removeClass().addClass("col-12"); - }) + }); showToast("Displaying as List"); }else{ Array($(".peer_list").children()).forEach(function(child){ @@ -436,11 +437,5 @@ $body.on("click", ".display_mode", function(){ } } } - }) -}) - -// Pre-share key -// $("#enable_preshare_key").on("change", function(){ -// $(".preshare_key_container").css("display", $(".preshare_key_container").css("display") === "none" ? "block":"none"); -// -// }) \ No newline at end of file + }); +}); \ No newline at end of file