| Current Path : /var/www/html/administrator/components/com_rsfirewall/assets/js/ |
| Current File : /var/www/html/administrator/components/com_rsfirewall/assets/js/rsfirewall.js |
var RSFirewall = {};
RSFirewall.$ = jQuery;
RSFirewall.parseJSON = function (data) {
if (typeof data != 'object') {
// parse invalid data:
var match = data.match(/{.*}/);
return RSFirewall.$.parseJSON(match[0]);
}
return RSFirewall.$.parseJSON(data);
};
RSFirewall.requestTimeOut = {};
RSFirewall.requestTimeOut.Seconds = 0;
RSFirewall.requestTimeOut.Milliseconds = function () {
return parseFloat(RSFirewall.requestTimeOut.Seconds) * 1000;
};
/* loading helper */
RSFirewall.removeLoading = function () {
RSFirewall.$('.com-rsfirewall-icon-16-loading').remove();
};
RSFirewall.addLoading = function (where, type) {
if (typeof type == 'undefined') {
RSFirewall.$(where).append('<span class="com-rsfirewall-icon-16-loading"></span>');
} else {
RSFirewall.$(where)[type]('<span class="com-rsfirewall-icon-16-loading"></span>');
}
};
RSFirewall.removeArrow = function () {
RSFirewall.$('.com-rsfirewall-current-item').removeClass('com-rsfirewall-current-item');
};
RSFirewall.addArrow = function (item) {
RSFirewall.$(item).addClass('com-rsfirewall-current-item');
};
RSFirewall.$(document).ready(function () {
RSFirewall.$('#jform_blocked_countries input, #jform_blocked_continents input, #jform_blocked_countries_checkall input').on('click', function (element) {
if ((element.target.value == 'US' || element.target.value == 'checkall' || element.target.value == 'NA') && element.target.checked) {
RSFirewall.$('#us-country-blocked').removeClass('com-rsfirewall-hidden')
} else if ((element.target.value == 'US' || element.target.value == 'checkall' || element.target.value == 'NA') && !element.target.checked) {
RSFirewall.$('#us-country-blocked').addClass('com-rsfirewall-hidden');
}
});
});
/* Database */
RSFirewall.Database = {};
RSFirewall.Database.Check = {
unhide : function (item) {
return RSFirewall.$(item).removeClass('com-rsfirewall-hidden');
},
ignored : false,
tables : [],
tablesNum : 0,
table : '',
content : '',
prefix : '',
startCheck : function () {
this.table = RSFirewall.$('#' + this.prefix + '-table');
this.content = RSFirewall.$('#' + this.prefix);
if (!this.tables.length) {
return false;
}
this.unhide(this.content);
this.content.hide().show('fast', function () {
RSFirewall.Database.Check.stepCheck(0);
});
},
stopCheck : function () {
},
setProgress: function (index) {
if (RSFirewall.$('#' + this.prefix + '-progress .com-rsfirewall-bar').length > 0) {
var currentProgress = (100 / this.tablesNum) * index;
RSFirewall.$('#' + this.prefix + '-progress .com-rsfirewall-bar').css('width', currentProgress + '%').text(parseInt(currentProgress) + '%');
}
},
stepCheck : function (index) {
this.setProgress(index);
if (!this.tables || !this.tables.length) {
this.stopCheck();
return false;
}
this.unhide(this.table.find('tr')[index + 1]);
var table = this.tables.pop();
RSFirewall.$.ajax({
type : 'POST',
url : 'index.php?option=com_rsfirewall',
data : {
task : 'dbcheck.optimize',
table: table,
sid : Math.random()
},
beforeSend: function () {
RSFirewall.addLoading(RSFirewall.$('#result' + index));
},
success : function (data) {
RSFirewall.removeLoading();
RSFirewall.$('#result' + index).html(data);
if (RSFirewall.requestTimeOut.Seconds != 0) {
setTimeout(function () {
RSFirewall.Database.Check.stepCheck(index + 1)
}, RSFirewall.requestTimeOut.Milliseconds());
}
else {
RSFirewall.Database.Check.stepCheck(index + 1);
}
}
});
}
};
/* System */
RSFirewall.System = {};
RSFirewall.Retries = 0;
RSFirewall.MaxRetries = 10;
RSFirewall.RetryTimeout = 10;
RSFirewall.System.Check = {
unhide : function (item) {
return RSFirewall.$(item).removeClass('com-rsfirewall-hidden');
},
content : null,
table : null,
steps : [],
currentStep : '',
prefix : '',
fix : function (step, currentButton) {
var parent = RSFirewall.$(currentButton).parents('td');
var data = {
task: 'fix.' + step,
sid : Math.random()
};
if (parent.find('.com-rsfirewall-loader-wrapper').length > 0) {
var loaderWrapper = parent.find('.com-rsfirewall-loader-wrapper');
} else {
var loaderWrapper = RSFirewall.$('<span class="com-rsfirewall-loader-wrapper"></span>');
loaderWrapper.insertAfter(currentButton);
}
loaderWrapper.removeClass('com-rsfirewall-ok com-rsfirewall-not-ok com-rsfirewall-error').empty();
if (step == 'fixAdminUser') {
data.username = RSFirewall.$('#com-rsfirewall-new-username').val();
} else if (step == 'fixHashes') {
data.files = [];
RSFirewall.$('input[name="hashes[]"]:checked').each(function () {
data.files.push(RSFirewall.$(this).val());
});
data.flags = [];
RSFirewall.$('input[name="hash_flags[]"]').each(function () {
data.flags.push(RSFirewall.$(this).val());
});
} else if (step == 'ignoreFiles') {
data.files = [];
RSFirewall.$('input[name="ignorefiles[]"]:checked').each(function () {
data.files.push(RSFirewall.$(this).val());
});
} else if (step == 'fixFolderPermissions') {
data.folders = [];
// adjust the limit
var limit = this.limit;
if (RSFirewall.$('input[name="folders[]"]:checked').length < this.limit) {
limit = RSFirewall.$('input[name="folders[]"]:checked').length;
}
// add the folders to the POST array
for (var i = 0; i < limit; i++) {
data.folders.push(RSFirewall.$(RSFirewall.$('input[name="folders[]"]:checked')[i]).val());
}
// how many items are left?
loaderWrapper.text(Joomla.JText._('COM_RSFIREWALL_ITEMS_LEFT').replace('%d', RSFirewall.$('input[name="folders[]"]:checked').length));
// stop if there are no folders to process
if (data.folders.length == 0) {
// show the message
loaderWrapper.html(Joomla.JText._('COM_RSFIREWALL_FIX_FOLDER_PERMISSIONS_DONE'));
loaderWrapper.addClass('com-rsfirewall-ok');
RSFirewall.$(currentButton).remove();
return;
}
} else if (step == 'fixFilePermissions') {
data.files = [];
// adjust the limit
var limit = this.limit;
if (RSFirewall.$('input[name="files[]"]:checked').length < this.limit) {
limit = RSFirewall.$('input[name="files[]"]:checked').length;
}
// add the files to the POST array
for (var i = 0; i < limit; i++) {
data.files.push(RSFirewall.$(RSFirewall.$('input[name="files[]"]:checked')[i]).val());
}
// how many items are left?
loaderWrapper.text(Joomla.JText._('COM_RSFIREWALL_ITEMS_LEFT').replace('%d', RSFirewall.$('input[name="files[]"]:checked').length));
// stop if there are no files to process
if (data.files.length == 0) {
// show the message
loaderWrapper.html(Joomla.JText._('COM_RSFIREWALL_FIX_FILE_PERMISSIONS_DONE'));
loaderWrapper.addClass('com-rsfirewall-ok');
RSFirewall.$(currentButton).remove();
return;
}
}
RSFirewall.$.ajax({
converters: {
"text json": RSFirewall.parseJSON
},
dataType : 'json',
type : 'POST',
url : 'index.php?option=com_rsfirewall',
data : data,
beforeSend: function () {
RSFirewall.addLoading(loaderWrapper);
RSFirewall.$(currentButton).hide();
},
error : function (jqXHR, textStatus, errorThrown) {
RSFirewall.removeLoading();
RSFirewall.$(currentButton).show();
loaderWrapper.addClass('com-rsfirewall-error');
loaderWrapper.html(Joomla.JText._('COM_RSFIREWALL_ERROR_FIX') + jqXHR.status + ' ' + errorThrown);
},
success : function (json) {
RSFirewall.removeLoading();
RSFirewall.$(currentButton).show();
if (json.success == true) {
if (RSFirewall.System.Check.parseFixDetails(step, json, loaderWrapper, currentButton)) {
// returning true means that we need to skip what's below
return;
}
if (typeof json.data.result != 'undefined') {
if (json.data.result == true) {
loaderWrapper.addClass('com-rsfirewall-ok');
RSFirewall.$(currentButton).remove();
} else {
loaderWrapper.addClass('com-rsfirewall-not-ok');
}
}
if (typeof json.data.message != 'undefined') {
loaderWrapper.html(json.data.message);
}
} else {
loaderWrapper.addClass('com-rsfirewall-error');
if (typeof json.data.message != 'undefined') {
loaderWrapper.html(json.data.message);
}
}
}
});
},
setProgress : function (index) {
if (RSFirewall.$('#' + this.prefix + '-progress .com-rsfirewall-bar').length > 0) {
var currentProgress = (100 / this.steps.length) * index;
RSFirewall.$('#' + this.prefix + '-progress .com-rsfirewall-bar').css('width', currentProgress + '%').text(parseInt(currentProgress) + '%');
}
},
stopCheck : function () {
// overwritten
},
stepCheck : function (index, more_data) {
this.setProgress(index);
if (typeof(this.steps[index]) == 'undefined') {
if (typeof this.stopCheck == 'function') {
this.stopCheck();
}
return;
}
trindex = index > 0 ? index * 2 : 0;
var currentRow = RSFirewall.$(this.table.find('tbody tr.com-rsfirewall-table-row')[trindex]);
var currentText = RSFirewall.$(currentRow.find('td span')[0]);
var currentResult = RSFirewall.$(currentRow.find('td span')[1]);
var currentDetailsRow = RSFirewall.$(this.table.find('tbody tr.com-rsfirewall-table-row')[trindex + 1]);
var currentDetails = RSFirewall.$(currentDetailsRow.children('td')[0]);
var currentDetailsButton = RSFirewall.$(this.table.find('.com-rsfirewall-details-button')[index]);
var currentStep = this.steps[index];
this.currentStep = currentStep;
this.unhide(currentRow);
default_data = {
task: 'check.' + currentStep,
sid : Math.random()
};
if (more_data) {
for (var key in more_data)
default_data[key] = more_data[key];
}
RSFirewall.$.ajax({
converters: {
"text json": RSFirewall.parseJSON
},
dataType : 'json',
type : 'POST',
url : 'index.php?option=com_rsfirewall',
data : default_data,
beforeSend: function () {
RSFirewall.addArrow(currentText);
RSFirewall.addLoading(currentResult);
},
error : function (jqXHR, textStatus, errorThrown) {
if (currentStep == 'checkSignatures')
{
// Retry after 10 seconds if the server firewall interfered
// Max 10 retries
if (RSFirewall.Retries < RSFirewall.MaxRetries)
{
RSFirewall.Retries++;
currentResult.html(Joomla.JText._('COM_RSFIREWALL_ERROR_CHECK_RETRYING'));
setTimeout(function () {
if (typeof RSFirewall.next_file != 'undefined')
{
RSFirewall.System.Check.stepCheck(index, {'file': RSFirewall.next_file});
}
else
{
RSFirewall.System.Check.stepCheck(index);
}
}, parseFloat(RSFirewall.RetryTimeout * 1000));
return;
}
}
currentResult.addClass('com-rsfirewall-error');
currentResult.html(Joomla.JText._('COM_RSFIREWALL_ERROR_CHECK') + jqXHR.status + ' ' + errorThrown);
RSFirewall.removeArrow();
if (RSFirewall.requestTimeOut.Seconds != 0) {
setTimeout(function () {
RSFirewall.System.Check.stepCheck(index + 1)
}, RSFirewall.requestTimeOut.Milliseconds());
}
else {
RSFirewall.System.Check.stepCheck(index + 1);
}
},
success : function (json) {
RSFirewall.removeArrow();
if (json.success == true) {
if (typeof json.data.message != 'undefined') {
currentResult.html(json.data.message);
}
if (typeof json.data.result != 'undefined') {
currentResult.addClass(json.data.result == true ? 'com-rsfirewall-ok' : 'com-rsfirewall-not-ok');
// show the button if we need to provide details
if (json.data.result == false) {
RSFirewall.System.Check.unhide(currentDetailsButton);
}
}
// a little hack to stop going to the next step
// if this step requires extra ajax calls
if (RSFirewall.System.Check.parseCheckDetails(currentStep, json, currentDetails, currentResult, currentDetailsButton)) {
return;
}
} else {
if (typeof json.data.message != 'undefined') {
if (currentStep == 'checkCoreFilesIntegrity') {
currentResult.addClass('com-rsfirewall-not-ok');
} else {
currentResult.addClass('com-rsfirewall-error');
}
currentResult.html(Joomla.JText._('COM_RSFIREWALL_ERROR_CHECK') + json.data.message);
}
}
if (RSFirewall.requestTimeOut.Seconds != 0) {
setTimeout(function () {
RSFirewall.System.Check.stepCheck(index + 1)
}, RSFirewall.requestTimeOut.Milliseconds());
}
else {
RSFirewall.System.Check.stepCheck(index + 1);
}
}
});
},
startCheck : function () {
this.table = RSFirewall.$('#' + this.prefix + '-table');
this.content = RSFirewall.$('#' + this.prefix);
var currentTable = this.table;
// make buttons clickable
this.table.find('.com-rsfirewall-details-button').each(function (i, el) {
RSFirewall.$(el).click(function () {
var row = currentTable.find('tbody tr.com-rsfirewall-table-row')[i * 2 + 1];
if (RSFirewall.$(row).hasClass('com-rsfirewall-hidden')) {
RSFirewall.System.Check.unhide(row);
RSFirewall.$(row).hide();
}
RSFirewall.$(row).toggle();
RSFirewall.$(this).children('span').toggleClass(function (j, theClass) {
RSFirewall.$(this).removeAttr('class');
if (theClass == 'expand')
return 'shrink';
return 'expand';
});
});
});
this.unhide(this.content);
this.content.hide().show('fast', function () {
RSFirewall.System.Check.stepCheck(0);
});
},
/* custom details parsing rules */
parseFixDetails : function (step, json, wrapper, button) {
if (step == 'fixPHP') {
if (json.data.contents) {
RSFirewall.$('#com-rsfirewall-php-ini').text(json.data.contents);
this.unhide('#com-rsfirewall-php-ini-wrapper');
RSFirewall.$('#com-rsfirewall-php-ini-wrapper').hide().fadeIn('slow');
}
} else if (step == 'fixFolderPermissions') {
if (json.data.results) {
for (var i = 0; i < json.data.results.length; i++) {
var result = RSFirewall.$('<span>', {'class': json.data.results[i] == 1 ? 'com-rsfirewall-ok' : 'com-rsfirewall-not-ok'});
RSFirewall.$(RSFirewall.$('input[name="folders[]"]:checked')[0]).replaceWith(result);
}
RSFirewall.System.Check.fix(step, button);
return true;
}
} else if (step == 'fixFilePermissions') {
if (json.data.results) {
for (var i = 0; i < json.data.results.length; i++) {
var result = RSFirewall.$('<span>', {'class': json.data.results[i] == 1 ? 'com-rsfirewall-ok' : 'com-rsfirewall-not-ok'});
RSFirewall.$(RSFirewall.$('input[name="files[]"]:checked')[0]).replaceWith(result);
}
RSFirewall.System.Check.fix(step, button);
return true;
}
}
},
parseCheckDetails: function (step, json, details, result, detailsButton) {
if (step == 'checkCoreFilesIntegrity') {
if (RSFirewall.$('#com-rsfirewall-hashes').length == 0) {
// let's create the table
var table = RSFirewall.$('<table>', {
'class': 'com-rsfirewall-colored-table',
'id' : 'com-rsfirewall-hashes'
});
details.append(table);
}
var table = RSFirewall.$('#com-rsfirewall-hashes');
if (json.data.ignored) {
this.ignored = true;
}
if (json.data.files && json.data.files.length > 0) {
var j = table.find('tr').length;
for (var i = 0; i < json.data.files.length; i++) {
var file = json.data.files[i];
var tr = RSFirewall.$('<tr>', {
'class': j % 2 ? 'blue' : 'yellow',
'id' : 'hash' + j
});
var td_checkbox = RSFirewall.$('<td>', {
width : '1%',
nowrap: 'nowrap'
});
var checkbox = RSFirewall.$('<input />', {
type : 'checkbox',
checked: true,
name : 'hashes[]',
value : file.path,
id : 'checkboxHash' + j
});
var hidden = RSFirewall.$('<input />', {
type: 'hidden',
name: 'hash_flags[]'
});
var label = RSFirewall.$('<label>', {'for': 'checkboxHash' + j}).text(file.path);
var $hid = 'hash' + j;
var downloadBtn = RSFirewall.$('<button type="button" style="margin-left:10px; margin-right:10px;" class="rsfirewall-download-original com-rsfirewall-button" onclick="RSFirewall.diffs.download(\'' + file.path + '\', \'' + $hid + '\' , window.document)"></button>')
.text(Joomla.JText._('COM_RSFIREWALL_DOWNLOAD_ORIGINAL'));
if (file.type == 'wrong') {
if (typeof file.time == 'string')
{
var td_type = RSFirewall.$('<td>').text(Joomla.JText._('COM_RSFIREWALL_FILE_HAS_BEEN_MODIFIED_AGO').replace('%s', file.time));
}
else
{
var td_type = RSFirewall.$('<td>').text(Joomla.JText._('COM_RSFIREWALL_FILE_HAS_BEEN_MODIFIED'));
}
var btn = RSFirewall.$('<button type="button" id="diff' + $hid + '" class="com-rsfirewall-button"></button>')
.attr('href', 'index.php?option=com_rsfirewall&view=diff&tmpl=component&hid=hash' + j + '&file=' + encodeURIComponent(file.path))
.text(Joomla.JText._('COM_RSFIREWALL_VIEW_DIFF'))
.click(function () {
window.open(RSFirewall.$(this).attr('href'), 'diffWindow', 'width=800, height=600, left=50%, location=0, menubar=0, resizable=1, scrollbars=1, toolbar=0, titlebar=1');
});
td_type.append(btn);
td_type.append(downloadBtn);
} else if (file.type == 'missing') {
hidden.val('M');
var td_type = RSFirewall.$('<td>').text(Joomla.JText._('COM_RSFIREWALL_FILE_IS_MISSING'));
td_type.append(downloadBtn);
}
var td_path = RSFirewall.$('<td>').append(label);
table.append(tr.append(td_checkbox.append(checkbox, hidden), td_path, td_type));
j++;
}
}
// we haven't reached the end of the file so do another ajax call
if (json.data.fstart) {
var stepIndex = this.steps.indexOf(this.currentStep);
if (RSFirewall.requestTimeOut.Seconds != 0) {
setTimeout(function () {
RSFirewall.System.Check.stepCheck(stepIndex, {'fstart': json.data.fstart})
}, RSFirewall.requestTimeOut.Milliseconds());
}
else {
RSFirewall.System.Check.stepCheck(stepIndex, {'fstart': json.data.fstart});
}
// returning true means that this step hasn't finished and we don't need to go to the next step
return true;
} else {
if (table.find('tr').length > 0) {
var $html = Joomla.JText._('COM_RSFIREWALL_HASHES_INCORRECT').replace('%d', '<span id="hashCount">' + table.find('tr').length + '</span> ');
result.html($html).addClass('com-rsfirewall-not-ok');
RSFirewall.System.Check.unhide(detailsButton);
} else {
result.text(Joomla.JText._('COM_RSFIREWALL_HASHES_CORRECT')).addClass('com-rsfirewall-ok');
}
// returning false means that this step has finished and we need to go to the next step
if (this.ignored) {
RSFirewall.$('#com-rsfirewall-ignore-files-button').removeClass('com-rsfirewall-hidden');
}
return false;
}
} else if (step == 'checkConfigurationIntegrity') {
// let's create the table
var table = RSFirewall.$('<table>', {'class': 'com-rsfirewall-colored-table'});
// and populate it
if (json.data.details) {
for (var i = 0; i < json.data.details.length; i++) {
var detail = json.data.details[i];
var tr = RSFirewall.$('<tr>', {'class': i % 2 ? 'blue' : 'yellow'});
var td_line = RSFirewall.$('<td>').html(Joomla.JText._('COM_RSFIREWALL_CONFIGURATION_LINE').replace('%d', detail.line));
var td_code = RSFirewall.$('<td>').text(detail.code);
table.append(tr.append(td_line, td_code));
}
}
details.append(table);
} else if (step == 'checkAdminPasswords') {
// let's create the table
var table = RSFirewall.$('<table>', {'class': 'com-rsfirewall-colored-table'});
var header = RSFirewall.$('<tr>');
var td_user = RSFirewall.$('<th>').text(Joomla.JText._('COM_RSFIREWALL_USERNAME'));
var td_pass = RSFirewall.$('<th>').text(Joomla.JText._('COM_RSFIREWALL_PASSWORD'));
table.append(header.append(td_user, td_pass));
// and populate it
if (json.data.details) {
for (var i = 0; i < json.data.details.length; i++) {
var detail = json.data.details[i];
var tr = RSFirewall.$('<tr>', {'class': i % 2 ? 'blue' : 'yellow'});
var td_user = RSFirewall.$('<td>').html(detail.username);
var td_pass = RSFirewall.$('<td>').text(detail.password);
table.append(tr.append(td_user, td_pass));
}
}
details.append(table);
} else if (step == 'checkTemporaryFiles') {
if (json.data.details) {
var p = RSFirewall.$('<p>');
details.append(p.append(json.data.details.message));
// let's create the table
var table = RSFirewall.$('<table>', {'class': 'com-rsfirewall-colored-table'});
var j = 0;
var limit = 10;
json.data.details.folders = RSFirewall.$.map(json.data.details.folders, function (el) {
return el
});
json.data.details.files = RSFirewall.$.map(json.data.details.files, function (el) {
return el
});
for (var i = 0; i < json.data.details.folders.length; i++) {
var folder = json.data.details.folders[i];
var tr = RSFirewall.$('<tr>', {'class': j % 2 ? 'blue' : 'yellow'});
var td = RSFirewall.$('<td>').text('[' + folder + ']');
table.append(tr.append(td));
j++;
if (i >= limit) {
var tr = RSFirewall.$('<tr>', {'class': j % 2 ? 'blue' : 'yellow'});
var td = RSFirewall.$('<td>').append(RSFirewall.$('<em>').text(Joomla.JText._('COM_RSFIREWALL_MORE_FOLDERS').replace('%d', (json.data.details.folders.length - limit))));
table.append(tr.append(td));
j++;
break;
}
}
for (var i = 0; i < json.data.details.files.length; i++) {
var file = json.data.details.files[i];
var tr = RSFirewall.$('<tr>', {'class': j % 2 ? 'blue' : 'yellow'});
var td = RSFirewall.$('<td>').text(file);
table.append(tr.append(td));
j++;
if (i >= limit) {
var tr = RSFirewall.$('<tr>', {'class': j % 2 ? 'blue' : 'yellow'});
var td = RSFirewall.$('<td>').append(RSFirewall.$('<em>').text(Joomla.JText._('COM_RSFIREWALL_MORE_FILES').replace('%d', (json.data.details.files.length - limit))));
table.append(tr.append(td));
j++;
break;
}
}
details.append(table);
}
} else if (step == 'checkDisableFunctions') {
if (json.data.details) {
var p = RSFirewall.$('<p>');
details.append(p.append(json.data.details));
}
if (this.table.find('.com-rsfirewall-not-ok').length > 0) {
this.unhide(RSFirewall.$('#com-rsfirewall-server-configuration-fix'));
}
} else if (step == 'checkFolderPermissions') {
if (RSFirewall.$('#com-rsfirewall-folders').length == 0) {
// let's create the table
var table = RSFirewall.$('<table>', {
'class': 'com-rsfirewall-colored-table',
'id' : 'com-rsfirewall-folders'
});
details.append(table);
}
var table = RSFirewall.$('#com-rsfirewall-folders');
if (json.data.stop) {
// stop scanning
if (table.find('tr').length > 0) {
result.text(Joomla.JText._('COM_RSFIREWALL_FOLDER_PERMISSIONS_INCORRECT').replace('%d', table.find('tr').length)).addClass('com-rsfirewall-not-ok');
RSFirewall.System.Check.unhide(detailsButton);
} else {
result.text(Joomla.JText._('COM_RSFIREWALL_FOLDER_PERMISSIONS_CORRECT')).addClass('com-rsfirewall-ok');
}
// finished
return false;
} else {
if (json.data.folders && json.data.folders.length > 0) {
var j = table.find('tr').length;
for (var i = 0; i < json.data.folders.length; i++) {
var folder = json.data.folders[i];
var tr = RSFirewall.$('<tr>', {'class': j % 2 ? 'blue' : 'yellow'});
var td_checkbox = RSFirewall.$('<td>', {
width : '1%',
nowrap: 'nowrap'
});
var checkbox = RSFirewall.$('<input />', {
type : 'checkbox',
checked: true,
name : 'folders[]',
value : folder.path,
id : 'checkboxFolder' + j
});
var label = RSFirewall.$('<label>', {'for': 'checkboxFolder' + j}).text(folder.path);
var td_path = RSFirewall.$('<td>').append(label);
var td_perms = RSFirewall.$('<td>').text(folder.perms);
table.append(tr.append(td_checkbox.append(checkbox), td_path, td_perms));
j++;
}
}
if (json.data.next_folder) {
var stepIndex = this.steps.indexOf(this.currentStep);
var next_folder = json.data.next_folder;
var next_folder_stripped = json.data.next_folder_stripped;
result.text(Joomla.JText._('COM_RSFIREWALL_PLEASE_WAIT_WHILE_BUILDING_DIRECTORY_STRUCTURE').replace('%s', next_folder_stripped));
if (RSFirewall.requestTimeOut.Seconds != 0) {
setTimeout(function () {
RSFirewall.System.Check.stepCheck(stepIndex, {'folder': next_folder})
}, RSFirewall.requestTimeOut.Milliseconds());
}
else {
RSFirewall.System.Check.stepCheck(stepIndex, {'folder': next_folder});
}
// not finished
return true;
}
}
} else if (step == 'checkFilePermissions') {
if (RSFirewall.$('#com-rsfirewall-files').length == 0) {
// let's create the table
var table = RSFirewall.$('<table>', {
'class': 'com-rsfirewall-colored-table',
'id' : 'com-rsfirewall-files'
});
details.append(table);
}
var table = RSFirewall.$('#com-rsfirewall-files');
if (json.data.files && json.data.files.length > 0) {
var j = table.find('tr').length;
for (var i = 0; i < json.data.files.length; i++) {
var file = json.data.files[i];
var tr = RSFirewall.$('<tr>', {'class': j % 2 ? 'blue' : 'yellow'});
var td_checkbox = RSFirewall.$('<td>', {
width : '1%',
nowrap: 'nowrap'
});
var checkbox = RSFirewall.$('<input />', {
type : 'checkbox',
checked: true,
name : 'files[]',
value : file.path,
id : 'checkboxFile' + j
});
var label = RSFirewall.$('<label>', {'for': 'checkboxFile' + j}).text(file.path);
var td_path = RSFirewall.$('<td>').append(label);
var td_perms = RSFirewall.$('<td>').text(file.perms);
table.append(tr.append(td_checkbox.append(checkbox), td_path, td_perms));
j++;
}
}
if (json.data.next_file) {
var stepIndex = this.steps.indexOf(this.currentStep);
var next_file = json.data.next_file;
var next_file_stripped = json.data.next_file_stripped;
result.text(Joomla.JText._('COM_RSFIREWALL_PLEASE_WAIT_WHILE_BUILDING_FILE_STRUCTURE').replace('%s', next_file_stripped));
if (RSFirewall.requestTimeOut.Seconds != 0) {
setTimeout(function () {
RSFirewall.System.Check.stepCheck(stepIndex, {'file': next_file})
}, RSFirewall.requestTimeOut.Milliseconds());
}
else {
RSFirewall.System.Check.stepCheck(stepIndex, {'file': next_file});
}
// not finished
return true;
} else {
if (json.data.stop) {
// stop scanning
if (table.find('tr').length > 0) {
result.text(Joomla.JText._('COM_RSFIREWALL_FILE_PERMISSIONS_INCORRECT').replace('%d', table.find('tr').length)).addClass('com-rsfirewall-not-ok');
RSFirewall.System.Check.unhide(detailsButton);
} else {
result.text(Joomla.JText._('COM_RSFIREWALL_FILE_PERMISSIONS_CORRECT')).addClass('com-rsfirewall-ok');
}
// finished
return false;
}
}
} else if (step == 'checkSignatures') {
if (RSFirewall.$('#com-rsfirewall-signatures').length == 0) {
// let's create the table
var table = RSFirewall.$('<table>', {
'class': 'com-rsfirewall-colored-table',
'id' : 'com-rsfirewall-signatures'
});
details.append(table);
}
var table = RSFirewall.$('#com-rsfirewall-signatures');
if (json.data.files && json.data.files.length > 0) {
var j = table.find('tr').length;
for (var i = 0; i < json.data.files.length; i++) {
var file = json.data.files[i];
var tr = RSFirewall.$('<tr>', {'class': j % 2 ? 'blue' : 'yellow'});
var td_checkbox = RSFirewall.$('<td>', {
valign: 'top',
width : '1%',
nowrap: 'nowrap'
});
var checkbox = RSFirewall.$('<input />', {
valign : 'top',
width : '19%',
type : 'checkbox',
checked: true,
name : 'ignorefiles[]',
value : file.path,
id : 'checkboxFile' + j
});
var td_path = RSFirewall.$('<td valign="top" width="20%">').text(file.path);
if (typeof file.time == 'string')
{
td_path.html(td_path.html() + '<br /><small>' + Joomla.JText._('COM_RSFIREWALL_FILE_HAS_BEEN_MODIFIED_AGO').replace('%s', file.time) + '</small>');
}
var td_reason = RSFirewall.$('<td valign="top" width="20%">', {'nowrap': 'nowrap'}).text(file.reason);
var td_match = RSFirewall.$('<td valign="top" width="40%">').addClass('broken-word');
if (file.match) {
var td_match = td_match.text(file.match.substring(0, 355));
}
var btn = RSFirewall.$('<button type="button" class="com-rsfirewall-button pull-right"></button>')
.attr('href', 'index.php?option=com_rsfirewall&view=file&tmpl=component&file=' + encodeURIComponent(file.path))
.text(Joomla.JText._('COM_RSFIREWALL_VIEW_FILE'))
.click(function () {
window.open(RSFirewall.$(this).attr('href'), 'fileWindow', 'width=800, height=600, left=50%, location=0, menubar=0, resizable=1, scrollbars=1, toolbar=0, titlebar=1');
});
td_match.append(btn);
table.append(tr.append(td_checkbox.append(checkbox), td_path, td_reason, td_match));
j++;
}
}
if (json.data.next_file) {
var stepIndex = this.steps.indexOf(this.currentStep);
var next_file = json.data.next_file;
var next_file_stripped = json.data.next_file_stripped;
result.text(Joomla.JText._('COM_RSFIREWALL_PLEASE_WAIT_WHILE_BUILDING_FILE_STRUCTURE').replace('%s', next_file_stripped));
RSFirewall.next_file = next_file;
if (RSFirewall.requestTimeOut.Seconds != 0) {
setTimeout(function () {
RSFirewall.System.Check.stepCheck(stepIndex, {'file': next_file})
}, RSFirewall.requestTimeOut.Milliseconds());
}
else {
RSFirewall.System.Check.stepCheck(stepIndex, {'file': next_file});
}
// not finished
return true;
} else {
if (json.data.stop) {
// stop scanning
if (table.find('tr').length > 0) {
result.text(Joomla.JText._('COM_RSFIREWALL_MALWARE_PLEASE_REVIEW_FILES').replace('%d', table.find('tr').length)).addClass('com-rsfirewall-not-ok');
RSFirewall.System.Check.unhide(detailsButton);
} else {
result.text(Joomla.JText._('COM_RSFIREWALL_NO_MALWARE_FOUND')).addClass('com-rsfirewall-ok');
}
// finished
return false;
}
}
} else {
if (json.data.details) {
var p = RSFirewall.$('<p>');
details.append(p.append(json.data.details));
}
}
}
};
RSFirewall.Grade = {
create: function () {
// compute the grade value
// each failed step removes 2 from the total grade
var grade = 100 - RSFirewall.$('.com-rsfirewall-count span.com-rsfirewall-not-ok').length * 2;
var hasErrors = RSFirewall.$('.com-rsfirewall-error').length > 0;
// If errors occured, grade is 0 and change the text.
if (hasErrors) {
grade = 0;
RSFirewall.$('#com-rsfirewall-grade p').html('<strong class="com-rsfirewall-error">' + Joomla.JText._('COM_RSFIREWALL_GRADE_NOT_FINISHED') + '</strong><br />' + Joomla.JText._('COM_RSFIREWALL_GRADE_NOT_FINISHED_DESC'));
}
RSFirewall.$('#com-rsfirewall-grade input').val(grade);
// green
RSFirewall.$("#com-rsfirewall-grade input").knob({
'min' : 0,
'max' : 100,
'readOnly' : true,
'width' : 90,
'height' : 90,
'inputColor' : '#000000',
'dynamicDraw' : true,
'thickness' : 0.3,
'tickColorizeValues': true,
'change' : function (v) {
var grade = v;
if (grade <= 75) {
color = '#ED7A53';
} else if (grade <= 90) {
color = '#88BBC8';
} else if (grade <= 100) {
color = '#9FC569';
}
this.fgColor = color;
}
});
RSFirewall.$("#com-rsfirewall-grade").fadeIn('slow');
// Save if no errors encountered.
if (!hasErrors) {
this.save();
}
},
save : function () {
RSFirewall.$.ajax({
type: 'POST',
url : 'index.php?option=com_rsfirewall',
data: {
task : 'check.saveGrade',
grade: RSFirewall.$('#com-rsfirewall-grade input').val(),
sid : Math.random()
}
});
}
};
RSFirewall.Status = {
errorContainer: '',
Error: function (display, type, error) {
this.errorContainer.empty();
if (display && typeof error != 'undefined') {
this.errorContainer.addClass('com-rsfirewall-log-' + type);
var heading = RSFirewall.$('<h3>').append(Joomla.JText._('COM_RSFIREWALL_LOG_' + type.toUpperCase()));
this.errorContainer.append(heading);
this.errorContainer.append(error);
this.errorContainer.show();
} else {
this.errorContainer.removeClass('com-rsfirewall-log-error', 'com-rsfirewall-log-warning');
this.errorContainer.hide();
}
},
Change: function (id, listId, type, element) {
var data = {
task: 'logs.' + type,
id : id
};
if (listId != null) {
data.listId = listId;
}
RSFirewall.$.ajax({
converters: {
"text json": RSFirewall.parseJSON
},
dataType : 'json',
type : 'POST',
url : 'index.php?option=com_rsfirewall&task',
data : data,
beforeSend: function () {
RSFirewall.addLoading(element, 'after');
RSFirewall.$(element).hide();
// remove previous errors
RSFirewall.Status.Error(false);
},
error : function (jqXHR, textStatus, errorThrown) {
RSFirewall.removeLoading();
RSFirewall.$(element).show();
// set the error
RSFirewall.Status.Error(true, 'error', jqXHR.status + ' ' + errorThrown);
},
success : function (json) {
RSFirewall.removeLoading();
if (json.success) {
if (json.data.result) {
// all ok
if (json.data.type) {
// change the button from where we triggered the action
RSFirewall.Status.MakeButton(element, id, null, 0);
// change the buttons for all other rows that contains the same ip
RSFirewall.Status.ChangeSameIp(id, null, 0);
} else {
// change the button from where we triggered the action
RSFirewall.Status.MakeButton(element, id, json.data.listId, 1);
// change the buttons for all other rows that contains the same ip
RSFirewall.Status.ChangeSameIp(id, json.data.listId, 1);
}
RSFirewall.$(element).remove();
} else {
// errors
RSFirewall.$(element).show();
// set the warning
RSFirewall.Status.Error(true, 'warning', json.data.error);
}
}
}
});
},
MakeButton: function (element, id, listId, type) {
var button;
if (type) {
button = '<button type="button" onclick="RSFirewall.Status.Change(' + id + ', ' + listId + ', \'unblockajax\', this)" class="btn btn-small">' + Joomla.JText._('COM_RSFIREWALL_UNBLOCK') + '</button>';
}
else {
button = '<button type="button" onclick="RSFirewall.Status.Change(' + id + ', null, \'blockajax\', this)" class="btn btn-danger btn-small">' + Joomla.JText._('COM_RSFIREWALL_BLOCK') + '</button>';
}
RSFirewall.$(element).after(button);
},
ChangeSameIp: function (id, listId, type) {
// get the ip address that we need to change the button
var ip = RSFirewall.$('#rsf-log-' + id).find('.rsf-ip-address').html().trim();
// parse the table to find the same ip entries
RSFirewall.$('.adminlist .rsf-entry').each(function () {
var ipFound;
if (ipFound = RSFirewall.$(this).find('.rsf-ip-address').html().trim()) {
if (ipFound == ip) {
RSFirewall.$(this).find('.rsf-status').empty();
if (type) {
button = '<button type="button" onclick="RSFirewall.Status.Change(' + id + ', ' + listId + ', \'unblockajax\', this)" class="btn btn-small">' + Joomla.JText._('COM_RSFIREWALL_UNBLOCK') + '</button>'
} else {
button = '<button type="button" onclick="RSFirewall.Status.Change(' + id + ', null, \'blockajax\', this)" class="btn btn-danger btn-small">' + Joomla.JText._('COM_RSFIREWALL_BLOCK') + '</button>';
}
RSFirewall.$(this).find('.rsf-status').append(button);
}
}
});
}
};
/**
* Function to download the original file from the remote server
* and overwrite the one stored locally.
*
* @type {{download: RSFirewall.diffs.download}}
*/
RSFirewall.diffs = {
download: function ($local, $hid, $window) {
if (!confirm(Joomla.JText._('COM_RSFIREWALL_CONFIRM_OVERWRITE_LOCAL_FILE'))) {
return false;
}
RSFirewall.$.ajax({
type : 'POST',
dataType : 'JSON',
url : 'index.php?option=com_rsfirewall',
data : {
task : 'diff.download',
localFile: $local
},
beforeSend: function () {
var $buttons = [];
var $counter = RSFirewall.$('#' + $hid, $window).find('td').last();
var $button = $counter.find('.rsfirewall-download-original');
var $optional = RSFirewall.$('#replace-original');
$buttons.push($button);
if ($optional.length) {
$buttons.push($optional);
}
RSFirewall.$.each($buttons, function () {
RSFirewall.$(this).attr('disabled', 'true').addClass('btn-processing');
RSFirewall.$(this).html('<span class="icon-refresh"></span> ' + Joomla.JText._("COM_RSFIREWALL_BUTTON_PROCESSING"));
});
},
success : function (result) {
var $hashCount = RSFirewall.$('#hashCount', $window);
var $parent = $hashCount.parents('.com-rsfirewall-table-row.alt-row');
var $counter = RSFirewall.$('#' + $hid, $window).find('td').last();
var $oldValue = parseInt(RSFirewall.$('#hashCount', $window).html());
var $button = $counter.find('.rsfirewall-download-original');
var $optional = RSFirewall.$('#replace-original');
var $diffButton = RSFirewall.$('#diff' + $hid, $window);
var $buttons = [];
$buttons.push($button);
if ($optional.length) {
$buttons.push($optional);
}
if (result.status == true) {
$diffButton.remove();
RSFirewall.$.each($buttons, function () {
RSFirewall.$(this).removeClass('btn-processing').addClass('btn-success');
RSFirewall.$(this).html('<span class="icon-checkmark-2"></span> ' + Joomla.JText._("COM_RSFIREWALL_BUTTON_SUCCESS"));
});
if ($oldValue == 1) {
$parent.find('.com-rsfirewall-not-ok').removeClass('com-rsfirewall-not-ok').addClass('com-rsfirewall-ok');
$parent.find('.com-rsfirewall-ok').empty().append('<span>' + Joomla.JText._('COM_RSFIREWALL_HASHES_CORRECT') + '</span>');
} else {
$hashCount.html($oldValue - 1);
}
} else {
RSFirewall.$.each($buttons, function () {
RSFirewall.$(this).removeClass('btn-processing').addClass('btn-failed');
RSFirewall.$(this).html('<span class="icon-cancel-circle"></span> ' + Joomla.JText._("COM_RSFIREWALL_BUTTON_FAILED"));
});
}
if ($optional.length) {
RSFirewall.$('.rsfirewall-replace-original').append('<div class="alert alert-info">' + result.message + '</div>');
}
if ($counter.find('#' + $hid + '-message', $window).length) {
RSFirewall.$('#' + $hid + '-message', $window).remove();
}
$counter.append('<span id="' + $hid + '-message">' + result.message + '</span>');
}
});
}
};
RSFirewall.ignore = {
remove: function ($id) {
if (!confirm(Joomla.JText._('COM_RSFIREWALL_CONFIRM_UNIGNORE'))) {
return false;
}
RSFirewall.$.ajax({
type : 'POST',
dataType : 'JSON',
url : 'index.php?option=com_rsfirewall',
data : {
task : 'ignored.removeFromIgnored',
ignoredFileId: $id
},
beforeSend: function () {
$button = RSFirewall.$('#removeIgnored' + $id);
$button.attr('disabled', 'true').addClass('btn-processing');
$button.html('<span class="icon-refresh"></span> ' + Joomla.JText._("COM_RSFIREWALL_BUTTON_PROCESSING"));
},
success : function (result) {
$button = RSFirewall.$('#removeIgnored' + $id);
if (result.status == true) {
$button.removeClass('btn-processing').addClass('btn-success');
$button.html('<span class="icon-checkmark-2"></span> ' + Joomla.JText._("COM_RSFIREWALL_BUTTON_SUCCESS"));
$button.parents('tr').hide('fast');
} else {
$button.removeClass('btn-processing').addClass('btn-failed');
$button.html('<span class="icon-cancel-circle"></span> ' + Joomla.JText._("COM_RSFIREWALL_BUTTON_FAILED"));
}
}
})
}
};
RSFirewall.vmap = {
/**
* Holds the LOCATION:THREATS object
*/
data : null,
/**
* The map DOM selector
*/
selector : null,
/**
* Constructor
*
* @param $id
*/
init : function ($id) {
/**
* Set the DOM selector
*/
this.selector = $id;
/**
* Load the data using AJAX
*/
this.loadData();
},
/**
* Helper function
*
* Call action here:
* - rsfirewall\admin\controllers\logs.php
* - rsfirewall\admin\models\logs.php
*
* returns an object ( success: bool | data: object( country code : encounters ) )
*/
loadData : function () {
var self = this;
RSFirewall.$.ajax({
type : 'POST',
dataType : 'JSON',
url : 'index.php?option=com_rsfirewall',
data : {
task: 'logs.getStatistics'
},
beforeSend: self.loadPreloader(self.selector),
success : function (result) {
if (result.success) {
jQuery('#rsf-overlay-region, #rsf-overlay-cube').fadeOut('fast', function () {
jQuery('#rsf-overlay-region, #rsf-overlay-cube').remove();
});
self.data = result.data;
self.renderMap();
}
}
})
},
/**
* Create a pre
*/
loadPreloader: function (selector) {
jQuery(selector).prepend('<div class="tpl-overlay" id="rsf-overlay-region"></div>');
jQuery(selector).append('<div class="sk-folding-cube" id="rsf-overlay-cube"><div class="sk-cube1 sk-cube"></div><div class="sk-cube2 sk-cube"></div><div class="sk-cube4 sk-cube"></div><div class="sk-cube3 sk-cube"></div></div>');
},
/**
* Render the jQuery Vector Map
*
* Triggered only if the AJAX request was successful
*/
renderMap : function () {
var self = this;
jQuery(this.selector).remove('.tpl-overlay, sk-folding-cube');
/**
* Draw the map
*/
jQuery(this.selector).vectorMap(
{
map : 'world_en',
backgroundColor : null,
color : '#ffffff',
hoverOpacity : 0.7,
selectedColor : '#666666',
enableZoom : true,
values : self.data,
showTooltip : true,
scaleColors : ['#F8C3C4', '#e8363a'],
normalizeFunction: 'polynomial'
}
);
/**
* Initiate the tooltips
*/
jQuery(this.selector).bind('labelShow.jqvmap',
function (event, label, code) {
var text = label.text();
if (typeof self.data[code] != 'undefined') {
label.text(text + ' : ' + self.data[code]);
}
}
);
}
};
RSFirewall.GeoIPDownload = function (element) {
RSFirewall.$(element).attr('disabled', 'disabled');
var GeoIPDownloadErrorHandler = function(message, url) {
var $parent = RSFirewall.$(element).parent();
$parent.append('<p><strong>' + message + '</p></strong>').hide().fadeIn();
if (typeof url === 'string')
{
$parent.append('<p><strong>' + Joomla.JText._('COM_RSFIREWALL_GEOIP_DB_TRY_TO_DOWNLOAD_MANUALLY').replace(/%s/g, url) + '</strong></p>');
}
$parent.append('<p>' + Joomla.JText._('COM_RSFIREWALL_GEOIP_DB_CANNOT_DOWNLOAD') + '</p><p><input type="file" name="jform[geoip_upload][]"></p><p>' + Joomla.JText._('COM_RSFIREWALL_GEOIP_DB_CANNOT_DOWNLOAD_CONTINUED') + '</p>').hide().fadeIn();
RSFirewall.$(element).fadeOut();
};
RSFirewall.$.ajax({
type : 'POST',
url : 'index.php?option=com_rsfirewall',
dataType: 'json',
data : {
'task': 'configuration.downloadGeoIPDatabase'
},
success: function (data, textStatus, jqXHR) {
if (!data.success) {
GeoIPDownloadErrorHandler(data.message, data.url);
} else {
if (!RSFirewall.$('.rsfirewall-geoip-works').length) {
RSFirewall.$('#country_block .com-rsfirewall-tooltip').after('<div class="alert alert-success rsfirewall-geoip-works"><p>' + data.message + '</p></div>');
}
RSFirewall.$(document.getElementsByName('jform[blocked_continents][]')).removeAttr('disabled');
RSFirewall.$(document.getElementsByName('jform[blocked_countries][]')).removeAttr('disabled');
RSFirewall.$(document.getElementsByName('jform[blocked_countries_checkall][]')).removeAttr('disabled');
RSFirewall.$(element).parents('.alert').remove();
}
},
error: function(jqXHR, textStatus, errorThrown) {
GeoIPDownloadErrorHandler(Joomla.JText._('COM_RSFIREWALL_DOWNLOAD_GEOIP_SERVER_ERROR').replace('%s', errorThrown));
}
})
}