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/js/im/lib/uploader/src/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/im/lib/uploader/src/filesender.js
import { Uploader } from './uploader';
import { UploaderTask } from './uploader-task';

export class FileSender
{
	token: string = null;
	nextDataChunkToSend: number = null;
	readOffset: number = 0;

	constructor(task: UploaderTask, options = {})
	{
		this.diskFolderId = task.diskFolderId;
		this.listener = task.listener;
		this.status = task.status;

		this.taskId = task.taskId;
		this.fileData = task.fileData;
		this.fileName = task.fileName || this.fileData.name;
		this.generateUniqueName = task.generateUniqueName;
		this.chunkSizeInBytes = task.chunkSize;
		this.previewBlob = task.previewBlob || null;
		this.requestToDelete = false;

		this.listener('onStartUpload', {
			id: this.taskId,
			file: this.fileData,
			previewData: this.previewBlob
		});

		this.host = options.host || null;
		this.actionUploadChunk = options.actionUploadChunk || 'disk.api.content.upload';
		this.actionCommitFile = options.actionCommitFile || 'disk.api.file.createByContent';
		this.actionRollbackUpload = options.actionRollbackUpload || 'disk.api.content.rollbackUpload';
		this.customHeaders = options.customHeaders || null;
	}

	uploadContent(): void
	{
		if (this.status === Uploader.STATUSES.CANCELLED)
		{
			return;
		}

		this.status = Uploader.STATUSES.PROGRESS;
		this.readNext();

		const url = `${this.host ? this.host : ""}
			/bitrix/services/main/ajax.php?action=${this.actionUploadChunk}
			&filename=${this.fileName}
			${this.token ? "&token=" + this.token : ""}`;

		const contentRangeHeader = "bytes " + this.readOffset + "-" + (this.readOffset + this.chunkSizeInBytes - 1)
			+ "/" + this.fileData.size;

		this.calculateProgress();

		const headers ={
			"Content-Type": this.fileData.type,
			"Content-Range": contentRangeHeader,
		};

		if (!this.customHeaders)
		{
			headers['X-Bitrix-Csrf-Token'] = BX.bitrix_sessid();
		}
		else //if (this.customHeaders)
		{
			for (const customHeader in this.customHeaders)
			{
				if (this.customHeaders.hasOwnProperty(customHeader))
				{
					headers[customHeader] = this.customHeaders[customHeader];
				}
			}
		}

		fetch(url, {
			method: 'POST',
			headers: headers,
			credentials: "include",
			body: this.nextDataChunkToSend
		})
			.then(response => response.json())
			.then(result => {
				if (result.errors.length > 0)
				{
					this.status = Uploader.STATUSES.FAILED;
					this.listener('onUploadFileError', {id: this.taskId, result: result});
					console.error(result.errors[0].message)
				}
				else if(result.data.token)
				{
					this.token = result.data.token;
					this.readOffset = this.readOffset + this.chunkSizeInBytes;
					if (!this.isEndOfFile())
					{
						this.uploadContent();
					}
					else
					{
						this.createFileFromUploadedChunks();
					}
				}
			}).catch(err => {
				this.status = Uploader.STATUSES.FAILED;
				this.listener('onUploadFileError', {id: this.taskId, result: err});
			}
		);
	}

	deleteContent(): void
	{
		this.status = Uploader.STATUSES.CANCELLED;
		this.requestToDelete = true;

		if (!this.token)
		{
			console.error('Empty token.')
			return;
		}

		const url = `${this.host ? this.host : ""}/bitrix/services/main/ajax.php?
		action=${this.actionRollbackUpload}&token=${this.token}`;

		const headers = {};
		if (!this.customHeaders)
		{
			headers['X-Bitrix-Csrf-Token'] = BX.bitrix_sessid();
		}
		else //if (this.customHeaders)
		{
			for (const customHeader in this.customHeaders)
			{
				if (this.customHeaders.hasOwnProperty(customHeader))
				{
					headers[customHeader] = this.customHeaders[customHeader];
				}
			}
		}

		fetch(url, {
			method: 'POST',
			credentials: "include",
			headers: headers
		})
			.then(response => response.json())
			.then(result => console.log(result))
			.catch(err => console.error(err))
	}

	createFileFromUploadedChunks(): void
	{
		if (!this.token)
		{
			console.error('Empty token.')
			return;
		}

		if (this.requestToDelete)
		{
			return;
		}

		const url = `${this.host ? this.host : ""}/bitrix/services/main/ajax.php?action=${this.actionCommitFile}&filename=${this.fileName}`
			+ "&folderId=" + this.diskFolderId
			+ "&contentId=" + this.token
			+ (this.generateUniqueName ? "&generateUniqueName=true" : "");

		const headers = {
			"X-Upload-Content-Type": this.fileData.type,
		};

		if (!this.customHeaders)
		{
			headers['X-Bitrix-Csrf-Token'] = BX.bitrix_sessid();
		}
		else //if (this.customHeaders)
		{
			for (const customHeader in this.customHeaders)
			{
				if (this.customHeaders.hasOwnProperty(customHeader))
				{
					headers[customHeader] = this.customHeaders[customHeader];
				}
			}
		}

		const formData = new FormData();
		if (this.previewBlob)
		{
			formData.append("previewFile", this.previewBlob, "preview_" + this.fileName + ".jpg");
		}

		fetch(url, {
			method: 'POST',
			headers: headers,
			credentials: "include",
			body: formData
		})
			.then(response => response.json())
			.then(result => {
				this.uploadResult = result;
				if (result.errors.length > 0)
				{
					this.status = Uploader.STATUSES.FAILED;
					this.listener('onCreateFileError', {id: this.taskId, result: result});
					console.error(result.errors[0].message)
				}
				else
				{
					this.calculateProgress();
					this.status = Uploader.STATUSES.DONE;
					this.listener('onComplete', {id: this.taskId, result: result});
				}
			}).catch(err => {
				this.status = Uploader.STATUSES.FAILED;
				this.listener('onCreateFileError', {id: this.taskId, result: err});
			}
		);
	}

	calculateProgress(): void
	{
		this.progress = Math.round((this.readOffset * 100) / this.fileData.size);

		this.listener('onProgress', {
			id: this.taskId,
			progress: this.progress,
			readOffset: this.readOffset,
			fileSize: this.fileData.size,
		});
	}

	readNext(): void
	{
		if ((this.readOffset + this.chunkSizeInBytes) > this.fileData.size)
		{
			this.chunkSizeInBytes = this.fileData.size - this.readOffset;
		}

		this.nextDataChunkToSend = this.fileData.slice(this.readOffset, this.readOffset + this.chunkSizeInBytes);
	}

	isEndOfFile(): boolean
	{
		return (this.readOffset >= this.fileData.size);
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit