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/cvetdv.ru/bitrix/modules/socialservices/lib/integration/zoom/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/socialservices/lib/integration/zoom/downloadagent.php
<?php

namespace Bitrix\Socialservices\Integration\Zoom;

use Bitrix\Main\Application;
use Bitrix\Main\Error;
use Bitrix\Main\Loader;
use Bitrix\Main\Result;
use Bitrix\Main\IO;
use Bitrix\Main\Web\HttpClient;
use Bitrix\Socialservices\ZoomMeetingRecordingTable;

class DownloadAgent
{
	protected const MAX_ATTEMPTS = 3;

	public static function scheduleDownload(int $activityId, int $recordingId, $siteId = SITE_ID)
	{
		if ($activityId > 0 && $recordingId > 0)
		{
			$siteId = Application::getConnection()->getSqlHelper()->forSql($siteId);
			\CAgent::AddAgent(
				__CLASS__."::run({$activityId}, {$recordingId}, '{$siteId}');",
				'socialservices',
				'N',
				3600,
				'',
				'Y',
				\ConvertTimeStamp(time() + \CTimeZone::GetOffset(), 'FULL')
			);
		}
	}

	public static function run($activityId, $recordingId, $siteId = SITE_ID, $attempt = 0)
	{
		$recordingFields = ZoomMeetingRecordingTable::getRowById($recordingId);
		if (!is_array($recordingFields))
		{
			return '';
		}

		$attachResult = static::attach($activityId, $recordingFields, $siteId);
		if ($attachResult->isSuccess())
		{
			return '';
		}

		$attempt++;
		if ($attempt > static::MAX_ATTEMPTS)
		{
			return '';
		}
		$siteId = Application::getConnection()->getSqlHelper()->forSql($siteId);
		return static::class."::run({$activityId}, {$recordingId}, '{$siteId}', {$attempt});";
	}

	public static function attach($activityId, array $recordingFields, $siteId = SITE_ID)
	{
		$result = new Result();

		$validSymbolsPattern = '/^[a-z0-9\-]+$/i';
		if (!preg_match($validSymbolsPattern, $recordingFields['EXTERNAL_ID']))
		{
			return $result->addError(new Error('Can not create recording file name, external_id contains invalid symbols'));
		}
		if (!preg_match($validSymbolsPattern, $recordingFields['FILE_TYPE']))
		{
			return $result->addError(new Error('Can not create recording file name, external_id contains invalid symbols'));
		}
		if (!Loader::includeModule('crm'))
		{
			return $result->addError(new Error('CRM module is not installed'));
		}
		$fileName = mb_strtolower("{$recordingFields['EXTERNAL_ID']}.{$recordingFields['FILE_TYPE']}");
		$downloadResult = static::download($recordingFields['DOWNLOAD_URL'], $recordingFields['DOWNLOAD_TOKEN'], $fileName);
		if(!$downloadResult->isSuccess())
		{
			return $result->addErrors($downloadResult->getErrors());
		}

		$activityFields = \CCrmActivity::GetByID($activityId, false);
		if(!$activityFields)
		{
			return $result->addError(new Error('Activity is not found'));
		}
		$responsible = $activityFields['RESPONSIBLE_ID'];

		$tempPath = $downloadResult->getData()['file'];
		$recordFile = \CFile::MakeFileArray($tempPath, $recordingFields['FILE_TYPE']);
		$recordFile['MODULE_ID'] = 'crm';
		$saveResult = DiskHelper::saveFile($recordFile, $responsible, $siteId);

		if(!$saveResult->isSuccess())
		{
			return $result->addErrors($saveResult->getErrors());
		}

		$fileId = $saveResult->getData()['fileId'];
		ZoomMeetingRecordingTable::update($recordingFields['ID'], [
			'FILE_ID' => $fileId
		]);

		$storageElementIds = \unserialize($activityFields['STORAGE_ELEMENT_IDS'], ['allowed_classes' => false]) ?: [];
		$storageElementIds[] = $fileId;

		$activityFields['STORAGE_TYPE_ID'] = \Bitrix\Crm\Integration\StorageType::Disk;
		$activityFields['STORAGE_ELEMENT_IDS'] = $storageElementIds;

		$updateResult = \CCrmActivity::Update($activityId, $activityFields, false);
		if (!$updateResult)
		{
			return $result->addError(new Error(\CCrmActivity::GetLastErrorMessage()));
		}
		return $result;
	}

	public static function download(string $recordingUrl, string $downloadToken, string $fileName): Result
	{
		$result = new Result();

		$tempPath = \CFile::GetTempName('', $fileName);
		IO\Directory::createDirectory(IO\Path::getDirectory($tempPath));
		if(IO\Directory::isDirectoryExists(IO\Path::getDirectory($tempPath)) === false)
		{
			return $result->addError(new Error("Error creating temporary directory {$tempPath}"));
		}
		$tempFile = new IO\File($tempPath);
		$handler = $tempFile->open("w+");
		if($handler === false)
		{
			return $result->addError(new Error("Error opening temporary file {$tempPath}"));
		}

		$http = new HttpClient();
		$http->setHeader("Authorization",  "Bearer {$downloadToken}");
		$http->setOutputStream($handler);
		$http->query("GET", $recordingUrl);
		$statusCode = $http->getStatus();
		if($statusCode !== 200)
		{
			return $result->addError(new Error("Service response status code is {$statusCode}"));
		}

		$http->getResult();
		$tempFile->close();

		return $result->setData([
			'file' => $tempPath
		]);
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit