Current File : /home/pacjaorg/public_html/kmm/administrator/components/com_djclassifieds/lib/djaccess.php
<?php
/**
 * @package DJ-Classifieds
 * @copyright Copyright (C) DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 */

defined('_JEXEC') or die('Restricted access');

require_once(JPATH_ROOT.'/administrator/components/com_djclassifieds/lib/djfield.php');
require_once(JPATH_ROOT.'/administrator/components/com_djclassifieds/lib/djseo.php');
require_once(JPATH_ROOT.'/components/com_djclassifieds/model.php');

class DJClassifiedsAccess
{
	static function getUserGroups($user_id = null)
    {
		$user = JFactory::getUser($user_id);

		if($user->id){
			$ug_arr = $user->groups;
		}else{
			$u_par = JComponentHelper::getParams('com_users');
			$guest_usergroup = $u_par->get('guest_usergroup', '0');
			$ug_arr = array(
				'1', // public
				$guest_usergroup
			);
        }
        
        return $ug_arr;
	}
	
    public static function hasAccessToFormField($f, $account_type_id = null)
    {
		$db = JFactory::getDBO();

		$has_access = false;
		$group_ids = array();

		if($f->group_id){
			$ug_arr = self::getUserGroups();
			$group_ids = explode(',', $f->group_id);

			foreach($group_ids as $group_id){
				$query = "SELECT * FROM #__djcf_fields_groups_usergroups WHERE group_id=".$group_id;
				$db->setQuery($query);
				$groups_restriction = $db->loadObjectList();
	
				if($groups_restriction){
					foreach($groups_restriction as $g){
						if(in_array($g->usergroup_id, $ug_arr)){
							$has_access = true;
							break 2;
						}
					}
				}else{
					$has_access = true;
					break;
				}
			}
		}else{
			$has_access = true;
		}

		if($account_type_id !== null && empty($groups_restriction)){ // if profile edit and no user groups set for field group - base access on profile field group (backward compatibility)
			$has_access = $f->group_id == '0' || in_array($account_type_id, $group_ids) ? true : false;
		}

		return $has_access;
    }

	static function filterFieldsByGroupAccess(&$fields)
	{
		foreach($fields as $key => $f){
			if($f->group_id){
				$group_ids = explode(',', $f->group_id);
				$match = false;
				foreach($group_ids as $group_id){
					$fieldgroup = DJClassifiedsField::getFieldGroup($group_id);
					//if(!$fieldgroup || ($fieldgroup && in_array($fieldgroup->access, $ug_arr))){
					if($fieldgroup === null || $fieldgroup){
						$match = true;
						break;
					}
				}
				if(!$match){
					unset($fields[$key]);
				}
			}
		}
	}

	public static function hasAccessToPlan($plan)
	{
		$user = JFactory::getUser();
		$db = JFactory::getDBO();

		$query = "SELECT * FROM #__djcf_plans_groups WHERE plan_id=".$plan->id;
		$db->setQuery($query);
		$groups_restriction = $db->loadObjectList();

		if($groups_restriction){
			$ug_arr = DJClassifiedsAccess::getUserGroups($user->id);
			foreach($groups_restriction as $g){
				if(in_array($g->group_id, $ug_arr)){
					return true;
				}
			}
			return false;
		}

		return true;
	}

	static function canEditItem($item, $par = null, $full_check = false)
	{
		$app = JFactory::getApplication();
		$user = JFactory::getUser();
		$par = $par ? $par : JComponentHelper::getParams('com_djclassifieds');

		$can_edit = false;
		if($item->published != '2' && ($user->id && $item->user_id == $user->id) || (!$user->id && $par->get('guest_can_edit','1') && $item->token && $app->input->get('token') == $item->token)){
			$can_edit = true;
		}

		if($full_check && $can_edit){
			if(!self::canEditAuctionItem($item, $par)){
				$can_edit = 'COM_DJCLASSIFIEDS_AUCTION_EDIT_LOCK_MESSAGE';
			}
			if(!self::canEditBuynowItem($item, $par)){
				$can_edit = 'COM_DJCLASSIFIEDS_BUYNOW_EDIT_LOCK_MESSAGE';
			}
		}

		if($user->id && $par->get('admin_can_edit_delete','0') && $user->authorise('core.admin', 'com_djclassifieds')){
			$can_edit = true;
		}

		return $can_edit;
	}

	static function canDeleteItem($item, $par = null)
	{
		$app = JFactory::getApplication();
		$user = JFactory::getUser();
		$par = $par ? $par : JComponentHelper::getParams('com_djclassifieds');

		$can_delete = false;
		if(($user->id && $item->user_id == $user->id) || (!$user->id && $par->get('guest_can_delete','1') && $item->token && $app->input->get('token') == $item->token)){
			$can_delete = true;
		}
		if($item->published == '2' && $par->get('allow_user_delete_archive','0')=='0'){
			$can_delete = false;
		}
		
		if($user->id && $par->get('admin_can_edit_delete','0') && $user->authorise('core.admin', 'com_djclassifieds')){
			$can_delete = true;
		}

		return $can_delete;
	}

	static function canEditAuctionItem($item, $par = null)
	{
		$par = $par ? $par : JComponentHelper::getParams('com_djclassifieds');
		$djmodel = new DJClassifiedsModel();

		$can_edit = $item->auction && $par->get('auction_edit_lock') && $djmodel->getBids($item->id) ? false : true;

		return $can_edit;
	}

	static function canEditBuynowItem($item, $par = null)
	{
		$db = JFactory::getDBO();
		$par = $par ? $par : JComponentHelper::getParams('com_djclassifieds');

		$can_edit = true;

		if($item->buynow && $par->get('buynow_edit_lock')){
			$query = "SELECT count(id) FROM #__djcf_orders WHERE item_id=".$item->id;
			$db->setQuery($query);
			$has_orders = $db->loadResult();
			if($has_orders){
				$can_edit = false;
			}
		}
	
		return $can_edit;
	}

	static function canRenewAuctionItem($item, $par = null)
	{
		$par = $par ? $par : JComponentHelper::getParams('com_djclassifieds');
		$djmodel = new DJClassifiedsModel();

		$can_renew = $item->auction && $par->get('auction_renew_lock') && $djmodel->getBids($item->id) ? false : true;
	
		return $can_renew;
	}
	
	static function passwordRuleTest($value)
	{
		$params = JComponentHelper::getParams('com_users');

		$minimumLengthp    = $params->get('minimum_length');
		$minimumIntegersp  = $params->get('minimum_integers');
		$minimumSymbolsp   = $params->get('minimum_symbols');
		$minimumUppercasep = $params->get('minimum_uppercase');
		$minimumLowercasep = $params->get('minimum_lowercase');

		empty($minimumLengthp) ? : $minimumLength = (int) $minimumLengthp;
		empty($minimumIntegersp) ? : $minimumIntegers = (int) $minimumIntegersp;
		empty($minimumSymbolsp) ? : $minimumSymbols = (int) $minimumSymbolsp;
		empty($minimumUppercasep) ? : $minimumUppercase = (int) $minimumUppercasep;
		empty($minimumLowercasep) ? : $minimumLowercase = (int) $minimumLowercasep;

		$valueLength = strlen($value);

		// Load language file of com_users component
		JFactory::getLanguage()->load('com_users');

		// We set a maximum length to prevent abuse since it is unfiltered.
		if ($valueLength > 4096)
		{
			return JText::_('COM_DJCLASSIFIEDS_MSG_PASSWORD_TOO_LONG');
		}

		// We don't allow white space inside passwords
		$valueTrim = trim($value);

		if (strlen($valueTrim) !== $valueLength)
		{
			return JText::_('COM_DJCLASSIFIEDS_MSG_SPACES_IN_PASSWORD');
		}

		// Minimum number of integers required
		if (!empty($minimumIntegers))
		{
			$nInts = preg_match_all('/[0-9]/', $value, $imatch);

			if ($nInts < $minimumIntegers)
			{
				return JText::plural('COM_DJCLASSIFIEDS_MSG_NOT_ENOUGH_INTEGERS_N', $minimumIntegers);
			}
		}

		// Minimum number of symbols required
		if (!empty($minimumSymbols))
		{
			$nsymbols = preg_match_all('[\W]', $value, $smatch);

			if ($nsymbols < $minimumSymbols)
			{
				return JText::plural('COM_DJCLASSIFIEDS_MSG_NOT_ENOUGH_SYMBOLS_N', $minimumSymbols);
			}
		}

		// Minimum number of upper case ASCII characters required
		if (!empty($minimumUppercase))
		{
			$nUppercase = preg_match_all('/[A-Z]/', $value, $umatch);

			if ($nUppercase < $minimumUppercase)
			{
				return JText::plural('COM_DJCLASSIFIEDS_MSG_NOT_ENOUGH_UPPERCASE_LETTERS_N', $minimumUppercase);
			}
		}

		// Minimum number of lower case ASCII characters required
		if (!empty($minimumLowercase))
		{
			$nLowercase = preg_match_all('/[a-z]/', $value, $umatch);

			if ($nLowercase < $minimumLowercase)
			{
				return JText::plural('COM_DJCLASSIFIEDS_MSG_NOT_ENOUGH_LOWERCASE_LETTERS_N', $minimumLowercase);
			}
		}

		// Minimum length option
		if (!empty($minimumLength))
		{
			if (strlen((string) $value) < $minimumLength)
			{
				return JText::plural('COM_DJCLASSIFIEDS_MSG_PASSWORD_TOO_SHORT_N', $minimumLength);
			}
		}

		return false;
	}

	static function getCaptchaPlugin()
	{
		$par = JComponentHelper::getParams('com_djclassifieds');
		return $par->get('captcha_plugin', JFactory::getConfig()->get('captcha'));
	}

	static function renderCaptcha()
	{
		$app = JFactory::getApplication();
		$captcha_plugin = self::getCaptchaPlugin();
		
		if($captcha_plugin){
			JPluginHelper::importPlugin('captcha', $captcha_plugin);
			$app->triggerEvent('onInit', array());
			$captcha_output = '';
			foreach($app->triggerEvent('onDisplay', array()) as $captcha_display){
				$captcha_output .= $captcha_display;
			}
			return $captcha_output;
		}
	}

	static function isCaptchaValid()
	{
		$captcha_plugin = self::getCaptchaPlugin();

		if($captcha_plugin){
			JPluginHelper::importPlugin('captcha', $captcha_plugin);

			$app = JFactory::getApplication();
			try {
				$catpcha_test = $app->triggerEvent('onCheckAnswer', array());
			} catch (Exception $e) {
				$app->enqueueMessage($e->getMessage(), 'error');
				return false;
			}
			if(!empty($catpcha_test[0]) && $catpcha_test[0] === false){
				return false;
			}
		}

		return true;
	}

	static function checkAskFormFiles()
	{
		$app = JFactory::getApplication();
		$par = JComponentHelper::getParams('com_djclassifieds');

		$ask_file = $_FILES['ask_file'];

		if($par->get('ask_seller_file','0') == '1'){
			if(!empty($ask_file['name'])){
				$ask_files = array();
				if(is_array($ask_file['name'])){
					foreach($ask_file['name'] as $key => $val){
						$ask_files[] = array('name' => $ask_file['name'][$key], 'size' => $ask_file['size'][$key]);
					}
				}else{
					$ask_files[] = $ask_file;
				}

				$file_maxsize = $par->get('ask_seller_file_size','2');
				if($file_maxsize > 0){
					$file_maxsize = $file_maxsize * 1024 * 1024;
				}

				foreach($ask_files as $file){
					if($file_maxsize > 0 && $file['size'] < $file_maxsize){
						$file_ext = pathinfo($file['name'])['extension'];
						if(!strstr(','.str_ireplace(' ', '', $par->get('ask_seller_file_types','doc,pdf,zip')).',', ','.$file_ext.',')){
							$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ASK_FORM_FILE_WRONG_EXT'), 'warning');
							return false;
						}
					}else{
						$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ASK_FORM_FILE_SIZE_LIMIT_EXCEEDED'), 'warning');
						return false;
					}
				}
			}
		}

		return true;
	}

	public static function restrictionRedirect($type = '')
	{
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$par = JComponentHelper::getParams('com_djclassifieds');
		
		if($type=='category'){
			$message = JText::_("COM_DJCLASSIFIEDS_YOU_ARE_NOT_AUTHORIZED_TO_VIEW_THIS_CATEGORY");
		}else{
			$message = JText::_("COM_DJCLASSIFIEDS_YOU_ARE_NOT_AUTHORIZED_TO_VIEW_THIS_ADVERT");
		}
			
		if($par->get('acl_redirect','0')==1){
			$app->enqueueMessage($message, 'warning');
			$redirect = JURI::base();
		}else if($par->get('acl_redirect','0')==2 && $par->get('acl_red_article_id','0')>0){
			$query = "SELECT a.id, a.alias, a.catid, c.alias as c_alias "
					."FROM #__content a "
					."LEFT JOIN #__categories c ON c.id=a.catid "
					."WHERE a.state=1 AND a.id=".$par->get('acl_red_article_id','0');
			$db->setQuery($query);
			$acl_article = $db->loadObject();		 				 				 				 		
			
			if($acl_article){
				$content_helper_route = JPATH_ROOT.'/components/com_content/helpers/route.php';
				if(file_exists($content_helper_route)){
					include_once $content_helper_route;
				}
				$slug = $acl_article->id.':'.$acl_article->alias;
				$cslug = $acl_article->catid.':'.$acl_article->c_alias;
				$article_link = ContentHelperRoute::getArticleRoute($slug,$cslug);		 			
				$redirect = JRoute::_($article_link);
			}else{
				$redirect = JURI::base();
			}
		}else{
			$redirect = DJClassifiedsSEO::getCategoryRoute('0:all');
		}

		$app->enqueueMessage($message, 'error');
		$app->redirect(JRoute::_($redirect, false));
	}

	static function isCatLocked($item)
	{
		$db = JFactory::getDBO();

		if($item->id){
			$query = "SELECT dx.id "
					."FROM #__djcf_days_xref dx "
					."INNER JOIN #__djcf_days d ON dx.day_id=d.id "
					."WHERE dx.cat_id=".$item->cat_id." AND d.days=".$item->exp_days." "
					."ORDER BY d.id DESC LIMIT 1";
			$db->setQuery($query);
			$day_id = $db->loadResult();
			if($day_id){
				return true;
			}
		}

		return false;
	}

	static function checkAdsLimits($par)
	{
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$user = JFactory::getUser();

		$user_ip = $_SERVER['REMOTE_ADDR'];

		if($par->get('advert_limit_5min',5) > 0){
			$date_last5 = JFactory::getDate('now - 5 minute')->toSQL();
			if($user->id){
				$query = "SELECT COUNT(id) FROM #__djcf_items WHERE user_id = ".$user->id." AND date_start >= '".$date_last5."'";					
			}else{					
				$query = "SELECT COUNT(id) FROM #__djcf_items WHERE ip_address = '".$user_ip."' AND date_start >= '".$date_last5."'";
			}

			$db->setQuery($query);
			$check = $db->loadResult();
			if($check >= $par->get('advert_limit_5min',5)){
				$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ADVERTS_LIMIT_LAST_5MIN_ALERT'), 'error');
				return false;
			}
		}
		
		if($par->get('advert_limit_hour',10) > 0){
			$date_lasth = JFactory::getDate('now - 1 hour')->toSQL();
			if($user->id){
				$query = "SELECT COUNT(id) FROM #__djcf_items WHERE user_id = ".$user->id." AND date_start >= '".$date_lasth."'";
			}else{
				$query = "SELECT COUNT(id) FROM #__djcf_items WHERE ip_address = '".$user_ip."' AND date_start >= '".$date_lasth."'";
			}
		
			$db->setQuery($query);
			$check = $db->loadResult();
			if($check >= $par->get('advert_limit_hour',10)){
				$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ADVERTS_LIMIT_LAST_HOUR_ALERT'), 'error');
				return false;
			}
		}
		
		if($par->get('advert_limit_day',50) > 0){
			$date_lastd = JFactory::getDate('now - 1 day')->toSQL();
			
			if($user->id){
				$query = "SELECT COUNT(id) FROM #__djcf_items WHERE user_id = ".$user->id." AND date_start >= '".$date_lastd."'";
			}else{
				$query = "SELECT COUNT(id) FROM #__djcf_items WHERE ip_address = '".$user_ip."' AND date_start >= '".$date_lastd."'";
			}
				
			$db->setQuery($query);
			$check = $db->loadResult(); 				
			if($check >= $par->get('advert_limit_day',50)){
				$app->enqueueMessage(JText::_('COM_DJCLASSIFIEDS_ADVERTS_LIMIT_LAST_DAY_ALERT'), 'error');
				return false;
			}
		}

		return true;
	}

	static function checkCatAllowed($cats_to_check)
	{
		$app = JFactory::getApplication();
		$djmodel = new DJClassifiedsModel();

		foreach($cats_to_check as $cat_id){
			$cat = $djmodel->getCategory($cat_id);

			if($cat->ads_disabled){
				$app->enqueueMessage(JText::sprintf('COM_DJCLASSIFIEDS_CATEGORY_POSTING_NOT_ALLOWED', JText::_($cat->name)), 'error');
				return false;
			}
		}

		return true;
	}

	static function checkCatAdsLimits($cats_to_check, $id = 0)
	{
		$app = JFactory::getApplication();
		$db = JFactory::getDBO();
		$user = JFactory::getUser();
		$djmodel = new DJClassifiedsModel();

		if($user->id){
			$query = "SELECT count(*) c, cat_id "
			."FROM ("
				."SELECT id, cat_id, user_id, date_exp FROM #__djcf_items "
				.(JPluginHelper::isEnabled('djclassifieds', 'multicategories') ? "UNION SELECT i.id, ic.cat_id, i.user_id, i.date_exp FROM #__djcf_items i INNER JOIN #__djcf_items_categories ic ON i.id=ic.item_id " : "")
			.") v "
			."WHERE user_id=".$user->id." AND id!=".($id ? $id : 0)." "
			."AND date_exp > ".$db->q(JFactory::getDate()->toSQL())." "
			."GROUP BY cat_id";
			$db->setQuery($query);
			$user_ad_count = $db->loadAssocList('cat_id', 'c');
	
			if($user_ad_count){
				foreach($cats_to_check as $cat_id){
					$cat = $djmodel->getCategory($cat_id);
		
					if(!empty($cat->ads_limit) && !empty($user_ad_count[$cat->id]) && $user_ad_count[$cat->id] >= $cat->ads_limit){
						$app->enqueueMessage(JText::sprintf('COM_DJCLASSIFIEDS_CATEGORY_ADS_LIMIT_REACHED', JText::_($cat->name)), 'error');
						return false;
					}
				}
			}
		}

		return true;
	}

	static function isProfileVerified($user_id = null)
	{
		if($user_id === null){
			$user_id = JFactory::getUser()->id;
		}

		$db = JFactory::getDBO();
		$query = "SELECT verified FROM #__djcf_profiles WHERE user_id=".$user_id;
		$db->setQuery($query);
		$verified = $db->loadResult();

		return $verified;
	}

	static function isUserEmailDisabled($email_id, $email)
	{
		$db = JFactory::getDBO();
		$query = "SELECT p.disabled_emails FROM #__djcf_profiles p INNER JOIN #__users u ON p.user_id=u.id WHERE u.email=".$db->q($email);
		$db->setQuery($query);
		$disabled_emails = $db->loadResult();
		
		if($disabled_emails && in_array($email_id, explode(',', $disabled_emails))){
			return true;
		}
	}

	static function hasAskFormAccess($user_id, $par)
	{
		$user = JFactory::getUser($user_id);

		if($par->get('ask_seller_type','0')=='0' && !$user->id){
			return false;
		}elseif($par->get('ask_seller_type','0')=='0' && $ug_access = $par->get('ask_seller_ug_access', array())){
			foreach($ug_access as $ug){
				if(in_array($ug, $user->groups)){
					return true;
					break;
				}
			}
			return false;
		}
		
		return true;
	}

	static function hasContactAccess($user_id, $par)
	{
		$user = JFactory::getUser($user_id);

		if($par->get('show_contact_only_registered','0')=='1' && !$user->id){
			return false;
		}elseif($par->get('show_contact_only_registered','0')=='1' && $ug_access = $par->get('show_contact_ug_access', array())){
			foreach($ug_access as $ug){
				if(in_array($ug, $user->groups)){
					return true;
					break;
				}
			}
			return false;
		}
		
		return true;
	}

	static function overrideUserAutopublish(&$par)
	{
		$user = JFactory::getUser();
		$autopublish_ug = $par->get('autopublish_ug', array());

		foreach($autopublish_ug as $ug){
			if(in_array($ug, $user->groups)){
				$par->set('autopublish', '1');
				return;
			}
		}
	}
}
Site is undergoing maintenance

PACJA Events

Maintenance mode is on

Site will be available soon. Thank you for your patience!