403Webshell
Server IP : 195.130.67.5  /  Your IP : 216.73.217.154
Web Server : Microsoft-IIS/10.0
System : Windows NT WEBSERVER1 10.0 build 17763 (Windows Server 2016) i586
User : IUSR ( 0)
PHP Version : 7.4.19
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /Old Sites/rescommittee/administrator/components/com_admintools/models/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /Old Sites/rescommittee/administrator/components/com_admintools/models/fixperms.php
<?php
/**
 *  @package AdminTools
 *  @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos
 *  @license GNU General Public License version 3, or later
 *  @version $Id$
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

class AdmintoolsModelFixperms extends FOFModel
{
	/** @var float The time the process started */
	private $startTime = null;

	/** @var array The folders to process */
	private $folderStack = array();

	/** @var array The files to process */
	private $filesStack = array();

	/** @var int Total numbers of folders in this site */
	public $totalFolders = 0;

	/** @var int Numbers of folders already processed */
	public $doneFolders = 0;

	/** @var int Default directory permissions */
	private $dirperms = 0755;

	/** @var int Default file permissions */
	private $fileperms = 0644;

	/** @var array Custom permissions */
	private $customperms = array();
	
	/** @var array Skip subdirectories and files of these directories */
	private $skipDirs = array();
	
	public function  __construct($config = array()) {
		parent::__construct($config);

		if(interface_exists('JModel')) {
			$params = JModelLegacy::getInstance('Storage','AdmintoolsModel');
		} else {
			$params = JModel::getInstance('Storage','AdmintoolsModel');
		}

		$dirperms = '0'.ltrim(trim($params->getValue('dirperms', '0755')),'0');
		$fileperms = '0'.ltrim(trim($params->getValue('fileperms', '0644')),'0');

		$dirperms = octdec($dirperms);
		if( ($dirperms < 0400) || ($dirperms > 0777) ) $dirperms = 0755;
		$this->dirperms = $dirperms;

		$fileperms = octdec($fileperms);
		if( ($fileperms < 0400) || ($fileperms > 0777) ) $fileperms = 0755;
		$this->fileperms = $fileperms;

		$db = $this->getDBO();
		$query = $db->getQuery(true)
			->select(array(
				$db->quoteName('path'),
				$db->quoteName('perms')
			))->from($db->quoteName('#__admintools_customperms'))
			->order($db->quoteName('path').' ASC');
		$db->setQuery($query);
		$this->customperms = $db->loadAssocList('path');
		
		// Add cache, tmp and log to the exceptions
		$this->skipDirs[] = rtrim(JPATH_CACHE,'/');
		$this->skipDirs[] = rtrim(JPATH_ROOT.'/cache','/');
		if(version_compare(JVERSION, '3.0', 'ge')) {
			$this->skipDirs[] = rtrim(JFactory::getConfig()->get('tmp_path', JPATH_ROOT.'/tmp'), '/');
			$this->skipDirs[] = rtrim(JFactory::getConfig()->get('log_path', JPATH_ROOT.'/logs'), '/');
		} else {
			$this->skipDirs[] = rtrim(JFactory::getConfig()->getValue('tmp_path', JPATH_ROOT.'/tmp'), '/');
			$this->skipDirs[] = rtrim(JFactory::getConfig()->getValue('log_path', JPATH_ROOT.'/logs'), '/');
		}
	}

	/**
	 * Returns the current timestampt in decimal seconds
	 */
	private function microtime_float()
	{
		list($usec, $sec) = explode(" ", microtime());
		return ((float)$usec + (float)$sec);
	}

	/**
	 * Starts or resets the internal timer
	 */
	private function resetTimer()
	{
		$this->startTime = $this->microtime_float();
	}

	/**
	 * Makes sure that no more than 3 seconds since the start of the timer have
	 * elapsed
	 * @return bool
	 */
	private function haveEnoughTime()
	{
		$now = $this->microtime_float();
		$elapsed = abs($now - $this->startTime);
		return $elapsed < 2;
	}

	/**
	 * Saves the file/folder stack in the session
	 */
	private function saveStack()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__admintools_storage'))
			->where($db->quoteName('key').' = '.$db->quote('fixperms_stack'));
		$db->setQuery($query);
		$db->execute();
		
		$object = (object)array(
			'key'	=> 'fixperms_stack',
			'value'	=> json_encode(array(
				'folders'	=> $this->folderStack,
				'files'		=> $this->filesStack,
				'total'		=> $this->totalFolders,
				'done'		=> $this->doneFolders
			))
		);
		$db->insertObject('#__admintools_storage', $object);
	}

	/**
	 * Resets the file/folder stack saved in the session
	 */
	private function resetStack()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__admintools_storage'))
			->where($db->quoteName('key').' = '.$db->quote('fixperms_stack'));
		$db->setQuery($query);
		$db->execute();
		
		$this->folderStack = array();
		$this->filesStack = array();
		$this->totalFolders = 0;
		$this->doneFolders = 0;
	}

	/**
	 * Loads the file/folder stack from the session
	 */
	private function loadStack()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select(array($db->quoteName('value')))
			->from($db->quoteName('#__admintools_storage'))
			->where($db->quoteName('key').' = '.$db->quote('fixperms_stack'));
		$db->setQuery($query);
		$stack = $db->loadResult();

		if(empty($stack))
		{
			$this->folderStack = array();
			$this->filesStack = array();
			$this->totalFolders = 0;
			$this->doneFolders = 0;
			return;
		}

		$stack = json_decode($stack, true);

		$this->folderStack = $stack['folders'];
		$this->filesStack = $stack['files'];
		$this->totalFolders = $stack['total'];
		$this->doneFolders = $stack['done'];
	}

	/**
	 * Scans $root for directories and updates $folderStack
	 * @param string $root The full path of the directory to scan
	 */
	public function getDirectories($root = null)
	{
		if(empty($root)) $root = JPATH_ROOT;
		JLoader::import('joomla.filesystem.folder');
		
		if(in_array(rtrim($root,'/'), $this->skipDirs)) return;

		$folders = JFolder::folders($root,'.',false,true);
		$this->totalFolders += count($folders);
		if(!empty($folders)) $this->folderStack = array_merge($this->folderStack, $folders);
	}

	/**
	 * Scans $root for files and updates $filesStack
	 * @param string $root The full path of the directory to scan
	 */
	public function getFiles($root = null)
	{
		if(empty($root)) $root = JPATH_ROOT;

		if(empty($root))
		{
			$root = '..';
			$root = realpath($root);
		}
		
		if(in_array(rtrim($root,'/'), $this->skipDirs)) return;

		$root = rtrim($root,'/').'/';

		JLoader::import('joomla.filesystem.folder');

		$folders = JFolder::files($root,'.',false,true);
		$this->filesStack = array_merge($this->filesStack, $folders);

		$this->totalFolders += count($folders);
	}

	public function startScanning()
	{
		$this->resetStack();
		$this->resetTimer();
		$this->getDirectories();
		$this->getFiles();
		$this->saveStack();

		if(!$this->haveEnoughTime())
		{
			return true;
		}
		else
		{
			return $this->run(false);
		}
	}

	public function chmod($path, $mode)
	{
		if(is_string($mode))
		{
			$mode = octdec($mode);
			if( ($mode <= 0) || ($mode > 0777) ) $mode = 0755;
		}

		// Initialize variables
		JLoader::import('joomla.client.helper');
		$ftpOptions = JClientHelper::getCredentials('ftp');

		// Check to make sure the path valid and clean
		$path = JPath::clean($path);

		if ($ftpOptions['enabled'] == 1) {
			// Connect the FTP client
			JLoader::import('joomla.client.ftp');
			if(version_compare(JVERSION,'3.0','ge')) {
				$ftp = JClientFTP::getInstance(
					$ftpOptions['host'], $ftpOptions['port'], array(),
					$ftpOptions['user'], $ftpOptions['pass']
				);
			} else {
				$ftp = JFTP::getInstance(
					$ftpOptions['host'], $ftpOptions['port'], array(),
					$ftpOptions['user'], $ftpOptions['pass']
				);
			}
		}

		if(@chmod($path, $mode))
		{
			$ret = true;
		} elseif ($ftpOptions['enabled'] == 1) {
			// Translate path and delete
			JLoader::import('joomla.client.ftp');
			$path = JPath::clean(str_replace(JPATH_ROOT, $ftpOptions['root'], $path), '/');
			// FTP connector throws an error
			$ret = $ftp->chmod($path, $mode);
		} else {
			return false;
		}
	}

	public function run($resetTimer = true)
	{
		if($resetTimer) $this->resetTimer();

		$this->loadStack();

		$result = true;
		while($result && $this->haveEnoughTime())
		{
			$result = $this->RealRun();
		}

		$this->saveStack();

		return $result;
	}

	private function RealRun()
	{
		while(empty($this->filesStack) && !empty($this->folderStack))
		{
			// Get a directory
			$dir = null;

			while(empty($dir) && !empty($this->folderStack))
			{
				// Get the next directory
				$dir = array_shift($this->folderStack);
				// Skip over non-directories and symlinks
				if(!@is_dir($dir) || @is_link($dir))
				{
					$dir = null;
					continue;
				}
				// Skip over . and ..
				$checkDir = str_replace('\\','/',$dir);
				if( in_array(basename($checkDir), array('.','..')) || (substr($checkDir,-2) == '/.') || (substr($checkDir,-3) == '/..') )
				{
					$dir = null;
					continue;
				}
				// Check for custom permissions
				$reldir = $this->getRelativePath($dir);
				if(array_key_exists($reldir, $this->customperms)) {
					$perms = $this->customperms[$reldir]['perms'];
				} else {
					$perms = $this->dirperms;
				}

				// Apply new permissions
				$this->chmod($dir, $perms);
				$this->doneFolders++;
				$this->getDirectories($dir);
				$this->getFiles($dir);

				if(!$this->haveEnoughTime())
				{
					// Gotta continue in the next step
					return true;
				}
			}
		}

		if(empty($this->filesStack) && empty($this->folderStack))
		{
			// Just finished
			$this->resetStack();
			return false;
		}

		if(!empty($this->filesStack) && $this->haveEnoughTime())
		{
			while(!empty($this->filesStack))
			{
				$file = array_shift($this->filesStack);

				// Skip over symlinks and non-files
				if(@is_link($file) || !@is_file($file))
				{
					continue;
				}

				$reldir = $this->getRelativePath($file);
				if(array_key_exists($reldir, $this->customperms)) {
					$perms = $this->customperms[$reldir]['perms'];
				} else {
					$perms = $this->fileperms;
				}

				$this->chmod($file, $perms);
				$this->doneFolders++;
			}
		}

		if(empty($this->filesStack) && empty($this->folderStack))
		{
			// Just finished
			$this->resetStack();
			return false;
		}

		return true;
	}

	public function getRelativePath($somepath)
	{
		$path = JPath::clean($somepath,'/');

		// Clean up the root
		$root = JPath::clean(JPATH_ROOT, '/');

		// Find the relative path and get the custom permissions
		$relpath = ltrim(substr($path, strlen($root) ), '/');

		return $relpath;
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit