403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/components/bitrix/socialnetwork.spaces/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/components/bitrix/socialnetwork.spaces/class.php
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

use Bitrix\Disk\Driver;
use Bitrix\Disk\Internals\Grid\FolderListOptions;
use Bitrix\Disk\Internals\Grid\TrashCanOptions;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Context;
use Bitrix\Main\Loader;
use Bitrix\Main\Engine\Contract\Controllerable;
use Bitrix\Main\Error;
use Bitrix\Main\Errorable;
use Bitrix\Main\ErrorCollection;
use Bitrix\Main\Localization\Loc;
use Bitrix\Socialnetwork\Item\Workgroup;
use Bitrix\Socialnetwork\Space\List\SpaceListMode;

class SpacesComponent extends CBitrixComponent implements Controllerable, Errorable
{
	private $application;
	private ErrorCollection $errorCollection;

	public function __construct($component = null)
	{
		parent::__construct($component);
		$this->init();
	}

	public function configureActions(): array
	{
		return [];
	}

	public function getErrors(): array
	{
		return $this->errorCollection->toArray();
	}

	public function getErrorByCode($code): ?Error
	{
		return $this->errorCollection->getErrorByCode($code);
	}

	public function onIncludeComponentLang()
	{
		$this->includeComponentLang(basename(__FILE__));

		Loc::loadMessages(__FILE__);
	}

	public function onPrepareComponentParams($params)
	{
		$params['SEF_MODE'] = 'Y';
		$params['SEF_FOLDER'] = $params['SEF_FOLDER'] ?? '/spaces/';
		$params['USER_SEF_FOLDER'] = $this->getUserSefFolder();
		$params['GROUP_SEF_FOLDER'] = $this->getGroupSefFolder();

		if (
			!isset($params['VARIABLE_ALIASES'])
			|| !is_array($params['VARIABLE_ALIASES'])
		)
		{
			$params['VARIABLE_ALIASES'] = [];
		}

		return $params;
	}

	public function executeComponent()
	{
		if (!\Bitrix\Socialnetwork\Space\Service::isAvailable())
		{
			ShowError('Functionality not available.');

			return;
		}

		$this->application->setTitle(Loc::getMessage('SN_SPACES_TITLE'));

		$defaultUrlTemplates404 = $this->prepareDefaultUrlTemplates(
			$this->arParams['USER_SEF_FOLDER'],
			$this->arParams['GROUP_SEF_FOLDER'],
		);

		$variables = [];
		$defaultVariableAliases404 = [];
		$componentVariables = $this->getComponentVariables();

		$engine = new CComponentEngine($this);

		if ($this->isDiskEnabled())
		{
			$engine->addGreedyPart('#PATH#');
			$engine->addGreedyPart('#FILE_PATH#');
			$engine->addGreedyPart('#TRASH_PATH#');
			$engine->addGreedyPart('#TRASH_FILE_PATH#');
			$engine->setResolveCallback([
				Driver::getInstance()->getUrlManager(),
				'resolveSocNetPathComponentEngine',
			]);
		}

		$urlTemplates = CComponentEngine::makeComponentUrlTemplates(
			$defaultUrlTemplates404,
			[]
		);
		$variableAliases = CComponentEngine::makeComponentVariableAliases(
			$defaultVariableAliases404,
			$this->arParams['VARIABLE_ALIASES']
		);

		$componentPage = $engine->guessComponentPath(
			$this->arParams['SEF_FOLDER'],
			$urlTemplates,
			$variables,
		);

		$groupId = (int) ($variables['group_id'] ?? 0);
		$userId = (int) ($variables['user_id'] ?? 0);

		if ($componentPage === 'group')
		{
			$group = Workgroup::getById($groupId);
			$isScrum = $group && $group->isScrumProject();
			$componentPage = $isScrum ? 'group_discussions' : 'group_discussions';
		}

		if ($componentPage === 'index')
		{
			$componentPage = 'user_discussions';
		}

		CComponentEngine::initComponentVariables(
			$componentPage,
			$componentVariables,
			$variableAliases,
			$variables
		);

		$this->arResult = $this->prepareResult(
			$variables,
			$variableAliases,
			$urlTemplates
		);

		$pageType = $this->getPageType($componentPage);

		$this->arResult['pageView'] = $this->getPageView(
			$pageType,
			$userId,
			$groupId,
			[
				'isTrashMode' => str_contains($componentPage, 'trashcan'),
				'viewMode' => Context::getCurrent()->getRequest()->get('viewMode'),
				'viewSize' => Context::getCurrent()->getRequest()->get('viewSize'),
			],
		);

		$isFrame = (Context::getCurrent()->getRequest()->get('IFRAME') === 'Y');
		if ($isFrame)
		{
			$this->application->restartBuffer();
		}

		$siteTemplateId = (defined('SITE_TEMPLATE_ID') ? SITE_TEMPLATE_ID  : 'def');
		if (
			Loader::includeModule('intranet')
			&& ($siteTemplateId === 'bitrix24' || $siteTemplateId === 'air')
		)
		{
			$this->arResult['SHOW_BITRIX24_THEME'] = 'Y';
		}
		else
		{
			$this->arResult['SHOW_BITRIX24_THEME'] = 'N';
		}

		$this->checkFeaturesAccess($groupId, $componentPage);

		$this->includeComponentTemplate($componentPage);

		if ($isFrame)
		{
			\Bitrix\Socialnetwork\Internals\Space\LiveWatch\LiveWatchService::getInstance()->setUserAsWatchingNow(
				\Bitrix\Socialnetwork\Helper\User::getCurrentUserId()
			);

			require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php');

			exit;
		}
	}

	public function getPageViewAction(
		string $pageType,
		int $userId,
		int $groupId,
		array $params,
	): string
	{
		return $this->getPageView(
			$pageType,
			$userId,
			$groupId,
			[
				'isTrashMode' => ($params['isTrashMode'] ?? null) === true,
				'viewMode' => ($params['viewMode'] ?? null) ? $params['viewMode'] : '',
				'viewSize' => ($params['viewSize'] ?? null) ? $params['viewSize'] : '',
			],
		);
	}

	private function prepareDefaultUrlTemplates(
		string $userSefFolder,
		string $groupSefFolder
	): array
	{
		$urls = [
			'index' => 'index.php',

			'user_discussions' => 'discussions/',

			'user_tasks' => 'tasks/',

			'user_calendar' => 'calendar/',

			'group' => 'group/#group_id#/',
			'group_discussions' => 'group/#group_id#/general/',

			'group_tasks' => 'group/#group_id#/tasks/',
			'group_tasks_task' => 'group/#group_id#/tasks/task/#action#/#task_id#/',
			'group_tasks_view' => 'group/#group_id#/tasks/view/#action#/#view_id#/',
			'group_tasks_report' => 'group/#group_id#/tasks/report/',

			'group_calendar' => 'group/#group_id#/calendar/',

			'group_photo_section' => 'group/#group_id#/photo/album/#section_id#/',

			'scrum_team_speed' => $groupSefFolder . 'group/#group_id#/scrum/team_speed/',
			'scrum_burn_down' => $groupSefFolder . 'group/#group_id#/scrum/burn_down/#sprint_id#/',

			'group_features' => 'group/#group_id#/features/',
			'group_users' => 'group/#group_id#/users/',
			'group_invite' => 'group/#group_id#/invite/',
		];

		if ($this->isDiskEnabled())
		{
			$urls['spaces_user_files'] = 'files/user/#user_id#/';
			$urls['user_files'] = 'files/user/#user_id#/disk/path/#PATH#';
			$urls['user_files_file'] = 'files/user/#user_id#/disk/file/#FILE_PATH#';
			$urls['user_files_file_history'] = 'files/user/#user_id#/disk/file-history/#FILE_ID#';
			$urls['user_files_trashcan_list'] = 'files/user/#user_id#/disk/trashcan/#TRASH_PATH#';
			$urls['user_files_trashcan_file_view'] = 'files/user/#user_id#/disk/trash/file/#TRASH_FILE_PATH#';
			$urls["user_files_external_link_list"] = 'user/#user_id#/disk/external';
			$urls["user_files_volume"] = $userSefFolder . 'user/#user_id#/disk/volume/#ACTION#';

			$urls['group_files'] = 'group/#group_id#/disk/path/#PATH#';
			$urls['group_files_file'] = 'group/#group_id#/disk/file/#FILE_PATH#';
			$urls['group_files_file_history'] = 'group/#group_id#/disk/file-history/#FILE_ID#';
			$urls['group_files_trashcan_list'] = 'group/#group_id#/disk/trashcan/#TRASH_PATH#';
			$urls['group_files_trashcan_file_view'] = 'group/#group_id#/disk/trash/file/#TRASH_FILE_PATH#';
			$urls['group_files_bizproc_workflow_admin'] = $groupSefFolder . 'group/#group_id#/disk/bp/';
			$urls['group_disk_bizproc_workflow_edit'] = $groupSefFolder . 'group/#group_id#/disk/bp_edit/#ID#/';
			$urls['group_files_start_bizproc'] = $groupSefFolder . 'group/#group_id#/disk/bp_start/#ELEMENT_ID#/';
			$urls['group_files_task'] = 'group/#group_id#/disk/bp_task/#ID#/';
			$urls['group_files_task_list'] = 'group/#group_id#/disk/bp_task_list/';
		}

		return $urls;
	}

	private function prepareResult(
		array $variables,
		array $variableAliases,
		array $urlTemplates
	): array
	{
		$urls = $this->prepareUrls(
			$this->arParams['SEF_FOLDER'],
			$this->arParams['USER_SEF_FOLDER'],
			$urlTemplates
		);

		$result = [
			'VARIABLES' => $variables,
			'ALIASES' => $variableAliases,
		];

		$result = array_merge($result, $urls);

		$result['NAME_TEMPLATE'] = CSite::getNameFormat();
		$result['DATE_TIME_FORMAT'] = CIntranetUtils::getCurrentDateTimeFormat();
		$result['DATE_TIME_FORMAT_WITHOUT_YEAR'] = CIntranetUtils::getCurrentDateTimeFormat(
			['woYear' => true]
		);

		$result['IS_LIST_DEPLOYED'] = $this->getListMode();

		return $result;
	}

	private function prepareUrls(
		string $sefFolder,
		string $userSefFolder,
		array $urlTemplates
	): array
	{
		$urls = [];

		foreach ($urlTemplates as $url => $value)
		{
			$urls['PATH_TO_' . mb_strtoupper($url)] = (
				(mb_substr($value, 0, 1) === '/') ? $value : $sefFolder . $value
			);
		}

		$urls['PATH_TO_USER'] = $userSefFolder . 'user/#user_id#/';

		$urls['PATH_TO_MESSAGES_CHAT'] = $userSefFolder . 'messages/chat/#user_id#/';
		$urls['PATH_TO_USER_BLOG_POST_IMPORTANT'] = $userSefFolder . 'user/#user_id#/blog/important/';
		$urls['PATH_TO_SEARCH_TAG'] = isModuleInstalled('search') ? SITE_DIR . 'search/?tags=#tag#' : '';
		$urls['PATH_TO_VIDEO_CALL'] = '';
		$urls['PATH_TO_COMPANY_DEPARTMENT'] = (
			isModuleInstalled('intranet')
				? '/company/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=#ID#'
				: ''
		);

		$urls['PATH_TO_USER_TASKS_TASK'] = $userSefFolder . 'user/#user_id#/tasks/task/#action#/#task_id#/';
		$urls['PATH_TO_USER_TASKS_VIEW'] = $userSefFolder . 'user/#user_id#/tasks/view/#action#/#view_id#/';
		$urls['PATH_TO_USER_TASKS_REPORT'] = $userSefFolder . 'user/#user_id#/tasks/report/';
		$urls['PATH_TO_USER_TASKS_TEMPLATES'] = $userSefFolder . 'user/#user_id#/tasks/templates/';
		$urls['PATH_TO_USER_TEMPLATES_TEMPLATE'] = $userSefFolder
			. 'user/#user_id#/tasks/templates/template/#action#/#template_id#/'
		;

		return $urls;
	}

	private function getComponentVariables(): array
	{
		return [
			'user_id',
			'group_id',
			'page',
			'message_id',
			'subject_id',
			'path',
			'section_id',
			'element_id',
			'action',
			'post_id',
			'category',
			'topic_id',
			'task_id',
			'view_id',
			'type',
			'report_id',
			'placement_id',
			'sprint_id',
		];
	}

	private function getUserSefFolder(): string
	{
		return Option::get(
			'socialnetwork',
			'user_page',
			(
				IsModuleInstalled('extranet')
				&& $this->getSiteId() == Option::get('extranet', 'extranet_site')
					? '/extranet/contacts/personal/'
					: '/company/personal/'
			),
			$this->getSiteId()
		);
	}

	private function getGroupSefFolder(): string
	{
		return Option::get(
			'socialnetwork',
			'workgroups_page',
			(
				IsModuleInstalled('extranet')
				&& $this->getSiteId() == Option::get('extranet', 'extranet_site')
					? '/extranet/workgroups/'
					: 'workgroups/'
			),
			$this->getSiteId()
		);
	}

	private function isDiskEnabled(): bool
	{
		return (
			Option::get('disk', 'successfully_converted', false)
			&& Loader::includeModule('disk')
		);
	}

	private function getListMode(): string
	{
		return SpaceListMode::getOption();
	}

	private function init(): void
	{
		Loader::includeModule('socialnetwork');

		global $APPLICATION;
		$this->application = $APPLICATION;

		$this->errorCollection = new ErrorCollection();
	}

	private function checkFeaturesAccess(int $groupId, string $componentPage)
	{
		$this->arResult['spaceNotFoundOrCantSee'] = false;

		$feature = null;

		$tasksPages = [
			'group_tasks',
			'group_tasks_task',
		];
		if (in_array($componentPage, $tasksPages, true))
		{
			$feature = 'tasks';
		}

		$calendarPages = [
			'group_calendar',
		];
		if (in_array($componentPage, $calendarPages, true))
		{
			$feature = 'calendar';
		}

		$filePages = [
			'group_files',
			'group_files_file',
			'group_files_file_history',
			'group_files_trashcan_list',
			'group_files_trashcan_file_view',
		];
		if (in_array($componentPage, $filePages, true))
		{
			$feature = 'files';
		}

		if ($feature)
		{
			$this->arResult['spaceNotFoundOrCantSee'] = (
				!CSocNetFeatures::isActiveFeature(SONET_ENTITY_GROUP, $groupId, $feature)
			);
		}
	}

	private function getPageView(
		string $pageType,
		int $userId,
		int $groupId,
		array $params,
	): string
	{
		$isTrashMode = ($params['isTrashMode'] ?? null) === true;
		$viewMode = ($params['viewMode'] ?? null) ? $params['viewMode'] : '';
		$viewSize = ($params['viewSize'] ?? null) ? $params['viewSize'] : '';

		return match ($pageType)
		{
			'discussions' => 'discussions',
			'tasks' => $this->getTasksPageView($userId, $groupId, $viewMode),
			'calendar' => $this->getCalendarPageView(),
			'files' => $this->getFilesPageView($userId, $groupId, $isTrashMode, $viewMode, $viewSize),
			default => '',
		};
	}

	private function getPageType(string $componentPage): string
	{
		if (str_contains($componentPage, 'discussions'))
		{
			return 'discussions';
		}
		else if (str_contains($componentPage, 'tasks'))
		{
			return 'tasks';
		}
		else if (str_contains($componentPage, 'calendar'))
		{
			return 'calendar';
		}
		else if (str_contains($componentPage, 'files'))
		{
			return 'files';
		}
		else
		{
			return '';
		}
	}

	private function getTasksPageView(int $userId, int $groupId, string $viewMode = ''): string
	{
		if (!Loader::includeModule('tasks'))
		{
			return '';
		}

		if ($groupId)
		{
			\Bitrix\Tasks\Ui\Filter\Task::setGroupId($groupId);

			$group = \Bitrix\Socialnetwork\Item\Workgroup::getById($groupId);
			$isScrum = $group && $group->isScrumProject();
			if ($isScrum)
			{
				if (!$viewMode)
				{
					$viewHelper = new \Bitrix\Tasks\Scrum\Utility\ViewHelper($this->getSiteId());

					$viewMode = $viewHelper->getActiveView($groupId);
				}

				$scrumView = match ($viewMode)
				{
					'active_sprint' => 'active',
					'completed_sprint' => 'complete',
					default => 'plan',
				};

				$pageView = 'tasks-scrum-' . $scrumView;
				if ($scrumView === 'plan')
				{
					$displayPriority = \CUserOptions::getOption(
						'tasks.scrum.' . $groupId,
						'display_priority',
						'sprint'
					);

					$pageView .= '-' . $displayPriority;
				}

				return $pageView;
			}
		}
		else if($userId)
		{
			\Bitrix\Tasks\Ui\Filter\Task::setUserId($userId);
		}

		$state = \Bitrix\Tasks\Ui\Filter\Task::listStateInit()->getState();

		switch ($state['VIEW_SELECTED']['CODENAME'])
		{
			case 'VIEW_MODE_GANTT':
				return 'tasks-gantt';
			case 'VIEW_MODE_PLAN':
				return 'tasks-plan';
			case 'VIEW_MODE_KANBAN':
				return 'tasks-kanban';
			case 'VIEW_MODE_TIMELINE':
				return 'tasks-timeline';
			case 'VIEW_MODE_CALENDAR':
				return 'tasks-calendar';
			default:
				return 'tasks-list';
		}
	}

	private function getCalendarPageView(): string
	{
		if (!Loader::includeModule('calendar'))
		{
			return '';
		}

		$view = \Bitrix\Calendar\UserSettings::get()['view'];

		if ($view === 'day' || $view === 'list')
		{
			return 'calendar-schedule';
		}
		else
		{
			return 'calendar-base';
		}
	}

	private function getFilesPageView(
		int $userId,
		int $groupId,
		bool $isTrashMode,
		string $viewMode = '',
		string $viewSize = '',
	): string
	{
		if (!Loader::includeModule('disk'))
		{
			return '';
		}

		if ($viewMode)
		{
			if ($viewMode === FolderListOptions::VIEW_MODE_TILE)
			{
				$availableSizes = [
					FolderListOptions::VIEW_TILE_SIZE_M,
					FolderListOptions::VIEW_TILE_SIZE_XL,
				];
				$viewSize = in_array($viewSize, $availableSizes) ? $viewSize : FolderListOptions::VIEW_TILE_SIZE_M;

				return 'files-tile-' . $viewSize;
			}
			else
			{
				return 'files-list';
			}
		}

		if ($groupId)
		{
			$storage = Driver::getInstance()->getStorageByGroupId($groupId);
		}
		else
		{
			$storage = Driver::getInstance()->getStorageByUserId($userId);
		}

		if ($isTrashMode)
		{
			$options = new TrashCanOptions($storage);
		}
		else
		{
			$options = new FolderListOptions($storage);
		}

		if ($options->getViewMode() === FolderListOptions::VIEW_MODE_TILE)
		{
			return 'files-tile-' . $options->getViewSize();
		}
		else
		{
			return 'files-list';
		}
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit