Support enabling finger print; fix prefetch

This commit is contained in:
Jarek Rozanski 2022-01-18 23:18:06 +01:00
parent 08ab436f1b
commit 203d63a5d0
6 changed files with 54 additions and 10 deletions

View file

@ -4,7 +4,7 @@ Tags: web analytics, tracking, web traffic, analytics, statistics, stats
Requires at least: 5.2 Requires at least: 5.2
Tested up to: 5.8.2 Tested up to: 5.8.2
Requires PHP: 7.2 Requires PHP: 7.2
Stable tag: 1.0.4 Stable tag: 1.0.5
License: GPLv2 License: GPLv2
Easily add Wide Angle Analytics tracker script to your WordPress site. You can quickly configure your web analytics tracker script. Easily add Wide Angle Analytics tracker script to your WordPress site. You can quickly configure your web analytics tracker script.
@ -60,3 +60,8 @@ We run a business around serving the needs of our customer. That's you.
You will find most of your answers in the [Knowledge Base](https://wideangle.co/documentation). Should you require further assistance, please [get in touch](https://wideangle.co/support) with our team. You will find most of your answers in the [Knowledge Base](https://wideangle.co/documentation). Should you require further assistance, please [get in touch](https://wideangle.co/support) with our team.
== Changelog ==
V1.0.5
- Support for `data-waa-fingerprint` toggle enabling optional browser fingerprinting.
- Fix the header generate to use valid `prefetch` attribute

View file

@ -2,17 +2,19 @@
class WideAngleAttributes { class WideAngleAttributes {
public $siteId; public $siteId;
public $ignoreHash; public $ignoreHash;
public $fingerprint;
public $trackerDomain; public $trackerDomain;
public $exclusionString; public $exclusionString;
public $includeParamsString; public $includeParamsString;
private $helpers; private $helpers;
public function __construct($siteId, $trackerDomain, $ignoreHash, $exclusionString, $includeParamsString) { public function __construct($siteId, $trackerDomain, $ignoreHash, $exclusionString, $includeParamsString, $fingerprint) {
$this->siteId = $siteId; $this->siteId = $siteId;
$this->trackerDomain = $trackerDomain; $this->trackerDomain = $trackerDomain;
$this->ignoreHash = $ignoreHash; $this->ignoreHash = $ignoreHash;
$this->exclusionString = $exclusionString; $this->exclusionString = $exclusionString;
$this->includeParamsString = $includeParamsString; $this->includeParamsString = $includeParamsString;
$this->fingerprint = $fingerprint;
$this->helpers = new WideAngleHelpers(); $this->helpers = new WideAngleHelpers();
} }
@ -21,6 +23,7 @@ class WideAngleAttributes {
'site_id' => $this->siteId, 'site_id' => $this->siteId,
'tracker_domain' => $this->trackerDomain, 'tracker_domain' => $this->trackerDomain,
'ignore_hash' => $this->ignoreHash, 'ignore_hash' => $this->ignoreHash,
'fingerprint' => $this->fingerprint,
'exclusion_paths' => $this->generateExclusionsAttribute(), 'exclusion_paths' => $this->generateExclusionsAttribute(),
'include_params' => $this->generateIncludeParamsAttribute() 'include_params' => $this->generateIncludeParamsAttribute()
); );

View file

@ -13,13 +13,14 @@ class WideAngleGenerator {
$this->ignoreHash = $attributes['ignore_hash']; $this->ignoreHash = $attributes['ignore_hash'];
$this->exclusionPaths = $attributes['exclusion_paths']; $this->exclusionPaths = $attributes['exclusion_paths'];
$this->includeParams = $attributes['include_params']; $this->includeParams = $attributes['include_params'];
$this->fingerprint = $attributes['fingerprint'];
} }
function generateHeaderScript() { function generateHeaderScript() {
$href = esc_attr("https://{$this->trackerDomain}/script/{$this->siteId}.js"); $href = esc_attr("https://{$this->trackerDomain}/script/{$this->siteId}.js");
$script = <<<EOD $script = <<<EOD
<link href="{$href}" ref="prefetch"/> <link href="{$href}" rel="prefetch"/>
EOD; EOD;
return $script; return $script;
} }
@ -29,9 +30,11 @@ EOD;
$pathExlusionsAttribute = $this->exclusionPaths != '' ? "data-waa-exc-paths=\"" . esc_attr($this->exclusionPaths) . "\"": ''; $pathExlusionsAttribute = $this->exclusionPaths != '' ? "data-waa-exc-paths=\"" . esc_attr($this->exclusionPaths) . "\"": '';
$includeParamsAttribute = $this->includeParams != '' ? "data-waa-inc-params=\"" . esc_attr($this->includeParams) . "\"": ''; $includeParamsAttribute = $this->includeParams != '' ? "data-waa-inc-params=\"" . esc_attr($this->includeParams) . "\"": '';
$ignoreHashAttribute = $this->ignoreHash != '' ? "data-waa-ignore-hash=\"" . esc_attr($this->ignoreHash) . "\"": 'data-waa-ignore-hash="false"'; $ignoreHashAttribute = $this->ignoreHash != '' ? "data-waa-ignore-hash=\"" . esc_attr($this->ignoreHash) . "\"": 'data-waa-ignore-hash="false"';
$fingerprintAttribute = $this->fingerprint != '' ? "data-waa-fingerprint=\"" . esc_attr($this->fingerprint) . "\"": '';
$script = <<<EOD $script = <<<EOD
<script async defer <script async defer
src="{$trackerUrlAttribute}" src="{$trackerUrlAttribute}"
$fingerprintAttribute
$ignoreHashAttribute $ignoreHashAttribute
$includeParamsAttribute $includeParamsAttribute
$pathExlusionsAttribute></script> $pathExlusionsAttribute></script>

View file

@ -29,6 +29,14 @@ class WideAngleHelpers {
} }
} }
function validateFingerprint($name, $fingerprint) {
if(filter_var($fingerprint, FILTER_VALIDATE_BOOLEAN)) {
return WideAngleValidated::createValid($name, $fingerprint, "true");
} else {
return WideAngleValidated::createValid($name, $fingerprint, "false");
}
}
function validateSiteId($name, $siteId) { function validateSiteId($name, $siteId) {
if(preg_match("/^[a-zA-Z0-9]{10,24}$/", $siteId)) { if(preg_match("/^[a-zA-Z0-9]{10,24}$/", $siteId)) {
return WideAngleValidated::createValid($name, $siteId, strtoupper(trim($siteId))); return WideAngleValidated::createValid($name, $siteId, strtoupper(trim($siteId)));

View file

@ -2,6 +2,7 @@
$siteId = wp_unslash($this->settings[self::WAA_CONF_SITE_ID]); $siteId = wp_unslash($this->settings[self::WAA_CONF_SITE_ID]);
$trackerDomain = wp_unslash($this->settings[self::WAA_CONF_TRACKER_DOMAIN]); $trackerDomain = wp_unslash($this->settings[self::WAA_CONF_TRACKER_DOMAIN]);
$ignoreHash = filter_var($this->settings[self::WAA_CONF_IGNORE_HASH], FILTER_VALIDATE_BOOLEAN); $ignoreHash = filter_var($this->settings[self::WAA_CONF_IGNORE_HASH], FILTER_VALIDATE_BOOLEAN);
$fingerprint = filter_var($this->settings[self::WAA_CONF_FINGERPRINT], FILTER_VALIDATE_BOOLEAN);
$parsedExclusions = $this->plugin->helpers->parseExclusionSetting(wp_unslash($this->settings[self::WAA_CONF_EXC_PATHS])); $parsedExclusions = $this->plugin->helpers->parseExclusionSetting(wp_unslash($this->settings[self::WAA_CONF_EXC_PATHS]));
$parsedIncludeParams = $this->plugin->helpers->parseIncludeParamsSetting(wp_unslash($this->settings[self::WAA_CONF_INC_PARAMS])); $parsedIncludeParams = $this->plugin->helpers->parseIncludeParamsSetting(wp_unslash($this->settings[self::WAA_CONF_INC_PARAMS]));
$generator = new WideAngleGenerator($this->settings[self::WAA_CONF_ATTRIBUTES]); $generator = new WideAngleGenerator($this->settings[self::WAA_CONF_ATTRIBUTES]);
@ -125,6 +126,18 @@ $generator = new WideAngleGenerator($this->settings[self::WAA_CONF_AT
<p class="description" id="tagline-description">By default, w URL Fragment/hash is trasmitted as part of the tracking event. You can disable this behaviour. The fragment will be stripped before sending an event.</p> <p class="description" id="tagline-description">By default, w URL Fragment/hash is trasmitted as part of the tracking event. You can disable this behaviour. The fragment will be stripped before sending an event.</p>
</td> </td>
</tr> </tr>
<tr>
<th scope="row"><label>Browser Fingerprinting</label></th>
<td>
<fieldset>
<legend class="screen-reader-text"><span>Browser Fingerprinting</span></legend>
<label>
<input id="waa_fingerprint" type="checkbox" name="waa_fingerprint" <?php if($fingerprint) { echo "checked"; } ?>/> Enable
</label>
</fieldset>
<p class="description" id="tagline-description">The tracker script will <b>not</b> attempt to fingerprint the browser by default. You can improve tracking qaulity by enabling more reliable browser fingerprinting. Enabling this feature might require collecting consent.</p>
</td>
</tr>
</tbody> </tbody>
</table> </table>
<?php wp_nonce_field( $this->plugin->name, $this->plugin->name . '_nonce' ); ?> <?php wp_nonce_field( $this->plugin->name, $this->plugin->name . '_nonce' ); ?>

View file

@ -5,7 +5,7 @@
Description: Easily enable and configure Wide Angle Analytics on your Wordpress site Description: Easily enable and configure Wide Angle Analytics on your Wordpress site
Author: Wide Angle Analytics by Input Objects GmbH Author: Wide Angle Analytics by Input Objects GmbH
Author URI: https://wideangle.co Author URI: https://wideangle.co
Version: 1.0.4 Version: 1.0.5
Requires at least: 5.2 Requires at least: 5.2
Requires PHP: 7.2 Requires PHP: 7.2
License: GPL v2 License: GPL v2
@ -17,6 +17,7 @@ class WideAngleAnalytics {
const WAA_CONF_SITE_ID = "waa_site_id"; const WAA_CONF_SITE_ID = "waa_site_id";
const WAA_CONF_TRACKER_DOMAIN = "waa_tracker_domain"; const WAA_CONF_TRACKER_DOMAIN = "waa_tracker_domain";
const WAA_CONF_FINGERPRINT = "waa_fingerprint";
const WAA_CONF_EXC_PATHS = "waa_exc_path"; const WAA_CONF_EXC_PATHS = "waa_exc_path";
const WAA_CONF_INC_PARAMS = "waa_inc_params"; const WAA_CONF_INC_PARAMS = "waa_inc_params";
const WAA_CONF_IGNORE_HASH = "waa_ignore_hash"; const WAA_CONF_IGNORE_HASH = "waa_ignore_hash";
@ -115,6 +116,7 @@ class WideAngleAnalytics {
$waaSiteId = $this->plugin->helpers->validateSiteId(self::WAA_CONF_SITE_ID, sanitize_text_field($_REQUEST['waa_site_id'])); $waaSiteId = $this->plugin->helpers->validateSiteId(self::WAA_CONF_SITE_ID, sanitize_text_field($_REQUEST['waa_site_id']));
$waaTrackerDomain = $this->plugin->helpers->validateTrackerDomain(self::WAA_CONF_TRACKER_DOMAIN, sanitize_text_field($_REQUEST['waa_tracker_domain'])); $waaTrackerDomain = $this->plugin->helpers->validateTrackerDomain(self::WAA_CONF_TRACKER_DOMAIN, sanitize_text_field($_REQUEST['waa_tracker_domain']));
$waaIgnoreHash = $this->plugin->helpers->validateIgnoreHashFlag(self::WAA_CONF_IGNORE_HASH, sanitize_text_field($_REQUEST['waa_ignore_hash'])); $waaIgnoreHash = $this->plugin->helpers->validateIgnoreHashFlag(self::WAA_CONF_IGNORE_HASH, sanitize_text_field($_REQUEST['waa_ignore_hash']));
$waaFingerprint = $this->plugin->helpers->validateFingerprint(self::WAA_CONF_FINGERPRINT, sanitize_text_field($_REQUEST['waa_fingerprint']));
$waaIncParams = $this->plugin->helpers->validateIncludeParams(self::WAA_CONF_INC_PARAMS, $_REQUEST); $waaIncParams = $this->plugin->helpers->validateIncludeParams(self::WAA_CONF_INC_PARAMS, $_REQUEST);
$waaExclusionPaths = $this->plugin->helpers->validateExclusionPathsRequest(self::WAA_CONF_EXC_PATHS, $_REQUEST); $waaExclusionPaths = $this->plugin->helpers->validateExclusionPathsRequest(self::WAA_CONF_EXC_PATHS, $_REQUEST);
@ -128,12 +130,20 @@ class WideAngleAnalytics {
} }
if(count($errors) === 0) { if(count($errors) === 0) {
$attributes = new WideAngleAttributes($waaSiteId->get_value(), $waaTrackerDomain->get_value(), $waaIgnoreHash->get_value(), $waaExclusionPaths->get_value(), $waaIncParams->get_value()); $attributes = new WideAngleAttributes(
$waaSiteId->get_value(),
$waaTrackerDomain->get_value(),
$waaIgnoreHash->get_value(),
$waaExclusionPaths->get_value(),
$waaIncParams->get_value(),
$waaFingerprint->get_value()
);
update_option(self::WAA_CONF_SITE_ID, $waaSiteId->get_value()); update_option(self::WAA_CONF_SITE_ID, $waaSiteId->get_value());
update_option(self::WAA_CONF_TRACKER_DOMAIN, $waaTrackerDomain->get_value()); update_option(self::WAA_CONF_TRACKER_DOMAIN, $waaTrackerDomain->get_value());
update_option(self::WAA_CONF_IGNORE_HASH, $waaIgnoreHash->get_value()); update_option(self::WAA_CONF_IGNORE_HASH, $waaIgnoreHash->get_value());
update_option(self::WAA_CONF_EXC_PATHS, $waaExclusionPaths->get_value()); update_option(self::WAA_CONF_EXC_PATHS, $waaExclusionPaths->get_value());
update_option(self::WAA_CONF_INC_PARAMS, $waaIncParams->get_value()); update_option(self::WAA_CONF_INC_PARAMS, $waaIncParams->get_value());
update_option(self::WAA_CONF_FINGERPRINT, $waaFingerprint->get_value());
update_option(self::WAA_CONF_ATTRIBUTES, $attributes->generateAttributes()); update_option(self::WAA_CONF_ATTRIBUTES, $attributes->generateAttributes());
$this->message = __('Settings updated', $this->plugin->name); $this->message = __('Settings updated', $this->plugin->name);
} else { } else {
@ -147,6 +157,7 @@ class WideAngleAnalytics {
self::WAA_CONF_INC_PARAMS => get_option(self::WAA_CONF_INC_PARAMS), self::WAA_CONF_INC_PARAMS => get_option(self::WAA_CONF_INC_PARAMS),
self::WAA_CONF_TRACKER_DOMAIN => get_option(self::WAA_CONF_TRACKER_DOMAIN), self::WAA_CONF_TRACKER_DOMAIN => get_option(self::WAA_CONF_TRACKER_DOMAIN),
self::WAA_CONF_IGNORE_HASH => get_option(self::WAA_CONF_IGNORE_HASH), self::WAA_CONF_IGNORE_HASH => get_option(self::WAA_CONF_IGNORE_HASH),
self::WAA_CONF_FINGERPRINT => get_option(self::WAA_CONF_FINGERPRINT),
self::WAA_CONF_ATTRIBUTES => get_option(self::WAA_CONF_ATTRIBUTES) self::WAA_CONF_ATTRIBUTES => get_option(self::WAA_CONF_ATTRIBUTES)
); );
include_once( $this->plugin->folder . '/views/admin_settings.php' ); include_once( $this->plugin->folder . '/views/admin_settings.php' );
@ -170,6 +181,7 @@ class WideAngleAnalytics {
register_setting($this->plugin->name, self::WAA_CONF_INC_PARAMS); register_setting($this->plugin->name, self::WAA_CONF_INC_PARAMS);
register_setting($this->plugin->name, self::WAA_CONF_TRACKER_DOMAIN, array('default' => 'stats.wideangle.co')); register_setting($this->plugin->name, self::WAA_CONF_TRACKER_DOMAIN, array('default' => 'stats.wideangle.co'));
register_setting($this->plugin->name, self::WAA_CONF_IGNORE_HASH, array('default' => 'false')); register_setting($this->plugin->name, self::WAA_CONF_IGNORE_HASH, array('default' => 'false'));
register_setting($this->plugin->name, self::WAA_CONF_FINGERPRINT, array('default' => 'false'));
register_setting($this->plugin->name, self::WAA_CONF_ATTRIBUTES, array('type' => 'array')); register_setting($this->plugin->name, self::WAA_CONF_ATTRIBUTES, array('type' => 'array'));
} }