uawdijnntqw1x1x1
IP : 18.218.8.36
Hostname : axolotl
Kernel : Linux axolotl 4.9.0-13-amd64 #1 SMP Debian 4.9.228-1 (2020-07-05) x86_64
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
OS : Linux
PATH:
/
var
/
www
/
axolotl
/
data
/
www
/
yar.axolotls.ru
/
bitrix
/
modules
/
webdav
/
classes
/
symlinkhelper.php
/
/
<?php IncludeModuleLangFile(__FILE__); final class CWebDavSymlinkHelper { const ENTITY_TYPE_USER = 'user'; const ENTITY_TYPE_GROUP = 'group'; const ENTITY_TYPE_SECTION = 'section'; const ENTITY_TYPE_SHARED = 'shared'; /** @var array */ protected static $_pathPattern; protected $_entityId; protected $_entityType; protected static $_rootSectionGarbage = array(); private static $_cacheDataSectionIblockId = array(); private static $_sectionOriginalNames = array(); public function __construct() { } /** * @param integer $sectionId * @param string $name */ public static function setSectionOriginalName($sectionId, $name) { self::$_sectionOriginalNames[$sectionId] = $name; } /** * @param integer $sectionId * @param string $defaultName * @return string */ public static function getSectionOriginalName($sectionId, $defaultName) { return isset(self::$_sectionOriginalNames[$sectionId])? self::$_sectionOriginalNames[$sectionId] : $defaultName; } /** * @param int $groupId * @param array $targetSectionData * @return bool */ public static function generateNameForGroupLink($groupId, array $targetSectionData) { if(!CModule::IncludeModule('socialnetwork')) { return false; } $query = CSocNetGroup::getList(array(), array('ID' => $groupId), false, false, array('NAME')); if(!$query) { return false; } $group = $query->fetch(); if(empty($group['NAME'])) { return false; } $group['NAME'] = GetMessage('WD_SYMLINK_TEMPLATE_NAME', array('#NAME#' => $group['NAME'])); return CWebDavTools::regenerateNameIfNonUnique($group['NAME'], $targetSectionData['IBLOCK_ID'], $targetSectionData['SECTION_ID']); } /** * @param int $sectionId * @param array $targetSectionData * @return bool|string */ public static function generateNameForUserSectionLink($sectionId, array $targetSectionData) { $section = CIBlockSection::getList( array(), array('ID' => $sectionId, 'CHECK_PERMISSIONS' => 'N',), false, array('NAME',) )->fetch(); if(empty($section['NAME'])) { return false; } $section['NAME'] = GetMessage('WD_SYMLINK_TEMPLATE_NAME', array('#NAME#' => $section['NAME'])); return CWebDavTools::regenerateNameIfNonUnique($section['NAME'], $targetSectionData['IBLOCK_ID'], $targetSectionData['SECTION_ID']); } public function setContextToUser() { return $this->setEntityType(self::ENTITY_TYPE_USER); } public function setContextToGroup() { return $this->setEntityType(self::ENTITY_TYPE_GROUP); } public function setContextToShared() { return $this->setEntityType(self::ENTITY_TYPE_SHARED); } public function setContextToSection() { return $this->setEntityType(self::ENTITY_TYPE_SECTION); } /** * @param mixed $entityId * @return $this */ public function setEntityId($entityId) { $this->_entityId = $entityId; return $this; } /** * @return mixed */ public function getEntityId() { return $this->_entityId; } /** * @param string $entityType * @return $this */ public function setEntityType($entityType) { $this->_entityType = $entityType; return $this; } /** * @return string */ public function getEntityType() { return $this->_entityType; } public static function addRootSectionData($entityType, $entityId, $data) { empty(self::$_rootSectionGarbage[$entityType]) && (self::$_rootSectionGarbage[$entityType] = array()); self::$_rootSectionGarbage[$entityType][$entityId] = $data; } public static function getRootSectionData($entityType, $entityId) { if(isset(self::$_rootSectionGarbage[$entityType][$entityId])) { return self::$_rootSectionGarbage[$entityType][$entityId]; } return array(); } public static function getLinkData($entityType, $entityId, $sectionData) { $chain = self::getNavChain($sectionData['IBLOCK_ID'], $sectionData['ID']); $sectionIds = array(); foreach ($chain as $item) { $sectionIds[] = $item['ID']; } unset($item); //hack. Now we have symlink only in user library. And then entityType ~equals to user if($entityType == self::ENTITY_TYPE_USER) { $userLib = CWebDavIblock::LibOptions('user_files', false, SITE_ID); if ($userLib && isset($userLib['id']) && ($iblockId = intval($userLib['id']))) { $rootSection = self::getRootSectionData($entityType, $entityId); if(empty($rootSection)) { $rootSection = CWebDavIblock::getRootSectionDataForUser($entityId); if(empty($rootSection)) { return array(); } $margins = CIBlockSection::GetList(array(), array( 'ID' => $rootSection['SECTION_ID'], 'IBLOCK_ID' => $rootSection['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N', ), false, array('LEFT_MARGIN', 'RIGHT_MARGIN', 'IBLOCK_ID')); if(!$margins) { return array(); } $rootSection = $margins->fetch(); self::addRootSectionData($entityType, $entityId, $rootSection); } $symlinkSection = CIBlockSection::getList( array(), array( 'IBLOCK_ID' => $iblockId, CWebDavIblock::UF_LINK_SECTION_ID => $sectionIds, 'CHECK_PERMISSIONS' => 'N', '>LEFT_BORDER' => $rootSection['LEFT_MARGIN'], '<RIGHT_BORDER' => $rootSection['RIGHT_MARGIN'], ), false, CWebDavIblock::getUFNamesForSectionLink() ); if(!$symlinkSection || !($symlinkSection = $symlinkSection->fetch())) { return array(); } return $symlinkSection; } } elseif($entityType == self::ENTITY_TYPE_GROUP) { return array(); } elseif($entityType == self::ENTITY_TYPE_SECTION) //or any another context { return array(); } elseif($entityType == self::ENTITY_TYPE_SHARED) { return array(); } } public static function getLinkDataOfElement($entityType, $entityId, $elementId) { $parentData = self::getParentDataForElementId($elementId); $parentData['ID'] = $parentData['IBLOCK_SECTION_ID']; return self::getLinkData($entityType, $entityId, $parentData); } public static function isLinkElement($entityType, $entityId, $elementId) { $parentData = self::getParentDataForElementId($elementId); $parentData['ID'] = $parentData['IBLOCK_SECTION_ID']; unset($parentData['IBLOCK_SECTION_ID']); return self::isLink($entityType, $entityId, $parentData); } public static function isLink($entityType, $entityId, $sectionData) { if($entityType == self::ENTITY_TYPE_USER) { $userLib = CWebDavIblock::LibOptions('user_files', false, SITE_ID); if ($userLib && isset($userLib['id']) && ($iblockId = intval($userLib['id']))) { if($iblockId != $sectionData['IBLOCK_ID']) { return true; } $chain = self::getNavChain($sectionData['IBLOCK_ID'], $sectionData['ID']); $rootSection = reset($chain); if($rootSection['CREATED_BY'] != $entityId) { return true; } } return false; } elseif($entityType == self::ENTITY_TYPE_GROUP) { $groupLib = CWebDavIblock::LibOptions('group_files', false, SITE_ID); if ($groupLib && isset($groupLib['id']) && ($iblockId = intval($groupLib['id']))) { if($iblockId != $sectionData['IBLOCK_ID']) { return true; } $chain = self::getNavChain($sectionData['IBLOCK_ID'], $sectionData['ID']); $rootSection = reset($chain); if($rootSection['SOCNET_GROUP_ID'] != $entityId) { return true; } } return false; } elseif($entityType == self::ENTITY_TYPE_SECTION) //or any another context { $margins = CIBlockSection::GetList(array(), array( 'ID' => $entityId, 'CHECK_PERMISSIONS' => 'N', ), false, array('LEFT_MARGIN', 'RIGHT_MARGIN', 'IBLOCK_ID')); if(!$margins) { return null; } $margins = $margins->fetch(); if($margins['IBLOCK_ID'] != $sectionData['IBLOCK_ID']) { return true; } if($sectionData['ID'] == $entityId) { return false; } $isSubSection = CIBlockSection::GetList(array(), array( 'ID' => $sectionData['ID'], 'IBLOCK_ID' => $sectionData['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N', '>LEFT_BORDER' => $margins['LEFT_MARGIN'], '<RIGHT_BORDER' => $margins['RIGHT_MARGIN'], ), false, array('ID')); if(!$isSubSection || !($isSubSection = $isSubSection->fetch())) { //not find real subsection === symlink return true; } return empty($isSubSection['ID']); } elseif($entityType == self::ENTITY_TYPE_SHARED) { return false; } throw new Exception('Unknown type ' . $entityType); } /** * @param array $sectionLinkData * @param array $unshareUsers if empty - unshare all users, else only ids * @return bool|null */ public static function unshareUserSection(array $sectionLinkData, array $unshareUsers = array()) { if( empty($sectionLinkData['ID']) || empty($sectionLinkData['IBLOCK_ID']) ) { return false; } return \Bitrix\Webdav\FolderInviteTable::deleteByFilter(array( '=IBLOCK_ID' => $sectionLinkData['IBLOCK_ID'], '=SECTION_ID' => $sectionLinkData['ID'], )); } public static function deleteSymLinkSection(array $sectionTargetData, array $sectionLinkData, $typeLibrary = self::ENTITY_TYPE_USER) { if( empty($sectionLinkData['ID']) || empty($sectionLinkData['IBLOCK_ID']) || empty($sectionLinkData['INVITE_USER_ID']) ) { return false; } if(empty($sectionTargetData['IBLOCK_ID']) || empty($sectionTargetData['IBLOCK_SECTION_ID'])) { return false; } $typeLibrary = strtolower($typeLibrary); if($typeLibrary != self::ENTITY_TYPE_USER && $typeLibrary != self::ENTITY_TYPE_GROUP && $typeLibrary != self::ENTITY_TYPE_SHARED) { return false; } return \Bitrix\Webdav\FolderInviteTable::deleteByFilter(array( '=INVITE_USER_ID' => $sectionLinkData['INVITE_USER_ID'], '=IS_APPROVED' => true, '=IBLOCK_ID' => $sectionLinkData['IBLOCK_ID'], '=SECTION_ID' => $sectionLinkData['ID'], )); } public static function deleteAllSymLinkOnSection(array $sectionLinkData, $typeLibrary = self::ENTITY_TYPE_USER) { if( empty($sectionLinkData['ID']) || empty($sectionLinkData['IBLOCK_ID']) ) { return false; } $typeLibrary = strtolower($typeLibrary); if($typeLibrary != self::ENTITY_TYPE_USER && $typeLibrary != self::ENTITY_TYPE_GROUP && $typeLibrary != self::ENTITY_TYPE_SHARED) { return false; } return \Bitrix\Webdav\FolderInviteTable::deleteByFilter(array( '=IBLOCK_ID' => $sectionLinkData['IBLOCK_ID'], '=SECTION_ID' => $sectionLinkData['ID'], )); } public static function deleteSymLinkOnSectionByUserIds(array $userIds, array $sectionLinkData, $typeLibrary = self::ENTITY_TYPE_USER) { if( empty($sectionLinkData['ID']) || empty($sectionLinkData['IBLOCK_ID']) ) { return false; } $typeLibrary = strtolower($typeLibrary); if($typeLibrary != self::ENTITY_TYPE_USER && $typeLibrary != self::ENTITY_TYPE_GROUP && $typeLibrary != self::ENTITY_TYPE_SHARED) { return false; } return \Bitrix\Webdav\FolderInviteTable::deleteByFilter(array( '=IBLOCK_ID' => $sectionLinkData['IBLOCK_ID'], '=SECTION_ID' => $sectionLinkData['ID'], 'INVITE_USER_ID' => $userIds, )); } /** * User by user * array( * 'IBLOCK_ID' => 16, * 'IBLOCK_SECTION_ID' => 162, * ); * array( * 'NAME' => 'link on folder', * 'IBLOCK_ID' => 15, * 'ID' => 3574, * 'CREATED_BY' => 1, * 'CAN_FORWARD' => 1, * 'INVITE_USER_ID' => 480, * ); * * @param array $sectionTargetData * @param array $sectionLinkData * @param string $typeLibrary - user, group, shared * @return bool|int */ public static function createSymLinkSection(array $sectionTargetData, array $sectionLinkData, $typeLibrary = self::ENTITY_TYPE_USER) { if( empty($sectionLinkData['IBLOCK_ID']) || empty($sectionLinkData['ID']) || empty($sectionLinkData['NAME']) || empty($sectionLinkData['CREATED_BY']) ) { return false; } if(empty($sectionTargetData['IBLOCK_ID']) || empty($sectionTargetData['IBLOCK_SECTION_ID'])) { return false; } $typeLibrary = strtolower($typeLibrary); if($typeLibrary != self::ENTITY_TYPE_USER && $typeLibrary != self::ENTITY_TYPE_GROUP && $typeLibrary != self::ENTITY_TYPE_SHARED) { return false; } if(!CWebDavTools::isIntranetUser($sectionLinkData['INVITE_USER_ID'])) { return false; } $sectionTargetData = array_intersect_key($sectionTargetData, array( 'IBLOCK_ID' => true, 'IBLOCK_SECTION_ID' => true, )); $additionalData = array( CWebDavIblock::UF_LINK_IBLOCK_ID => $sectionLinkData['IBLOCK_ID'], CWebDavIblock::UF_LINK_SECTION_ID => $sectionLinkData['ID'], CWebDavIblock::UF_LINK_ROOT_SECTION_ID => self::getRootSectionId($sectionLinkData['IBLOCK_ID'], $sectionLinkData['ID'], $typeLibrary), CWebDavIblock::UF_LINK_CAN_FORWARD => $sectionLinkData['CAN_FORWARD'], 'CREATED_BY' => $sectionLinkData['CREATED_BY'], 'MODIFIED_BY' => $sectionLinkData['CREATED_BY'], 'NAME' => $sectionLinkData['NAME'], ); $exists = \Bitrix\Webdav\FolderInviteTable::getRow(array('filter' => array( 'INVITE_USER_ID' => $sectionLinkData['INVITE_USER_ID'], 'IBLOCK_ID' => $sectionLinkData['IBLOCK_ID'], 'SECTION_ID' => $sectionLinkData['ID'], ), 'select' => array('ID', 'LINK_SECTION_ID', 'IS_DELETED', 'IS_APPROVED'))); //rewrite old self-deleted by user invite if($exists && !$exists['IS_DELETED'] && $exists['IS_APPROVED']) { return $exists['LINK_SECTION_ID']; } $section = new CIBlockSection(); $sectionId = $section->add(array_merge( $sectionTargetData, $additionalData )); if($typeLibrary == self::ENTITY_TYPE_GROUP) { $inviteUserId = $sectionLinkData['CREATED_BY']; \Bitrix\Webdav\FolderInviteTable::addIfNonExists(array( 'INVITE_USER_ID' => $sectionLinkData['CREATED_BY'], 'USER_ID' => $sectionLinkData['CREATED_BY'], 'IBLOCK_ID' => $sectionLinkData['IBLOCK_ID'], 'SECTION_ID' => $sectionLinkData['ID'], 'LINK_SECTION_ID' => $sectionId, 'IS_APPROVED' => true, 'IS_DELETED' => false, 'CAN_FORWARD' => false, )); } elseif($typeLibrary == self::ENTITY_TYPE_USER) { if($sectionId) { $inviteUserId = $sectionLinkData['INVITE_USER_ID']; \Bitrix\Webdav\FolderInviteTable::addIfNonExists(array( 'INVITE_USER_ID' => $sectionLinkData['INVITE_USER_ID'], 'USER_ID' => $sectionLinkData['CREATED_BY'], 'IBLOCK_ID' => $sectionLinkData['IBLOCK_ID'], 'SECTION_ID' => $sectionLinkData['ID'], 'LINK_SECTION_ID' => $sectionId, 'IS_APPROVED' => true, 'IS_DELETED' => false, 'CAN_FORWARD' => false, 'CAN_EDIT' => $sectionLinkData['CAN_EDIT'], )); $rightsLetter = $sectionLinkData['CAN_EDIT']? 'W' : 'R'; CWebDavIblock::appendRightsOnSections(array($sectionLinkData), array( $rightsLetter => 'U' . $sectionLinkData['INVITE_USER_ID'], )); } } if($sectionId && $inviteUserId) { CWebDavDiskDispatcher::sendChangeStatus($inviteUserId, 'symlink'); } return $sectionId; } public static function createInviteOnSection(array $sectionTargetData, array $sectionLinkData, $typeLibrary = self::ENTITY_TYPE_USER) { if( empty($sectionLinkData['IBLOCK_ID']) || empty($sectionLinkData['ID']) || empty($sectionLinkData['NAME']) || empty($sectionLinkData['CREATED_BY']) ) { return false; } if(empty($sectionTargetData['IBLOCK_ID']) || empty($sectionTargetData['IBLOCK_SECTION_ID'])) { return false; } $typeLibrary = strtolower($typeLibrary); if($typeLibrary != self::ENTITY_TYPE_USER && $typeLibrary != self::ENTITY_TYPE_GROUP && $typeLibrary != self::ENTITY_TYPE_SHARED) { return false; } if(!CWebDavTools::isIntranetUser($sectionLinkData['INVITE_USER_ID'])) { return false; } $exists = \Bitrix\Webdav\FolderInviteTable::getRow(array('filter' => array( 'INVITE_USER_ID' => $sectionLinkData['INVITE_USER_ID'], 'IBLOCK_ID' => $sectionLinkData['IBLOCK_ID'], 'SECTION_ID' => $sectionLinkData['ID'], ), 'select' => array('ID', 'LINK_SECTION_ID', 'IS_DELETED', 'IS_APPROVED'))); //rewrite old self-deleted by user invite if($exists && !$exists['IS_DELETED'] && $exists['IS_APPROVED']) { return true; } if($typeLibrary == self::ENTITY_TYPE_GROUP) { \Bitrix\Webdav\FolderInviteTable::addIfNonExists(array( 'INVITE_USER_ID' => $sectionLinkData['CREATED_BY'], 'USER_ID' => $sectionLinkData['CREATED_BY'], 'IBLOCK_ID' => $sectionLinkData['IBLOCK_ID'], 'SECTION_ID' => $sectionLinkData['ID'], 'IS_APPROVED' => CWebDavTools::allowAutoconnectShareGroupFolder(), 'IS_DELETED' => false, 'CAN_FORWARD' => false, )); } elseif($typeLibrary == self::ENTITY_TYPE_USER) { } return true; } /** * Determine root section for library * @param $iblockId * @param $sectionId * @param $typeLibrary * @return integer|false */ private static function getRootSectionId($iblockId, $sectionId, $typeLibrary) { $section = CIBlockSection::GetList(array(), array( 'ID' => $sectionId, 'IBLOCK_ID' => $iblockId, ), false, array('ID', 'LEFT_MARGIN', 'RIGHT_MARGIN', 'DEPTH_LEVEL'))->fetch(); if($typeLibrary == self::ENTITY_TYPE_USER) { $sectionOwnerElement = CIBlockSection::GetList(array('LEFT_MARGIN' => 'DESC'), array( 'IBLOCK_ID' => $iblockId, 'DEPTH_LEVEL' => 1, 'IBLOCK_SECTION_ID' => null, '!LEFT_MARGIN' => $section['LEFT_MARGIN'], '!RIGHT_MARGIN' => $section['RIGHT_MARGIN'], 'CHECK_PERMISSIONS' => 'N', ), false, array('ID', 'IBLOCK_ID', 'IBLOCK_SECTION_ID', 'CREATED_BY', 'NAME'))->fetch(); return $sectionOwnerElement['ID']; } elseif($typeLibrary == self::ENTITY_TYPE_GROUP) { if($section['DEPTH_LEVEL'] == 1) { return $section['ID']; } $sectionOwnerElement = CIBlockSection::GetList(array('LEFT_MARGIN' => 'DESC'), array( 'IBLOCK_ID' => $iblockId, 'DEPTH_LEVEL' => 1, 'IBLOCK_SECTION_ID' => null, '!LEFT_MARGIN' => $section['LEFT_MARGIN'], '!RIGHT_MARGIN' => $section['RIGHT_MARGIN'], 'CHECK_PERMISSIONS' => 'N', ), false, array('ID', 'IBLOCK_ID', 'IBLOCK_SECTION_ID', 'SOCNET_GROUP_ID', 'NAME'))->fetch(); return empty($sectionOwnerElement['ID'])? 0 : $sectionOwnerElement['ID']; } elseif($typeLibrary == self::ENTITY_TYPE_SHARED) { return 0; } } public static function getNavChain($iblockId, $sectionId) { static $_cacheData = array(); if(isset($_cacheData[$iblockId][$sectionId])) { return $_cacheData[$iblockId][$sectionId]; } if(!isset($_cacheData[$iblockId])) { $_cacheData[$iblockId] = array(); } $_cacheData[$iblockId][$sectionId] = array(); $dbQuery = CIBlockSection::GetNavChain($iblockId, $sectionId, array( 'ID', 'CREATED_BY', 'IBLOCK_SECTION_ID', 'NAME', 'LEFT_MARGIN', 'RIGHT_MARGIN', 'DEPTH_LEVEL', 'SOCNET_GROUP_ID', 'IBLOCK_CODE', )); while($chainItem = $dbQuery->fetch()) { $_cacheData[$iblockId][$sectionId][] = $chainItem; } return $_cacheData[$iblockId][$sectionId]; } /** * Return iblockId for section * @param $sectionId * @return null|integer */ public static function getIblockIdForSectionId($sectionId) { if(isset(self::$_cacheDataSectionIblockId[$sectionId])) { return self::$_cacheDataSectionIblockId[$sectionId]; } self::$_cacheDataSectionIblockId[$sectionId] = null; $getIblock = CIBlockSection::GetList(array(), array('ID' => $sectionId, 'CHECK_PERMISSIONS' => 'N'), false, array('IBLOCK_ID')); if($getIblock && ($getIblock = $getIblock->fetch())) { self::$_cacheDataSectionIblockId[$sectionId] = $getIblock['IBLOCK_ID']; } return self::$_cacheDataSectionIblockId[$sectionId]; } public static function setIblockIdForSectionId($sectionId, $data) { self::$_cacheDataSectionIblockId[$sectionId] = $data; } /** * Return iblock & section for element * @param $elementId * @return array */ public static function getParentDataForElementId($elementId) { static $_cacheData = array(); if(isset($_cacheData[$elementId])) { return $_cacheData[$elementId]; } $_cacheData[$elementId] = array(); $getParentData = CIBlockElement::GetList(array(), array('ID' => $elementId, 'SHOW_HISTORY'=>'Y'), false, false, array('IBLOCK_ID', 'IBLOCK_SECTION_ID')); if($getParentData && ($getParentData = $getParentData->fetch())) { $_cacheData[$elementId] = $getParentData; } return $_cacheData[$elementId]; } public static function sendNotifyUnshare(array $folderInvite) { if(empty($folderInvite['IS_DELETED']) && !empty($folderInvite['IS_APPROVED']) && $folderInvite['USER_ID'] != $folderInvite['INVITE_USER_ID'] && \Bitrix\Main\Loader::includeModule('im')) { $sectionToShare = CIBlockSection::getList(array(), array( 'ID' => $folderInvite['SECTION_ID'], 'IBLOCK_ID' => $folderInvite['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N', ), false, array('ID', 'NAME'))->fetch(); if(empty($sectionToShare['NAME'])) { return; } $notifyFields = array(); $notifyFields['NOTIFY_MODULE'] = 'webdav'; $notifyFields['NOTIFY_EVENT'] = "invite"; $notifyFields['NOTIFY_TYPE'] = IM_NOTIFY_FROM; $notifyFields['FROM_USER_ID'] = $folderInvite['USER_ID']; $notifyFields['TO_USER_ID'] = $folderInvite['INVITE_USER_ID']; $notifyFields['NOTIFY_TAG'] = \Bitrix\Webdav\FolderInviteTable::getNotifyTag($folderInvite); $notifyFields['NOTIFY_SUB_TAG'] = "WEBDAV|INVITE|{$folderInvite['ID']}"; $sectionName = self::getSectionOriginalName($sectionToShare['ID'], $sectionToShare['NAME']); $notifyFields['MESSAGE'] = $notifyFields['TITLE'] = GetMessage('WD_SYMLINK_INVITE_TEXT_DISCONNECT_TITLE', array( '#FOLDERNAME#' => $sectionName, ) ); \CIMNotify::Add($notifyFields); } } public static function sendNotify(array $folderInvite) { $serverName = (CMain::IsHTTPS() ? "https" : "http")."://".((defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME) > 0) ? SITE_SERVER_NAME : COption::GetOptionString("main", "server_name", "")); if(empty($folderInvite['IS_DELETED']) && !empty($folderInvite['IS_APPROVED']) && $folderInvite['USER_ID'] != $folderInvite['INVITE_USER_ID'] && \Bitrix\Main\Loader::includeModule('im')) { $sectionToShare = CIBlockSection::getList(array(), array( 'ID' => $folderInvite['SECTION_ID'], 'IBLOCK_ID' => $folderInvite['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N', ), false, array('NAME'))->fetch(); if(empty($sectionToShare['NAME'])) { return; } $notifyFields = array(); $notifyFields['NOTIFY_MODULE'] = 'webdav'; $notifyFields['NOTIFY_EVENT'] = "invite"; $notifyFields['NOTIFY_TYPE'] = IM_NOTIFY_FROM; $notifyFields['FROM_USER_ID'] = $folderInvite['USER_ID']; $notifyFields['TO_USER_ID'] = $folderInvite['INVITE_USER_ID']; $notifyFields['NOTIFY_TAG'] = \Bitrix\Webdav\FolderInviteTable::getNotifyTag($folderInvite); $notifyFields['NOTIFY_SUB_TAG'] = "WEBDAV|INVITE|{$folderInvite['ID']}"; $uriShow = \CComponentEngine::makePathFromTemplate( CWebDavSymlinkHelper::getPathPattern('user', '/company/personal/user/#user_id#/'), array('user_id' => $folderInvite['INVITE_USER_ID'] )) . 'files/lib/?result=sec' . $folderInvite['LINK_SECTION_ID']; $uriDisconnect = \CComponentEngine::makePathFromTemplate( CWebDavSymlinkHelper::getPathPattern('user', '/company/personal/user/#user_id#/'), array('user_id' => $folderInvite['INVITE_USER_ID'] )) . 'files/lib/?result=sec' . $folderInvite['LINK_SECTION_ID'] . '#disconnect'; $notifyFields['NOTIFY_MESSAGE'] = GetMessage('WD_SYMLINK_INVITE_TEXT_APPROVE_N1', array( '#FOLDERNAME#' => '<a href="' . $uriShow . '">' . $sectionToShare['NAME'] . '</a>', '#DISCONNECT_LINK#' => '<a href="' . $uriDisconnect . '">' . GetMessage('WD_SYMLINK_INVITE_TEXT_DISCONNECT_LINK') . '</a>', '#INVITETEXT#' => $folderInvite['DESCRIPTION'] ?: '', ) ); $notifyFields['NOTIFY_MESSAGE_OUT'] = GetMessage('WD_SYMLINK_INVITE_TEXT_APPROVE_N1', array( '#FOLDERNAME#' => $sectionToShare['NAME'] . " ({$uriShow})", '#DISCONNECT_LINK#' => "\n\n". GetMessage('WD_SYMLINK_INVITE_TEXT_DISCONNECT_LINK') . ': ' . $serverName . $uriDisconnect, '#INVITETEXT#' => $folderInvite['DESCRIPTION'] ?: '', ) ); \CIMNotify::Add($notifyFields); } //self invite. It's connect group disk. elseif(empty($folderInvite['IS_DELETED']) && $folderInvite['USER_ID'] == $folderInvite['INVITE_USER_ID'] && \Bitrix\Main\Loader::includeModule('im')) { $sectionToShare = CIBlockSection::getList(array(), array( 'ID' => $folderInvite['SECTION_ID'], 'IBLOCK_ID' => $folderInvite['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N', ), false, array('NAME', 'SOCNET_GROUP_ID'))->fetch(); if(empty($sectionToShare['NAME']) || empty($sectionToShare['SOCNET_GROUP_ID'])) { return; } if(\Bitrix\Main\Loader::includeModule('socialnetwork')) { $group = CSocNetGroup::GetList(array(), array('ID' => $sectionToShare['SOCNET_GROUP_ID']), false, false, array('NAME'))->fetch(); } $notifyFields = array(); $notifyFields['NOTIFY_MODULE'] = 'webdav'; $notifyFields['NOTIFY_EVENT'] = "invite"; $notifyFields['NOTIFY_TYPE'] = IM_NOTIFY_FROM; $notifyFields['FROM_USER_ID'] = $folderInvite['USER_ID']; $notifyFields['TO_USER_ID'] = $folderInvite['INVITE_USER_ID']; $notifyFields['NOTIFY_TAG'] = \Bitrix\Webdav\FolderInviteTable::getNotifyTag($folderInvite); $notifyFields['NOTIFY_SUB_TAG'] = "WEBDAV|INVITE|{$folderInvite['ID']}"; $uriShow = \CComponentEngine::makePathFromTemplate( CWebDavSymlinkHelper::getPathPattern('group', '/company/personal/user/#user_id#/'), array('user_id' => $folderInvite['INVITE_USER_ID'] )) . 'files/lib/?result=sec' . $folderInvite['LINK_SECTION_ID']; $uriDisconnect = \CComponentEngine::makePathFromTemplate( CWebDavSymlinkHelper::getPathPattern('user', '/company/personal/user/#user_id#/'), array('user_id' => $folderInvite['INVITE_USER_ID'] )) . 'files/lib/?result=sec' . $folderInvite['LINK_SECTION_ID'] . '#disconnect'; if(\CWebDavTools::allowAutoconnectShareGroupFolder()) { $notifyFields['NOTIFY_MESSAGE'] = GetMessage('WD_SYMLINK_INVITE_GROUP_TEXT_APPROVE_N1', array( '#FOLDERNAME#' => $sectionToShare['NAME'], '#INVITETEXT#' => $folderInvite['DESCRIPTION'] ?: '', '#GROUPNAME#' => '<a href="' . $uriShow . '">' . $group['NAME'] . '</a>', '#DISCONNECT_LINK#' => '<a href="' . $uriDisconnect . '">' . GetMessage('WD_SYMLINK_INVITE_TEXT_DISCONNECT_LINK') . '</a>', ) ); $notifyFields['NOTIFY_MESSAGE_OUT'] = GetMessage('WD_SYMLINK_INVITE_GROUP_TEXT_APPROVE_N1', array( '#FOLDERNAME#' => $sectionToShare['NAME'], '#INVITETEXT#' => $folderInvite['DESCRIPTION'] ?: '', '#GROUPNAME#' => $group['NAME'], '#DISCONNECT_LINK#' => "\n\n". GetMessage('WD_SYMLINK_INVITE_TEXT_DISCONNECT_LINK') . ': ' . $serverName . $uriDisconnect, ) ); } elseif(empty($folderInvite['IS_APPROVED'])) { $notifyFields['NOTIFY_TYPE'] = IM_NOTIFY_CONFIRM; $notifyFields['NOTIFY_BUTTONS'] = Array( Array('TITLE' => GetMessage('WD_SYMLINK_INVITE_APPROVE_Y'), 'VALUE' => 'Y', 'TYPE' => 'accept'), Array('TITLE' => GetMessage('WD_SYMLINK_INVITE_APPROVE_N'), 'VALUE' => 'N', 'TYPE' => 'cancel') ); $notifyFields['MESSAGE'] = GetMessage('WD_SYMLINK_INVITE_GROUP_TEXT_APPROVE_CONFIRM_N1', array( '#FOLDERNAME#' => $sectionToShare['NAME'], '#GROUPNAME#' => $group['NAME'], ) ); } \CIMNotify::Add($notifyFields); } elseif(!empty($folderInvite['IS_DELETED']) && \Bitrix\Main\Loader::includeModule('im')) { $sectionToShare = CIBlockSection::getList(array(), array( 'ID' => $folderInvite['SECTION_ID'], 'IBLOCK_ID' => $folderInvite['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N', ), false, array('NAME'))->fetch(); if(empty($sectionToShare['NAME'])) { return; } $inviteUser = \CUser::getById($folderInvite['INVITE_USER_ID']); if($inviteUser) { $inviteUser = $inviteUser->fetch(); } $notifyFields = array(); $notifyFields['NOTIFY_MODULE'] = 'webdav'; $notifyFields['NOTIFY_EVENT'] = "invite"; $notifyFields['NOTIFY_TYPE'] = IM_NOTIFY_FROM; $notifyFields['FROM_USER_ID'] = $folderInvite['INVITE_USER_ID']; $notifyFields['TO_USER_ID'] = $folderInvite['USER_ID']; $notifyFields['NOTIFY_TAG'] = \Bitrix\Webdav\FolderInviteTable::getNotifyTag($folderInvite); $notifyFields['NOTIFY_SUB_TAG'] = "WEBDAV|INVITE|{$folderInvite['ID']}"; if(CWebDavTools::getUserGender($inviteUser['PERSONAL_GENDER']) == 'F') { $notifyFields['MESSAGE'] = GetMessage('WD_SYMLINK_INVITE_TEXT_DISCONNECT_F', array( '#FOLDERNAME#' => $sectionToShare['NAME'], '#USERNAME#' => CWebDavTools::getUserName($inviteUser) ) ); } else { $notifyFields['MESSAGE'] = GetMessage('WD_SYMLINK_INVITE_TEXT_DISCONNECT_M', array( '#FOLDERNAME#' => $sectionToShare['NAME'], '#USERNAME#' => CWebDavTools::getUserName($inviteUser) ) ); } \CIMNotify::Add($notifyFields); } } public static function onBeforeConfirmNotify($module, $tag, $value, $arNotify) { global $USER; $userId = $USER->getId(); if ($module == 'webdav' && $userId) { $tagData = explode('|', $tag); $folderInviteId = intval($tagData[2]); if ($tagData[0] == "WEBDAV" && $tagData[1] == "INVITE" && $folderInviteId > 0 && $userId == $tagData[3]) { if (\Bitrix\Main\Loader::includeModule('im')) { CIMNotify::DeleteByTag(\Bitrix\Webdav\FolderInviteTable::getNotifyTag(array('ID' => $folderInviteId, 'INVITE_USER_ID' => $userId))); } //decline if($value === 'N') { \Bitrix\Webdav\FolderInviteTable::delete($folderInviteId); return false; } $targetSectionData = CWebDavIblock::getRootSectionDataForUser($userId); if(!$targetSectionData) { return false; } $folderInviteData = \Bitrix\Webdav\FolderInviteTable::getRowById($folderInviteId); if(!$folderInviteData) { return false; } $sectionToShare = CIBlockSection::getList(array(), array( 'ID' => $folderInviteData['SECTION_ID'], 'IBLOCK_ID' => $folderInviteData['IBLOCK_ID'], 'CHECK_PERMISSIONS' => 'N', ), false, array('NAME', 'SOCNET_GROUP_ID'))->fetch(); if(empty($sectionToShare['NAME']) || empty($sectionToShare['SOCNET_GROUP_ID'])) { return false; } if(\Bitrix\Main\Loader::includeModule('socialnetwork')) { $group = CSocNetGroup::GetList(array(), array('ID' => $sectionToShare['SOCNET_GROUP_ID']), false, false, array('NAME'))->fetch(); } if(empty($group)) { return false; } $groupId = $sectionToShare['SOCNET_GROUP_ID']; $dispatcher = new \Bitrix\Webdav\InviteDispatcher; $attachObjectType = CWebDavSymlinkHelper::ENTITY_TYPE_GROUP; $attachObjectId = (int)$groupId; $inviteComponentParams = array( 'attachObject' => array( 'id' => $attachObjectId, 'type' => $attachObjectType, ), 'attachToUserId' => $folderInviteData['INVITE_USER_ID'], 'inviteFromUserId' => $folderInviteData['USER_ID'], 'canEdit' => $folderInviteData['CAN_EDIT'], ); $response = $dispatcher->processActionConnect($inviteComponentParams); if($response['status'] == $dispatcher::STATUS_SUCCESS) { \Bitrix\Webdav\FolderInviteTable::update($folderInviteId, array( 'IS_APPROVED' => true, 'LINK_SECTION_ID' => $response['sectionId'], )); } return $response['status'] == $dispatcher::STATUS_SUCCESS; } } } /** * @param $name * @param $value */ public static function setPathPattern($name, $value) { self::$_pathPattern[$name] = $value; } /** * @param $name * @param null $default * @return string */ public static function getPathPattern($name, $default = null) { return isset(self::$_pathPattern[$name])? self::$_pathPattern[$name] : $default; } }
/var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/webdav/classes/symlinkhelper.php