Your IP : 18.119.117.128


Current Path : /home/bitrix/ext_www/dev.shuft.com.ua/bitrix/modules/main/lib/mail/
Upload File :
Current File : /home/bitrix/ext_www/dev.shuft.com.ua/bitrix/modules/main/lib/mail/tracking.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage main
 * @copyright 2001-2012 Bitrix
 */

namespace Bitrix\Main\Mail;

use Bitrix\Main\Config as Config;
use Bitrix\Main\Application;
use Bitrix\Main\EventResult;
use Bitrix\Main\Security\Sign\BadSignatureException;
use Bitrix\Main\Security\Sign\Signer;

class Tracking
{
	const SIGN_SALT_ACTION = 'event_mail_tracking';

	/**
	 * @param $moduleId
	 * @param $arFields
	 * @return string
	 */
	public static function getTag($moduleId, $arFields)
	{
		return $moduleId.".".base64_encode(json_encode($arFields));
	}

	/**
	 * @param $tag
	 * @return array
	 */
	public static function parseTag($tag)
	{
		$arTag = explode(".", $tag);
		$moduleId = $arTag[0];
		unset($arTag[0]);
		return array('MODULE_ID' => $moduleId, 'FIELDS' => (array) json_decode(base64_decode(implode('.', $arTag))));
	}

	/**
	 * @param $moduleId
	 * @param $arFields
	 * @return string
	 * @throws \Bitrix\Main\ArgumentTypeException
	 */
	public static function getSignedTag($moduleId, $arFields)
	{
		$tag = static::getTag($moduleId, $arFields);
		$signer = new Signer;
		return $signer->sign($tag, static::SIGN_SALT_ACTION);
	}

	/**
	 * @param $signedTag
	 * @return array
	 * @throws \Bitrix\Main\Security\Sign\BadSignatureException
	 */
	public static function parseSignedTag($signedTag)
	{
		$signer = new Signer;
		$unsignedTag = $signer->unsign($signedTag, static::SIGN_SALT_ACTION);
		return static::parseTag($unsignedTag);
	}

	/**
	 * @param $moduleId
	 * @param $arFields
	 * @return string
	 */
	public static function getLinkRead($moduleId, $arFields)
	{
		$tag = static::getTag($moduleId, $arFields);
		$bitrixDirectory = \Bitrix\Main\Application::getInstance()->getPersonalRoot();
		return $bitrixDirectory.'/tools/track_mail_read.php?tag='.urlencode($tag);
	}

	/**
	 * Get click link.
	 *
	 * @param string $moduleId Module ID.
	 * @param array $fields Fields.
	 * @return string
	 */
	public static function getLinkClick($moduleId, $fields)
	{
		$uri = Application::getInstance()->getPersonalRoot();
		$uri .= '/tools/track_mail_click.php';
		$uri .= '?tag=' . urlencode(static::getTag($moduleId, $fields));

		return $uri;
	}

	/**
	 * @param $moduleId
	 * @param $arFields
	 * @return string
	 */
	public static function getLinkUnsub($moduleId, $arFields, $urlPage = "")
	{
		$tag = static::getSignedTag($moduleId, $arFields);
		if($urlPage == "")
		{
			$bitrixDirectory = \Bitrix\Main\Application::getInstance()->getPersonalRoot();
			$resutl = $bitrixDirectory.'/tools/track_mail_unsub.php?tag='.urlencode($tag);
		}
		else
		{
			$resutl = $urlPage.(strpos($urlPage, "?")===false ? "?" : "&").'tag='.urlencode($tag);
		}

		return $resutl;
	}

	/**
	 * Get sign.
	 *
	 * @param string $value Value.
	 * @return string
	 */
	public static function getSign($value)
	{
		static $cached = array();
		foreach ($cached as $cache)
		{
			if ($cache[0] == $value)
			{
				return $cache[1];
			}
		}

		$signer = new Signer;
		$sign = $signer->getSignature($value, static::SIGN_SALT_ACTION);

		$cached[] = array($value, $sign);
		if (count($cached) > 10)
		{
			array_shift($cached);
		}

		return $sign;
	}

	/**
	 * Verify sign.
	 *
	 * @param string $value Value.
	 * @param string $signature Signature.
	 * @return bool
	 */
	public static function validateSign($value, $signature)
	{
		try
		{
			$signer = new Signer;
			return $signer->validate($value, $signature, static::SIGN_SALT_ACTION);
		}
		catch (BadSignatureException $exception)
		{
			return false;
		}
	}

	/**
	 * @param $arData
	 * @return array|bool
	 */
	public static function getSubscriptionList($arData)
	{
		$arSubscription = array();

		if(array_key_exists('MODULE_ID', $arData))
			$filter = array($arData['MODULE_ID']);
		else
			$filter = null;

		if(!is_array($arData['FIELDS'])) return false;

		$event = new \Bitrix\Main\Event("main", "OnMailEventSubscriptionList", array($arData['FIELDS']), $filter);
		$event->send();
		foreach ($event->getResults() as $eventResult)
		{
			if ($eventResult->getType() == EventResult::ERROR)
			{
				return false;
			}

			$subscriptionList = $eventResult->getParameters();
			if($subscriptionList && is_array($subscriptionList['LIST']))
			{
				$arSubscription = array_merge(
					$arSubscription,
					array($eventResult->getModuleId() => $subscriptionList['LIST'])
				);
			}
		}

		if(array_key_exists('MODULE_ID', $arData))
			$arSubscription = $arSubscription[$arData['MODULE_ID']];

		return $arSubscription;
	}

	/**
	 * @param $arData
	 * @return bool
	 */
	public static function subscribe($arData)
	{
		if(!is_array($arData['FIELDS'])) return false;

		$event = new \Bitrix\Main\Event("main", "OnMailEventSubscriptionEnable", array($arData['FIELDS']), array($arData['MODULE_ID']));
		$event->send();
		foreach ($event->getResults() as $eventResult)
		{
			if ($eventResult->getType() == EventResult::ERROR)
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * @param $arData
	 * @return bool
	 */
	public static function unsubscribe($arData)
	{
		if(!is_array($arData['FIELDS'])) return false;

		$event = new \Bitrix\Main\Event("main", "OnMailEventSubscriptionDisable", array($arData['FIELDS']), array($arData['MODULE_ID']));
		$event->send();
		foreach ($event->getResults() as $eventResult)
		{
			if ($eventResult->getType() == EventResult::ERROR)
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * @param array $arData
	 * @return bool
	 */
	public static function click(array $arData)
	{
		if(array_key_exists('MODULE_ID', $arData))
			$filter = array($arData['MODULE_ID']);
		else
			$filter = null;

		$event = new \Bitrix\Main\Event("main", "OnMailEventMailClick", array($arData['FIELDS']), $filter);
		$event->send();
		foreach ($event->getResults() as $eventResult)
		{
			if ($eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * @param array $arData
	 * @return bool
	 */
	public static function read(array $arData)
	{
		if(array_key_exists('MODULE_ID', $arData))
			$filter = array($arData['MODULE_ID']);
		else
			$filter = null;

		$event = new \Bitrix\Main\Event("main", "OnMailEventMailRead", array($arData['FIELDS']), $filter);
		$event->send();
		foreach ($event->getResults() as $eventResult)
		{
			if ($eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
			{
				return false;
			}
		}

		return true;
	}
}