| Current Path : /var/www/html/plugins/system/jchatlogin/ |
| 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' );
}
}