File Manager

Current Directory: /home/astoriaah/www/administrator/components/com_gdpr/js
Viewing File: /home/astoriaah/www/administrator/components/com_gdpr/js/audit.js
/** * Audit class to perform an async analysis of cookies and external domains * * @package GDPR::AUDIT::administrator::components::com:gdpr * @subpackage js * @author Joomla! Extensions Store * @copyright (C) 2019 Joomla! Extensions Store * @license GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html */ //'use strict'; (function($) { var Audit = function() { /** * Target audit link, default on the website home page * * @access private * @var String */ var targetAuditLink = null; /** * Register user events for interface controls * * @access private * @param Boolean initialize * @return Void */ var addListeners = function(initialize) { // Append a dialog for the audit tool $('div.audit.icons').on('click.audit', function(jqEvent){ // Remove any previous instance $('#audit_dialog').remove(); showAuditInterface(gdprBaseAuditHome); }); // Bind the start audit button $(document).on('click.audit', '#start_analysis', function(jqEvent){ $('#link_to_analyze').removeClass('error'); // Validate the required field targetAuditLink = $('#link_to_analyze').val(); if(!targetAuditLink) { $('#link_to_analyze').addClass('error').focus(); return false; } // Set the running process interface $('span.audit-cogicon', this).addClass('running'); $('span.audit-labelicon-start', this).text(COM_GDPR_AUDIT_STARTED); $('#audit_status').text(COM_GDPR_AUDIT_CURRENT_STATUS_RUNNING).addClass('running'); // Start here the real analysis process startAudit(targetAuditLink); }); // Bind the start configuration wizard button $(document).on('click.audit', '#start_wizard', function(jqEvent){ // Set the running process interface $('span.audit-settingsicon', this).addClass('running'); $('span.audit-labelicon-wizard', this).text(COM_GDPR_WIZARD_STARTED); $('#audit_status').text(COM_GDPR_AUDIT_CURRENT_STATUS_RUNNING).addClass('running'); // Start here the real analysis process startAutoConfigurationWizard(); }); $(document).on('keyup.audit', '#link_to_analyze', function(jqEvent){ $(this).removeClass('error'); }); // Closer dialog button $(document).on('click.audit', 'label.closedialog', function(jqEvent){ $(this).parents('#audit_dialog').remove(); }); // Opener of the analysis link $(document).on('click.audit', '#linkopener', function(jqEvent){ var currentLinkValue = $('#link_to_analyze').val(); window.open(currentLinkValue, '_blank'); }); }; /** * Render the Audit dialog box * * @access private * @return Void */ var showAuditInterface = function(linkToAnalyze) { var contentsString = ''; // Build modal dialog var analysisDialog = '<div id="audit_dialog" class="panel panel-primary">' + '<div class="panel-heading">' + '<h3 class="panel-title">' + COM_GDPR_AUDIT_DIALOG_TITLE + '</h3>' + '<label class="closedialog icon-cancel"></label>' + '</div>' + '<div class="panel-body">' + '<label class="label label-info analysis-labels" id="linkopener">' + COM_GDPR_AUDIT_TARGET_LINK + '</label>' + '<input id="link_to_analyze" class="analysis-input" autocomplete="off" type="text" value="' + linkToAnalyze + '" placeholder="' + COM_GDPR_AUDIT_CHOOSE_TARGET_LINK + '"/>' + '<button id="start_analysis" class="btn btn-success active">' + '<span class="audit-cogicon"></span><span class="audit-labelicon-start">' + COM_GDPR_AUDIT_START + '</span>' + '</button>' + '<div class="flexbox-container-analysis">' + '<div id="cookie_results_container"></div>' + '<div id="domains_results_container"></div>' + '</div>' + '</div>' + '<div class="panel-footer">' + '<span class="label label-warning label-with-badge">' + COM_GDPR_AUDIT_FOOTER + '<span id="audit_status" class="badge pull-right">' + COM_GDPR_AUDIT_CURRENT_STATUS_IDLE + '</span></span>' + '</div>' + '</div>'; // Inject elements into content body $('body').append(analysisDialog); } /** * Process the asyncronous audit of the website link that has been specified * It performs an analysis of both cookies (local) and external domains found in the page source code * * @access private * @param String linkToAnalyze * @return Void */ var startAudit = function(linkToAnalyze) { // No ajax request if no valid link and keyword specified if(!linkToAnalyze) { // Reset the analyzing button $('span.audit-cogicon').removeClass('running'); $('span.audit-labelicon-start').text(COM_GDPR_AUDIT_START); $('#audit_status').text(COM_GDPR_AUDIT_CURRENT_STATUS_IDLE).removeClass('running'); return; } // Clear previous results $('label.label-results, ul.analysis-results-cookies, ul.analysis-results-domains').fadeOut(100).promise().done(function(){ $('#cookie_results_container, #domains_results_container').empty(); }); $('#start_wizard').remove(); // Async request var auditPromise = $.Deferred(function(defer) { $.ajax({ type : "GET", url : linkToAnalyze, }).done(function(data, textStatus, jqXHR) { // Check response HTTP status code defer.resolve(data, jqXHR.status, jqXHR.getAllResponseHeaders()); }).fail(function(jqXHR, textStatus, errorThrown) { // Error found defer.resolve(null, jqXHR.status + ' ' + errorThrown); }); }).promise(); auditPromise.then(function(responseData, status, headers) { if(status == 200 && responseData) { // All went ok, now analyze and report data // STEP 1 - Set the parsed wrapped set var responseDataString = responseData.trim(); /** * STEP 2 Analyze cookies */ $('#audit_dialog div.panel-body #cookie_results_container').append('<label class="label label-success analysis-labels label-results">' + COM_GDPR_AUDIT_RESULTS_COOKIE + '</label>'); var ulCookieResults = $('<ul/>'); ulCookieResults.addClass('analysis-results-cookies'); ulCookieResults.append('<li><span>' + COM_GDPR_AUDIT_RESULTS_COOKIE_NAME + '</span><span>' + COM_GDPR_AUDIT_RESULTS_COOKIE_VALUE + '</span></li>'); // STEP 3 - Get the local cookies found var addedFoundCookies = false; var documentCookies = document.cookie.trim(); if(documentCookies) { var cookies = documentCookies.split("; "); // Loop through all cookies for (var c = 0; c < cookies.length; c++) { var splittedCookie = cookies[c].split("="); if(splittedCookie[0] == 'cookieconsent_status') { continue; } ulCookieResults.append( '<li>' + '<span>' + '<a class="hasAuditTooltip" title="' + COM_GDPR_AUDIT_SEARCH_COOKIE + '" href="https://www.google.com/search?q=' + encodeURIComponent(splittedCookie[0]) + '" target="_blank">' + splittedCookie[0] + '</a>' + '</span>' + '<span class="hasCookieValue">' + '<span>' + splittedCookie[1] + '</span>' + '</span>' + '</li>'); addedFoundCookies = true; } } if(!addedFoundCookies) { ulCookieResults.append('<li><span>' + COM_GDPR_AUDIT_RESULTS_NOCOOKIES + '</span></li>'); } $('#audit_dialog div.panel-body #cookie_results_container').append(ulCookieResults); /** * STEP 4 - Analyze domains/resources */ $('#audit_dialog div.panel-body #domains_results_container').append('<label class="label label-success analysis-labels label-results">' + COM_GDPR_AUDIT_RESULTS_DOMAINS + '</label>'); var ulDomainsResults = $('<ul/>'); ulDomainsResults.addClass('analysis-results-domains'); ulDomainsResults.append('<li><span>URL</span></li>'); // Focus keyword regular expression object var reObject = new RegExp(/\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}/, 'gi'); // STEP 5 - Get the external domains/resources of the page var addedDomains = []; var foundDomains = responseDataString.match(reObject); if(foundDomains) { // Cycle all found domains $.each(foundDomains, function(index, domain) { // Exclude domains that are already added and the local domain if($.inArray(domain, addedDomains) == -1 && domain.indexOf(gdprBaseDomain) == -1) { var purifiedDomain = domain.replace(/^\/\//gi, ''); ulDomainsResults.append('<li><a class="hasAuditTooltip" title="' + COM_GDPR_AUDIT_SEARCH_DOMAIN + '" href="https://www.google.com/search?q=' + encodeURIComponent(purifiedDomain) + '" target="_blank">' + purifiedDomain + '</a></li>'); addedDomains[index] = domain; } }); } // Special case for scripts injecting Matomo var scriptReObject = new RegExp(/<script[\s\S]*?>[\s\S]*?(matomo.js)[\s\S]*?<\/script>/, 'gi'); if(responseDataString.match(scriptReObject)) { ulDomainsResults.append('<li><a class="hasAuditTooltip" title="' + COM_GDPR_AUDIT_SEARCH_DOMAIN + '" href="https://www.google.com/search?q=' + encodeURIComponent('matomo.js') + '" target="_blank">matomo.js</a></li>'); addedDomains[addedDomains.length] = 'matomo.js'; } if(addedDomains.length == 0) { ulDomainsResults.append('<li><span>' + COM_GDPR_AUDIT_RESULTS_NODOMAINS + '</span></li>'); } $('#audit_dialog div.panel-body #domains_results_container').append(ulDomainsResults); // Add the button to start the auto configuration wizard $('#start_analysis').next('#start_wizard').remove(); $('#start_analysis').after( '<button id="start_wizard" class="btn btn-primary active" title="' + COM_GDPR_WIZARD_DESCRIPTION + '">' + '<span class="audit-settingsicon"></span><span class="audit-labelicon-wizard">' + COM_GDPR_WIZARD_START + '</span>' + '</button>'); $('#start_wizard').tooltip({trigger:'hover', placement:'top', html : 1}); } else { // An error in the AJAX request occurred, kindly inform user and return $('#cookie_results_container').append('<span class="label label-important"><span class="icon-warning"></span> ' + COM_GDPR_AUDIT_AUDIT_ERROR + status + '</span>'); return; } }).always(function(){ // Reset the analyzing button $('span.audit-cogicon').removeClass('running'); $('span.audit-labelicon-start').text(COM_GDPR_AUDIT_START); $('#audit_status').text(COM_GDPR_AUDIT_CURRENT_STATUS_IDLE).removeClass('running'); // Initialize tooltips of the audit results $('a.hasAuditTooltip').tooltip({trigger:'hover', placement:'top', html : 1}); }); }; /** * The first operation is get informations about published data sources * and start cycle over all the records using promises and recursion * * @access private * @return Void */ var startAutoConfigurationWizard = function() { // Retrieve cookies found by the audit, put them in the posted object var cookiesAudited = []; var cookiesAuditedHref = $('ul.analysis-results-cookies a'); cookiesAuditedHref.each(function(index, cookieName) { cookiesAudited[index] = $(cookieName).text(); }); // Retrieve domains found by the audit, put them in the posted object var domainsAudited = []; var domainsAuditedHref = $('ul.analysis-results-domains a'); domainsAuditedHref.each(function(index, domainName) { domainsAudited[index] = $(domainName).text(); }); // Clear previous results $('label.label-results, ul.analysis-results-cookies, ul.analysis-results-domains').fadeOut(100).promise().done(function(){ $('#cookie_results_container, #domains_results_container').empty(); }); // Object to send to server var ajaxparams = { idtask : 'autoConfigurationWizard', template : 'json', param : { 'cookies' : cookiesAudited, 'domains' : domainsAudited } }; // Unique param 'data' var uniqueParam = JSON.stringify(ajaxparams); // Request JSON2JSON var summaryPromise = $.Deferred(function(defer) { $.ajax({ type : "POST", url : "../administrator/index.php?option=com_gdpr&task=ajaxserver.display&format=json", dataType : 'json', context : this, data : { data : uniqueParam } }).done(function(data, textStatus, jqXHR) { if(data === null) { // Error found defer.reject(COM_GDPR_WIZARD_NULL_RESPONSEDATA, 'warning'); return false; } if(!data.result) { // Error found defer.reject(data.exception_message, data.errorlevel, data.summary, textStatus); return false; } // Check response all went well if(data.result && data.summary) { defer.resolve(data.summary); } }).fail(function(jqXHR, textStatus, errorThrown) { // Error found var genericStatus = textStatus[0].toUpperCase() + textStatus.slice(1) + ': ' + jqXHR.status ; defer.reject(COM_GDPR_WIZARD_ERROR_HTTP + '-' + genericStatus + '- ' + errorThrown, 'important'); }); }).promise(); summaryPromise.then(function(responseData) { $('#cookie_results_container, #domains_results_container').empty(); /** * Append found matched cookies to the database */ $('#audit_dialog div.panel-body #cookie_results_container').append('<label class="label label-success analysis-labels label-results">' + COM_GDPR_WIZARD_RESULTS_COOKIE + '</label>'); var ulCookieResults = $('<ul/>'); ulCookieResults.addClass('analysis-results-cookies'); ulCookieResults.append('<li><span>' + COM_GDPR_WIZARD_COOKIE_RESULTS_NAME + '</span><span>' + COM_GDPR_WIZARD_RESULTS_CATEGORY + '</span></li>'); var addedFoundCookies = false; if(responseData.foundCookies) { // Loop through all cookies for (var c = 0; c < responseData.foundCookies.length; c++) { ulCookieResults.append( '<li>' + '<span>' + '<a class="hasAuditTooltip" title="' + COM_GDPR_AUDIT_SEARCH_COOKIE + '" href="https://www.google.com/search?q=' + encodeURIComponent(responseData.foundCookies[c][0]) + '" target="_blank">' + responseData.foundCookies[c][0] + '</a>' + '</span>' + '<span class="hasCookieValue">' + '<span>' + responseData.foundCookies[c][1] + '</span>' + '</span>' + '</li>'); addedFoundCookies = true; } } if(!addedFoundCookies) { ulCookieResults.append('<li><span>' + COM_GDPR_WIZARD_RESULTS_NOCOOKIES + '</span></li>'); } $('#audit_dialog div.panel-body #cookie_results_container').append(ulCookieResults); /** * Append found matched domains to the database */ $('#audit_dialog div.panel-body #domains_results_container').append('<label class="label label-success analysis-labels label-results">' + COM_GDPR_WIZARD_RESULTS_DOMAINS + '</label>'); var ulDomainsResults = $('<ul/>'); ulDomainsResults.addClass('analysis-results-domains'); ulDomainsResults.append('<li><span>' + COM_GDPR_WIZARD_DOMAIN_RESULTS_NAME + '</span><span>' + COM_GDPR_WIZARD_RESULTS_CATEGORY + '</span></li>'); // Focus keyword regular expression object var reObject = new RegExp(/\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}/, 'gi'); // STEP 5 - Get the external domains/resources of the page var addedDomains = []; if(responseData.foundDomains) { // Cycle all found domains $.each(responseData.foundDomains, function(index, domain) { // Exclude domains that are already added and the local domain var purifiedDomain = domain[0].replace(/^\/\//gi, ''); ulDomainsResults.append('<li>' + '<span>' + '<a class="hasAuditTooltip" title="' + COM_GDPR_AUDIT_SEARCH_DOMAIN + '" href="https://www.google.com/search?q=' + encodeURIComponent(purifiedDomain) + '" target="_blank">' + purifiedDomain + '</a>' + '</span>' + '<span>' + domain[1] + '</span>' + '</li>'); addedDomains[index] = domain; }); } if(addedDomains.length == 0) { ulDomainsResults.append('<li><span>' + COM_GDPR_WIZARD_RESULTS_NODOMAINS + '</span></li>'); } $('#audit_dialog div.panel-body #domains_results_container').append(ulDomainsResults); }, function(errorText, errorLevel, responseData, error) { $('#cookie_results_container').append('<span class="label label-' + errorLevel + '">' + errorText + '</span>'); }).always(function(){ // Reset the analyzing button $('span.audit-settingsicon').removeClass('running'); $('span.audit-labelicon-wizard').text(COM_GDPR_WIZARD_START); $('#audit_status').text(COM_GDPR_AUDIT_CURRENT_STATUS_IDLE).removeClass('running'); // Initialize tooltips of the audit results $('a.hasAuditTooltip').tooltip({trigger:'hover', placement:'top', html : 1}); }) }; /** * Function dummy constructor * * @access private * @param String * contextSelector * @method <<IIFE>> * @return Void */ (function __construct() { // Add UI events addListeners.call(this, true); }).call(this); } // On DOM Ready $(function() { window.GDPRAudit = new Audit(); }); })(jQuery);