2022-01-12 19:53:36 -05:00
/ * *
* configuration . js - Copyright ( C ) 2021 Donald Zou [ https : //github.com/donaldzou]
* Under Apache - 2.0 License
* /
/ * *
* This will load peers data from server
* @ param search
* /
function load _data ( search ) {
startProgressBar ( ) ;
let result = '' ;
$ . ajax ( {
method : "GET" ,
url : "/get_config/" + conf _name + "?search=" + encodeURIComponent ( search ) ,
headers : {
"Content-Type" : "application/json"
} ,
success : function ( response ) {
removeNoResponding ( ) ;
peers = response . peer _data ;
if ( response . listen _port === "" && response . status === "stopped" ) {
$ ( "config_info_alert" ) . append ( '<div class="alert alert-warning" role="alert">Peer QR Code and configuration file download required a specified <strong>Listen Port</strong>.</div>' ) ;
}
if ( response . conf _address === "N/A" ) {
$ ( "config_info_alert" ) . append ( '<div class="alert alert-warning" role="alert">Configuration <strong>Address</strong> need to be specified to have peers connect to it.</div>' ) ;
}
let $conf _status _btn = $ ( "#conf_status_btn" ) ;
if ( response . checked === "checked" ) {
$conf _status _btn . html ( '<a href="#" id="' + response . name + '" ' + response . checked + ' class="switch text-primary"><i class="bi bi-toggle2-on"></i> ON</a>' ) ;
} else {
$conf _status _btn . html ( '<a href="#" id="' + response . name + '" ' + response . checked + ' class="switch text-primary"><i class="bi bi-toggle2-off"></i> OFF</a>' ) ;
}
$ ( "#sort_by_dropdown option" ) . removeAttr ( "selected" ) ;
$ ( "#sort_by_dropdown option[value=" + response . sort _tag + "]" ) . attr ( "selected" , "selected" ) ;
$ ( ".interval-btn-group button" ) . removeClass ( "active" ) ;
$ ( "button[data-refresh-interval=" + response . dashboard _refresh _interval + "]" ) . addClass ( "active" ) ;
$ ( ".display-btn-group button" ) . removeClass ( "active" ) ;
$ ( "button[data-display-mode=" + response . peer _display _mode + "]" ) . addClass ( "active" ) ;
$ ( "#conf_status" ) . html ( response . status + '<span class="dot dot-' + response . status + '"></span>' ) ;
$ ( "#conf_connected_peers" ) . html ( response . running _peer ) ;
$ ( "#conf_total_data_usage" ) . html ( response . total _data _usage [ 0 ] + " GB" ) ;
$ ( "#conf_total_data_received" ) . html ( response . total _data _usage [ 2 ] + " GB" ) ;
$ ( "#conf_total_data_sent" ) . html ( response . total _data _usage [ 1 ] + " GB" ) ;
$ ( "#conf_public_key" ) . html ( response . public _key ) ;
$ ( "#conf_listen_port" ) . html ( response . listen _port === "" ? "N/A" : response . listen _port ) ;
2022-01-12 20:28:12 -05:00
$ ( "#conf_address" ) . html ( response . conf _address ) ;
2022-01-12 19:53:36 -05:00
$ ( ".info h6" ) . removeClass ( "info_loading" ) ;
$conf _status _btn . removeClass ( "info_loading" ) ;
if ( response . peer _data . length === 0 ) {
$ ( ".peer_list" ) . html ( '<div class="col-12" style="text-align: center; margin-top: 1.5rem"><h3 class="text-muted">Oops! No peers found ‘︿’</h3></div>' ) ;
} else {
let display _mode = response . peer _display _mode === "list" ? "col-12" : "col-sm-6 col-lg-4" ;
response . peer _data . forEach ( function ( peer ) {
let total _r = 0 ;
let total _s = 0 ;
total _r += peer . cumu _receive ;
total _s += peer . cumu _sent ;
let spliter = '<div class="w-100"></div>' ;
let peer _name =
'<div class="col-sm display" style="display: flex; align-items: center; margin-bottom: 0.2rem">' +
'<h5 style="margin: 0;">' + ( peer . name === "" ? "Untitled" : peer . name ) + '</h5>' +
'<h6 style="text-transform: uppercase; margin: 0; margin-left: auto !important;"><span class="dot dot-' + peer . status + '" style="margin-left: auto !important;" data-toggle="tooltip" data-placement="left" title="Peer Connected"></span></h6>' +
'</div>' ;
let peer _transfer = '<div class="col-12 peer_data_group" style="text-align: right; display: flex; margin-bottom: 0.5rem"><p class="text-primary" style="text-transform: uppercase; margin-bottom: 0; margin-right: 1rem"><small><i class="bi bi-arrow-down-right"></i> ' + roundN ( peer . total _receive + total _r , 4 ) + ' GB</small></p> <p class="text-success" style="text-transform: uppercase; margin-bottom: 0"><small><i class="bi bi-arrow-up-right"></i> ' + roundN ( peer . total _sent + total _s , 4 ) + ' GB</small></p> </div>' ;
let peer _key = '<div class="col-sm"><small class="text-muted" style="display: flex"><strong>PEER</strong><strong style="margin-left: auto!important; opacity: 0; transition: 0.2s ease-in-out" class="text-primary">CLICK TO COPY</strong></small> <h6><samp class="ml-auto key">' + peer . id + '</samp></h6></div>' ;
let peer _allowed _ip = '<div class="col-sm"><small class="text-muted"><strong>ALLOWED IP</strong></small><h6 style="text-transform: uppercase;">' + peer . allowed _ip + '</h6></div>' ;
let peer _latest _handshake = '<div class="col-sm"> <small class="text-muted"><strong>LATEST HANDSHAKE</strong></small> <h6 style="text-transform: uppercase;">' + peer . latest _handshake + '</h6> </div>' ;
let peer _endpoint = '<div class="col-sm"><small class="text-muted"><strong>END POINT</strong></small><h6 style="text-transform: uppercase;">' + peer . endpoint + '</h6></div>' ;
let peer _control = '<div class="col-sm"><hr><div class="button-group" style="display:flex"><button type="button" class="btn btn-outline-primary btn-setting-peer btn-control" id="' + peer . id + '" data-toggle="modal"><i class="bi bi-gear-fill" data-toggle="tooltip" data-placement="bottom" title="Peer Settings"></i></button> <button type="button" class="btn btn-outline-danger btn-delete-peer btn-control" id="' + peer . id + '" data-toggle="modal"><i class="bi bi-x-circle-fill" data-toggle="tooltip" data-placement="bottom" title="Delete Peer"></i></button>' ;
if ( peer . private _key !== "" ) {
peer _control += '<div class="share_peer_btn_group" style="margin-left: auto !important; display: inline"><button type="button" class="btn btn-outline-success btn-qrcode-peer btn-control" img_src="/qrcode/' + response . name + '?id=' + encodeURIComponent ( peer . id ) + '"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="width: 19px;" fill="#28a745"><path d="M3 11h8V3H3v8zm2-6h4v4H5V5zM3 21h8v-8H3v8zm2-6h4v4H5v-4zM13 3v8h8V3h-8zm6 6h-4V5h4v4zM13 13h2v2h-2zM15 15h2v2h-2zM13 17h2v2h-2zM17 17h2v2h-2zM19 19h2v2h-2zM15 19h2v2h-2zM17 13h2v2h-2zM19 15h2v2h-2z"/></svg></button><a href="/download/' + response . name + '?id=' + encodeURIComponent ( peer . id ) + '" class="btn btn-outline-info btn-download-peer btn-control"><i class="bi bi-download"></i></a></div>' ;
}
peer _control += '</div>' ;
let html = '<div class="' + display _mode + '" data-id="' + peer . id + '">' +
'<div class="card mb-3 card-' + peer . status + '">' +
'<div class="card-body">' +
'<div class="row">' +
peer _name +
spliter +
peer _transfer +
peer _key +
peer _allowed _ip +
peer _latest _handshake +
spliter +
peer _endpoint +
spliter +
peer _control +
'</div>' +
'</div>' +
'</div>' +
'</div></div>' ;
result += html ;
} ) ;
$ ( ".peer_list" ) . html ( result ) ;
if ( response . dashboard _refresh _interval !== load _interval ) {
load _interval = response . dashboard _refresh _interval ;
clearInterval ( load _timeout ) ;
load _timeout = setInterval ( function ( ) {
load _data ( $ ( '#search_peer_textbox' ) . val ( ) ) ;
} , response . dashboard _refresh _interval ) ;
}
}
$ ( ".dot.dot-running" ) . attr ( "title" , "Peer Connected" ) . tooltip ( ) ;
$ ( ".dot.dot-stopped" ) . attr ( "title" , "Peer Disconnected" ) . tooltip ( ) ;
$ ( "i[data-toggle='tooltip']" ) . tooltip ( ) ;
endProgressBar ( ) ;
}
} ) . fail ( function ( ) {
noResponding ( ) ;
} ) ;
}
function noResponding ( ) {
$ ( ".no-response" ) . addClass ( "active" ) ;
setTimeout ( function ( ) {
$ ( ".no-response" ) . addClass ( "show" ) ;
$ ( "#right_body" ) . addClass ( "no-responding" ) ;
$ ( ".navbar" ) . addClass ( "no-responding" ) ;
} , 10 ) ;
}
function removeNoResponding ( ) {
$ ( ".no-response" ) . removeClass ( "show" ) ;
$ ( "#right_body" ) . removeClass ( "no-responding" ) ;
$ ( ".navbar" ) . removeClass ( "no-responding" ) ;
setTimeout ( function ( ) {
$ ( ".no-response" ) . removeClass ( "active" ) ;
} , 1010 ) ;
}
$ ( "[data-toggle='tooltip']" ) . tooltip ( ) ;
$ ( "[data-toggle='popover']" ) . popover ( ) ;
2021-12-29 12:17:44 -05:00
let $body = $ ( "body" ) ;
2022-01-04 16:32:23 -05:00
let $progress _bar = $ ( ".progress-bar" ) ;
let available _ips = [ ] ;
let $save _peer = $ ( "#save_peer" ) ;
$ ( ".add_btn" ) . on ( "click" , function ( ) {
2022-01-08 15:26:17 -05:00
$addModal . toggle ( ) ;
2022-01-04 16:32:23 -05:00
} ) ;
2021-12-29 12:17:44 -05:00
2022-01-04 16:32:23 -05:00
/ * *
* Round Transfer number into 4 digits
* @ param value
* @ param digits
* @ returns { number }
* /
2021-12-30 15:21:25 -05:00
function roundN ( value , digits ) {
let tenToN = 10 * * digits ;
return ( Math . round ( value * tenToN ) ) / tenToN ;
}
2022-01-04 16:32:23 -05:00
/ * *
* Start Progress Bar
* /
2021-12-29 12:17:44 -05:00
function startProgressBar ( ) {
$progress _bar . css ( "width" , "0%" )
2021-12-29 23:26:15 -05:00
. 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%" ) ;
2021-12-29 12:17:44 -05:00
setTimeout ( function ( ) {
stillLoadingProgressBar ( ) ;
2021-12-29 23:26:15 -05:00
} , 300 ) ;
2021-12-29 12:17:44 -05:00
}
2021-12-30 15:21:25 -05:00
2022-01-04 16:32:23 -05:00
/ * *
* Still Loading Progress Bar
* /
2021-12-29 12:17:44 -05:00
function stillLoadingProgressBar ( ) {
2021-12-29 23:26:15 -05:00
$progress _bar . css ( "transition" , "3s ease-in-out" ) . css ( "width" , "75%" ) ;
2021-12-29 12:17:44 -05:00
}
2021-12-30 15:21:25 -05:00
2022-01-04 16:32:23 -05:00
/ * *
* End Progress Bae
* /
2021-12-29 12:17:44 -05:00
function endProgressBar ( ) {
2021-12-29 23:26:15 -05:00
$progress _bar . css ( "transition" , "0.3s ease-in-out" ) . css ( "width" , "100%" ) ;
2021-12-29 12:17:44 -05:00
setTimeout ( function ( ) {
2021-12-29 23:26:15 -05:00
$progress _bar . css ( "opacity" , "0" ) ;
} , 250 ) ;
2021-12-29 12:17:44 -05:00
}
2022-01-04 16:32:23 -05:00
/ * *
* Show toast
* @ param msg
* /
2021-12-29 12:17:44 -05:00
function showToast ( msg ) {
$ ( '#alertToast' ) . toast ( 'show' ) ;
$ ( '#alertToast .toast-body' ) . html ( msg ) ;
}
2022-01-04 16:32:23 -05:00
/ * *
* When configuration switch got click
* /
2021-12-29 12:17:44 -05:00
$body . on ( "click" , ".switch" , function ( ) {
2021-08-05 23:15:50 -04:00
$ ( this ) . siblings ( $ ( ".spinner-border" ) ) . css ( "display" , "inline-block" ) ;
2021-12-29 23:26:15 -05:00
$ ( this ) . remove ( ) ;
2021-08-05 23:15:50 -04:00
location . replace ( "/switch/" + $ ( this ) . attr ( 'id' ) ) ;
2021-12-29 23:26:15 -05:00
} ) ;
2021-08-05 23:15:50 -04:00
2022-01-04 16:32:23 -05:00
/ * *
* Generate Private and Public key for a new peer
* /
2021-08-05 23:15:50 -04:00
function generate _key ( ) {
2022-01-06 15:17:43 -05:00
let keys = wireguard . generateKeypair ( ) ;
$ ( "#private_key" ) . val ( keys . privateKey ) ;
$ ( "#public_key" ) . val ( keys . publicKey ) ;
$ ( "#add_peer_alert" ) . addClass ( "d-none" ) ;
$ ( "#re_generate_key i" ) . removeClass ( "rotating" ) ;
$ ( "#enable_preshare_key" ) . val ( keys . presharedKey ) ;
2021-08-05 23:15:50 -04:00
}
2022-01-04 16:32:23 -05:00
/ * *
* Generate Public key when private got change
* /
2021-12-29 12:17:44 -05:00
$ ( "#private_key" ) . on ( "change" , function ( ) {
2022-01-06 15:17:43 -05:00
if ( $ ( this ) . val ( ) . length === 44 ) {
2021-12-29 23:26:15 -05:00
$ ( "#re_generate_key i" ) . addClass ( "rotating" ) ;
2022-01-06 15:17:43 -05:00
$ ( "#public_key" ) . val ( wireguard . generatePublicKey ( $ ( "#private_key" ) . val ( ) ) ) ;
2021-08-05 23:15:50 -04:00
} else {
2021-12-29 23:26:15 -05:00
$ ( "#public_key" ) . removeAttr ( "disabled" ) . val ( "" ) ;
2021-08-05 23:15:50 -04:00
}
2021-12-29 23:26:15 -05:00
} ) ;
2022-01-04 16:32:23 -05:00
/ * *
* Trigger IP badge and item
* @ param ip
* /
function trigger _ip ( ip ) {
let $ip _ele = $ ( ".available-ip-item[data-ip='" + ip + "']" ) ;
if ( $ip _ele . html ( ) ) {
if ( $ip _ele . hasClass ( "active" ) ) {
$ip _ele . removeClass ( "active" ) ;
$ ( "#selected_ip_list .badge[data-ip='" + ip + "']" ) . remove ( ) ;
} else {
$ip _ele . addClass ( "active" ) ;
$ ( "#selected_ip_list" ) . append ( '<span class="badge badge-primary available-ip-badge" style="cursor: pointer" data-ip="' + ip + '">' + ip + '</span>' )
}
}
}
/ * *
* Get all available IP for this configuration
* /
function get _available _ip ( ) {
$ . ajax ( {
"url" : "/available_ips/" + $save _peer . attr ( "conf_id" ) ,
"method" : "GET" ,
} ) . done ( function ( res ) {
available _ips = res ;
let $list _group = $ ( "#available_ip_modal .modal-body .list-group" ) ;
$list _group . html ( "" ) ;
$ ( "#allowed_ips" ) . val ( available _ips [ 0 ] ) ;
available _ips . forEach ( ( ip ) =>
$list _group . append ( '<a class="list-group-item list-group-item-action available-ip-item" style="cursor: pointer" data-ip="' + ip + '">' + ip + '</a>' ) ) ;
} ) ;
}
$ ( "#available_ip_modal" ) . on ( "show.bs.modal" , ( ) => {
$ ( '#add_modal' ) . addClass ( "ip_modal_open" ) ;
} ) . on ( "hidden.bs.modal" , function ( ) {
$ ( '#add_modal' ) . removeClass ( "ip_modal_open" ) ;
let ips = [ ] ;
let $selected _ip _list = $ ( "#selected_ip_list" ) ;
$selected _ip _list . children ( ) . each ( function ( ) {
ips . push ( $ ( this ) . data ( "ip" ) ) ;
} ) ;
ips . forEach ( ( ele ) => trigger _ip ( ele ) ) ;
} )
/ * *
* When IP Badge got click
* /
$body . on ( "click" , ".available-ip-badge" , function ( ) {
$ ( ".available-ip-item[data-ip='" + $ ( this ) . data ( "ip" ) + "']" ) . removeClass ( "active" ) ;
$ ( this ) . remove ( ) ;
} )
/ * *
* When available ip item got click
* /
$body . on ( "click" , ".available-ip-item" , function ( ) {
trigger _ip ( $ ( this ) . data ( "ip" ) ) ;
} ) ;
let $ipModal = new bootstrap . Modal ( document . getElementById ( 'available_ip_modal' ) , {
2022-01-08 15:26:17 -05:00
keyboard : false ,
backdrop : 'static'
2022-01-04 16:32:23 -05:00
} ) ;
$ ( "#search_available_ip" ) . on ( "click" , function ( ) {
$ipModal . toggle ( ) ;
let $allowed _ips = $ ( "#allowed_ips" ) ;
if ( $allowed _ips . val ( ) . length > 0 ) {
let s = $allowed _ips . val ( ) . split ( "," ) ;
for ( let i = 0 ; i < s . length ; i ++ ) {
s [ i ] = s [ i ] . trim ( ) ;
trigger _ip ( s [ i ] ) ;
}
}
} ) . tooltip ( ) ;
$ ( "#confirm_ip" ) . on ( "click" , ( ) => {
$ipModal . toggle ( ) ;
let ips = [ ] ;
let $selected _ip _list = $ ( "#selected_ip_list" ) ;
$selected _ip _list . children ( ) . each ( function ( ) {
ips . push ( $ ( this ) . data ( "ip" ) ) ;
} ) ;
$ ( "#allowed_ips" ) . val ( ips . join ( ", " ) ) ;
ips . forEach ( ( ele ) => trigger _ip ( ele ) ) ;
} ) ;
$ ( "#allowed_ips" ) . on ( "keyup" , function ( ) {
let s = clean _ip ( $ ( this ) . val ( ) ) ;
s = s . split ( "," ) ;
if ( available _ips . includes ( s [ s . length - 1 ] ) ) {
$ ( "#allowed_ips_indicator" ) . removeClass ( ) . addClass ( "text-success" )
. html ( '<i class="bi bi-check-circle-fill"></i>' ) ;
} else {
$ ( "#allowed_ips_indicator" ) . removeClass ( ) . addClass ( "text-warning" )
. html ( '<i class="bi bi-exclamation-circle-fill"></i>' ) ;
}
} )
2021-08-05 23:15:50 -04:00
$ ( '#add_modal' ) . on ( 'show.bs.modal' , function ( event ) {
2021-12-29 23:26:15 -05:00
generate _key ( ) ;
2022-01-04 16:32:23 -05:00
get _available _ip ( ) ;
} ) . on ( 'hide.bs.modal' , function ( ) {
$ ( "#allowed_ips_indicator" ) . html ( '' ) ;
2021-12-29 23:26:15 -05:00
} ) ;
2022-01-04 16:32:23 -05:00
2021-12-29 23:26:15 -05:00
$ ( "#re_generate_key" ) . on ( "click" , function ( ) {
$ ( "#public_key" ) . attr ( "disabled" , "disabled" ) ;
$ ( "#re_generate_key i" ) . addClass ( "rotating" ) ;
generate _key ( ) ;
} ) ;
2022-01-04 16:32:23 -05:00
2022-01-08 15:26:17 -05:00
let $addModal = new bootstrap . Modal ( document . getElementById ( 'add_modal' ) , {
keyboard : false ,
backdrop : 'static'
2021-12-29 23:26:15 -05:00
} ) ;
2021-12-29 12:17:44 -05:00
2022-01-04 16:32:23 -05:00
function clean _ip ( val ) {
let clean _ip = val . split ( ',' ) ;
for ( let i = 0 ; i < clean _ip . length ; i ++ ) clean _ip [ i ] = clean _ip [ i ] . trim ( ' ' ) ;
return clean _ip . filter ( Boolean ) . join ( "," ) ;
}
2021-12-29 12:17:44 -05:00
2022-01-12 19:53:36 -05:00
$ ( "#new_add_amount" ) . on ( "keyup" , function ( ) {
let $bulk _amount _validation = $ ( "#bulk_amount_validation" ) ;
// $(this).removeClass("is-valid").addClass("is-invalid");
if ( $ ( this ) . val ( ) . length > 0 ) {
if ( isNaN ( $ ( this ) . val ( ) ) ) {
$ ( this ) . removeClass ( "is-valid" ) . addClass ( "is-invalid" ) ;
$bulk _amount _validation . html ( "Please enter a valid integer" ) ;
} else if ( $ ( this ) . val ( ) > available _ips . length ) {
$ ( this ) . removeClass ( "is-valid" ) . addClass ( "is-invalid" ) ;
$bulk _amount _validation . html ( ` Cannot create more than ${ available _ips . length } peers. ` ) ;
} else if ( $ ( this ) . val ( ) < 1 ) {
$ ( this ) . removeClass ( "is-valid" ) . addClass ( "is-invalid" ) ;
$bulk _amount _validation . html ( "Please enter at least 1 or more." ) ;
} else {
$ ( this ) . removeClass ( "is-invalid" ) . addClass ( "is-valid" ) ;
}
} else {
$ ( this ) . removeClass ( "is-invalid" ) . removeClass ( "is-valid" ) ;
}
} ) ;
function bulk _add _peers ( ) {
2022-01-08 15:26:17 -05:00
let $new _add _amount = $ ( "#new_add_amount" ) ;
2022-01-06 15:17:43 -05:00
$save _peer . attr ( "disabled" , "disabled" ) ;
2022-01-08 15:26:17 -05:00
$save _peer . html ( "Adding " + $new _add _amount . val ( ) + " peers..." ) ;
2021-12-29 23:26:15 -05:00
let $new _add _DNS = $ ( "#new_add_DNS" ) ;
2022-01-04 16:32:23 -05:00
$new _add _DNS . val ( clean _ip ( $new _add _DNS . val ( ) ) ) ;
2021-12-29 23:26:15 -05:00
let $new _add _endpoint _allowed _ip = $ ( "#new_add_endpoint_allowed_ip" ) ;
2022-01-06 15:17:43 -05:00
$new _add _endpoint _allowed _ip . val ( clean _ip ( $new _add _endpoint _allowed _ip . val ( ) ) ) ;
2021-12-29 23:26:15 -05:00
let $new _add _MTU = $ ( "#new_add_MTU" ) ;
let $new _add _keep _alive = $ ( "#new_add_keep_alive" ) ;
let $enable _preshare _key = $ ( "#enable_preshare_key" ) ;
2022-01-06 15:17:43 -05:00
let data _list = [ $new _add _DNS , $new _add _endpoint _allowed _ip , $new _add _MTU , $new _add _keep _alive ] ;
2022-01-12 19:53:36 -05:00
if ( $new _add _amount . val ( ) > 0 && ! $new _add _amount . hasClass ( "is-invalid" ) ) {
2022-01-06 15:17:43 -05:00
if ( $new _add _DNS . val ( ) !== "" && $new _add _endpoint _allowed _ip . val ( ) !== "" ) {
let conf = $save _peer . attr ( 'conf_id' ) ;
let keys = [ ] ;
2022-01-12 19:53:36 -05:00
for ( let i = 0 ; i < $new _add _amount . val ( ) ; i ++ ) {
keys . push ( wireguard . generateKeypair ( ) ) ;
}
2022-01-06 15:17:43 -05:00
$ . ajax ( {
method : "POST" ,
url : "/add_peer_bulk/" + conf ,
headers : {
"Content-Type" : "application/json"
} ,
data : JSON . stringify ( {
"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" ) ,
"keys" : keys ,
"amount" : $new _add _amount . val ( )
} ) ,
success : function ( response ) {
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 ( "" ) ;
data _list . forEach ( ( ele ) => ele . removeAttr ( "disabled" ) ) ;
$ ( "#add_peer_form" ) . trigger ( "reset" ) ;
$save _peer . removeAttr ( "disabled" ) . html ( "Save" ) ;
2022-01-08 15:26:17 -05:00
showToast ( $new _add _amount . val ( ) + " peers added successful!" ) ;
$addModal . toggle ( ) ;
2022-01-06 15:17:43 -05:00
}
2021-08-05 23:15:50 -04:00
}
2022-01-12 19:53:36 -05:00
} ) ;
2022-01-06 15:17:43 -05:00
} else {
$ ( "#add_peer_alert" ) . html ( "Please fill in all required box." ) . removeClass ( "d-none" ) ;
$save _peer . removeAttr ( "disabled" ) ;
$save _peer . html ( "Add" ) ;
}
2021-08-14 23:30:05 -04:00
} else {
2022-01-12 19:53:36 -05:00
$save _peer . removeAttr ( "disabled" ) . html ( "Add" ) ;
2022-01-06 15:17:43 -05:00
}
}
$save _peer . on ( "click" , function ( ) {
let $bulk _add = $ ( "#bulk_add" ) ;
if ( $bulk _add . prop ( "checked" ) ) {
2022-01-12 19:53:36 -05:00
if ( ! $ ( "#new_add_amount" ) . hasClass ( "is-invalid" ) ) {
bulk _add _peers ( )
}
2022-01-06 15:17:43 -05:00
} else {
let $public _key = $ ( "#public_key" ) ;
let $private _key = $ ( "#private_key" ) ;
let $allowed _ips = $ ( "#allowed_ips" ) ;
$allowed _ips . val ( clean _ip ( $allowed _ips . val ( ) ) ) ;
let $new _add _DNS = $ ( "#new_add_DNS" ) ;
$new _add _DNS . val ( clean _ip ( $new _add _DNS . val ( ) ) ) ;
let $new _add _endpoint _allowed _ip = $ ( "#new_add_endpoint_allowed_ip" ) ;
$new _add _endpoint _allowed _ip . val ( clean _ip ( $new _add _endpoint _allowed _ip . val ( ) ) ) ;
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" ) ;
$ ( this ) . attr ( "disabled" , "disabled" ) ;
$ ( this ) . html ( "Adding..." ) ;
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 ,
headers : {
"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" ) ,
"preshared_key" : $enable _preshare _key . val ( )
} ) ,
success : function ( response ) {
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 ( "" ) ;
data _list . forEach ( ( ele ) => ele . removeAttr ( "disabled" ) ) ;
$ ( "#add_peer_form" ) . trigger ( "reset" ) ;
$save _peer . removeAttr ( "disabled" ) . html ( "Save" ) ;
showToast ( "Add peer successful!" ) ;
2022-01-08 15:26:17 -05:00
$addModal . toggle ( ) ;
2022-01-06 15:17:43 -05:00
}
}
} ) ;
} else {
$ ( "#add_peer_alert" ) . html ( "Please fill in all required box." ) . removeClass ( "d-none" ) ;
$ ( this ) . removeAttr ( "disabled" ) ;
$ ( this ) . html ( "Add" ) ;
}
2021-08-05 23:15:50 -04:00
}
2021-12-29 23:26:15 -05:00
} ) ;
2021-08-05 23:15:50 -04:00
2022-01-12 19:53:36 -05:00
// QR Code
2021-12-29 23:26:15 -05:00
let qrcodeModal = new bootstrap . Modal ( document . getElementById ( 'qrcode_modal' ) , {
keyboard : false
} ) ;
2021-12-29 12:17:44 -05:00
$body . on ( "click" , ".btn-qrcode-peer" , function ( ) {
2021-12-29 23:26:15 -05:00
let src = $ ( this ) . attr ( 'img_src' ) ;
2021-12-23 21:26:24 -05:00
$ . ajax ( {
"url" : src ,
"method" : "GET"
} ) . done ( function ( res ) {
2021-12-29 23:26:15 -05:00
$ ( "#qrcode_img" ) . attr ( 'src' , res ) ;
2021-12-23 21:26:24 -05:00
qrcodeModal . toggle ( ) ;
2021-12-29 23:26:15 -05:00
} ) ;
} ) ;
2021-08-05 23:15:50 -04:00
// Delete Peer Modal
2021-12-29 23:26:15 -05:00
let deleteModal = new bootstrap . Modal ( document . getElementById ( 'delete_modal' ) , {
2022-01-08 15:26:17 -05:00
keyboard : false ,
backdrop : 'static'
2021-08-05 23:15:50 -04:00
} ) ;
2021-12-29 12:17:44 -05:00
$body . on ( "click" , ".btn-delete-peer" , function ( ) {
2021-12-29 23:26:15 -05:00
let peer _id = $ ( this ) . attr ( "id" ) ;
2021-08-05 23:15:50 -04:00
$ ( "#delete_peer" ) . attr ( "peer_id" , peer _id ) ;
deleteModal . toggle ( ) ;
2021-12-29 23:26:15 -05:00
} ) ;
2021-08-05 23:15:50 -04:00
2021-12-29 23:26:15 -05:00
$ ( "#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" ) ;
2022-01-08 15:26:17 -05:00
let peer _ids = [ peer _id ] ;
deletePeers ( config , peer _ids ) ;
} ) ;
function deletePeers ( config , peer _ids ) {
2021-08-05 23:15:50 -04:00
$ . ajax ( {
method : "POST" ,
url : "/remove_peer/" + config ,
headers : {
"Content-Type" : "application/json"
} ,
2022-01-08 15:26:17 -05:00
data : JSON . stringify ( { "action" : "delete" , "peer_ids" : peer _ids } ) ,
2021-08-05 23:15:50 -04:00
success : function ( response ) {
if ( response !== "true" ) {
2022-01-08 15:26:17 -05:00
if ( deleteModal . _isShown ) {
$ ( "#remove_peer_alert" ) . html ( response + $ ( "#add_peer_alert" ) . html ( ) )
. removeClass ( "d-none" ) ;
}
if ( deleteBulkModal . _isShown ) {
$ ( "#bulk_remove_peer_alert" ) . html ( response + $ ( "#bulk_remove_peer_alert" ) . html ( ) )
. removeClass ( "d-none" ) ;
}
2021-08-05 23:15:50 -04:00
}
else {
2022-01-08 15:26:17 -05:00
if ( deleteModal . _isShown ) {
deleteModal . toggle ( )
}
if ( deleteBulkModal . _isShown ) {
$ ( "#confirm_delete_bulk_peers" ) . removeAttr ( "disabled" ) . html ( "Delete" ) ;
$ ( "#selected_peer_list" ) . html ( '' ) ;
$ ( ".delete-bulk-peer-item.active" ) . removeClass ( 'active' ) ;
deleteBulkModal . toggle ( ) ;
}
2021-08-14 17:13:16 -04:00
load _data ( $ ( '#search_peer_textbox' ) . val ( ) ) ;
2021-08-05 23:15:50 -04:00
$ ( '#alertToast' ) . toast ( 'show' ) ;
$ ( '#alertToast .toast-body' ) . html ( "Peer deleted!" ) ;
2021-12-29 23:26:15 -05:00
$ ( "#delete_peer" ) . removeAttr ( "disabled" ) . html ( "Delete" ) ;
2021-08-05 23:15:50 -04:00
}
}
2021-12-29 23:26:15 -05:00
} ) ;
2022-01-08 15:26:17 -05:00
}
2021-08-05 23:15:50 -04:00
// Peer Setting Modal
2021-12-29 23:26:15 -05:00
let settingModal = new bootstrap . Modal ( document . getElementById ( 'setting_modal' ) , {
2022-01-08 15:26:17 -05:00
keyboard : false ,
backdrop : 'static'
2021-12-29 23:26:15 -05:00
} ) ;
2021-12-29 12:17:44 -05:00
$body . on ( "click" , ".btn-setting-peer" , function ( ) {
2021-12-29 23:26:15 -05:00
startProgressBar ( ) ;
let peer _id = $ ( this ) . attr ( "id" ) ;
2021-08-05 23:15:50 -04:00
$ ( "#save_peer_setting" ) . attr ( "peer_id" , peer _id ) ;
$ . ajax ( {
method : "POST" ,
url : "/get_peer_data/" + $ ( "#setting_modal" ) . attr ( "conf_id" ) ,
headers : {
"Content-Type" : "application/json"
} ,
data : JSON . stringify ( { "id" : peer _id } ) ,
success : function ( response ) {
2021-12-29 23:26:15 -05:00
let peer _name = ( ( response . name === "" ) ? "Untitled Peer" : response . name ) ;
2021-08-05 23:15:50 -04:00
$ ( "#setting_modal .peer_name" ) . html ( peer _name ) ;
2021-12-29 23:26:15 -05:00
$ ( "#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 ) ;
2021-08-14 17:13:16 -04:00
settingModal . toggle ( ) ;
2021-12-29 23:26:15 -05:00
endProgressBar ( ) ;
2021-08-05 23:15:50 -04:00
}
2021-12-29 23:26:15 -05:00
} ) ;
2021-08-05 23:15:50 -04:00
} ) ;
$ ( '#setting_modal' ) . on ( 'hidden.bs.modal' , function ( event ) {
$ ( "#setting_peer_alert" ) . addClass ( "d-none" ) ;
2021-12-29 23:26:15 -05:00
} ) ;
2021-08-05 23:15:50 -04:00
2021-12-29 23:26:15 -05:00
$ ( "#peer_private_key_textbox" ) . on ( "change" , function ( ) {
let $save _peer _setting = $ ( "#save_peer_setting" ) ;
2021-08-05 23:15:50 -04:00
if ( $ ( this ) . val ( ) . length > 0 ) {
$ . ajax ( {
2021-12-29 23:26:15 -05:00
"url" : "/check_key_match/" + $save _peer _setting . attr ( "conf_id" ) ,
2021-08-05 23:15:50 -04:00
"method" : "POST" ,
"headers" : { "Content-Type" : "application/json" } ,
"data" : JSON . stringify ( {
"private_key" : $ ( "#peer_private_key_textbox" ) . val ( ) ,
2021-12-29 23:26:15 -05:00
"public_key" : $save _peer _setting . attr ( "peer_id" )
2021-08-05 23:15:50 -04:00
} )
} ) . done ( function ( res ) {
2021-12-29 23:26:15 -05:00
if ( res . status === "failed" ) {
$ ( "#setting_peer_alert" ) . html ( res . status ) . removeClass ( "d-none" ) ;
2021-08-05 23:15:50 -04:00
} else {
$ ( "#setting_peer_alert" ) . addClass ( "d-none" ) ;
}
2021-12-29 23:26:15 -05:00
} ) ;
2021-08-05 23:15:50 -04:00
}
2021-12-29 23:26:15 -05:00
} ) ;
2021-08-05 23:15:50 -04:00
2021-12-29 23:26:15 -05:00
$ ( "#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" ) ) ;
2021-08-05 23:15:50 -04:00
$ . ajax ( {
method : "POST" ,
url : "/save_peer_setting/" + conf _id ,
headers : {
"Content-Type" : "application/json"
} ,
data : JSON . stringify ( {
id : peer _id ,
2021-12-29 23:26:15 -05:00
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 ( )
2021-08-05 23:15:50 -04:00
} ) ,
success : function ( response ) {
2021-12-29 23:26:15 -05:00
if ( response . status === "failed" ) {
$ ( "#setting_peer_alert" ) . html ( response . msg ) . removeClass ( "d-none" ) ;
2021-08-05 23:15:50 -04:00
} else {
settingModal . toggle ( ) ;
2021-12-29 23:26:15 -05:00
load _data ( $ ( '#search_peer_textbox' ) . val ( ) ) ;
2021-08-05 23:15:50 -04:00
$ ( '#alertToast' ) . toast ( 'show' ) ;
$ ( '#alertToast .toast-body' ) . html ( "Peer Saved!" ) ;
}
2021-12-29 23:26:15 -05:00
$ ( "#save_peer_setting" ) . removeAttr ( "disabled" ) . html ( "Save" ) ;
data _list . forEach ( ( ele ) => ele . removeAttr ( "disabled" ) ) ;
2021-08-05 23:15:50 -04:00
}
2021-12-29 23:26:15 -05:00
} ) ;
2021-08-24 21:04:01 -04:00
} else {
2021-12-29 23:26:15 -05:00
$ ( "#setting_peer_alert" ) . html ( "Please fill in all required box." ) . removeClass ( "d-none" ) ;
$ ( "#save_peer_setting" ) . removeAttr ( "disabled" ) . html ( "Save" ) ;
2021-08-05 23:15:50 -04:00
}
2021-12-29 23:26:15 -05:00
} ) ;
2021-08-05 23:15:50 -04:00
2021-12-29 23:26:15 -05:00
$ ( ".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 ) ;
} ) ;
2021-08-14 17:13:16 -04:00
// Search Peer
2021-12-29 23:26:15 -05:00
let typingTimer ;
let doneTypingInterval = 200 ;
let $input = $ ( '#search_peer_textbox' ) ;
2021-08-14 17:13:16 -04:00
$input . on ( 'keyup' , function ( ) {
clearTimeout ( typingTimer ) ;
typingTimer = setTimeout ( doneTyping , doneTypingInterval ) ;
} ) ;
2022-01-04 16:32:23 -05:00
2021-08-14 17:13:16 -04:00
$input . on ( 'keydown' , function ( ) {
clearTimeout ( typingTimer ) ;
} ) ;
2022-01-04 16:32:23 -05:00
2021-08-14 17:13:16 -04:00
function doneTyping ( ) {
2021-12-29 23:26:15 -05:00
load _data ( $input . val ( ) ) ;
2021-08-14 17:13:16 -04:00
}
// Sorting
2021-12-29 12:17:44 -05:00
$body . on ( "change" , "#sort_by_dropdown" , function ( ) {
2021-08-14 17:13:16 -04:00
$ . ajax ( {
method : "POST" ,
data : JSON . stringify ( { 'sort' : $ ( "#sort_by_dropdown option:selected" ) . val ( ) } ) ,
headers : { "Content-Type" : "application/json" } ,
url : "/update_dashboard_sort" ,
success : function ( res ) {
2021-12-29 23:26:15 -05:00
load _data ( $ ( '#search_peer_textbox' ) . val ( ) ) ;
2021-08-14 17:13:16 -04:00
}
2021-12-29 23:26:15 -05:00
} ) ;
} ) ;
2021-08-14 17:13:16 -04:00
2021-12-29 23:26:15 -05:00
// Click key to copy animation
2021-12-29 12:17:44 -05:00
$body . on ( "mouseenter" , ".key" , function ( ) {
2021-12-29 23:26:15 -05:00
let label = $ ( this ) . parent ( ) . siblings ( ) . children ( ) [ 1 ] ;
label . style . opacity = "100" ;
2022-01-04 16:32:23 -05:00
} ) . on ( "mouseout" , ".key" , function ( ) {
2021-12-29 23:26:15 -05:00
let label = $ ( this ) . parent ( ) . siblings ( ) . children ( ) [ 1 ] ;
label . style . opacity = "0" ;
2021-08-14 17:13:16 -04:00
setTimeout ( function ( ) {
2021-12-29 23:26:15 -05:00
label . innerHTML = "CLICK TO COPY" ;
} , 200 ) ;
2022-01-04 16:32:23 -05:00
} ) . on ( "click" , ".key" , function ( ) {
2021-12-29 23:26:15 -05:00
var label = $ ( this ) . parent ( ) . siblings ( ) . children ( ) [ 1 ] ;
copyToClipboard ( $ ( this ) ) ;
label . innerHTML = "COPIED!" ;
} ) ;
/ * *
* CopyToClipboard
* @ param element
* /
2021-08-14 17:13:16 -04:00
function copyToClipboard ( element ) {
2021-12-29 23:26:15 -05:00
let $temp = $ ( "<input>" ) ;
2021-12-29 12:17:44 -05:00
$body . append ( $temp ) ;
2021-12-29 23:26:15 -05:00
$temp . val ( $ ( element ) . text ( ) ) . trigger ( "select" ) ;
2021-08-14 17:13:16 -04:00
document . execCommand ( "copy" ) ;
$temp . remove ( ) ;
}
2021-09-08 12:39:25 -04:00
// Update Interval
2021-12-29 12:17:44 -05:00
$body . on ( "click" , ".update_interval" , function ( ) {
2021-12-27 21:01:02 -05:00
$ ( ".interval-btn-group button" ) . removeClass ( "active" ) ;
2021-12-29 23:26:15 -05:00
let _new = $ ( this ) ;
2021-12-29 12:17:44 -05:00
_new . addClass ( "active" ) ;
let interval = $ ( this ) . data ( "refresh-interval" ) ;
2021-12-27 21:01:02 -05:00
$ . ajax ( {
method : "POST" ,
data : "interval=" + $ ( this ) . data ( "refresh-interval" ) ,
url : "/update_dashboard_refresh_interval" ,
success : function ( res ) {
2021-12-29 12:17:44 -05:00
if ( res === "true" ) {
load _interval = interval ;
clearInterval ( load _timeout ) ;
load _timeout = setInterval ( function ( ) {
load _data ( $ ( '#search_peer_textbox' ) . val ( ) ) ;
} , interval ) ;
showToast ( "Refresh Interval set to " + Math . round ( interval / 1000 ) + " seconds" ) ;
} else {
$ ( ".interval-btn-group button" ) . removeClass ( "active" ) ;
$ ( '.interval-btn-group button[data-refresh-interval="' + load _interval + '"]' ) . addClass ( "active" ) ;
showToast ( "Refresh Interval set unsuccessful" ) ;
}
2021-12-27 21:01:02 -05:00
}
2022-01-12 19:53:36 -05:00
} ) ;
2021-12-27 21:01:02 -05:00
} ) ;
2021-12-29 23:26:15 -05:00
// Refresh Button
2021-12-29 12:17:44 -05:00
$body . on ( "click" , ".refresh" , function ( ) {
2021-08-14 23:30:05 -04:00
load _data ( $ ( '#search_peer_textbox' ) . val ( ) ) ;
} ) ;
2021-09-03 17:32:51 -04:00
2021-09-08 12:39:25 -04:00
// Switch display mode
2021-12-29 12:17:44 -05:00
$body . on ( "click" , ".display_mode" , function ( ) {
2021-12-27 21:01:02 -05:00
$ ( ".display-btn-group button" ) . removeClass ( "active" ) ;
$ ( this ) . addClass ( "active" ) ;
let display _mode = $ ( this ) . data ( "display-mode" ) ;
2021-09-03 17:32:51 -04:00
$ . ajax ( {
method : "GET" ,
2021-12-27 21:01:02 -05:00
url : "/switch_display_mode/" + $ ( this ) . data ( "display-mode" ) ,
2021-09-03 17:32:51 -04:00
success : function ( res ) {
2021-12-29 12:17:44 -05:00
if ( res === "true" ) {
if ( display _mode === "list" ) {
2021-12-27 21:01:02 -05:00
Array ( $ ( ".peer_list" ) . children ( ) ) . forEach ( function ( child ) {
$ ( child ) . removeClass ( ) . addClass ( "col-12" ) ;
2021-12-29 23:26:15 -05:00
} ) ;
2021-12-29 12:17:44 -05:00
showToast ( "Displaying as List" ) ;
2021-12-27 21:01:02 -05:00
} else {
Array ( $ ( ".peer_list" ) . children ( ) ) . forEach ( function ( child ) {
$ ( child ) . removeClass ( ) . addClass ( "col-sm-6 col-lg-4" ) ;
2021-12-29 12:17:44 -05:00
} ) ;
2021-12-30 15:21:25 -05:00
showToast ( "Displaying as Grids" ) ;
2021-12-27 21:01:02 -05:00
}
2021-12-29 12:17:44 -05:00
}
2021-09-03 17:32:51 -04:00
}
2021-12-29 23:26:15 -05:00
} ) ;
2022-01-06 15:17:43 -05:00
} ) ;
2022-01-08 15:26:17 -05:00
// Toggle bulk add mode
2022-01-06 15:17:43 -05:00
$ ( "#bulk_add" ) . on ( "change" , function ( ) {
let hide = $ ( ".non-bulk" ) . find ( "input" ) ;
let amount = $ ( "#new_add_amount" ) ;
if ( $ ( this ) . prop ( "checked" ) === true ) {
for ( let i = 0 ; i < hide . length ; i ++ ) {
$ ( hide [ i ] ) . attr ( "disabled" , "disabled" ) ;
}
amount . removeAttr ( "disabled" ) ;
}
else {
for ( let i = 0 ; i < hide . length ; i ++ ) {
if ( $ ( hide [ i ] ) . attr ( 'id' ) !== "public_key" ) {
$ ( hide [ i ] ) . removeAttr ( "disabled" ) ;
}
}
amount . attr ( "disabled" , "disabled" ) ;
}
2022-01-12 19:53:36 -05:00
} ) ;
2022-01-08 15:26:17 -05:00
// Configuration sub menu
let $setting _btn _menu = $ ( ".setting_btn_menu" ) ;
$setting _btn _menu . css ( "top" , ( $setting _btn _menu . height ( ) + 54 ) * ( - 1 ) ) ;
let $setting _btn = $ ( ".setting_btn" ) ;
$setting _btn . on ( "click" , function ( ) {
if ( $setting _btn _menu . hasClass ( "show" ) ) {
$setting _btn _menu . removeClass ( "showing" ) ;
setTimeout ( function ( ) {
$setting _btn _menu . removeClass ( "show" ) ;
2022-01-12 19:53:36 -05:00
} , 201 ) ;
2022-01-08 15:26:17 -05:00
} else {
$setting _btn _menu . addClass ( "show" ) ;
setTimeout ( function ( ) {
$setting _btn _menu . addClass ( "showing" ) ;
2022-01-12 19:53:36 -05:00
} , 10 ) ;
2022-01-08 15:26:17 -05:00
}
} )
2022-01-12 19:53:36 -05:00
$ ( "html" ) . on ( "click" , function ( r ) {
2022-01-08 15:26:17 -05:00
if ( document . querySelector ( ".setting_btn" ) !== r . target ) {
2022-01-12 19:53:36 -05:00
if ( ! document . querySelector ( ".setting_btn" ) . contains ( r . target ) ) {
2022-01-08 15:26:17 -05:00
if ( ! document . querySelector ( ".setting_btn_menu" ) . contains ( r . target ) ) {
$setting _btn _menu . removeClass ( "showing" ) ;
setTimeout ( function ( ) {
$setting _btn _menu . removeClass ( "show" ) ;
2022-01-12 19:53:36 -05:00
} , 310 ) ;
2022-01-08 15:26:17 -05:00
}
}
}
} ) ;
// Delete peers by bulk
let deleteBulkModal = new bootstrap . Modal ( document . getElementById ( 'delete_bulk_modal' ) , {
keyboard : false ,
backdrop : 'static'
} ) ;
$ ( "#delete_peers_by_bulk_btn" ) . on ( "click" , ( ) => {
let $delete _bulk _modal _list = $ ( "#delete_bulk_modal .list-group" ) ;
$delete _bulk _modal _list . html ( '' ) ;
peers . forEach ( ( peer ) => {
let name = ""
if ( peer [ "name" ] === "" ) { name = "Untitled Peer" ; }
else { name = peer [ "name" ] ; }
$delete _bulk _modal _list . append ( '<a class="list-group-item list-group-item-action delete-bulk-peer-item" style="cursor: pointer" data-id="'
+ peer [ 'id' ] + '" data-name="' + name + '">' + name + '<br><code>' + peer [ 'id' ] + '</code></a>' ) ;
} ) ;
deleteBulkModal . toggle ( ) ;
} ) ;
function toggleBulkIP ( element ) {
let $selected _peer _list = $ ( "#selected_peer_list" ) ;
let id = element . data ( "id" ) ;
let name = element . data ( "name" ) === "" ? "Untitled Peer" : element . data ( "name" ) ;
if ( element . hasClass ( "active" ) ) {
element . removeClass ( "active" ) ;
$ ( "#selected_peer_list .badge[data-id='" + id + "']" ) . remove ( ) ;
} else {
element . addClass ( "active" ) ;
$selected _peer _list . append ( '<span class="badge badge-danger delete-peer-bulk-badge" style="cursor: pointer; text-overflow: ellipsis; max-width: 100%; overflow-x: hidden" data-id="' + id + '">' + name + ' - ' + id + '</span>' )
}
}
$body . on ( "click" , ".delete-bulk-peer-item" , function ( ) {
toggleBulkIP ( $ ( this ) ) ;
} ) . on ( "click" , ".delete-peer-bulk-badge" , function ( ) {
toggleBulkIP ( $ ( ".delete-bulk-peer-item[data-id='" + $ ( this ) . data ( "id" ) + "']" ) ) ;
} ) ;
let $selected _peer _list = document . getElementById ( "selected_peer_list" ) ;
let changeObserver = new MutationObserver ( function ( mutationsList , observer ) {
if ( $selected _peer _list . hasChildNodes ( ) ) {
$ ( "#confirm_delete_bulk_peers" ) . removeAttr ( "disabled" ) ;
} else {
$ ( "#confirm_delete_bulk_peers" ) . attr ( "disabled" , "disabled" ) ;
}
} ) ;
changeObserver . observe ( $selected _peer _list , {
attributes : true ,
childList : true ,
characterData : true
} )
let confirm _delete _bulk _peers _interval = undefined ;
$ ( "#confirm_delete_bulk_peers" ) . on ( "click" , function ( ) {
let btn = $ ( this ) ;
if ( confirm _delete _bulk _peers _interval !== undefined ) {
clearInterval ( confirm _delete _bulk _peers _interval ) ;
confirm _delete _bulk _peers _interval = undefined ;
btn . html ( "Delete" ) ;
} else {
let timer = 5 ;
btn . html ( ` Deleting in ${ timer } secs... Click to cancel ` ) ;
confirm _delete _bulk _peers _interval = setInterval ( function ( ) {
timer -= 1 ;
btn . html ( ` Deleting in ${ timer } secs... Click to cancel ` ) ;
if ( timer === 0 ) {
btn . html ( ` Deleting... ` ) ;
btn . attr ( "disabled" , "disabled" ) ;
let ips = [ ] ;
$selected _peer _list . childNodes . forEach ( ( ele ) => ips . push ( ele . dataset . id ) ) ;
deletePeers ( btn . data ( "conf" ) , ips ) ;
clearInterval ( confirm _delete _bulk _peers _interval ) ;
confirm _delete _bulk _peers _interval = undefined ;
}
} , 1000 )
}
} ) ;
$ ( "#select_all_delete_bulk_peers" ) . on ( "click" , function ( ) {
$ ( ".delete-bulk-peer-item" ) . each ( function ( ) {
2022-01-12 19:53:36 -05:00
if ( ! $ ( this ) . hasClass ( "active" ) ) {
toggleBulkIP ( $ ( this ) ) ;
}
2022-01-08 15:26:17 -05:00
} ) ;
} ) ;
$ ( deleteBulkModal . _element ) . on ( "hidden.bs.modal" , function ( ) {
$ ( ".delete-bulk-peer-item" ) . each ( function ( ) {
2022-01-12 19:53:36 -05:00
if ( $ ( this ) . hasClass ( "active" ) ) {
toggleBulkIP ( $ ( this ) ) ;
}
2022-01-08 15:26:17 -05:00
} ) ;
2022-01-12 19:53:36 -05:00
} ) ;
// Download Peers
function download _one _config ( conf ) {
let link = document . createElement ( 'a' ) ;
link . download = conf . filename ;
let blob = new Blob ( [ conf . content ] , { type : 'text/conf' } ) ;
link . href = window . URL . createObjectURL ( blob ) ;
link . click ( ) ;
}
function download _all _config ( confs ) {
wireguard . generateZipFiles ( confs ) ;
}
$body . on ( "click" , ".btn-download-peer" , function ( e ) {
e . preventDefault ( ) ;
let link = $ ( this ) . attr ( "href" ) ;
$ . ajax ( {
"url" : link ,
"method" : "GET" ,
success : function ( res ) {
download _one _config ( res ) ;
}
} ) ;
} ) ;
$ ( "#download_all_peers" ) . on ( "click" , function ( ) {
$ . ajax ( {
"url" : $ ( this ) . data ( "url" ) ,
"method" : "GET" ,
success : function ( res ) {
if ( res . peers . length > 0 ) {
download _all _config ( res ) ;
}
}
} ) ;
} ) ;