AnonSec Shell
Server IP : 85.193.89.191  /  Your IP : 18.216.86.171
Web Server : Apache
System : Linux 956367-cx40159.tmweb.ru 3.10.0-1160.105.1.el7.x86_64 #1 SMP Thu Dec 7 15:39:45 UTC 2023 x86_64
User : bitrix ( 600)
PHP Version : 8.1.27
Disable Function : NONE
MySQL : OFF  |  cURL : OFF  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/bitrix/www/bitrix/components/bitrix/socialnetwork.group_copy/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/bitrix/www/bitrix/components/bitrix/socialnetwork.group_copy/class.php
<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

use Bitrix\Blog\Copy\Integration\Group as BlogFeature;
use Bitrix\Disk\Copy\Integration\Group as DiskFeature;
use Bitrix\Landing\Copy\Integration\Group as LandingFeature;
use Bitrix\Lists\Copy\Integration\Group as ListsFeature;
use Bitrix\Main\AccessDeniedException;
use Bitrix\Main\Application;
use Bitrix\Main\ArgumentException;
use Bitrix\Main\Config\Configuration;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Context;
use Bitrix\Main\Engine\Contract\Controllerable;
use Bitrix\Main\Error;
use Bitrix\Main\Errorable;
use Bitrix\Main\ErrorableImplementation;
use Bitrix\Main\ErrorCollection;
use Bitrix\Main\Loader;
use Bitrix\Main\LoaderException;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\SystemException;
use Bitrix\Main\Text\Emoji;
use Bitrix\Photogallery\Copy\Integration\Group as PhotoFeature;
use Bitrix\Socialnetwork\Component\WorkgroupForm;
use Bitrix\Socialnetwork\Copy\GroupManager;
use Bitrix\Socialnetwork\Item\Workgroup;
use Bitrix\Socialnetwork\WorkgroupTable;
use Bitrix\Tasks\Copy\Integration\Group as TasksFeature;

class SocialnetworkGroupCopy extends CBitrixComponent implements Controllerable, Errorable
{
	use ErrorableImplementation;

	public function configureActions()
	{
		return [];
	}

	protected function listKeysSignedParameters()
	{
		return [
			"PATH_TO_GROUP",
		];
	}

	public function onIncludeComponentLang()
	{
		$this->includeComponentLang(basename(__FILE__));
		Loc::loadMessages(__FILE__);
	}

	public function onPrepareComponentParams($params)
	{
		$this->errorCollection = new ErrorCollection();

		$params["GROUP_ID"] = (int) ($params["GROUP_ID"] ?? 0);

		return $params;
	}

	public function executeComponent()
	{
		try
		{
			$this->checkModules();

			if (!$this->isFeatureEnabled())
			{
				$this->includeComponentTemplate('limit');

				return;
			}

			$executiveUserId = $this->getUser()->getID();

			if ($executiveUserId)
			{
				$this->checkAccess($executiveUserId, $this->arParams["GROUP_ID"]);
			}

			$this->arParams["IS_PROJECT"] = $this->isProject($this->arParams["GROUP_ID"]);

			$this->setResult();
			$this->setTitle();

			$this->includeComponentTemplate();
		}
		catch (SystemException $exception)
		{
			ShowError($exception->getMessage());
		}
	}

	public function copyGroupAction()
	{
		$this->checkModules();

		if (!$this->isFeatureEnabled())
		{
			return null;
		}

		$request = Context::getCurrent()->getRequest();
		$post = $request->getPostList()->toArray();

		$this->checkRequiredCreationParams($post);
		if ($this->hasErrors())
		{
			return null;
		}

		$executiveUserId = $this->getUser()->getID();

		$groupId = $post["id"];
		$groupIdsToCopy = [$groupId];

		$this->checkAccess($executiveUserId, $groupId);

		$features = $this->getFeaturesFromRequest($post["features"]);

		$copyManager = new GroupManager($executiveUserId, $groupIdsToCopy);
		$this->setFeatures($copyManager, $executiveUserId, $features, $post);
		$copyManager->setProjectTerm($this->getProjectTerm($post));

		$changedFields = $this->getChangedFields($post);
		$copyManager->setChangedFields($changedFields);

		$result = $copyManager->startCopy();

		if ($result->getErrors())
		{
			$this->errorCollection->set($result->getErrors());
			return null;
		}

		return $this->getUrlToCopiedGroup($copyManager, $groupId);
	}

	private function isFeatureEnabled(): bool
	{
		return \Bitrix\Socialnetwork\Helper\Workgroup::isGroupCopyFeatureEnabled();
	}

	private function setFeatures(GroupManager $copyManager, $executiveUserId, array $features, array $post)
	{
		if (!array_key_exists("users", $features))
		{
			$copyManager->setMarkerUsers(false);
		}
		if (array_key_exists("tasks", $features) && Loader::includeModule("tasks"))
		{
			$copyManager->setFeature(new TasksFeature($executiveUserId, $features["tasks"]));
		}
		if (array_key_exists("files", $features) && Loader::includeModule("disk"))
		{
			$copyManager->setFeature(new DiskFeature($executiveUserId, $features["files"]));
		}
		if (array_key_exists("group_lists", $features) && Loader::includeModule("lists"))
		{
			$features["group_lists"][] = "field";
			$copyManager->setFeature(new ListsFeature($executiveUserId, $features["group_lists"]));
		}
		if (array_key_exists("blog", $features) && Loader::includeModule("blog"))
		{
			$copyManager->setFeature(new BlogFeature($executiveUserId, $features["blog"]));
		}
		if (array_key_exists("photo", $features) && Loader::includeModule("photogallery"))
		{
			$copyManager->setFeature(new PhotoFeature($executiveUserId, $features["photo"]));
		}
		if (array_key_exists("landing_knowledge", $features) && Loader::includeModule("landing"))
		{
			$copyManager->setFeature(new LandingFeature($executiveUserId));
		}

		$ufIgnoreList = $this->getUfIgnoreList($features);

		$copyManager->setUfIgnoreList($ufIgnoreList);
	}

	/**
	 * @throws SystemException
	 */
	private function checkModules()
	{
		try
		{
			if (!Loader::includeModule("socialnetwork"))
			{
				throw new SystemException("Module \"socialnetwork\" not found");
			}
		}
		catch (LoaderException $exception)
		{
			throw new SystemException("System error");
		}
	}

	/**
	 * @param int $userId
	 * @param int $groupId
	 * @throws AccessDeniedException
	 */
	private function checkAccess(int $userId, int $groupId)
	{
		try
		{
			$group = CSocNetGroup::getByID($groupId);
			if ($group && $group['ACTIVE'] === 'Y')
			{
				$currentUserPerms = \Bitrix\Socialnetwork\Helper\Workgroup::getPermissions([
					'userId' => $userId,
					'groupId' => $groupId,
				]);

				if (!$currentUserPerms["UserCanModifyGroup"])
				{
					throw new AccessDeniedException();
				}
			}
			else
			{
				throw new AccessDeniedException();
			}
		}
		catch (Exception $exception)
		{
			throw new AccessDeniedException();
		}
	}

	private function setTitle()
	{
		global $APPLICATION;

		$name = Loc::getMessage("SOCNET_GROUP_COPY_TITLE_BASE");
		if ($this->arParams["GROUP_ID"])
		{
			$name = (
				$this->arParams['IS_PROJECT']
					? Loc::getMessage('SOCNET_GROUP_COPY_TITLE_BASE_PROJECT')
					: Loc::getMessage('SOCNET_GROUP_COPY_TITLE_BASE_GROUP')
			);
		}

		$this->arResult['PageTitle'] = $name;
		$APPLICATION->SetTitle($name);
	}

	private function setResult()
	{
		$this->arResult = [];

		$this->arResult["INTRANET_INSTALLED"] = ModuleManager::isModuleInstalled("intranet");
		$this->arResult["EXTRANET_INSTALLED"] = $this->isExtranetInstalled();
		$this->arResult["EXTRANET"] = ($this->isExtranet() ? "Y" : "N");
		$this->arResult["LANDING_INSTALLED"] = ModuleManager::isModuleInstalled("landing");

		$this->arResult["CURRENT_USER_ID"] = $this->getUser()->getID();
		$this->arResult["GROUP_ID"] = $this->arParams["GROUP_ID"];
		$this->arResult["IS_PROJECT"] = $this->arParams["IS_PROJECT"] ? "Y" : "N";
		$this->arResult["LIST"] = $this->getListToGroupSelector();
		$this->arResult["GROUP"] = $this->getGroupData();
		$this->arResult["IS_EXTRANET_GROUP"] = (($this->arResult["GROUP"]["IS_EXTRANET_GROUP"] == "Y") ? "Y" : "N");
	}

	private function checkRequiredCreationParams($post)
	{
		$fieldName = null;

		if ($post["name"] == '')
		{
			$fieldName = "name";
		}
		if (!intval($post["id"]))
		{
			$fieldName = "groupId";
		}

		if ($fieldName)
		{
			$this->errorCollection->setError(new Error("The \"".$fieldName."\" field is required"));
		}
	}

	private function isProject($groupId)
	{
		$group = Workgroup::getById($groupId);
		return $group->isProject();
	}

	private function getListToGroupSelector()
	{
		$list = [];

		if ($this->arParams["GROUP_ID"])
		{
			$list[] = "SG".$this->arParams["GROUP_ID"];
		}

		return $list;
	}

	private function getUser()
	{
		global $USER;
		return $USER;
	}

	private function getFeatures($groupId)
	{
		$whiteList = [
			"tasks" => [
				"checklists" => [
					"Title" => $this->getFeatureTitle("checklists"),
					"Name" => "checklists",
				],
				"comments" => [
					"Title" => $this->getFeatureTitle("comments"),
					"Name" => "comments",
				],
				"robots" => [
					"Title" => $this->getFeatureTitle("robots"),
					"Name" => "robots",
				]
			],
			"files" => [
				"onlyFolders" => [
					"Title" => $this->getFeatureTitle("only_Folders"),
					"Name" => "onlyFolders",
					"Checked" => false
				]
			],
			"group_lists" => [
				"section" => [
					"Title" => $this->getFeatureTitle("section"),
					"Name" => "section",
				],
				"element" => [
					"Title" => $this->getFeatureTitle("element"),
					"Name" => "element",
				],
				"workflow" => [
					"Title" => $this->getFeatureTitle("workflow"),
					"Name" => "workflow",
				]
			],
			"blog" => [
				"comments" => [
					"Title" => $this->getFeatureTitle("comments"),
					"Name" => "comments",
				],
				/*"voteResult" => [
					"Title" => $this->getFeatureTitle("vote_result"),
					"Name" => "voteResult",
					"Checked" => false
				]*/
			],
			"photo" => [],
			"landing_knowledge" => [],
		];

		$group = Workgroup::getById($groupId);
		if ($group && $group->isScrumProject())
		{
			unset($whiteList['tasks']);
		}

		$features = [];
		WorkgroupForm::processWorkgroupFeatures($groupId, $features);

		$result = [
			"users" => [
				"Active" => true,
				"Title" => $this->getFeatureTitle("users"),
				"Name" => "users",
				"Children" => [
					"departments" => [
						"Title" => $this->getFeatureTitle("departments"),
						"Name" => "departments",
					]
				]
			]
		];
		foreach ($features as $featureId => $feature)
		{
			if (array_key_exists($featureId, $whiteList) && !empty($feature["Active"]))
			{
				$feature["Title"] = $this->getFeatureTitle($featureId);
				$feature["Name"] = $featureId;
				$feature["Children"] = $whiteList[$featureId];
				$result[$featureId] = $feature;
			}
		}

		return $result;
	}

	private function getFeatureTitle($featureId)
	{
		$featureId = mb_strtoupper($featureId);
		if (
			$featureId === 'BLOG'
			&& ModuleManager::isModuleInstalled('intranet')
		)
		{
			$featureId = 'BLOG2';
		}
		return Loc::getMessage("SOCNET_GROUP_COPY_FEATURE_".$featureId);
	}

	private function getFeaturesFromRequest(array $features)
	{
		$featuresToCopy = [];

		foreach ($features as $featureId => $feature)
		{
			if (isset($feature["active"]) && $feature["active"] == "Y")
			{
				unset($feature["active"]);

				$featuresToCopy[$featureId] = [];

				foreach ($feature as $featureName => $marker)
				{
					if ($marker == "Y")
					{
						$featuresToCopy[$featureId][] = $featureName;
					}
				}
			}
		}

		return $featuresToCopy;
	}

	private function getExceptionErrorMessage(\Exception $exception)
	{
		$message = $exception->getMessage();
		if (is_array($message))
		{
			if (array_key_exists("message", $message))
			{
				$message = $message["message"];
			}
			else
			{
				$message = "System error";
			}
		}
		return $message;
	}

	private function getUrlToCopiedGroup(GroupManager $copyManager, int $groupId): string
	{
		$mapIdsCopiedGroups = $copyManager->getMapIdsCopiedGroups();

		$copiedGroupId = 0;
		if (array_key_exists($groupId, $mapIdsCopiedGroups))
		{
			$copiedGroupId = $mapIdsCopiedGroups[$groupId];
		}

		return CComponentEngine::makePathFromTemplate($this->arParams["PATH_TO_GROUP"], ["group_id" => $copiedGroupId]);
	}

	private function getUfIgnoreList(array $features)
	{
		$ufIgnoreList = [
			"UF_SG_DEPT"
		];

		if (!empty($features["users"]) && in_array("departments", $features["users"]))
		{
			$currentPos = array_search("UF_SG_DEPT", $ufIgnoreList);
			if ($currentPos !== false)
			{
				unset($ufIgnoreList[$currentPos]);
			}
		}

		return $ufIgnoreList;
	}

	private function setErrors(Exception $exception)
	{
		if ($message = $this->getExceptionErrorMessage($exception))
		{
			$this->errorCollection->setError(new Error($message, $exception->getCode()));
		}
		else
		{
			$this->errorCollection->setError(new Error("System error", $exception->getCode()));
		}
		return null;
	}

	private function getGroupData()
	{
		$groupData = [
			"ID" => $this->arResult["GROUP_ID"],
			"GROUP_PROPERTIES" => [],
			"SUBJECTS" => [],
			"SPAM_PERMS" => [],
			"MODERATOR_IDS" => []
		];

		WorkgroupForm::processWorkgroupData($groupData["ID"], $groupData["GROUP_PROPERTIES"], $groupData, "edit");

		$groupData["SUBJECTS"] = $this->getSubjects();

		$groupData["LIST_INITIATE_PERMS"] = $this->getInitiatePerms();

		$groupData["SPAM_PERMS"] = $this->getSpamPerms();

		$groupData["FEATURES"] = $this->getFeatures($this->arResult["GROUP_ID"]);

		return $groupData;
	}

	private function getSubjects()
	{
		$subjects = [];
		$queryObject = CSocNetGroupSubject::getList(
			["SORT"=>"ASC", "NAME" => "ASC"],
			["SITE_ID" => $this->getSiteId()],
			false,
			false,
			["ID", "NAME"]
		);
		while ($subject = $queryObject->getNext())
		{
			$subjects[$subject["ID"]] = $subject["NAME"];
		}

		return $subjects;
	}

	private function getInitiatePerms(): array
	{
		return [
			"group" => Workgroup::getInitiatePermOptionsList(),
			"project" => Workgroup::getInitiatePermOptionsList(["project" => true])
		];
	}

	private function getSpamPerms(): array
	{
		return Workgroup::getSpamPermOptionsList();
	}

	private function isExtranet()
	{
		return (
			$this->isExtranetInstalled() &&
			Loader::includeModule("extranet") &&
			CExtranet::isExtranetSite()
		);
	}

	private function isExtranetInstalled(): bool
	{
		return (
			ModuleManager::isModuleInstalled("intranet") &&
			ModuleManager::isModuleInstalled("extranet") &&
			!empty(Option::get("extranet", "extranet_site"))
		);
	}

	private function getChangedFields(array $post)
	{
		//todo check $post isset keys

		$changedFields = [
			"NAME" => $post["name"],
			"DESCRIPTION" => $post["description"],
			"VISIBLE" => ($post["visible"] == "Y" ? "Y" : "N"),
			"OPENED" => ($post["opened"] == "Y" ? "Y" : "N"),
			"CLOSED" => ($post["closed"] == "Y" ? "Y" : "N"),
			"IS_EXTRANET_GROUP" => ($post["extranet_group"] == "Y" ? "Y" : "N"),
			"SUBJECT_ID" => $post["subject_id"],
			"KEYWORDS" => $post["keywords"],
			"INITIATE_PERMS" => $post["initiate_perms"],
			"SPAM_PERMS" => $post["spam_perms"] ?? null,
			"PROJECT" => ($post["project"] == "Y" ? "Y" : "N"),
			"LANDING" => ($post["landing"] == "Y" ? "Y" : "N"),
			"OWNER_ID" => $post["owner_id"],
			"MODERATORS" => $post["moderators"] ?? null,
			"IMAGE_ID" => null,
		];

		if(Configuration::getValue("utf_mode") === true)
		{
			$connection = Application::getConnection();
			$table = WorkgroupTable::getTableName();

			if ($changedFields["NAME"] <> "")
			{
				if (!$connection->isUtf8mb4($table, "NAME"))
				{
					$changedFields["NAME"] = Emoji::encode($changedFields["NAME"]);
				}
			}

			if ($changedFields["DESCRIPTION"] <> "")
			{
				if (!$connection->isUtf8mb4($table, "DESCRIPTION"))
				{
					$changedFields["DESCRIPTION"] = Emoji::encode($changedFields["DESCRIPTION"]);
				}
			}
		}

		if ($post["image_id"])
		{
			$imageId = CFile::makeFileArray($post["image_id"]);
			//$arImageID["old_file"] = $arResult["POST"]["IMAGE_ID"]; todo
			$imageId["del"] = "N";
			CFile::ResizeImage($imageId, array("width" => 300, "height" => 300), BX_RESIZE_IMAGE_PROPORTIONAL);
			$changedFields["IMAGE_ID"] = $imageId;
		}

		if ($this->isExtranet())
		{
			$siteIds = [];
			$queryObject = WorkgroupTable::getList([
				"filter" => [
					"GROUP_ID" => $post["id"]
				],
				"select" => ["SITE_ID"]
			]);
			while ($fields = $queryObject->fetch())
			{
				$siteIds[] = $fields["SITE_ID"];
			}
			$siteIds[] = $this->getSiteId();

			$siteIds = array_unique($siteIds);
			if (!empty($siteIds))
			{
				$changedFields["SITE_ID"] = $siteIds;
			}
		}
		else
		{
			$changedFields["SITE_ID"] = [$this->getSiteId()];
			if (
				Loader::includeModule("extranet") &&
				!CExtranet::isExtranetSite() &&
				($post["is_extranet_group"] ?? null) == "Y"
			)
			{
				$changedFields["SITE_ID"][] = CExtranet::getExtranetSiteID();
				$changedFields["VISIBLE"] = "N";
				$changedFields["OPENED"] = "N";
			}
		}

		return $changedFields;
	}

	/**
	 * @param array $post
	 * @return array|mixed
	 * @throws ArgumentException
	 */
	private function getProjectTerm(array $post)
	{
		$projectTerm = [
			"project" => ($post["project"] == "Y")
		];
		if (!empty($post["start_point"]))
		{
			if (!$this->checkDateFormat($post["start_point"]))
			{
				throw new ArgumentException(Loc::getMessage("SOCNET_GROUP_COPY_DATE_FORMAT_ERROR"));
			}
			$projectTerm["start_point"] = $post["start_point"];
			return $projectTerm;
		}
		else
		{
			if (
				!$this->checkDateFormat($post["project_term"]["start_point"]) ||
				(!empty($post["project_term"]["end_point"]) &&
					!$this->checkDateFormat($post["project_term"]["end_point"])))
			{
				throw new ArgumentException(Loc::getMessage("SOCNET_GROUP_COPY_DATE_FORMAT_ERROR"));
			}
			$projectTerm = array_merge($projectTerm, $post["project_term"]);
			return $projectTerm;
		}
	}

	private function checkDateFormat($date)
	{
		$phpDateFormat = Bitrix\Main\Type\DateTime::convertFormatToPhp(FORMAT_DATE);
		return Bitrix\Main\Type\DateTime::isCorrect($date, $phpDateFormat);
	}
}

Anon7 - 2022
AnonSec Team