Seditio Source
Root |
./othercms/b2evolution_7.2.3/inc/tools/model/_emailtrackinghelper.class.php
<?php
/**
 * This file implements the email tracking helper class.
 *
 * This file is part of the b2evolution/evocms project - {@link http://b2evolution.net/}.
 * See also {@link https://github.com/b2evolution/b2evolution}.
 *
 * @license GNU GPL v2 - {@link http://b2evolution.net/about/gnu-gpl-license}
 *
 * @copyright (c)2003-2020 by Francois Planque - {@link http://fplanque.com/}.
*
 * @license http://b2evolution.net/about/license.html GNU General Public License (GPL)
 *
 * @package evocore
 */
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );


/**
 * Dependencies
 */
load_funcs('_core/_misc.funcs.php');


/**
 * Email Tracking Helper Class
 *
 * @package evocore
 */
class EmailTrackingHelper
{
    private
$url_type;
    private
$email_ID;
    private
$key;
    private
$tag;

    function
__construct( $url_type, $email_ID, $key, $content_type = 'html', $tag = NULL )
    {
       
$this->url_type = $url_type;
       
$this->email_ID = $email_ID;
       
$this->key = $key;
       
$this->content_type = $content_type;
       
$this->tag = $tag;
    }

    public function
get_passthrough_url( $params = array() )
    {
       
$params = array_merge( array(
               
'url_type' => $this->url_type,
               
'email_ID' => $this->email_ID,
               
'key' => $this->key,
               
'content_type' => $this->content_type,
               
'tag' => $this->tag,
            ),
$params );

       
$url = get_htsrv_url().'email_passthrough.php?email_ID='.$params['email_ID'].'&type='.$params['url_type'].'&email_key=$email_key_start$'.$params['key'].'$email_key_end$';
        if( isset(
$this->tag ) )
        {
           
$url .= '&tag='.$params['tag'];
        }
       
$url .=    '&redirect_to=';

        return
$url;
    }


    private function
_cleanup_email_param_marker( $match, $url )
    {
       
// Remove email function marker in the URL
       
$first_char = mb_substr( $match[0], 0, 1 );
       
$last_char = mb_substr( $match[0], -1 );
        switch(
$first_char )
        {
            case
'&':
                if(
$last_char == '&' )
                {
                   
$url = str_replace( $match[0], '&', $url );
                }
                else
                {
                   
$url = str_replace( $match[0], '', $url );
                }
                break;

            case
'?':
                if(
$last_char == '&' )
                {
                   
$url = str_replace( $match[0], '?', $url );
                }
                else
                {
                   
$url = str_replace( $match[0], '', $url );
                }
                break;
        }

        return
$url;
    }

    public function
callback( $matches )
    {
       
$passthrough_url = $this->get_passthrough_url();

       
$unsubscribe_link_re = '/quick_unsubscribe\.php(?:[^\<\>])+type=(newsletter)/';
       
$email_func_re = '/(?:\?|&|&amp;)evo_mail_function=(like|dislike|cta(?:1|2|3))&?/';
       
$activate_link_re = '/login\.php\?action=activateacc_ez/';

        switch(
$this->content_type )
        {
            case
'html':
               
/**
                 * $matches
                 *  1 - <a href="
                 *  2 - HREF URL
                 *  3 - "
                 */
               
$redirect_url = $matches[2];
               
// Preserve $mail_log_ID$ and $email_key$ markers from rawurlencode()
               
$redirect_url = str_replace( array( '$mail_log_ID$', '$email_key$' ), array( '_____mail_log_ID_____', '_____email_key_____' ), $redirect_url );

               
//pre_dump( $matches );
               
if( preg_match( $unsubscribe_link_re, $redirect_url, $match ) )
                {
                    if(
$match[1] == 'newsletter' )
                    {
                       
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 2 ) );
                    }
                }
                elseif(
preg_match( $email_func_re, $redirect_url, $match ) )
                {
                    switch(
$match[1] )
                    {
                        case
'like':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 3 ) );
                            break;

                        case
'dislike':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 4 ) );
                            break;

                        case
'cta1':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 5 ) );
                            break;

                        case
'cta2':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 6 ) );
                            break;

                        case
'cta3':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 7 ) );
                            break;

                        case
'unsubscribe':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 9 ) );
                            break;
                    }

                   
// Remove email function marker in the URL
                   
$redirect_url = $this->_cleanup_email_param_marker( $match, $redirect_url );
                }
                elseif(
preg_match( $activate_link_re, $redirect_url, $match ) )
                {    
// Activate button/link:
                   
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 8 ) );
                }

                if(
preg_match_all( '~(\$secret_content_start\$)(.*?)(\$secret_content_end\$)~', $redirect_url, $secret_contents ) )
                {
// Preserve secret content markers
                   
for( $i = 0, $n = count( $secret_contents[2] ); $i < $n; $i++ )
                    {
                       
$redirect_url = str_replace( '$secret_content_start$'.$secret_contents[2][$i].'$secret_content_end$', '_____'.md5( $secret_contents[2][$i] ).'_____', $redirect_url );
                    }

                   
$redirect_url = rawurlencode( $redirect_url );
                   
// Restore $mail_log_ID$ and $email_key$ markers
                   
$redirect_url = str_replace( array( '_____mail_log_ID_____', '_____email_key_____' ), array( '$mail_log_ID$', '$email_key$' ), $redirect_url );

                    for(
$i = 0, $n = count( $secret_contents[2] ); $i < $n; $i++ )
                    {
                       
$secret_content = '$secret_content_start$'.rawurlencode( $secret_contents[2][$i] ).'$secret_content_end$';
                       
$redirect_url = str_replace( '_____'.md5( $secret_contents[2][$i] ).'_____', $secret_content, $redirect_url );
                    }

                    return
$matches[1].$passthrough_url.$redirect_url.$matches[3];
                }

               
$redirect_url = rawurlencode( $redirect_url );
               
// Restore $mail_log_ID$ and $email_key$ markers
               
$redirect_url = str_replace( array( '_____mail_log_ID_____', '_____email_key_____' ), array( '$mail_log_ID$', '$email_key$' ), $redirect_url );

                return
$matches[1].$passthrough_url.$redirect_url.$matches[3];

            case
'plain_text':
               
$redirect_url = $matches[0];
                if(
preg_match( $unsubscribe_link_re, $redirect_url, $match ) )
                {
                    if(
$match[1] == 'newsletter' )
                    {
                       
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 2 ) );
                    }
                }
                elseif(
preg_match( $email_func_re, $redirect_url, $match ) )
                {
                    switch(
$match[1] )
                    {
                        case
'like':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 3 ) );
                            break;

                        case
'dislike':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 4 ) );
                            break;

                        case
'cta1':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 5 ) );
                            break;

                        case
'cta2':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 6 ) );
                            break;

                        case
'cta3':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 7 ) );
                            break;

                        case
'unsubscribe':
                           
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 9 ) );
                            break;
                    }

                   
// Remove email function marker in the URL
                   
$redirect_url = $this->_cleanup_email_param_marker( $match, $redirect_url );
                }
                elseif(
preg_match( $activate_link_re, $redirect_url, $match ) )
                {
                   
$passthrough_url = $this->get_passthrough_url( array( 'tag' => 8 ) );
                }

                if(
preg_match_all( '~(\$secret_content_start\$)(.*?)(\$secret_content_end\$)~', $redirect_url, $secret_contents ) )
                {
// Preserve secret content markers
                   
for( $i = 0, $n = count( $secret_contents[2] ); $i < $n; $i++ )
                    {
                       
$redirect_url = str_replace( '$secret_content_start$'.$secret_contents[2][$i].'$secret_content_end$', '_____'.md5( $secret_contents[2][$i] ).'_____', $redirect_url );
                    }

                   
$redirect_url = rawurlencode( $redirect_url );
                   
// Restore $mail_log_ID$ and $email_key$ markers
                   
$redirect_url = str_replace( array( '_____mail_log_ID_____', '_____email_key_____' ), array( '$mail_log_ID$', '$email_key$' ), $redirect_url );

                    for(
$i = 0, $n = count( $secret_contents[2] ); $i < $n; $i++ )
                    {
                       
$secret_content = '$secret_content_start$'.rawurlencode( $secret_contents[2][$i] ).'$secret_content_end$';
                       
$redirect_url = str_replace( '_____'.md5( $secret_contents[2][$i] ).'_____', $secret_content, $redirect_url );
                    }

                    return
$passthrough_url.$redirect_url;
                }

               
$redirect_url = rawurlencode( $redirect_url );
               
// Restore $mail_log_ID$ and $email_key$ markers
               
$redirect_url = str_replace( array( '_____mail_log_ID_____', '_____email_key_____' ), array( '$mail_log_ID$', '$email_key$' ), $redirect_url );

                return
$passthrough_url.$redirect_url;

            default:
               
debug_die( 'Invalid content type' );
        }
    }
}

?>