diff --git a/lib/Catalyst/Plugin/EscapeJs.pm b/lib/Catalyst/Plugin/EscapeJs.pm
new file mode 100644
index 0000000000..f7dc9b659f
--- /dev/null
+++ b/lib/Catalyst/Plugin/EscapeJs.pm
@@ -0,0 +1,16 @@
+package Catalyst::Plugin::EscapeJs;
+use warnings;
+use strict;
+use MRO::Compat;
+
+sub escape_js {
+ my $c = shift;
+ my $str = shift;
+ my $quote_char = shift;
+ $quote_char //= "'";
+ $str =~ s/\\/\\\\/g;
+ $str =~ s/$quote_char/\\$quote_char/g;
+ return $str;
+}
+
+1;
\ No newline at end of file
diff --git a/lib/NGCP/Panel.pm b/lib/NGCP/Panel.pm
index 1ba020b297..1cc24d79fe 100644
--- a/lib/NGCP/Panel.pm
+++ b/lib/NGCP/Panel.pm
@@ -27,6 +27,7 @@ use Catalyst qw/
Session::Store::Redis
Session::State::Cookie
EscapeSensitiveValue
+ EscapeJs
I18N
/;
use Log::Log4perl::Catalyst qw();
diff --git a/share/layout/body.tt b/share/layout/body.tt
index 340447d568..d0d2603347 100644
--- a/share/layout/body.tt
+++ b/share/layout/body.tt
@@ -145,7 +145,7 @@ var mainWrapperInit = function () {
$('.sw_action_row').hover(
function() { $(this).find('.sw_actions').css('visibility','visible'); },
function() { $(this).find('.sw_actions').css('visibility','hidden'); }
- );
+ );
$('a[data-confirm]').live("click", function(ev) {
var href = $(this).attr('href');
@@ -154,15 +154,15 @@ var mainWrapperInit = function () {
$('body').append(
'
'+
''+
''+
'
'
);
- }
+ }
$('#dataConfirmOK').attr('href', href);
if( href.search(/^javascript:/i ) > -1 ){
$('#dataConfirmOK').attr('onclick', href);
@@ -205,7 +205,7 @@ var mainWrapperInit = function () {
var backuri = $(this).data('backuri') ? $(this).data('backuri') : '[%- backuri | uri -%]';
var _back = 'back='+backuri;
if(_href == null || _href.match(/[&\?]back=/)) {
- // ignore
+ // ignore
} else if(_href.match(/\?/)) {
$(this).attr('href', _href + '&' + _back);
} else {
diff --git a/share/templates/widgets/admin_billing_overview.tt b/share/templates/widgets/admin_billing_overview.tt
index d979a57127..f20c792e48 100644
--- a/share/templates/widgets/admin_billing_overview.tt
+++ b/share/templates/widgets/admin_billing_overview.tt
@@ -4,21 +4,21 @@ enqueLists.push([{
widgetName: "AdminBillingOverview",
cb: function(data) {
//console.log(data);
- $("#admin_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.loc('Peering Costs') %]');
+ $("#admin_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.escape_js(c.loc('Peering Costs')) %]');
}
},{
res: 'reseller_sum',
widgetName: "AdminBillingOverview",
cb: function(data) {
//console.log(data);
- $("#admin_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.loc('Reseller Revenue') %]');
+ $("#admin_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.escape_js(c.loc('Reseller Revenue')) %]');
}
},{
res: 'customer_sum',
widgetName: "AdminBillingOverview",
cb: function(data) {
//console.log(data);
- $("#admin_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.loc('Customer Revenue') %]');
+ $("#admin_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.escape_js(c.loc('Customer Revenue')) %]');
}
},{
res: 'profiles_count',
@@ -29,7 +29,7 @@ enqueLists.push([{
$("#admin_billing_overview_lazy_items_header").append(
'' +
'' + data.widget_data + '' +
- '' + (data.widget_data == 1 ? '[% c.loc('Billing Profile') %]' : '[% c.loc('Billing Profiles') %]') + '' +
+ '' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Billing Profile')) %]' : '[% c.escape_js(c.loc('Billing Profiles')) %]') + '' +
'
');
}
}]);
diff --git a/share/templates/widgets/admin_peering_overview.tt b/share/templates/widgets/admin_peering_overview.tt
index 49e5b267c6..23e47e74e8 100644
--- a/share/templates/widgets/admin_peering_overview.tt
+++ b/share/templates/widgets/admin_peering_overview.tt
@@ -4,14 +4,14 @@ enqueLists.push([{
widgetName: "AdminPeeringOverview",
cb: function(data) {
//console.log(data);
- $("#admin_peering_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.loc('Peering Server') %]' : '[% c.loc('Peering Servers') %]') + '');
+ $("#admin_peering_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Peering Server')) %]' : '[% c.escape_js(c.loc('Peering Servers')) %]') + '');
}
},{
res: 'rules_count',
widgetName: "AdminPeeringOverview",
cb: function(data) {
//console.log(data);
- $("#admin_peering_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.loc('Peering Rule') %]' : '[% c.loc('Peering Rules') %]') + '');
+ $("#admin_peering_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Peering Rule')) %]' : '[% c.escape_js(c.loc('Peering Rules')) %]') + '');
}
},{
res: 'groups_count',
@@ -22,7 +22,7 @@ enqueLists.push([{
$("#admin_peering_overview_lazy_items_header").append(
'' +
'' + data.widget_data + '' +
- '' + (data.widget_data == 1 ? '[% c.loc('Peering Group') %]' : '[% c.loc('Peering Groups') %]') + '' +
+ '' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Peering Group')) %]' : '[% c.escape_js(c.loc('Peering Groups')) %]') + '' +
'
');
}
}]);
diff --git a/share/templates/widgets/admin_reseller_overview.tt b/share/templates/widgets/admin_reseller_overview.tt
index b231f62f44..3d164ac084 100644
--- a/share/templates/widgets/admin_reseller_overview.tt
+++ b/share/templates/widgets/admin_reseller_overview.tt
@@ -4,21 +4,21 @@ enqueLists.push([{
widgetName: "AdminResellerOverview",
cb: function(data) {
//console.log(data);
- $("#admin_reseller_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.loc('Domain') %]' : '[% c.loc('Domains') %]') + '');
+ $("#admin_reseller_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Domain')) %]' : '[% c.escape_js(c.loc('Domains')) %]') + '');
}
},{
res: 'customers_count',
widgetName: "AdminResellerOverview",
cb: function(data) {
//console.log(data);
- $("#admin_reseller_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.loc('Customer') %]' : '[% c.loc('Customers') %]') + '');
+ $("#admin_reseller_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Customer')) %]' : '[% c.escape_js(c.loc('Customers')) %]') + '');
}
},{
res: 'subscribers_count',
widgetName: "AdminResellerOverview",
cb: function(data) {
//console.log(data);
- $("#admin_reseller_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.loc('Subscriber') %]' : '[% c.loc('Subscribers') %]') + '');
+ $("#admin_reseller_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Subscriber')) %]' : '[% c.escape_js(c.loc('Subscribers')) %]') + '');
}
},{
res: 'resellers_count',
@@ -29,7 +29,7 @@ enqueLists.push([{
$("#admin_reseller_overview_lazy_items_header").append(
'' +
'' + data.widget_data + '' +
- '' + (data.widget_data == 1 ? '[% c.loc('Reseller') %]' : '[% c.loc('Resellers') %]') + '' +
+ '' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Reseller')) %]' : '[% c.escape_js(c.loc('Resellers')) %]') + '' +
'
');
}
}]);
diff --git a/share/templates/widgets/admin_system_overview.tt b/share/templates/widgets/admin_system_overview.tt
index c2217af335..ced829ebd2 100644
--- a/share/templates/widgets/admin_system_overview.tt
+++ b/share/templates/widgets/admin_system_overview.tt
@@ -15,7 +15,7 @@ enqueLists.push([{
//console.log(data);
var txt = data.widget_data.text;
var col = data.widget_data.color;
- $("#admin_system_overview_lazy_items_list").append('[% c.loc('System') %] ' + txt + '');
+ $("#admin_system_overview_lazy_items_list").append('[% c.escape_js(c.loc('System')) %] ' + txt + '');
}
},{
res: 'hardware',
@@ -24,7 +24,7 @@ enqueLists.push([{
//console.log(data);
var txt = data.widget_data.text;
var col = data.widget_data.color;
- $("#admin_system_overview_lazy_items_list").append('[% c.loc('Hardware') %] ' + txt + '');
+ $("#admin_system_overview_lazy_items_list").append('[% c.escape_js(c.loc('Hardware')) %] ' + txt + '');
}
},{
res: 'overall_status',
diff --git a/share/templates/widgets/reseller_billing_overview.tt b/share/templates/widgets/reseller_billing_overview.tt
index b2574fd265..02a741b729 100644
--- a/share/templates/widgets/reseller_billing_overview.tt
+++ b/share/templates/widgets/reseller_billing_overview.tt
@@ -4,14 +4,14 @@ enqueLists.push([{
widgetName: "ResellerBillingOverview",
cb: function(data) {
//console.log(data);
- $("#reseller_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.loc('Reseller Cost') %]');
+ $("#reseller_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.escape_js(c.loc('Reseller Cost')) %]');
}
},{
res: 'customer_sum',
widgetName: "ResellerBillingOverview",
cb: function(data) {
//console.log(data);
- $("#reseller_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.loc('Customer Revenue') %]');
+ $("#reseller_billing_overview_lazy_items_list").append('' + sprintf('%.02f',data.widget_data / 100.0) + ' [% c.escape_js(c.loc('Customer Revenue')) %]');
}
},{
res: 'profiles_count',
@@ -22,7 +22,7 @@ enqueLists.push([{
$("#reseller_billing_overview_lazy_items_header").append(
'' +
'' + data.widget_data + '' +
- '' + (data.widget_data == 1 ? '[% c.loc('Billing Profile') %]' : '[% c.loc('Billing Profiles') %]') + '' +
+ '' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Billing Profile')) %]' : '[% c.escape_js(c.loc('Billing Profiles')) %]') + '' +
'
');
}
}]);
diff --git a/share/templates/widgets/reseller_customer_overview.tt b/share/templates/widgets/reseller_customer_overview.tt
index 670edf29c2..3cc6358d7b 100644
--- a/share/templates/widgets/reseller_customer_overview.tt
+++ b/share/templates/widgets/reseller_customer_overview.tt
@@ -4,14 +4,14 @@ enqueLists.push([{
widgetName: "ResellerCustomerOverview",
cb: function(data) {
//console.log(data);
- $("#reseller_customer_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.loc('Contact') %]' : '[% c.loc('Contacts') %]') + '');
+ $("#reseller_customer_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Contact')) %]' : '[% c.escape_js(c.loc('Contacts')) %]') + '');
}
},{
res: 'subscribers_count',
widgetName: "ResellerCustomerOverview",
cb: function(data) {
//console.log(data);
- $("#reseller_customer_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.loc('Subscriber') %]' : '[% c.loc('Subscribers') %]') + '');
+ $("#reseller_customer_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Subscriber')) %]' : '[% c.escape_js(c.loc('Subscribers')) %]') + '');
}
},{
res: 'customers_count',
@@ -22,7 +22,7 @@ enqueLists.push([{
$("#reseller_customer_overview_lazy_items_header").append(
'' +
'' + data.widget_data + '' +
- '' + (data.widget_data == 1 ? '[% c.loc('Customer') %]' : '[% c.loc('Customers') %]') + '' +
+ '' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Customer')) %]' : '[% c.escape_js(c.loc('Customers')) %]') + '' +
'
');
}
}]);
diff --git a/share/templates/widgets/reseller_domain_overview.tt b/share/templates/widgets/reseller_domain_overview.tt
index 8a6dfaec15..65bf2fb273 100644
--- a/share/templates/widgets/reseller_domain_overview.tt
+++ b/share/templates/widgets/reseller_domain_overview.tt
@@ -4,14 +4,14 @@ enqueLists.push([{
widgetName: "ResellerDomainOverview",
cb: function(data) {
//console.log(data);
- $("#reseller_domain_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.loc('Rewrite Rule Set') %]' : '[% c.loc('Rewrite Rule Sets') %]') + '');
+ $("#reseller_domain_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Rewrite Rule Set')) %]' : '[% c.escape_js(c.loc('Rewrite Rule Sets')) %]') + '');
}
},{
res: 'sound_sets_count',
widgetName: "ResellerDomainOverview",
cb: function(data) {
//console.log(data);
- $("#reseller_domain_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.loc('Sound Set') %]' : '[% c.loc('Sound Sets') %]') + '');
+ $("#reseller_domain_overview_lazy_items_list").append('' + data.widget_data + ' ' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Sound Set')) %]' : '[% c.escape_js(c.loc('Sound Sets')) %]') + '');
}
},{
res: 'domains_count',
@@ -22,7 +22,7 @@ enqueLists.push([{
$("#reseller_domain_overview_lazy_items_header").append(
'' +
'' + data.widget_data + '' +
- '' + (data.widget_data == 1 ? '[% c.loc('Domain') %]' : '[% c.loc('Domains') %]') + '' +
+ '' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Domain')) %]' : '[% c.escape_js(c.loc('Domains')) %]') + '' +
'
');
}
}]);
diff --git a/share/templates/widgets/subscriber_calls_overview.tt b/share/templates/widgets/subscriber_calls_overview.tt
index bc223c671f..35cfdfa1ef 100644
--- a/share/templates/widgets/subscriber_calls_overview.tt
+++ b/share/templates/widgets/subscriber_calls_overview.tt
@@ -6,7 +6,7 @@ enqueLists.push([{
//console.log(data);
var calls = data.widget_data;
if (calls.length == 0) {
- $("#subscriber_call_overview_lazy_items_list").append('[% c.loc('No calls yet') %]');
+ $("#subscriber_call_overview_lazy_items_list").append('[% c.escape_js(c.loc('No calls yet')) %]');
} else {
for (var i = 0; i < calls.length; i++) {
var call = calls[i];
@@ -47,7 +47,7 @@ enqueLists.push([{
$("#subscriber_call_overview_lazy_items_header").append(
'' +
'' + data.widget_data + '' +
- '' + (data.widget_data == 1 ? '[% c.loc('Recent Call') %]' : '[% c.loc('Recent Calls') %]') + '' +
+ '' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Recent Call')) %]' : '[% c.escape_js(c.loc('Recent Calls')) %]') + '' +
'
');
}
}]);
diff --git a/share/templates/widgets/subscriber_cf_overview.tt b/share/templates/widgets/subscriber_cf_overview.tt
index c0f4353f02..8103f00a3a 100644
--- a/share/templates/widgets/subscriber_cf_overview.tt
+++ b/share/templates/widgets/subscriber_cf_overview.tt
@@ -11,9 +11,9 @@ enqueLists.push([{
$("#subscriber_cf_overview_lazy_items_list").append('' +
cf_mappings.desc + ' [% c.loc('active') %]'
+ 'green">[% c.escape_js(c.loc('active')) %]'
:
- 'grey">[% c.loc('inactive') %]'
+ 'grey">[% c.escape_js(c.loc('inactive')) %]'
) + '' +
'');
mcount += cf_mappings.mappings.length;
@@ -22,7 +22,7 @@ enqueLists.push([{
$("#subscriber_cf_overview_lazy_items_header").append(
'' +
'' + mcount + '' +
- '' + (mcount == 1 ? '[% c.loc('Call Forward Configured') %]' : '[% c.loc('Call Forwards Configured') %]') + '' +
+ '' + (mcount == 1 ? '[% c.escape_js(c.loc('Call Forward Configured')) %]' : '[% c.escape_js(c.loc('Call Forwards Configured')) %]') + '' +
'
');
}
}]);
diff --git a/share/templates/widgets/subscriber_reg_overview.tt b/share/templates/widgets/subscriber_reg_overview.tt
index 7ad495f8eb..84a9647ded 100644
--- a/share/templates/widgets/subscriber_reg_overview.tt
+++ b/share/templates/widgets/subscriber_reg_overview.tt
@@ -6,7 +6,7 @@ enqueLists.push([{
//console.log(data);
var registrations = data.widget_data;
if (registrations.length == 0) {
- $("#subscriber_registration_overview_lazy_items_list").append('[% c.loc('No devices registered') %]');
+ $("#subscriber_registration_overview_lazy_items_list").append('[% c.escape_js(c.loc('No devices registered')) %]');
} else {
for (var i = 0; i < registrations.length; i++) {
var registration = registrations[i];
@@ -31,7 +31,7 @@ enqueLists.push([{
$("#subscriber_registration_overview_lazy_items_header").append(
'' +
'' + data.widget_data + '' +
- '' + (data.widget_data == 1 ? '[% c.loc('Registered Device') %]' : '[% c.loc('Registered Devices') %]') + '' +
+ '' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('Registered Device')) %]' : '[% c.escape_js(c.loc('Registered Devices')) %]') + '' +
'
');
}
}]);
diff --git a/share/templates/widgets/subscriber_vm_overview.tt b/share/templates/widgets/subscriber_vm_overview.tt
index 67bcc3bf25..3c28094965 100644
--- a/share/templates/widgets/subscriber_vm_overview.tt
+++ b/share/templates/widgets/subscriber_vm_overview.tt
@@ -6,7 +6,7 @@ enqueLists.push([{
//console.log(data);
var voicemails = data.widget_data;
if (voicemails.length == 0) {
- $("#subscriber_voicemail_overview_lazy_items_list").append('[% c.loc('No new messages') %]');
+ $("#subscriber_voicemail_overview_lazy_items_list").append('[% c.escape_js(c.loc('No new messages')) %]');
} else {
for (var i = 0; i < voicemails.length; i++) {
var voicemail = voicemails[i];
@@ -36,7 +36,7 @@ enqueLists.push([{
$("#subscriber_voicemail_overview_lazy_items_header").append(
'' +
'' + data.widget_data + '' +
- '' + (data.widget_data == 1 ? '[% c.loc('New Message') %]' : '[% c.loc('New Messages') %]') + '' +
+ '' + (data.widget_data == 1 ? '[% c.escape_js(c.loc('New Message')) %]' : '[% c.escape_js(c.loc('New Messages')) %]') + '' +
'
');
}
}]);