From: Tim Otten Date: Thu, 14 Jan 2021 10:29:49 +0000 (-0800) Subject: Simplify tracking of URLs X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=6ad859f1b83295522d94e5392dd1cb00d5cd3775;p=civicrm-core.git Simplify tracking of URLs In the prior commit, it needed to conceptually change the behavior of `getTrackerURL($oldURL): $trackedURL`, but it danced around it (adding more classes and similar-sounding-methods, but distributed elsewhere). This re-consolidates to keep a cleaner separation of responsibilities between `{Html,Text}ClickTracker.php` (*parsing an HTML or text message for URLS*) and `TrackableURL.php` (*translating the URL*). --- diff --git a/CRM/Mailing/BAO/TrackableURL.php b/CRM/Mailing/BAO/TrackableURL.php index 0113e53bb9..ea6d032db4 100644 --- a/CRM/Mailing/BAO/TrackableURL.php +++ b/CRM/Mailing/BAO/TrackableURL.php @@ -38,7 +38,15 @@ class CRM_Mailing_BAO_TrackableURL extends CRM_Mailing_DAO_TrackableURL { * The redirect/tracking url */ public static function getTrackerURL($url, $mailing_id, $queue_id) { + if (strpos($url, '{') !== FALSE) { + return self::getTrackerURLForUrlWithTokens($url, $mailing_id, $queue_id); + } + else { + return self::getBasicTrackerURL($url, $mailing_id, $queue_id); + } + } + private static function getBasicTrackerURL($url, $mailing_id, $queue_id) { static $urlCache = []; if (array_key_exists($mailing_id . $url, $urlCache)) { @@ -87,6 +95,66 @@ class CRM_Mailing_BAO_TrackableURL extends CRM_Mailing_DAO_TrackableURL { return $returnUrl; } + /** + * Create a trackable URL for a URL with tokens. + * + * @param string $url + * @param int $mailing_id + * @param int|string $queue_id + * + * @return string + */ + private static function getTrackerURLForUrlWithTokens($url, $mailing_id, $queue_id) { + + // Parse the URL. + // (not using parse_url because it's messy to reassemble) + if (!preg_match('/^([^?#]+)([?][^#]*)?(#.*)?$/', $url, $parsed)) { + // Failed to parse it, give up and don't track it. + return $url; + } + + // If we have a token in the URL + path section, we can't tokenise. + if (strpos($parsed[1], '{') !== FALSE) { + return $url; + } + + $trackable_url = $parsed[1]; + + // Process the query parameters, if there are any. + $tokenised_params = []; + $static_params = []; + if (!empty($parsed[2])) { + $query_key_value_pairs = explode('&', substr($parsed[2], 1)); + + // Separate the tokenised from the static parts. + foreach ($query_key_value_pairs as $_) { + if (strpos($_, '{') === FALSE) { + $static_params[] = $_; + } + else { + $tokenised_params[] = $_; + } + } + // Add the static params to the trackable part. + if ($static_params) { + $trackable_url .= '?' . implode('&', $static_params); + } + } + + // Get trackable URL. + $data = self::getBasicTrackerURL($trackable_url, $mailing_id, $queue_id); + + // Append the tokenised bits and the fragment. + if ($tokenised_params) { + // We know the URL will already have the '?' + $data .= '&' . implode('&', $tokenised_params); + } + if (!empty($parsed[3])) { + $data .= $parsed[3]; + } + return $data; + } + /** * @param $url * @param $mailing_id diff --git a/ext/flexmailer/src/ClickTracker/BaseClickTracker.php b/ext/flexmailer/src/ClickTracker/BaseClickTracker.php deleted file mode 100644 index 970b52fbd0..0000000000 --- a/ext/flexmailer/src/ClickTracker/BaseClickTracker.php +++ /dev/null @@ -1,82 +0,0 @@ -Foo

', + ';

Foo

;', + ';\\[1\\] .*(extern/url.php|civicrm/mailing/url)[\?&]u=\d+.*&id=\d+.*;', + ['url_tracking' => 1], + ]; + return $cases; }