15 return 'google_storage';
20 return 'Google Storage';
27 'US' =>
'United States',
35 $arSettings = $_POST[
'SETTINGS'][$this->
GetID()];
39 $arSettings = unserialize($arBucket[
'SETTINGS'], [
'allowed_classes' =>
false]);
42 if (!is_array($arSettings))
44 $arSettings = [
'PROJECT_ID' =>
'',
'ACCESS_KEY' =>
'',
'SECRET_KEY' =>
''];
50 <tr id="SETTINGS_0_' . $htmlID .
'" style="display:' . ($cur_SERVICE_ID == $this->
GetID() || !$bServiceSet ?
'' :
'none') .
'" class="settings-tr adm-detail-required-field">
51 <td>' .
GetMessage(
'CLO_STORAGE_GOOGLE_EDIT_PROJECT_ID') .
':</td>
52 <td><input type="hidden" name="SETTINGS[' . $htmlID .
'][PROJECT_ID]" id="' . $htmlID .
'PROJECT_ID" value="' .
htmlspecialcharsbx($arSettings[
'PROJECT_ID']) .
'"><input type="text" size="55" name="' . $htmlID .
'INP_" id="' . $htmlID .
'INP_PROJECT_ID" value="' .
htmlspecialcharsbx($arSettings[
'PROJECT_ID']) .
'" ' . ($arBucket[
'READ_ONLY'] ==
'Y' ?
'"disabled"' :
'') .
' onchange="BX(\'' . $htmlID .
'PROJECT_ID\').value = this.value"></td>
54 <tr id="SETTINGS_1_' . $htmlID .
'" style="display:' . ($cur_SERVICE_ID == $this->
GetID() || !$bServiceSet ?
'' :
'none') .
'" class="settings-tr adm-detail-required-field">
55 <td>' .
GetMessage(
'CLO_STORAGE_GOOGLE_EDIT_ACCESS_KEY') .
':</td>
56 <td><input type="hidden" name="SETTINGS[' . $htmlID .
'][ACCESS_KEY]" id="' . $htmlID .
'ACCESS_KEY" value="' .
htmlspecialcharsbx($arSettings[
'ACCESS_KEY']) .
'"><input type="text" size="55" name="' . $htmlID .
'INP_ACCESS_KEY" id="' . $htmlID .
'INP_ACCESS_KEY" value="' .
htmlspecialcharsbx($arSettings[
'ACCESS_KEY']) .
'" ' . ($arBucket[
'READ_ONLY'] ==
'Y' ?
'"disabled"' :
'') .
' onchange="BX(\'' . $htmlID .
'ACCESS_KEY\').value = this.value"></td>
58 <tr id="SETTINGS_2_' . $htmlID .
'" style="display:' . ($cur_SERVICE_ID == $this->
GetID() || !$bServiceSet ?
'' :
'none') .
'" class="settings-tr adm-detail-required-field">
59 <td>' .
GetMessage(
'CLO_STORAGE_GOOGLE_EDIT_SECRET_KEY') .
':</td>
60 <td><input type="hidden" name="SETTINGS[' . $htmlID .
'][SECRET_KEY]" id="' . $htmlID .
'SECRET_KEY" value="' .
htmlspecialcharsbx($arSettings[
'SECRET_KEY']) .
'"><input type="text" size="55" name="' . $htmlID .
'INP_SECRET_KEY" id="' . $htmlID .
'INP_SECRET_KEY" value="' .
htmlspecialcharsbx($arSettings[
'SECRET_KEY']) .
'" autocomplete="off" ' . ($arBucket[
'READ_ONLY'] ==
'Y' ?
'"disabled"' :
'') .
' onchange="BX(\'' . $htmlID .
'SECRET_KEY\').value = this.value"></td>
62 <tr id="SETTINGS_3_' . $htmlID .
'" style="display:' . ($cur_SERVICE_ID == $this->
GetID() || !$bServiceSet ?
'' :
'none') .
'" class="settings-tr">
76 'PROJECT_ID' => is_array($arSettings) ? trim($arSettings[
'PROJECT_ID']) :
'',
77 'ACCESS_KEY' => is_array($arSettings) ? trim($arSettings[
'ACCESS_KEY']) :
'',
78 'SECRET_KEY' => is_array($arSettings) ? trim($arSettings[
'SECRET_KEY']) :
'',
81 if ($arBucket[
'READ_ONLY'] !==
'Y' && !mb_strlen(
$result[
'PROJECT_ID']))
83 $aMsg[] = [
'id' => $this->
GetID() .
'INP_PROJECT_ID',
'text' =>
GetMessage(
'CLO_STORAGE_GOOGLE_EMPTY_PROJECT_ID')];
86 if ($arBucket[
'READ_ONLY'] !==
'Y' && !mb_strlen(
$result[
'ACCESS_KEY']))
88 $aMsg[] = [
'id' => $this->
GetID() .
'INP_ACCESS_KEY',
'text' =>
GetMessage(
'CLO_STORAGE_GOOGLE_EMPTY_ACCESS_KEY')];
91 if ($arBucket[
'READ_ONLY'] !==
'Y' && !mb_strlen(
$result[
'SECRET_KEY']))
93 $aMsg[] = [
'id' => $this->
GetID() .
'INP_SECRET_KEY',
'text' =>
GetMessage(
'CLO_STORAGE_GOOGLE_EMPTY_SECRET_KEY')];
114 if ($arBucket[
'LOCATION'])
117 '<CreateBucketConfiguration>'
118 .
'<LocationConstraint>' . $arBucket[
'LOCATION'] .
'</LocationConstraint>'
119 .
'</CreateBucketConfiguration>';
127 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
128 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
135 'x-goog-project-id' => $arBucket[
'SETTINGS'][
'PROJECT_ID'],
139 if ($this->status == 409)
150 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
162 if ($arBucket[
'PREFIX'])
171 $arAllBucket = $arBucket;
172 $arBucket[
'PREFIX'] =
'';
180 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
181 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
186 if ($this->status == 204 || $this->status == 404)
197 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
210 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
211 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
215 '?max-keys=1' . ($arBucket[
'PREFIX'] ?
'&prefix=' . $arBucket[
'PREFIX'] :
'')
218 if ($this->status == 404)
227 || !is_array(
$response[
'ListBucketResult'])
228 || !isset(
$response[
'ListBucketResult'][
'#'])
229 || !is_array(
$response[
'ListBucketResult'][
'#'])
230 || !isset(
$response[
'ListBucketResult'][
'#'][
'Contents'])
231 || !is_array(
$response[
'ListBucketResult'][
'#'][
'Contents']);
245 public function GetFileSRC($arBucket, $arFile, $encoded =
true)
247 if ($arBucket[
'CNAME'])
249 $host = $arBucket[
'CNAME'];
253 $host = $arBucket[
'BUCKET'] .
'.commondatastorage.googleapis.com';
256 if (is_array($arFile))
258 $URI = ltrim($arFile[
'SUBDIR'] .
'/' . $arFile[
'FILE_NAME'],
'/');
262 $URI = ltrim($arFile,
'/');
265 if ($arBucket[
'PREFIX'])
267 if (mb_substr($URI, 0, mb_strlen($arBucket[
'PREFIX']) + 1) !== $arBucket[
'PREFIX'] .
'/')
269 $URI = $arBucket[
'PREFIX'] .
'/' . $URI;
274 $request = \Bitrix\Main\Context::getCurrent()->getRequest();
275 $proto =
$request->isHttps() ?
'https' :
'http';
283 return $proto .
'://' .
$host .
'/' . $URI;
291 if ($arBucket[
'PREFIX'])
293 if (mb_substr($filePath, 0, mb_strlen($arBucket[
'PREFIX']) + 2) !==
'/' . $arBucket[
'PREFIX'] .
'/')
295 $filePath =
'/' . $arBucket[
'PREFIX'] .
'/' . ltrim($filePath,
'/');
301 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
302 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
308 if ($this->status == 200)
310 if (isset($this->headers[
'Content-Length']) && $this->headers[
'Content-Length'] > 0)
312 return $this->headers[
'Content-Length'];
319 elseif ($this->status == 206)
331 public function FileCopy($arBucket, $arFile, $filePath)
335 if ($arBucket[
'PREFIX'])
337 if (mb_substr($filePath, 0, mb_strlen($arBucket[
'PREFIX']) + 2) !==
'/' . $arBucket[
'PREFIX'] .
'/')
339 $filePath =
'/' . $arBucket[
'PREFIX'] .
'/' . ltrim($filePath,
'/');
344 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
345 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
352 'x-goog-acl' =>
'public-read',
353 'x-goog-copy-source' =>
CCloudUtil::URLEncode(
'/' . $arBucket[
'BUCKET'] .
'/' . ($arBucket[
'PREFIX'] ? $arBucket[
'PREFIX'] .
'/' :
'') . ($arFile[
'SUBDIR'] ? $arFile[
'SUBDIR'] .
'/' :
'') . $arFile[
'FILE_NAME'],
'UTF-8',
true),
354 'Content-Type' => $arFile[
'CONTENT_TYPE']
358 if ($this->status == 200)
360 return $this->
GetFileSRC($arBucket, $filePath);
364 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
377 if ($arBucket[
'PREFIX'])
379 if (mb_substr($filePath, 0, mb_strlen($arBucket[
'PREFIX']) + 2) !==
'/' . $arBucket[
'PREFIX'] .
'/')
381 $filePath =
'/' . $arBucket[
'PREFIX'] .
'/' . ltrim($filePath,
'/');
387 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
388 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
394 if ($this->status == 204 || $this->status == 404)
401 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
410 public function SaveFile($arBucket, $filePath, $arFile)
414 if ($arBucket[
'PREFIX'])
416 if (mb_substr($filePath, 0, mb_strlen($arBucket[
'PREFIX']) + 2) !==
'/' . $arBucket[
'PREFIX'] .
'/')
418 $filePath =
'/' . $arBucket[
'PREFIX'] .
'/' . ltrim($filePath,
'/');
424 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
425 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
430 $arFile[
'content'] ?? fopen($arFile[
'tmp_name'],
'rb'),
432 'x-goog-acl' =>
'public-read',
433 'Content-Type' => $arFile[
'type'],
434 'Content-Length' => (array_key_exists(
'content', $arFile) ? strlen($arFile[
'content']) : filesize($arFile[
'tmp_name'])),
438 if ($this->status == 200)
444 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
453 public function ListFiles($arBucket, $filePath, $bRecursive =
false)
466 $filePath = trim($filePath,
'/');
467 if ($filePath !==
'')
472 if ($arBucket[
'PREFIX'])
474 if (mb_substr($filePath, 0, mb_strlen($arBucket[
'PREFIX']) + 2) !==
'/' . $arBucket[
'PREFIX'] .
'/')
476 $filePath = $arBucket[
'PREFIX'] .
'/' . ltrim($filePath,
'/');
479 $filePath = str_replace(
' ',
'+', $filePath);
485 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
486 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
490 '?' . ($bRecursive ?
'' :
'delimiter=/&') .
'prefix=' . rawurlencode($filePath) .
'&marker=' . rawurlencode($marker)
496 && is_array(
$response[
'ListBucketResult'])
497 && isset(
$response[
'ListBucketResult'][
'#'])
498 && is_array(
$response[
'ListBucketResult'][
'#'])
502 isset(
$response[
'ListBucketResult'][
'#'][
'CommonPrefixes'])
503 && is_array(
$response[
'ListBucketResult'][
'#'][
'CommonPrefixes'])
506 foreach (
$response[
'ListBucketResult'][
'#'][
'CommonPrefixes'] as
$a)
508 $dir_name = mb_substr(rtrim(
$a[
'#'][
'Prefix'][0][
'#'],
'/'), mb_strlen($filePath));
514 isset(
$response[
'ListBucketResult'][
'#'][
'Contents'])
515 && is_array(
$response[
'ListBucketResult'][
'#'][
'Contents'])
518 foreach (
$response[
'ListBucketResult'][
'#'][
'Contents'] as
$a)
520 $file_name = mb_substr(
$a[
'#'][
'Key'][0][
'#'], mb_strlen($filePath));
521 $result[
'file'][] = $file_name;
522 $result[
'file_size'][] =
$a[
'#'][
'Size'][0][
'#'];
523 $result[
'file_mtime'][] = mb_substr(
$a[
'#'][
'LastModified'][0][
'#'], 0, 19);
524 $result[
'file_hash'][] = trim(
$a[
'#'][
'ETag'][0][
'#'],
'"');
525 $result[
'last_key'] = $file_name;
530 isset(
$response[
'ListBucketResult'][
'#'][
'IsTruncated'])
531 && is_array(
$response[
'ListBucketResult'][
'#'][
'IsTruncated'])
532 &&
$response[
'ListBucketResult'][
'#'][
'IsTruncated'][0][
'#'] ===
'true'
533 &&
$response[
'ListBucketResult'][
'#'][
'NextMarker'][0][
'#'] <>
''
536 $marker =
$response[
'ListBucketResult'][
'#'][
'NextMarker'][0][
'#'];
546 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
558 protected function StartUpload($arBucket, $filePath, $ContentType)
560 $filePath =
'/' . trim($filePath,
'/');
561 if ($arBucket[
'PREFIX'])
563 if (mb_substr($filePath, 0, mb_strlen($arBucket[
'PREFIX']) + 2) !==
'/' . $arBucket[
'PREFIX'] .
'/')
565 $filePath =
'/' . $arBucket[
'PREFIX'] . $filePath;
571 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
572 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
579 'x-goog-acl' =>
'public-read',
580 'x-goog-resumable' =>
'start',
581 'Content-Type' => $ContentType,
587 && is_array($this->headers)
588 && isset($this->headers[
'Location'])
589 && preg_match(
'/upload_id=(.*)$/', $this->headers[
'Location'], $match)
593 'filePath' => $filePath,
595 'upload_id' => $match[1],
599 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
609 $upload_info = $this->
StartUpload($arBucket, $filePath, $ContentType);
612 $upload_info[
'fileSize'] = $fileSize;
613 $upload_info[
'ContentType'] = $ContentType;
625 return 5 * 1024 * 1024;
628 private function UploadRange($filePathU, $arBucket, &
$NS,
$data, $pos)
631 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
632 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
635 $filePathU .
'?upload_id=' . rawurlencode(
$NS[
'upload_id']),
639 'Content-Range' =>
'bytes */' .
$NS[
'fileSize'],
643 $data_len = strlen(
$data);
646 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
647 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
650 $filePathU .
'?upload_id=' . rawurlencode(
$NS[
'upload_id']),
654 'Content-Range' =>
'bytes ' . $pos .
'-' . ($pos + $data_len - 1) .
'/' .
$NS[
'fileSize'],
662 $part_no = intval($part_no);
665 if (isset(
$NS[
'Parts']))
667 foreach (
$NS[
'Parts'] as $first_part_no => $part)
669 if ($part[
'part_no'] === ($part_no - 1))
671 $found = $first_part_no;
681 if ($found ===
false)
683 $partFileName =
'/' . trim(
$NS[
'filePath'],
'/') .
'.tmp' . $part_no;
684 if ($arBucket[
'PREFIX'])
686 if (mb_substr($partFileName, 0, mb_strlen($arBucket[
'PREFIX']) + 2) !==
'/' . $arBucket[
'PREFIX'] .
'/')
688 $partFileName =
'/' . $arBucket[
'PREFIX'] . $partFileName;
691 $upload_info = $this->
StartUpload($arBucket, $partFileName,
$NS[
'ContentType']);
694 $upload_info[
'fileSize'] =
'*';
695 $upload_info[
'part_no'] = $part_no;
697 $NS[
'Parts'][$part_no] = $upload_info;
706 $NS[
'Parts'][$found][
'part_no'] = $part_no;
708 (isset(
$NS[
'Parts'][$part_no + 1]))
712 $data_len = strlen(
$data);
713 $NS[
'Parts'][$found][
'fileSize'] =
$NS[
'Parts'][$found][
'filePos'] + $data_len;
716 $filePath =
$NS[
'Parts'][$found][
'filePath'];
719 $this->UploadRange($filePathU, $arBucket,
$NS[
'Parts'][$found],
$data,
$NS[
'Parts'][$found][
'filePos']);
723 && is_array($this->headers)
724 && preg_match(
'/^bytes=(\\d+)-(\\d+)$/', $this->headers[
'Range'], $match)
728 $NS[
'Parts'][$found][
'filePos'] = $match[2] + 1;
731 elseif ($this->status == 200)
737 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
749 $filePath =
'/' . trim(
$NS[
'filePath'],
'/');
750 if ($arBucket[
'PREFIX'])
752 if (mb_substr($filePath, 0, mb_strlen($arBucket[
'PREFIX']) + 2) !==
'/' . $arBucket[
'PREFIX'] .
'/')
754 $filePath =
'/' . $arBucket[
'PREFIX'] . $filePath;
759 $this->UploadRange($filePathU, $arBucket,
$NS,
$data,
$NS[
'filePos']);
763 && is_array($this->headers)
764 && preg_match(
'/^bytes=(\\d+)-(\\d+)$/', $this->headers[
'Range'], $match)
768 $NS[
'filePos'] = $match[2] + 1;
771 elseif ($this->status == 200)
777 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
787 if (isset(
$NS[
'Parts']))
790 $filePath =
'/' . trim(
$NS[
'filePath'],
'/');
791 if ($arBucket[
'PREFIX'])
793 if (mb_substr($filePath, 0, mb_strlen($arBucket[
'PREFIX']) + 2) !==
'/' . $arBucket[
'PREFIX'] .
'/')
795 $filePath =
'/' . $arBucket[
'PREFIX'] . $filePath;
800 $xml =
'<ComposeRequest>';
801 foreach (
$NS[
'Parts'] as $part)
803 $xml .=
'<Component><Name>' . ltrim($part[
'filePath'],
'/') .
'</Name></Component>';
805 $xml .=
'</ComposeRequest>';
808 $arBucket[
'SETTINGS'][
'ACCESS_KEY'],
809 $arBucket[
'SETTINGS'][
'SECRET_KEY'],
812 $filePathU .
'?compose',
816 'x-goog-acl' =>
'public-read',
817 'Content-Type' =>
$NS[
'ContentType'],
821 if ($this->status == 200)
823 foreach (
$NS[
'Parts'] as $part)
825 $this->
DeleteFile($arBucket, $part[
'filePath']);
831 if (defined(
'BX_CLOUDS_ERROR_DEBUG'))
846 if (isset($additional_headers[
'Content-Type']))
848 $ContentType = $additional_headers[
'Content-Type'];
849 unset($additional_headers[
'Content-Type']);
853 $ContentType =
$content ?
'text/plain' :
'';
856 if (!array_key_exists(
'x-goog-api-version', $additional_headers))
858 $additional_headers[
'x-goog-api-version'] =
'1';
861 $RequestMethod =
$verb;
862 $RequestURI = $file_name;
863 $RequestDATE = gmdate(
'D, d M Y H:i:s', time()) .
' GMT';
866 $CanonicalizedAmzHeaders =
'';
867 ksort($additional_headers);
868 foreach ($additional_headers as
$key => $value)
870 if (preg_match(
'/^x-goog-/',
$key))
872 $CanonicalizedAmzHeaders .=
$key .
':' . $value .
"\n";
876 $CanonicalizedResource =
'/' . $bucket . $RequestURI;
878 $StringToSign = $RequestMethod .
"\n\n"
879 . $ContentType .
"\n"
880 . $RequestDATE .
"\n"
881 . $CanonicalizedAmzHeaders . $CanonicalizedResource
884 $Signature = base64_encode($this->
hmacsha1($StringToSign, $secret_key));
885 $Authorization =
'GOOG1 ' .
$access_key .
':' . $Signature;
889 'streamTimeout' => $this->streamTimeout,
891 if (isset($additional_headers[
'option-file-result']))
893 $request->setOutputStream($additional_headers[
'option-file-result']);
896 $request->setHeader(
'Date', $RequestDATE);
897 $request->setHeader(
'Authorization', $Authorization);
898 foreach ($additional_headers as
$key => $value)
900 if (!preg_match(
'/^option-/',
$key))
908 && preg_match(
'#^(http|https)://' . preg_quote($bucket,
'#') .
'(.+)/#', $this->new_end_point, $match))
914 $host = $bucket .
'.commondatastorage.googleapis.com';
918 $this->new_end_point =
'';
922 $this->verb = $RequestMethod;
931 if (defined(
'BX_CLOUDS_TRACE') &&
$verb !==
'GET' &&
$verb !==
'HEAD')
933 $stime = microtime(1);
935 'request_id' => md5((
string)mt_rand()),
943 $request->setHeader(
'Content-type', $ContentType);
946 $this->status =
$request->getStatus();
949 $this->headers[
$key] = is_array($value) ? $value[0] : $value;
951 $this->errstr = implode(
"\n",
$request->getError());
952 $this->errno = $this->errstr ? 255 : 0;
953 $this->result =
$request->getResult();
958 $logRequest[
'time'] = round(microtime(
true) - $stime, 6);
963 if ($this->status == 200)
965 if (isset($additional_headers[
'option-raw-result']))
972 $text = preg_replace(
'/<' .
'\\?XML.*?\\?' .
'>/i',
'', $this->result);
973 if ($obXML->LoadString(
$text))
975 $arXML = $obXML->GetArray();
976 if (is_array($arXML))
993 && isset($this->headers[
'Location'])
997 $this->new_end_point = $this->headers[
'Location'];
1009 elseif ($this->status > 0)
1014 if ($obXML->LoadString($this->result))
1016 $arXML = $obXML->GetArray();
1017 if (is_array($arXML) && is_string($arXML[
'Error'][
'#'][
'Message'][0][
'#']))
1019 $APPLICATION->ThrowException(
GetMessage(
'CLO_STORAGE_GOOGLE_XML_ERROR', [
'#errmsg#' => trim($arXML[
'Error'][
'#'][
'Message'][0][
'#'],
'.')]));
1036 if (mb_strlen(
$key) > 64)
1040 $key = str_pad(
$key, 64, chr(0x00));
1041 $ipad = str_repeat(chr(0x36), 64);
1042 $opad = str_repeat(chr(0x5c), 64);
1043 $hmac = pack(
'H*', sha1((
$key ^ $opad) . pack(
'H*', sha1((
$key ^ $ipad) .
$data))));
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
DeleteFile($arBucket, $filePath)
StartUpload($arBucket, $filePath, $ContentType)
InitiateMultipartUpload($arBucket, &$NS, $filePath, $fileSize, $ContentType)
FileExists($arBucket, $filePath)
UploadPart($arBucket, &$NS, $data)
SendRequest($access_key, $secret_key, $verb, $bucket, $file_name='/', $params='', $content='', $additional_headers=[])
GetFileSRC($arBucket, $arFile, $encoded=true)
FileCopy($arBucket, $arFile, $filePath)
UploadPartNo($arBucket, &$NS, $data, $part_no)
CompleteMultipartUpload($arBucket, &$NS)
SaveFile($arBucket, $filePath, $arFile)
ListFiles($arBucket, $filePath, $bRecursive=false)
CheckSettings($arBucket, &$arSettings)
GetSettingsHTML($arBucket, $bServiceSet, $cur_SERVICE_ID, $bVarsFromForm)
static URLEncode($str, $charset, $file_name=false)
$_SERVER["DOCUMENT_ROOT"]
if(!defined('NOT_CHECK_PERMISSIONS')) $NS
AddMessage2Log($text, $module='', $traceDepth=6, $showArgs=false)
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']