1+ function escapeHtml ( unsafe )
2+ {
3+ return unsafe
4+ . replace ( / & / g, "&" )
5+ . replace ( / < / g, "<" )
6+ . replace ( / > / g, ">" )
7+ . replace ( / " / g, """ )
8+ . replace ( / ' / g, "'" ) ;
9+ }
10+
111function renderClientList ( data ) {
212 $ . each ( data , function ( index , obj ) {
313 // render telegram button
@@ -6,13 +16,13 @@ function renderClientList(data) {
616 telegramButton = `<div class="btn-group">
717 <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal"
818 data-target="#modal_telegram_client" data-clientid="${ obj . Client . id } "
9- data-clientname="${ obj . Client . name } ">Telegram</button>
19+ data-clientname="${ escapeHtml ( obj . Client . name ) } ">Telegram</button>
1020 </div>`
1121 }
1222
1323 let telegramHtml = "" ;
1424 if ( obj . Client . telegram_userid && obj . Client . telegram_userid . length > 0 ) {
15- telegramHtml = `<div style="display: none"><i class="fas fa-tguserid"></i>${ obj . Client . telegram_userid } </div>`
25+ telegramHtml = `<div style="display: none"><i class="fas fa-tguserid"></i>${ escapeHtml ( obj . Client . telegram_userid ) } </div>`
1626 }
1727
1828 // render client status css tag style
@@ -24,13 +34,13 @@ function renderClientList(data) {
2434 // render client allocated ip addresses
2535 let allocatedIpsHtml = "" ;
2636 $ . each ( obj . Client . allocated_ips , function ( index , obj ) {
27- allocatedIpsHtml += `<small class="badge badge-secondary">${ obj } </small> ` ;
37+ allocatedIpsHtml += `<small class="badge badge-secondary">${ escapeHtml ( obj ) } </small> ` ;
2838 } )
2939
3040 // render client allowed ip addresses
3141 let allowedIpsHtml = "" ;
3242 $ . each ( obj . Client . allowed_ips , function ( index , obj ) {
33- allowedIpsHtml += `<small class="badge badge-secondary">${ obj } </small> ` ;
43+ allowedIpsHtml += `<small class="badge badge-secondary">${ escapeHtml ( obj ) } </small> ` ;
3444 } )
3545
3646 let subnetRangesString = "" ;
@@ -40,7 +50,7 @@ function renderClientList(data) {
4050
4151 let additionalNotesHtml = "" ;
4252 if ( obj . Client . additional_notes && obj . Client . additional_notes . length > 0 ) {
43- additionalNotesHtml = `<div style="display: none"><i class="fas fa-additional_notes"></i>${ obj . Client . additional_notes . toUpperCase ( ) } </div>`
53+ additionalNotesHtml = `<div style="display: none"><i class="fas fa-additional_notes"></i>${ escapeHtml ( obj . Client . additional_notes . toUpperCase ( ) ) } </div>`
4454 }
4555
4656 // render client html content
@@ -56,12 +66,12 @@ function renderClientList(data) {
5666 <div class="btn-group">
5767 <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal"
5868 data-target="#modal_qr_client" data-clientid="${ obj . Client . id } "
59- data-clientname="${ obj . Client . name } " ${ obj . QRCode != "" ? '' : ' disabled' } >QR code</button>
69+ data-clientname="${ escapeHtml ( obj . Client . name ) } " ${ obj . QRCode != "" ? '' : ' disabled' } >QR code</button>
6070 </div>
6171 <div class="btn-group">
6272 <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal"
6373 data-target="#modal_email_client" data-clientid="${ obj . Client . id } "
64- data-clientname="${ obj . Client . name } ">Email</button>
74+ data-clientname="${ escapeHtml ( obj . Client . name ) } ">Email</button>
6575 </div>
6676 ${ telegramButton }
6777 <div class="btn-group">
@@ -72,31 +82,31 @@ function renderClientList(data) {
7282 <div class="dropdown-menu" role="menu">
7383 <a class="dropdown-item" href="#" data-toggle="modal"
7484 data-target="#modal_edit_client" data-clientid="${ obj . Client . id } "
75- data-clientname="${ obj . Client . name } ">Edit</a>
85+ data-clientname="${ escapeHtml ( obj . Client . name ) } ">Edit</a>
7686 <a class="dropdown-item" href="#" data-toggle="modal"
7787 data-target="#modal_pause_client" data-clientid="${ obj . Client . id } "
78- data-clientname="${ obj . Client . name } ">Disable</a>
88+ data-clientname="${ escapeHtml ( obj . Client . name ) } ">Disable</a>
7989 <a class="dropdown-item" href="#" data-toggle="modal"
8090 data-target="#modal_remove_client" data-clientid="${ obj . Client . id } "
81- data-clientname="${ obj . Client . name } ">Delete</a>
91+ data-clientname="${ escapeHtml ( obj . Client . name ) } ">Delete</a>
8292 </div>
8393 </div>
8494 </div>
8595 <div class="card-body">
86- <div class="info-box-text"><i class="fas fa-user"></i> ${ obj . Client . name } </div>
87- <div style="display: none"><i class="fas fa-key"></i> ${ obj . Client . public_key } </div>
88- <div style="display: none"><i class="fas fa-subnetrange"></i>${ subnetRangesString } </div>
96+ <div class="info-box-text"><i class="fas fa-user"></i> ${ escapeHtml ( obj . Client . name ) } </div>
97+ <div style="display: none"><i class="fas fa-key"></i> ${ escapeHtml ( obj . Client . public_key ) } </div>
98+ <div style="display: none"><i class="fas fa-subnetrange"></i>${ escapeHtml ( subnetRangesString ) } </div>
8999 ${ telegramHtml }
90100 ${ additionalNotesHtml }
91- <div class="info-box-text"><i class="fas fa-envelope"></i> ${ obj . Client . email } </div>
101+ <div class="info-box-text"><i class="fas fa-envelope"></i> ${ escapeHtml ( obj . Client . email ) } </div>
92102 <div class="info-box-text"><i class="fas fa-clock"></i>
93103 ${ prettyDateTime ( obj . Client . created_at ) } </div>
94104 <div class="info-box-text"><i class="fas fa-history"></i>
95105 ${ prettyDateTime ( obj . Client . updated_at ) } </div>
96106 <div class="info-box-text"><i class="fas fa-server" style="${ obj . Client . use_server_dns ? "opacity: 1.0" : "opacity: 0.5" } "></i>
97107 ${ obj . Client . use_server_dns ? 'DNS enabled' : 'DNS disabled' } </div>
98108 <div class="info-box-text"><i class="fas fa-file"></i>
99- ${ obj . Client . additional_notes } </div>
109+ ${ escapeHtml ( obj . Client . additional_notes ) } </div>
100110 <div class="info-box-text"><strong>IP Allocation</strong></div>`
101111 + allocatedIpsHtml
102112 + `<div class="info-box-text"><strong>Allowed IPs</strong></div>`
0 commit comments