Your IP : 216.73.216.224


Current Path : /var/www/html/plugins/system/jchatlogin/
Upload File :
Current File : /var/www/html/plugins/system/jchatlogin/jchatlogin.php

<?php
/** 
 * Manage login/logout for social networks connect
 * @package JCHAT::plugins::system
 * @subpackage jchatlogin
 * @copyright (C) 2024 - Joomla! Extensions Store
 * @license GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html  
 */
// no direct access
defined ( '_JEXEC' ) or die ( 'Restricted access' );
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;
use Joomla\Event\Event;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;

class PlgSystemJChatlogin extends CMSPlugin implements SubscriberInterface {
	/**
	 * Component params
	 * 
	 * @access private
	 * @var Object
	 */
	private $cParams;
	
	/**
	 * App reference
	 *
	 * @access protected
	 * @var Object
	 */
	protected $appInstance;
	
	/**
	 * Check if the execution is valid
	 * 
	 * @access private
	 * return boolean
	 */
	private function checkIfValidExecution($cParams) {
		// Ottenimento document
		$doc = $this->appInstance->getDocument ();
		// Output JS APP nel Document
		if($doc->getType() !== 'html' || $this->appInstance->getInput()->getCmd ( 'tmpl' ) === 'component') {
			return false;
		}
		
		$user = $this->appInstance->getIdentity();
		if(!$user->id && !$cParams->get('guestenabled', false)) {
			return false;
		}
		
		// Check access levels intersection to ensure that users has access usage permission for chat
		// Get users access levels based on user groups belonging
		$userAccessLevels = $user->getAuthorisedViewLevels();
		
		// Get chat access level from configuration, if set AKA param != array(0) go on with intersection
		$chatAccessLevels = $cParams->get('chat_accesslevels', array(0));
		if(is_array($chatAccessLevels) && !in_array(0, $chatAccessLevels, false)) {
			$intersectResult = array_intersect($userAccessLevels, $chatAccessLevels);
			$hasChatAccess = (bool)(count($intersectResult));
			// Return if user has no access
			if(!$hasChatAccess) {
				return false;
			}
		}
		
		// Check for IP multiple ranges exclusions
		if($cParams->get ( 'ipbanning', false)) {
			$ipAddressRegex = '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/i';
			$clientIP = $_SERVER ['REMOTE_ADDR'];
			$clientIpDec = ( float ) sprintf ( "%u", ip2long ( $clientIP ) );
			$ipRanges = $cParams->get ( 'iprange_multiple', null);
			// Check if data are not null
			if($ipRanges) {
				// Try to load every range, one per row
				$explodeRows = explode(PHP_EOL, $ipRanges);
				if(!empty($explodeRows)) {
					foreach ($explodeRows as $singleRange) {
						// Try to detect single range
						$explodeRange = explode('-', $singleRange);
						if(!empty($explodeRange) && count($explodeRange) == 2) {
							$ipStart = trim($explodeRange[0]);
							$ipEnd = trim($explodeRange[1]);
							$validIpRangeStart = preg_match ( $ipAddressRegex, $ipStart );
							$validIpRangeEnd = preg_match ( $ipAddressRegex, $ipEnd );
							if ($validIpRangeStart && $validIpRangeEnd) {
								$lowerIpDec = ( float ) sprintf ( "%u", ip2long ( $ipStart ) );
								$upperIpDec = ( float ) sprintf ( "%u", ip2long ( $ipEnd ) );
								if (($clientIpDec >= $lowerIpDec) && ($clientIpDec <= $upperIpDec)) {
									return false;
								}
							}
						}
					}
				}
			}
		}
		
		// Check for hours activation
		$startHour = $cParams->get('start_at_hour', null);
		$stopHour = $cParams->get('stop_at_hour', null);
		if($startHour && $stopHour) {
			$jTimeZone = Factory::getApplication()->getConfig ()->get ( 'offset' );
			$dateObject = Factory::getDate();
			$dateObject->setTimezone(new \DateTimeZone($jTimeZone));
			$currentHour = $dateObject->format('G', true);
			if($currentHour < $startHour || $currentHour >= $stopHour) {
				return false;
			}
		}
		
		// Check for day of the week activation
		$daysOfTheWeek = $cParams->get('days_of_the_week', null);
		if(is_array($daysOfTheWeek) && count($daysOfTheWeek) && !in_array('', $daysOfTheWeek, true))  {
			$jTimeZone = Factory::getApplication()->getConfig ()->get ( 'offset' );
			$dateObject = Factory::getDate();
			$dateObject->setTimezone(new \DateTimeZone($jTimeZone));
			$currentDay = $dateObject->format('w', true);
			if(!in_array($currentDay, $daysOfTheWeek)) {
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * onAfterDispatch handler
	 *
	 * @param Event $event
	 * @access	public
	 * @return null
	 */
	public function chatSocialLoginConnector(Event $event) {
		if($this->appInstance->isClient ('site') && $this->checkIfValidExecution($this->cParams)) {
			// Load framework classes without autoloading
			require_once JPATH_ROOT . '/administrator/components/com_jchat/Framework/Helpers/Users.php';
			
			// Manage partial language translations
			$jLang = $this->appInstance->getLanguage();
			$jLang->load('com_jchat', JPATH_SITE . '/components/com_jchat', 'en-GB', true, true);
			if($jLang->getTag() != 'en-GB') {
				$jLang->load('com_jchat', JPATH_SITE, null, true, false);
				$jLang->load('com_jchat', JPATH_SITE . '/components/com_jchat', null, true, false);
			}
			
			// Check and include if Facebook social login is enabled
			if($this->cParams->get('fblogin_active', 0)) {
				// Inject the FB app id in the js domain
				$doc = $this->appInstance->getDocument();
				$appId = $this->cParams->get('appId', '');
				$locale = $this->appInstance->getLanguage ()->getTag();
				$sdkLangTag = str_replace("-", "_", $locale);
				$sdkVersion = $this->cParams->get ( 'sdkversion', '6.0' );
				
				$doc->getWebAssetManager()->addInlineScript ("var jchatAppId = '$appId';" .
															 "var jchatSdkVersion = 'v$sdkVersion';" .
															 "jQuery(function(){jQuery('<div id=\'fb-root\'></div>').appendTo('body')});" );

				switch ((int)$this->cParams->get ( 'sdkloadmode', '2' )) {
					// Override load mode
					case 2 :
						$doc->getWebAssetManager()->addInlineScript ( "(function(d){var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];js = d.createElement('script');js.id = id;js.async = true;js.src = '//connect.facebook.net/$sdkLangTag/sdk.js#xfbml=1&version=v$sdkVersion&appId=$appId';ref.parentNode.insertBefore(js, ref);}(document));" );
						break;
					
					// No override load mode
					case 1 :
						$doc->getWebAssetManager()->addInlineScript ( "(function(d) {var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];if (d.getElementById(id)){return;}js = d.createElement('script');js.id = id;js.async = true;js.src = '//connect.facebook.net/$sdkLangTag/sdk.js#xfbml=1&version=v$sdkVersion&appId=$appId';ref.parentNode.insertBefore(js, ref);}(document));" );
						break;
						
					// Load nothing
					case 0 :
						break;
				}
				
				// Include the Facebook connector class
				require_once JPATH_ROOT . '/plugins/system/jchatlogin/connectors/connector.php';
				require_once JPATH_ROOT . '/plugins/system/jchatlogin/connectors/facebook.php';
				$fbConnector = new \JChatLoginConnectorFacebook($this->cParams);
				$fbConnector->execute();
			}
			
			// Check and include if G+ social login is enabled
			if($this->cParams->get('gpluslogin_active', 0)) {
				// Include the Facebook connector class
				require_once JPATH_ROOT . '/plugins/system/jchatlogin/connectors/connector.php';
				require_once JPATH_ROOT . '/plugins/system/jchatlogin/connectors/google.php';
				$gplusConnector = new \JChatLoginConnectorGoogle($this->cParams);
				$gplusConnector->execute();
			}
			
			// Check and include if Twitter social login is enabled
			// Check and include if G+ social login is enabled
			if($this->cParams->get('twitterlogin_active', 0)) {
				// Include the Facebook connector class
				require_once JPATH_ROOT . '/plugins/system/jchatlogin/connectors/connector.php';
				require_once JPATH_ROOT . '/plugins/system/jchatlogin/connectors/twitter.php';
				$twitterConnector = new \JChatLoginConnectorTwitter($this->cParams);
				$twitterConnector->execute();
			}
		}
	}
	
	/**
	 * Returns an array of events this subscriber will listen to.
	 *
	 * @return  array
	 *
	 * @since 4.0.0
	 */
	public static function getSubscribedEvents(): array {
		return [
				'onAfterDispatch' => 'chatSocialLoginConnector'
		];
	}
	
	/**
	 * Class Constructor
	 * 
	 * @access protected
	 * @param object $subject
	 *        	object to observe
	 * @param array $config
	 *        	An array that holds the plugin configuration
	 * @since 1.6
	 */
	public function __construct($subject, $config = []) {
		parent::__construct ( $subject, $config );
		
		// Init application
		$this->appInstance = Factory::getApplication();
		
		$this->cParams = ComponentHelper::getParams ( 'com_jchat' );
	}
}