You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-07-13 01:30:17 +02:00
Main build (Jenkins)
This commit is contained in:
@ -1731,6 +1731,10 @@ def test_s3(){
|
|||||||
powershell encoding: 'UTF-8', script:'./oint.exe s3 ListObjectVersions --bucket "test" --basic "test" --prefix "test" --ver "test" --headers "test" --debug --test '
|
powershell encoding: 'UTF-8', script:'./oint.exe s3 ListObjectVersions --bucket "test" --basic "test" --prefix "test" --ver "test" --headers "test" --debug --test '
|
||||||
}
|
}
|
||||||
|
|
||||||
|
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
|
||||||
|
powershell encoding: 'UTF-8', script:'./oint.exe s3 GetObjectDownloadLink --name "test" --bucket "test" --basic "test" --expires "test" --headers "test" --debug --test '
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1731,6 +1731,10 @@ def test_s3(){
|
|||||||
powershell encoding: 'UTF-8', script:'./oint.exe s3 ПолучитьСписокВерсийОбъектов --bucket "test" --basic "test" --prefix "test" --ver "test" --headers "test" --debug --test '
|
powershell encoding: 'UTF-8', script:'./oint.exe s3 ПолучитьСписокВерсийОбъектов --bucket "test" --basic "test" --prefix "test" --ver "test" --headers "test" --debug --test '
|
||||||
}
|
}
|
||||||
|
|
||||||
|
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
|
||||||
|
powershell encoding: 'UTF-8', script:'./oint.exe s3 ПолучитьСсылкуСкачиванияОбъекта --name "test" --bucket "test" --basic "test" --expires "test" --headers "test" --debug --test '
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
5
docs/en/data/S3/GetObjectDownloadLink.json
Normal file
5
docs/en/data/S3/GetObjectDownloadLink.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"URL": "storage-155.s3hoster.by",
|
||||||
|
"AccessKey": "BRN5RKJE67...",
|
||||||
|
"SecretKey": "NNhv+i9PrytpT8Tu0C1N..."
|
||||||
|
}
|
11
docs/en/examples/S3/GetObjectDownloadLink.txt
Normal file
11
docs/en/examples/S3/GetObjectDownloadLink.txt
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
URL = "storage-155.s3hoster.by";
|
||||||
|
AccessKey = "BRN5RKJE67...";
|
||||||
|
SecretKey = "NNhv+i9PrytpT8Tu0C1N...";
|
||||||
|
Region = "BTC";
|
||||||
|
|
||||||
|
BasicData = OPI_S3.GetBasicDataStructure(URL, AccessKey, SecretKey, Region);
|
||||||
|
|
||||||
|
Name = "picture.jpg";
|
||||||
|
Bucket = "opi-gpbucket3";
|
||||||
|
|
||||||
|
Result = OPI_S3.GetObjectDownloadLink(Name, Bucket, BasicData, 7200);
|
@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 16
|
||||||
|
---
|
||||||
|
|
||||||
|
import Tabs from '@theme/Tabs';
|
||||||
|
import TabItem from '@theme/TabItem';
|
||||||
|
|
||||||
|
# Get object download link
|
||||||
|
Get presigned link for object retrieving without authorization
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`Function GetObjectDownloadLink(Val Name, Val Bucket, Val BasicData, Val Expire = 3600, Val Headers = Undefined) Export`
|
||||||
|
|
||||||
|
| Parameter | CLI option | Type | Required | Description |
|
||||||
|
|-|-|-|-|-|
|
||||||
|
| Name | --name | String | ✔ | Name of the object in the bucket |
|
||||||
|
| Bucket | --bucket | String | ✔ | Name of the bucket to put the object |
|
||||||
|
| BasicData | --basic | Structure of KeyAndValue | ✔ | Basic request data. See GetBasicDataStructure |
|
||||||
|
| Expire | --expires | String, Number | ✖ | Link lifetime in seconds. 604800 max. |
|
||||||
|
| Headers | --headers | Map Of KeyAndValue | ✖ | Additional request headers, if necessary |
|
||||||
|
|
||||||
|
|
||||||
|
Returns: String - URL for object retrieving
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
Process at AWS documentation: [Download and upload objects with presigned URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)
|
||||||
|
:::
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
|
||||||
|
```bsl title="1C:Enterprise/OneScript code example"
|
||||||
|
URL = "storage-155.s3hoster.by";
|
||||||
|
AccessKey = "BRN5RKJE67...";
|
||||||
|
SecretKey = "NNhv+i9PrytpT8Tu0C1N...";
|
||||||
|
Region = "BTC";
|
||||||
|
|
||||||
|
BasicData = OPI_S3.GetBasicDataStructure(URL, AccessKey, SecretKey, Region);
|
||||||
|
|
||||||
|
Name = "picture.jpg";
|
||||||
|
Bucket = "opi-gpbucket3";
|
||||||
|
|
||||||
|
Result = OPI_S3.GetObjectDownloadLink(Name, Bucket, BasicData, 7200);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
5
docs/ru/data/S3/ПолучитьСсылкуСкачиванияОбъекта.json
Normal file
5
docs/ru/data/S3/ПолучитьСсылкуСкачиванияОбъекта.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"URL": "storage-155.s3hoster.by",
|
||||||
|
"AccessKey": "BRN5RKJE67...",
|
||||||
|
"SecretKey": "NNhv+i9PrytpT8Tu0C1N..."
|
||||||
|
}
|
11
docs/ru/examples/S3/ПолучитьСсылкуСкачиванияОбъекта.txt
Normal file
11
docs/ru/examples/S3/ПолучитьСсылкуСкачиванияОбъекта.txt
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
URL = "storage-155.s3hoster.by";
|
||||||
|
AccessKey = "BRN5RKJE67...";
|
||||||
|
SecretKey = "NNhv+i9PrytpT8Tu0C1N...";
|
||||||
|
Region = "BTC";
|
||||||
|
|
||||||
|
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
|
||||||
|
|
||||||
|
Наименование = "picture.jpg";
|
||||||
|
Бакет = "opi-gpbucket3";
|
||||||
|
|
||||||
|
Результат = OPI_S3.ПолучитьСсылкуСкачиванияОбъекта(Наименование, Бакет, ОсновныеДанные, 7200);
|
@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 16
|
||||||
|
---
|
||||||
|
|
||||||
|
import Tabs from '@theme/Tabs';
|
||||||
|
import TabItem from '@theme/TabItem';
|
||||||
|
|
||||||
|
# Получить ссылку скачивания объекта
|
||||||
|
Получает прямую ссылку для скачивания объекта без дополнительной авторизации
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`Функция ПолучитьСсылкуСкачиванияОбъекта(Знач Наименование, Знач Бакет, Знач ОсновныеДанные, Знач ВремяЖизни = 3600, Знач Заголовки = Неопределено) Экспорт`
|
||||||
|
|
||||||
|
| Параметр | CLI опция | Тип | Обяз. | Назначение |
|
||||||
|
|-|-|-|-|-|
|
||||||
|
| Наименование | --name | Строка | ✔ | Наименование объекта в бакете |
|
||||||
|
| Бакет | --bucket | Строка | ✔ | Имя бакета для загрузки объекта |
|
||||||
|
| ОсновныеДанные | --basic | Структура Из КлючИЗначение | ✔ | Основные данные запроса. См. ПолучитьСтруктуруДанных |
|
||||||
|
| ВремяЖизни | --expires | Строка, Число | ✖ | Время жизни ссылки в секундах. 604800 максимум |
|
||||||
|
| Заголовки | --headers | Соответствие Из КлючИЗначение | ✖ | Дополнительные заголовки запроса, если необходимо |
|
||||||
|
|
||||||
|
|
||||||
|
Возвращаемое значение: Строка - URL для получения объекта
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
О механизме в документации AWS: [Download and upload objects with presigned URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)
|
||||||
|
:::
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
|
||||||
|
```bsl title="Пример использования для 1С:Предприятие/OneScript"
|
||||||
|
URL = "storage-155.s3hoster.by";
|
||||||
|
AccessKey = "BRN5RKJE67...";
|
||||||
|
SecretKey = "NNhv+i9PrytpT8Tu0C1N...";
|
||||||
|
Region = "BTC";
|
||||||
|
|
||||||
|
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
|
||||||
|
|
||||||
|
Наименование = "picture.jpg";
|
||||||
|
Бакет = "opi-gpbucket3";
|
||||||
|
|
||||||
|
Результат = OPI_S3.ПолучитьСсылкуСкачиванияОбъекта(Наименование, Бакет, ОсновныеДанные, 7200);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1168,6 +1168,39 @@ Function ListObjectVersions(Val Bucket
|
|||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
|
// Get object download link
|
||||||
|
// Get presigned link for object retrieving without authorization
|
||||||
|
//
|
||||||
|
// Note
|
||||||
|
// Process at AWS documentation: [Download and upload objects with presigned URLs](@docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// Name - String - Name of the object in the bucket - name
|
||||||
|
// Bucket - String - Name of the bucket to put the object - bucket
|
||||||
|
// BasicData - Structure of KeyAndValue - Basic request data. See GetBasicDataStructure - basic
|
||||||
|
// Expire - String, Number - Link lifetime in seconds. 604800 max. - expires
|
||||||
|
// Headers - Map Of KeyAndValue - Additional request headers, if necessary - headers
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// String - URL for object retrieving
|
||||||
|
Function GetObjectDownloadLink(Val Name
|
||||||
|
, Val Bucket
|
||||||
|
, Val BasicData
|
||||||
|
, Val Expire = 3600
|
||||||
|
, Val Headers = Undefined) Export
|
||||||
|
|
||||||
|
BasicData_ = OPI_Tools.CopyCollection(BasicData);
|
||||||
|
|
||||||
|
CheckBasicData(BasicData_);
|
||||||
|
FillObjectURL(BasicData_, Name, Bucket);
|
||||||
|
|
||||||
|
Signature = CreateURLSignature(BasicData_, Name, "GET", Expire, Headers);
|
||||||
|
URL = BasicData_["URL"] + Signature;
|
||||||
|
|
||||||
|
Return URL;
|
||||||
|
|
||||||
|
EndFunction
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
@ -1178,16 +1211,99 @@ EndFunction
|
|||||||
|
|
||||||
Function CreateAuthorizationHeader(Val DataStructure, Val Request, Val Connection, Val Method)
|
Function CreateAuthorizationHeader(Val DataStructure, Val Request, Val Connection, Val Method)
|
||||||
|
|
||||||
AccessKey = DataStructure["AccessKey"];
|
AccessKey = DataStructure["AccessKey"];
|
||||||
SecretKey = DataStructure["SecretKey"];
|
|
||||||
Region = DataStructure["Region"];
|
|
||||||
Service = DataStructure["Service"];
|
|
||||||
|
|
||||||
CurrentDate = CurrentUniversalDate();
|
CurrentDate = CurrentUniversalDate();
|
||||||
|
|
||||||
Request.Headers.Insert("x-amz-date", OPI_Tools.ISOTimestamp(CurrentDate));
|
Request.Headers.Insert("x-amz-date", OPI_Tools.ISOTimestamp(CurrentDate));
|
||||||
Request.Headers.Insert("Host" , Connection.Host);
|
Request.Headers.Insert("Host" , Connection.Host);
|
||||||
|
|
||||||
|
MainParts = GetMainSignatureParts(DataStructure, Request, Connection, Method, CurrentDate);
|
||||||
|
|
||||||
|
Scope = MainParts["Scope"];
|
||||||
|
Signature = MainParts["Signature"];
|
||||||
|
HeadersKeys = MainParts["HeadersKeys"];
|
||||||
|
|
||||||
|
AuthorizationHeader = FormAuthorisationHeader(AccessKey, Scope, Signature, HeadersKeys);
|
||||||
|
|
||||||
|
Return AuthorizationHeader;
|
||||||
|
|
||||||
|
EndFunction
|
||||||
|
|
||||||
|
Function CreateURLSignature(Val DataStructure, Val Name, Val Method, Val Expire, Val Headers)
|
||||||
|
|
||||||
|
AccessKey = DataStructure["AccessKey"];
|
||||||
|
SecretKey = DataStructure["SecretKey"];
|
||||||
|
Region = DataStructure["Region"];
|
||||||
|
Service = DataStructure["Service"];
|
||||||
|
URL = DataStructure["URL"];
|
||||||
|
|
||||||
|
SplitedURL = OPI_Tools.SplitURL(URL);
|
||||||
|
|
||||||
|
Host = SplitedURL["Host"];
|
||||||
|
Address = SplitedURL["Address"];
|
||||||
|
|
||||||
|
AdditionalHeaders = New Structure("Host", Host);
|
||||||
|
AddAdditionalHeaders(Headers, AdditionalHeaders);
|
||||||
|
|
||||||
|
CurrentDate = CurrentUniversalDate();
|
||||||
|
SignKey = GetSignatureKey(SecretKey, Region, Service, CurrentDate);
|
||||||
|
Scope = CreateScope(Region, Service, CurrentDate);
|
||||||
|
Timestamp = OPI_Tools.ISOTimestamp(CurrentDate);
|
||||||
|
HeadersKeys = GetHeadersKeysString(Headers);
|
||||||
|
Base = EncodeString(AccessKey + "/" + Scope, StringEncodingMethod.URLencoding);
|
||||||
|
|
||||||
|
HeadersString = GetHeadersString(Headers);
|
||||||
|
HashString = "UNSIGNED-PAYLOAD";
|
||||||
|
|
||||||
|
URLParameters = New ValueTable;
|
||||||
|
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Algorithm" , "AWS4-HMAC-SHA256");
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Credential" , Base);
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Date" , Timestamp);
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Expires" , Expire);
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-SignedHeaders", HeadersKeys);
|
||||||
|
|
||||||
|
ParametersString = OPI_Tools.RequestParametersToString(URLParameters);
|
||||||
|
ParametersString = Right(ParametersString, StrLen(ParametersString) - 1);
|
||||||
|
RequestTemplate = "";
|
||||||
|
|
||||||
|
For N = 1 To 6 Do
|
||||||
|
|
||||||
|
RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = 6, "", Chars.LF);
|
||||||
|
|
||||||
|
EndDo;
|
||||||
|
|
||||||
|
CanonicalRequest = StrTemplate(RequestTemplate
|
||||||
|
, Method
|
||||||
|
, Address
|
||||||
|
, ParametersString
|
||||||
|
, HeadersString
|
||||||
|
, HeadersKeys
|
||||||
|
, HashString);
|
||||||
|
|
||||||
|
StringToSign = CreateSignatureString(CanonicalRequest, Scope, CurrentDate);
|
||||||
|
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
||||||
|
Signature = Lower(ПолучитьHexСтрокуИзДвоичныхДанных(Signature));
|
||||||
|
|
||||||
|
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Signature", Signature);
|
||||||
|
|
||||||
|
URLSign = OPI_Tools.RequestParametersToString(URLParameters);
|
||||||
|
|
||||||
|
Return URLSign;
|
||||||
|
|
||||||
|
EndFunction
|
||||||
|
|
||||||
|
Function GetMainSignatureParts(Val DataStructure
|
||||||
|
, Val Request
|
||||||
|
, Val Connection
|
||||||
|
, Val Method
|
||||||
|
, Val CurrentDate)
|
||||||
|
|
||||||
|
SecretKey = DataStructure["SecretKey"];
|
||||||
|
Region = DataStructure["Region"];
|
||||||
|
Service = DataStructure["Service"];
|
||||||
|
|
||||||
SignKey = GetSignatureKey(SecretKey, Region, Service, CurrentDate);
|
SignKey = GetSignatureKey(SecretKey, Region, Service, CurrentDate);
|
||||||
CanonicalRequest = CreateCanonicalRequest(Request, Connection, Method);
|
CanonicalRequest = CreateCanonicalRequest(Request, Connection, Method);
|
||||||
Scope = CreateScope(Region, Service, CurrentDate);
|
Scope = CreateScope(Region, Service, CurrentDate);
|
||||||
@ -1196,10 +1312,15 @@ Function CreateAuthorizationHeader(Val DataStructure, Val Request, Val Connectio
|
|||||||
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
||||||
Signature = Lower(ПолучитьHexСтрокуИзДвоичныхДанных(Signature));
|
Signature = Lower(ПолучитьHexСтрокуИзДвоичныхДанных(Signature));
|
||||||
|
|
||||||
HeadersKeys = GetHeadersKeysString(Request);
|
HeadersKeys = GetHeadersKeysString(Request.Headers);
|
||||||
AuthorizationHeader = FormAuthorisationHeader(AccessKey, Scope, Signature, HeadersKeys);
|
|
||||||
|
|
||||||
Return AuthorizationHeader;
|
PartsStructure = New Structure;
|
||||||
|
|
||||||
|
PartsStructure.Insert("Scope" , Scope);
|
||||||
|
PartsStructure.Insert("Signature" , Signature);
|
||||||
|
PartsStructure.Insert("HeadersKeys", HeadersKeys);
|
||||||
|
|
||||||
|
Return PartsStructure;
|
||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
@ -1223,11 +1344,11 @@ EndFunction
|
|||||||
|
|
||||||
Function CreateCanonicalRequest(Val Request, Val Connection, Val Method)
|
Function CreateCanonicalRequest(Val Request, Val Connection, Val Method)
|
||||||
|
|
||||||
RequestBody = OPI_Tools.GetRequestBody(Request);
|
|
||||||
HashSum = OPI_Cryptography.Hash(RequestBody, HashFunction.SHA256);
|
|
||||||
Request.Headers.Insert("x-amz-content-sha256", Lower(ПолучитьHexСтрокуИзДвоичныхДанных(HashSum)));
|
|
||||||
|
|
||||||
RequestTemplate = "";
|
RequestTemplate = "";
|
||||||
|
RequestBody = OPI_Tools.GetRequestBody(Request);
|
||||||
|
HashSum = OPI_Cryptography.Hash(RequestBody, HashFunction.SHA256);
|
||||||
|
|
||||||
|
Request.Headers.Insert("x-amz-content-sha256", Lower(ПолучитьHexСтрокуИзДвоичныхДанных(HashSum)));
|
||||||
|
|
||||||
For N = 1 To 6 Do
|
For N = 1 To 6 Do
|
||||||
|
|
||||||
@ -1238,8 +1359,8 @@ Function CreateCanonicalRequest(Val Request, Val Connection, Val Method)
|
|||||||
Method = Upper(Method);
|
Method = Upper(Method);
|
||||||
URIString = GetURIString(Request);
|
URIString = GetURIString(Request);
|
||||||
ParameterString = GetParamsString(Request);
|
ParameterString = GetParamsString(Request);
|
||||||
HeadersString = GetHeadersString(Request);
|
HeadersString = GetHeadersString(Request.Headers);
|
||||||
KeysString = GetHeadersKeysString(Request);
|
KeysString = GetHeadersKeysString(Request.Headers);
|
||||||
|
|
||||||
HashString = Lower(ПолучитьHexСтрокуИзДвоичныхДанных(HashSum));
|
HashString = Lower(ПолучитьHexСтрокуИзДвоичныхДанных(HashSum));
|
||||||
|
|
||||||
@ -1330,10 +1451,9 @@ Function GetParamsString(Request)
|
|||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function GetHeadersString(Val Request)
|
Function GetHeadersString(Val Headers)
|
||||||
|
|
||||||
HeadersList = New ValueList;
|
HeadersList = New ValueList;
|
||||||
Headers = Request.Headers;
|
|
||||||
|
|
||||||
For Each Title In Headers Do
|
For Each Title In Headers Do
|
||||||
|
|
||||||
@ -1358,10 +1478,9 @@ Function GetHeadersString(Val Request)
|
|||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function GetHeadersKeysString(Val Request)
|
Function GetHeadersKeysString(Val Headers)
|
||||||
|
|
||||||
HeadersList = New ValueList;
|
HeadersList = New ValueList;
|
||||||
Headers = Request.Headers;
|
|
||||||
|
|
||||||
For Each Title In Headers Do
|
For Each Title In Headers Do
|
||||||
|
|
||||||
|
@ -2162,6 +2162,7 @@ Procedure AWS_ObjectsManagement() Export
|
|||||||
S3_ListObjects(TestParameters);
|
S3_ListObjects(TestParameters);
|
||||||
S3_ListObjectVersions(TestParameters);
|
S3_ListObjectVersions(TestParameters);
|
||||||
S3_GetObject(TestParameters);
|
S3_GetObject(TestParameters);
|
||||||
|
S3_GetObjectDownloadLink(TestParameters);
|
||||||
S3_DeleteObject(TestParameters);
|
S3_DeleteObject(TestParameters);
|
||||||
S3_DeleteBucket(TestParameters);
|
S3_DeleteBucket(TestParameters);
|
||||||
|
|
||||||
@ -15567,6 +15568,35 @@ Procedure S3_AbortMultipartUpload(FunctionParameters)
|
|||||||
|
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure S3_GetObjectDownloadLink(FunctionParameters)
|
||||||
|
|
||||||
|
Image = FunctionParameters["Picture"]; // SKIP
|
||||||
|
OPI_TypeConversion.GetBinaryData(Image); // SKIP
|
||||||
|
RequiredSize = Image.Size(); // SKIP
|
||||||
|
|
||||||
|
URL = FunctionParameters["S3_URL"];
|
||||||
|
AccessKey = FunctionParameters["S3_AccessKey"];
|
||||||
|
SecretKey = FunctionParameters["S3_SecretKey"];
|
||||||
|
Region = "BTC";
|
||||||
|
|
||||||
|
BasicData = OPI_S3.GetBasicDataStructure(URL, AccessKey, SecretKey, Region);
|
||||||
|
|
||||||
|
Name = "picture.jpg";
|
||||||
|
Bucket = "opi-gpbucket3";
|
||||||
|
|
||||||
|
Result = OPI_S3.GetObjectDownloadLink(Name, Bucket, BasicData, 7200);
|
||||||
|
|
||||||
|
// END
|
||||||
|
|
||||||
|
OPI_TestDataRetrieval.WriteLog(Result, "GetObjectDownloadLink", "S3");
|
||||||
|
OPI_TestDataRetrieval.Check_String(Result);
|
||||||
|
|
||||||
|
Result = OPI_Tools.Get(Result);
|
||||||
|
|
||||||
|
OPI_TestDataRetrieval.Check_BinaryData(Result, RequiredSize);
|
||||||
|
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
//@skip-check module-structure-top-region
|
//@skip-check module-structure-top-region
|
||||||
//@skip-check module-structure-method-in-regions
|
//@skip-check module-structure-method-in-regions
|
||||||
//@skip-check wrong-string-literal-content
|
//@skip-check wrong-string-literal-content
|
||||||
|
|
||||||
#Region Internal
|
#Region Internal
|
||||||
|
|
||||||
#Region HTTPMethods
|
#Region HTTPMethods
|
||||||
@ -190,20 +191,24 @@ Function CreateRequest(Val Address, Val AdditionalHeaders = "", Val DataType = "
|
|||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function CreateConnection(Val Host, Val Safe = True, Val User = "", Val Password = "") Export
|
Function CreateConnection(Val Host, Val Safe = True, Val User = "", Val Password = "", Val Port = "") Export
|
||||||
|
|
||||||
|
If Not ValueIsFilled(Port) Then
|
||||||
|
Port = ?(Safe, 443, 80);
|
||||||
|
EndIf;
|
||||||
|
|
||||||
If Safe Then
|
If Safe Then
|
||||||
|
|
||||||
If IsOneScript() Then
|
If IsOneScript() Then
|
||||||
Connection = New HTTPConnection(Host, 443, User, Password, , 3000);
|
Connection = New HTTPConnection(Host, Port, User, Password, , 3000);
|
||||||
Else
|
Else
|
||||||
SSL = New OpenSSLSecureConnection;
|
SSL = New OpenSSLSecureConnection;
|
||||||
Connection = New HTTPConnection(Host, 443, User, Password, , 3000, SSL);
|
Connection = New HTTPConnection(Host, Port, User, Password, , 3000, SSL);
|
||||||
EndIf;
|
EndIf;
|
||||||
|
|
||||||
Else
|
Else
|
||||||
|
|
||||||
Connection = New HTTPConnection(Host, 80, User, Password, , 3000, SSL);
|
Connection = New HTTPConnection(Host, Port, User, Password, , 3000);
|
||||||
|
|
||||||
EndIf;
|
EndIf;
|
||||||
|
|
||||||
@ -227,8 +232,9 @@ Function ExecuteRequest(Val Request, Val Connection, Val View, Val ResponseFile
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
Request.ResourceAddress = Address;
|
Request.ResourceAddress = Address;
|
||||||
|
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile, FullResponse);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile, FullResponse);
|
||||||
@ -344,7 +350,6 @@ Function SplitURL(Val URL) Export
|
|||||||
|
|
||||||
URL = StrReplace(URL, "https://", "");
|
URL = StrReplace(URL, "https://", "");
|
||||||
URL = StrReplace(URL, "http://" , "");
|
URL = StrReplace(URL, "http://" , "");
|
||||||
URL = StrReplace(URL, ":443" , "");
|
|
||||||
|
|
||||||
If StrFind(URL, "/") = 0 Then
|
If StrFind(URL, "/") = 0 Then
|
||||||
Address = "";
|
Address = "";
|
||||||
@ -354,6 +359,20 @@ Function SplitURL(Val URL) Export
|
|||||||
Host = Left(URL, StrFind(URL, "/", SearchDirection.FromBegin) - 1);
|
Host = Left(URL, StrFind(URL, "/", SearchDirection.FromBegin) - 1);
|
||||||
EndIf;
|
EndIf;
|
||||||
|
|
||||||
|
If StrFind(Host, ":") <> 0 Then
|
||||||
|
|
||||||
|
ServerPort = StrSplit(Host, ":");
|
||||||
|
Host = ServerPort[0];
|
||||||
|
Port = ServerPort[1];
|
||||||
|
|
||||||
|
OPI_TypeConversion.GetNumber(Port);
|
||||||
|
|
||||||
|
Else
|
||||||
|
|
||||||
|
Port = ?(SecureConnection, 443, 80);
|
||||||
|
|
||||||
|
EndIf;
|
||||||
|
|
||||||
If IsOneScript() And SecureConnection Then
|
If IsOneScript() And SecureConnection Then
|
||||||
Host = "https://" + Host;
|
Host = "https://" + Host;
|
||||||
EndIf;
|
EndIf;
|
||||||
@ -362,6 +381,7 @@ Function SplitURL(Val URL) Export
|
|||||||
ReturnStructure.Insert("Host" , Host);
|
ReturnStructure.Insert("Host" , Host);
|
||||||
ReturnStructure.Insert("Address" , Address);
|
ReturnStructure.Insert("Address" , Address);
|
||||||
ReturnStructure.Insert("Safe" , SecureConnection);
|
ReturnStructure.Insert("Safe" , SecureConnection);
|
||||||
|
ReturnStructure.Insert("Port" , Port);
|
||||||
|
|
||||||
Return ReturnStructure;
|
Return ReturnStructure;
|
||||||
|
|
||||||
@ -935,6 +955,41 @@ Procedure AddField(Val Name, Val Value, Val Type, Collection) Export
|
|||||||
|
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure AddKeyValue(Table, Val Key, Val Value) Export
|
||||||
|
|
||||||
|
KeyExist = False;
|
||||||
|
ValueExist = False;
|
||||||
|
|
||||||
|
For Each Coloumn In Table.Columns Do
|
||||||
|
|
||||||
|
If Coloumn.Name = "Key" Then
|
||||||
|
|
||||||
|
KeyExist = True;
|
||||||
|
|
||||||
|
ElsIf Coloumn.Name = "Value" Then
|
||||||
|
|
||||||
|
ValueExist = True;
|
||||||
|
|
||||||
|
Else
|
||||||
|
Continue;
|
||||||
|
EndIf;
|
||||||
|
|
||||||
|
EndDo;
|
||||||
|
|
||||||
|
If Not KeyExist Then
|
||||||
|
Table.Columns.Add("Key");
|
||||||
|
EndIf;
|
||||||
|
|
||||||
|
If Not ValueExist Then
|
||||||
|
Table.Columns.Add("Value");
|
||||||
|
EndIf;
|
||||||
|
|
||||||
|
NewValue = Table.Add();
|
||||||
|
NewValue.Key = Key;
|
||||||
|
NewValue.Value = Value;
|
||||||
|
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
@ -952,9 +1007,10 @@ Function ExecuteRequestWithBody(Val URL, Val View, Val Parameters = "", Val Addi
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
Request = CreateRequestWithBody(Address, Parameters, AdditionalHeaders, JSON);
|
Request = CreateRequestWithBody(Address, Parameters, AdditionalHeaders, JSON);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile, FullResponse);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile, FullResponse);
|
||||||
|
|
||||||
Return Response;
|
Return Response;
|
||||||
@ -968,9 +1024,10 @@ Function ExecuteRequestWithBinaryData(Val URL, Val View, Val Data, Val Additiona
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
Request = CreateRequest(Address, AdditionalHeaders, DataType);
|
Request = CreateRequest(Address, AdditionalHeaders, DataType);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
|
|
||||||
If Not Data.Size() = 0 Then
|
If Not Data.Size() = 0 Then
|
||||||
Request.SetBodyFromBinary(Data);
|
Request.SetBodyFromBinary(Data);
|
||||||
@ -993,9 +1050,10 @@ Function ExecuteRequestWithoutBody(Val URL, Val View, Val Parameters = "", Val A
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"] + RequestParametersToString(Parameters);
|
Address = URLStructure["Address"] + RequestParametersToString(Parameters);
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
Request = CreateRequest(Address, AdditionalHeaders);
|
Request = CreateRequest(Address, AdditionalHeaders);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
|
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
||||||
|
|
||||||
@ -1018,11 +1076,12 @@ Function ExecuteMultipartRequest(Val URL, Val View, Val Parameters = "", Val Fil
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
RequestBody = GetTempFileName();
|
RequestBody = GetTempFileName();
|
||||||
|
|
||||||
Request = CreateMultipartRequest(Address, Parameters, Files, AdditionalHeaders, RequestBody, ContentType);
|
Request = CreateMultipartRequest(Address, Parameters, Files, AdditionalHeaders, RequestBody, ContentType);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
||||||
|
|
||||||
Request = Undefined;
|
Request = Undefined;
|
||||||
@ -1040,11 +1099,12 @@ Function ExecuteMultipartRelatedRequest(Val URL, Val View, Val JSON = "", Val Fi
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
RequestBody = GetTempFileName();
|
RequestBody = GetTempFileName();
|
||||||
|
|
||||||
Request = CreateMultipartRelatedRequest(Address, Files, JSON, AdditionalHeaders, RequestBody);
|
Request = CreateMultipartRelatedRequest(Address, Files, JSON, AdditionalHeaders, RequestBody);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
|
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
||||||
|
|
||||||
|
@ -1168,6 +1168,39 @@ Function ListObjectVersions(Val Bucket
|
|||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
|
// Get object download link
|
||||||
|
// Get presigned link for object retrieving without authorization
|
||||||
|
//
|
||||||
|
// Note
|
||||||
|
// Process at AWS documentation: [Download and upload objects with presigned URLs](@docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// Name - String - Name of the object in the bucket - name
|
||||||
|
// Bucket - String - Name of the bucket to put the object - bucket
|
||||||
|
// BasicData - Structure of KeyAndValue - Basic request data. See GetBasicDataStructure - basic
|
||||||
|
// Expire - String, Number - Link lifetime in seconds. 604800 max. - expires
|
||||||
|
// Headers - Map Of KeyAndValue - Additional request headers, if necessary - headers
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// String - URL for object retrieving
|
||||||
|
Function GetObjectDownloadLink(Val Name
|
||||||
|
, Val Bucket
|
||||||
|
, Val BasicData
|
||||||
|
, Val Expire = 3600
|
||||||
|
, Val Headers = Undefined) Export
|
||||||
|
|
||||||
|
BasicData_ = OPI_Tools.CopyCollection(BasicData);
|
||||||
|
|
||||||
|
CheckBasicData(BasicData_);
|
||||||
|
FillObjectURL(BasicData_, Name, Bucket);
|
||||||
|
|
||||||
|
Signature = CreateURLSignature(BasicData_, Name, "GET", Expire, Headers);
|
||||||
|
URL = BasicData_["URL"] + Signature;
|
||||||
|
|
||||||
|
Return URL;
|
||||||
|
|
||||||
|
EndFunction
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
@ -1178,16 +1211,99 @@ EndFunction
|
|||||||
|
|
||||||
Function CreateAuthorizationHeader(Val DataStructure, Val Request, Val Connection, Val Method)
|
Function CreateAuthorizationHeader(Val DataStructure, Val Request, Val Connection, Val Method)
|
||||||
|
|
||||||
AccessKey = DataStructure["AccessKey"];
|
AccessKey = DataStructure["AccessKey"];
|
||||||
SecretKey = DataStructure["SecretKey"];
|
|
||||||
Region = DataStructure["Region"];
|
|
||||||
Service = DataStructure["Service"];
|
|
||||||
|
|
||||||
CurrentDate = CurrentUniversalDate();
|
CurrentDate = CurrentUniversalDate();
|
||||||
|
|
||||||
Request.Headers.Insert("x-amz-date", OPI_Tools.ISOTimestamp(CurrentDate));
|
Request.Headers.Insert("x-amz-date", OPI_Tools.ISOTimestamp(CurrentDate));
|
||||||
Request.Headers.Insert("Host" , Connection.Host);
|
Request.Headers.Insert("Host" , Connection.Host);
|
||||||
|
|
||||||
|
MainParts = GetMainSignatureParts(DataStructure, Request, Connection, Method, CurrentDate);
|
||||||
|
|
||||||
|
Scope = MainParts["Scope"];
|
||||||
|
Signature = MainParts["Signature"];
|
||||||
|
HeadersKeys = MainParts["HeadersKeys"];
|
||||||
|
|
||||||
|
AuthorizationHeader = FormAuthorisationHeader(AccessKey, Scope, Signature, HeadersKeys);
|
||||||
|
|
||||||
|
Return AuthorizationHeader;
|
||||||
|
|
||||||
|
EndFunction
|
||||||
|
|
||||||
|
Function CreateURLSignature(Val DataStructure, Val Name, Val Method, Val Expire, Val Headers)
|
||||||
|
|
||||||
|
AccessKey = DataStructure["AccessKey"];
|
||||||
|
SecretKey = DataStructure["SecretKey"];
|
||||||
|
Region = DataStructure["Region"];
|
||||||
|
Service = DataStructure["Service"];
|
||||||
|
URL = DataStructure["URL"];
|
||||||
|
|
||||||
|
SplitedURL = OPI_Tools.SplitURL(URL);
|
||||||
|
|
||||||
|
Host = SplitedURL["Host"];
|
||||||
|
Address = SplitedURL["Address"];
|
||||||
|
|
||||||
|
AdditionalHeaders = New Structure("Host", Host);
|
||||||
|
AddAdditionalHeaders(Headers, AdditionalHeaders);
|
||||||
|
|
||||||
|
CurrentDate = CurrentUniversalDate();
|
||||||
|
SignKey = GetSignatureKey(SecretKey, Region, Service, CurrentDate);
|
||||||
|
Scope = CreateScope(Region, Service, CurrentDate);
|
||||||
|
Timestamp = OPI_Tools.ISOTimestamp(CurrentDate);
|
||||||
|
HeadersKeys = GetHeadersKeysString(Headers);
|
||||||
|
Base = EncodeString(AccessKey + "/" + Scope, StringEncodingMethod.URLencoding);
|
||||||
|
|
||||||
|
HeadersString = GetHeadersString(Headers);
|
||||||
|
HashString = "UNSIGNED-PAYLOAD";
|
||||||
|
|
||||||
|
URLParameters = New ValueTable;
|
||||||
|
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Algorithm" , "AWS4-HMAC-SHA256");
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Credential" , Base);
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Date" , Timestamp);
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Expires" , Expire);
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-SignedHeaders", HeadersKeys);
|
||||||
|
|
||||||
|
ParametersString = OPI_Tools.RequestParametersToString(URLParameters);
|
||||||
|
ParametersString = Right(ParametersString, StrLen(ParametersString) - 1);
|
||||||
|
RequestTemplate = "";
|
||||||
|
|
||||||
|
For N = 1 To 6 Do
|
||||||
|
|
||||||
|
RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = 6, "", Chars.LF);
|
||||||
|
|
||||||
|
EndDo;
|
||||||
|
|
||||||
|
CanonicalRequest = StrTemplate(RequestTemplate
|
||||||
|
, Method
|
||||||
|
, Address
|
||||||
|
, ParametersString
|
||||||
|
, HeadersString
|
||||||
|
, HeadersKeys
|
||||||
|
, HashString);
|
||||||
|
|
||||||
|
StringToSign = CreateSignatureString(CanonicalRequest, Scope, CurrentDate);
|
||||||
|
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
||||||
|
Signature = Lower(GetHexStringFromBinaryData(Signature));
|
||||||
|
|
||||||
|
|
||||||
|
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Signature", Signature);
|
||||||
|
|
||||||
|
URLSign = OPI_Tools.RequestParametersToString(URLParameters);
|
||||||
|
|
||||||
|
Return URLSign;
|
||||||
|
|
||||||
|
EndFunction
|
||||||
|
|
||||||
|
Function GetMainSignatureParts(Val DataStructure
|
||||||
|
, Val Request
|
||||||
|
, Val Connection
|
||||||
|
, Val Method
|
||||||
|
, Val CurrentDate)
|
||||||
|
|
||||||
|
SecretKey = DataStructure["SecretKey"];
|
||||||
|
Region = DataStructure["Region"];
|
||||||
|
Service = DataStructure["Service"];
|
||||||
|
|
||||||
SignKey = GetSignatureKey(SecretKey, Region, Service, CurrentDate);
|
SignKey = GetSignatureKey(SecretKey, Region, Service, CurrentDate);
|
||||||
CanonicalRequest = CreateCanonicalRequest(Request, Connection, Method);
|
CanonicalRequest = CreateCanonicalRequest(Request, Connection, Method);
|
||||||
Scope = CreateScope(Region, Service, CurrentDate);
|
Scope = CreateScope(Region, Service, CurrentDate);
|
||||||
@ -1196,10 +1312,15 @@ Function CreateAuthorizationHeader(Val DataStructure, Val Request, Val Connectio
|
|||||||
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
||||||
Signature = Lower(GetHexStringFromBinaryData(Signature));
|
Signature = Lower(GetHexStringFromBinaryData(Signature));
|
||||||
|
|
||||||
HeadersKeys = GetHeadersKeysString(Request);
|
HeadersKeys = GetHeadersKeysString(Request.Headers);
|
||||||
AuthorizationHeader = FormAuthorisationHeader(AccessKey, Scope, Signature, HeadersKeys);
|
|
||||||
|
|
||||||
Return AuthorizationHeader;
|
PartsStructure = New Structure;
|
||||||
|
|
||||||
|
PartsStructure.Insert("Scope" , Scope);
|
||||||
|
PartsStructure.Insert("Signature" , Signature);
|
||||||
|
PartsStructure.Insert("HeadersKeys", HeadersKeys);
|
||||||
|
|
||||||
|
Return PartsStructure;
|
||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
@ -1223,11 +1344,11 @@ EndFunction
|
|||||||
|
|
||||||
Function CreateCanonicalRequest(Val Request, Val Connection, Val Method)
|
Function CreateCanonicalRequest(Val Request, Val Connection, Val Method)
|
||||||
|
|
||||||
RequestBody = OPI_Tools.GetRequestBody(Request);
|
|
||||||
HashSum = OPI_Cryptography.Hash(RequestBody, HashFunction.SHA256);
|
|
||||||
Request.Headers.Insert("x-amz-content-sha256", Lower(GetHexStringFromBinaryData(HashSum)));
|
|
||||||
|
|
||||||
RequestTemplate = "";
|
RequestTemplate = "";
|
||||||
|
RequestBody = OPI_Tools.GetRequestBody(Request);
|
||||||
|
HashSum = OPI_Cryptography.Hash(RequestBody, HashFunction.SHA256);
|
||||||
|
|
||||||
|
Request.Headers.Insert("x-amz-content-sha256", Lower(GetHexStringFromBinaryData(HashSum)));
|
||||||
|
|
||||||
For N = 1 To 6 Do
|
For N = 1 To 6 Do
|
||||||
|
|
||||||
@ -1238,8 +1359,8 @@ Function CreateCanonicalRequest(Val Request, Val Connection, Val Method)
|
|||||||
Method = Upper(Method);
|
Method = Upper(Method);
|
||||||
URIString = GetURIString(Request);
|
URIString = GetURIString(Request);
|
||||||
ParameterString = GetParamsString(Request);
|
ParameterString = GetParamsString(Request);
|
||||||
HeadersString = GetHeadersString(Request);
|
HeadersString = GetHeadersString(Request.Headers);
|
||||||
KeysString = GetHeadersKeysString(Request);
|
KeysString = GetHeadersKeysString(Request.Headers);
|
||||||
|
|
||||||
HashString = Lower(GetHexStringFromBinaryData(HashSum));
|
HashString = Lower(GetHexStringFromBinaryData(HashSum));
|
||||||
|
|
||||||
@ -1330,10 +1451,9 @@ Function GetParamsString(Request)
|
|||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function GetHeadersString(Val Request)
|
Function GetHeadersString(Val Headers)
|
||||||
|
|
||||||
HeadersList = New ValueList;
|
HeadersList = New ValueList;
|
||||||
Headers = Request.Headers;
|
|
||||||
|
|
||||||
For Each Title In Headers Do
|
For Each Title In Headers Do
|
||||||
|
|
||||||
@ -1358,10 +1478,9 @@ Function GetHeadersString(Val Request)
|
|||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function GetHeadersKeysString(Val Request)
|
Function GetHeadersKeysString(Val Headers)
|
||||||
|
|
||||||
HeadersList = New ValueList;
|
HeadersList = New ValueList;
|
||||||
Headers = Request.Headers;
|
|
||||||
|
|
||||||
For Each Title In Headers Do
|
For Each Title In Headers Do
|
||||||
|
|
||||||
|
@ -2162,6 +2162,7 @@ Procedure AWS_ObjectsManagement() Export
|
|||||||
S3_ListObjects(TestParameters);
|
S3_ListObjects(TestParameters);
|
||||||
S3_ListObjectVersions(TestParameters);
|
S3_ListObjectVersions(TestParameters);
|
||||||
S3_GetObject(TestParameters);
|
S3_GetObject(TestParameters);
|
||||||
|
S3_GetObjectDownloadLink(TestParameters);
|
||||||
S3_DeleteObject(TestParameters);
|
S3_DeleteObject(TestParameters);
|
||||||
S3_DeleteBucket(TestParameters);
|
S3_DeleteBucket(TestParameters);
|
||||||
|
|
||||||
@ -15567,6 +15568,35 @@ Procedure S3_AbortMultipartUpload(FunctionParameters)
|
|||||||
|
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure S3_GetObjectDownloadLink(FunctionParameters)
|
||||||
|
|
||||||
|
Image = FunctionParameters["Picture"]; // SKIP
|
||||||
|
OPI_TypeConversion.GetBinaryData(Image); // SKIP
|
||||||
|
RequiredSize = Image.Size(); // SKIP
|
||||||
|
|
||||||
|
URL = FunctionParameters["S3_URL"];
|
||||||
|
AccessKey = FunctionParameters["S3_AccessKey"];
|
||||||
|
SecretKey = FunctionParameters["S3_SecretKey"];
|
||||||
|
Region = "BTC";
|
||||||
|
|
||||||
|
BasicData = OPI_S3.GetBasicDataStructure(URL, AccessKey, SecretKey, Region);
|
||||||
|
|
||||||
|
Name = "picture.jpg";
|
||||||
|
Bucket = "opi-gpbucket3";
|
||||||
|
|
||||||
|
Result = OPI_S3.GetObjectDownloadLink(Name, Bucket, BasicData, 7200);
|
||||||
|
|
||||||
|
// END
|
||||||
|
|
||||||
|
OPI_TestDataRetrieval.WriteLog(Result, "GetObjectDownloadLink", "S3");
|
||||||
|
OPI_TestDataRetrieval.Check_String(Result);
|
||||||
|
|
||||||
|
Result = OPI_Tools.Get(Result);
|
||||||
|
|
||||||
|
OPI_TestDataRetrieval.Check_BinaryData(Result, RequiredSize);
|
||||||
|
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
//@skip-check module-structure-top-region
|
//@skip-check module-structure-top-region
|
||||||
//@skip-check module-structure-method-in-regions
|
//@skip-check module-structure-method-in-regions
|
||||||
//@skip-check wrong-string-literal-content
|
//@skip-check wrong-string-literal-content
|
||||||
|
|
||||||
#Region Internal
|
#Region Internal
|
||||||
|
|
||||||
#Region HTTPMethods
|
#Region HTTPMethods
|
||||||
@ -190,20 +191,24 @@ Function CreateRequest(Val Address, Val AdditionalHeaders = "", Val DataType = "
|
|||||||
|
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
Function CreateConnection(Val Host, Val Safe = True, Val User = "", Val Password = "") Export
|
Function CreateConnection(Val Host, Val Safe = True, Val User = "", Val Password = "", Val Port = "") Export
|
||||||
|
|
||||||
|
If Not ValueIsFilled(Port) Then
|
||||||
|
Port = ?(Safe, 443, 80);
|
||||||
|
EndIf;
|
||||||
|
|
||||||
If Safe Then
|
If Safe Then
|
||||||
|
|
||||||
If IsOneScript() Then
|
If IsOneScript() Then
|
||||||
Connection = New HTTPConnection(Host, 443, User, Password, , 3000);
|
Connection = New HTTPConnection(Host, Port, User, Password, , 3000);
|
||||||
Else
|
Else
|
||||||
SSL = New OpenSSLSecureConnection;
|
SSL = New OpenSSLSecureConnection;
|
||||||
Connection = New HTTPConnection(Host, 443, User, Password, , 3000, SSL);
|
Connection = New HTTPConnection(Host, Port, User, Password, , 3000, SSL);
|
||||||
EndIf;
|
EndIf;
|
||||||
|
|
||||||
Else
|
Else
|
||||||
|
|
||||||
Connection = New HTTPConnection(Host, 80, User, Password, , 3000, SSL);
|
Connection = New HTTPConnection(Host, Port, User, Password, , 3000);
|
||||||
|
|
||||||
EndIf;
|
EndIf;
|
||||||
|
|
||||||
@ -227,8 +232,9 @@ Function ExecuteRequest(Val Request, Val Connection, Val View, Val ResponseFile
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
Request.ResourceAddress = Address;
|
Request.ResourceAddress = Address;
|
||||||
|
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile, FullResponse);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile, FullResponse);
|
||||||
@ -344,7 +350,6 @@ Function SplitURL(Val URL) Export
|
|||||||
|
|
||||||
URL = StrReplace(URL, "https://", "");
|
URL = StrReplace(URL, "https://", "");
|
||||||
URL = StrReplace(URL, "http://" , "");
|
URL = StrReplace(URL, "http://" , "");
|
||||||
URL = StrReplace(URL, ":443" , "");
|
|
||||||
|
|
||||||
If StrFind(URL, "/") = 0 Then
|
If StrFind(URL, "/") = 0 Then
|
||||||
Address = "";
|
Address = "";
|
||||||
@ -354,6 +359,20 @@ Function SplitURL(Val URL) Export
|
|||||||
Host = Left(URL, StrFind(URL, "/", SearchDirection.FromBegin) - 1);
|
Host = Left(URL, StrFind(URL, "/", SearchDirection.FromBegin) - 1);
|
||||||
EndIf;
|
EndIf;
|
||||||
|
|
||||||
|
If StrFind(Host, ":") <> 0 Then
|
||||||
|
|
||||||
|
ServerPort = StrSplit(Host, ":");
|
||||||
|
Host = ServerPort[0];
|
||||||
|
Port = ServerPort[1];
|
||||||
|
|
||||||
|
OPI_TypeConversion.GetNumber(Port);
|
||||||
|
|
||||||
|
Else
|
||||||
|
|
||||||
|
Port = ?(SecureConnection, 443, 80);
|
||||||
|
|
||||||
|
EndIf;
|
||||||
|
|
||||||
If IsOneScript() And SecureConnection Then
|
If IsOneScript() And SecureConnection Then
|
||||||
Host = "https://" + Host;
|
Host = "https://" + Host;
|
||||||
EndIf;
|
EndIf;
|
||||||
@ -362,6 +381,7 @@ Function SplitURL(Val URL) Export
|
|||||||
ReturnStructure.Insert("Host" , Host);
|
ReturnStructure.Insert("Host" , Host);
|
||||||
ReturnStructure.Insert("Address" , Address);
|
ReturnStructure.Insert("Address" , Address);
|
||||||
ReturnStructure.Insert("Safe" , SecureConnection);
|
ReturnStructure.Insert("Safe" , SecureConnection);
|
||||||
|
ReturnStructure.Insert("Port" , Port);
|
||||||
|
|
||||||
Return ReturnStructure;
|
Return ReturnStructure;
|
||||||
|
|
||||||
@ -935,6 +955,41 @@ Procedure AddField(Val Name, Val Value, Val Type, Collection) Export
|
|||||||
|
|
||||||
EndProcedure
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure AddKeyValue(Table, Val Key, Val Value) Export
|
||||||
|
|
||||||
|
KeyExists = False;
|
||||||
|
ValueExists = False;
|
||||||
|
|
||||||
|
For Each Coloumn In Table.Columns Do
|
||||||
|
|
||||||
|
If Coloumn.Name = "Key" Then
|
||||||
|
|
||||||
|
KeyExists = True;
|
||||||
|
|
||||||
|
ElsIf Coloumn.Name = "Value" Then
|
||||||
|
|
||||||
|
ValueExists = True;
|
||||||
|
|
||||||
|
Else
|
||||||
|
Continue;
|
||||||
|
EndIf;
|
||||||
|
|
||||||
|
EndDo;
|
||||||
|
|
||||||
|
If Not KeyExists Then
|
||||||
|
Table.Columns.Add("Key");
|
||||||
|
EndIf;
|
||||||
|
|
||||||
|
If Not ValueExists Then
|
||||||
|
Table.Columns.Add("Value");
|
||||||
|
EndIf;
|
||||||
|
|
||||||
|
NewValue = Table.Add();
|
||||||
|
NewValue.Key = Key;
|
||||||
|
NewValue.Value = Value;
|
||||||
|
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
|
|
||||||
#EndRegion
|
#EndRegion
|
||||||
@ -952,9 +1007,10 @@ Function ExecuteRequestWithBody(Val URL, Val View, Val Parameters = "", Val Addi
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
Request = CreateRequestWithBody(Address, Parameters, AdditionalHeaders, JSON);
|
Request = CreateRequestWithBody(Address, Parameters, AdditionalHeaders, JSON);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile, FullResponse);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile, FullResponse);
|
||||||
|
|
||||||
Return Response;
|
Return Response;
|
||||||
@ -968,9 +1024,10 @@ Function ExecuteRequestWithBinaryData(Val URL, Val View, Val Data, Val Additiona
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
Request = CreateRequest(Address, AdditionalHeaders, DataType);
|
Request = CreateRequest(Address, AdditionalHeaders, DataType);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
|
|
||||||
If Not Data.Size() = 0 Then
|
If Not Data.Size() = 0 Then
|
||||||
Request.SetBodyFromBinaryData(Data);
|
Request.SetBodyFromBinaryData(Data);
|
||||||
@ -993,9 +1050,10 @@ Function ExecuteRequestWithoutBody(Val URL, Val View, Val Parameters = "", Val A
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"] + RequestParametersToString(Parameters);
|
Address = URLStructure["Address"] + RequestParametersToString(Parameters);
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
Request = CreateRequest(Address, AdditionalHeaders);
|
Request = CreateRequest(Address, AdditionalHeaders);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
|
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
||||||
|
|
||||||
@ -1018,11 +1076,12 @@ Function ExecuteMultipartRequest(Val URL, Val View, Val Parameters = "", Val Fil
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
RequestBody = GetTempFileName();
|
RequestBody = GetTempFileName();
|
||||||
|
|
||||||
Request = CreateMultipartRequest(Address, Parameters, Files, AdditionalHeaders, RequestBody, ContentType);
|
Request = CreateMultipartRequest(Address, Parameters, Files, AdditionalHeaders, RequestBody, ContentType);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
||||||
|
|
||||||
Request = Undefined;
|
Request = Undefined;
|
||||||
@ -1040,11 +1099,12 @@ Function ExecuteMultipartRelatedRequest(Val URL, Val View, Val JSON = "", Val Fi
|
|||||||
Host = URLStructure["Host"];
|
Host = URLStructure["Host"];
|
||||||
Address = URLStructure["Address"];
|
Address = URLStructure["Address"];
|
||||||
Safe = URLStructure["Safe"];
|
Safe = URLStructure["Safe"];
|
||||||
|
Port = URLStructure["Port"];
|
||||||
|
|
||||||
RequestBody = GetTempFileName();
|
RequestBody = GetTempFileName();
|
||||||
|
|
||||||
Request = CreateMultipartRelatedRequest(Address, Files, JSON, AdditionalHeaders, RequestBody);
|
Request = CreateMultipartRelatedRequest(Address, Files, JSON, AdditionalHeaders, RequestBody);
|
||||||
Connection = CreateConnection(Host, Safe);
|
Connection = CreateConnection(Host, Safe, , , Port);
|
||||||
|
|
||||||
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
Response = ExecuteRequest(Request, Connection, View, ResponseFile);
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
<extension xsi:type="mdclassExtension:ConfigurationExtension">
|
<extension xsi:type="mdclassExtension:ConfigurationExtension">
|
||||||
<defaultRunMode>Checked</defaultRunMode>
|
<defaultRunMode>Checked</defaultRunMode>
|
||||||
<usePurposes>Checked</usePurposes>
|
<usePurposes>Checked</usePurposes>
|
||||||
<interfaceCompatibilityMode>Checked</interfaceCompatibilityMode>
|
|
||||||
</extension>
|
</extension>
|
||||||
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="12689443-2950-4e3b-b313-9a692b6acac7"/>
|
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="12689443-2950-4e3b-b313-9a692b6acac7"/>
|
||||||
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="f6f98fbd-010a-4aba-8f11-01203bbc59c7"/>
|
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="f6f98fbd-010a-4aba-8f11-01203bbc59c7"/>
|
||||||
|
@ -1509,6 +1509,57 @@
|
|||||||
NewLine.Описание = "Additional request headers, if necessary (optional, def. val. - Empty value)";
|
NewLine.Описание = "Additional request headers, if necessary (optional, def. val. - Empty value)";
|
||||||
NewLine.Область = "Objects management";
|
NewLine.Область = "Objects management";
|
||||||
|
|
||||||
|
|
||||||
|
NewLine = CompositionTable.Add();
|
||||||
|
NewLine.Библиотека = "s3";
|
||||||
|
NewLine.Модуль = "OPI_S3";
|
||||||
|
NewLine.Метод = "GetObjectDownloadLink";
|
||||||
|
NewLine.МетодПоиска = "GETOBJECTDOWNLOADLINK";
|
||||||
|
NewLine.Параметр = "--name";
|
||||||
|
NewLine.Описание = "Name of the object in the bucket";
|
||||||
|
NewLine.Область = "Objects management";
|
||||||
|
NewLine.ОписаниеМетода = "Get presigned link for object retrieving without authorization";
|
||||||
|
|
||||||
|
|
||||||
|
NewLine = CompositionTable.Add();
|
||||||
|
NewLine.Библиотека = "s3";
|
||||||
|
NewLine.Модуль = "OPI_S3";
|
||||||
|
NewLine.Метод = "GetObjectDownloadLink";
|
||||||
|
NewLine.МетодПоиска = "GETOBJECTDOWNLOADLINK";
|
||||||
|
NewLine.Параметр = "--bucket";
|
||||||
|
NewLine.Описание = "Name of the bucket to put the object";
|
||||||
|
NewLine.Область = "Objects management";
|
||||||
|
|
||||||
|
|
||||||
|
NewLine = CompositionTable.Add();
|
||||||
|
NewLine.Библиотека = "s3";
|
||||||
|
NewLine.Модуль = "OPI_S3";
|
||||||
|
NewLine.Метод = "GetObjectDownloadLink";
|
||||||
|
NewLine.МетодПоиска = "GETOBJECTDOWNLOADLINK";
|
||||||
|
NewLine.Параметр = "--basic";
|
||||||
|
NewLine.Описание = "Basic request data. See GetBasicDataStructure";
|
||||||
|
NewLine.Область = "Objects management";
|
||||||
|
|
||||||
|
|
||||||
|
NewLine = CompositionTable.Add();
|
||||||
|
NewLine.Библиотека = "s3";
|
||||||
|
NewLine.Модуль = "OPI_S3";
|
||||||
|
NewLine.Метод = "GetObjectDownloadLink";
|
||||||
|
NewLine.МетодПоиска = "GETOBJECTDOWNLOADLINK";
|
||||||
|
NewLine.Параметр = "--expires";
|
||||||
|
NewLine.Описание = "Link lifetime in seconds. 604800 max. (optional, def. val. - 3600)";
|
||||||
|
NewLine.Область = "Objects management";
|
||||||
|
|
||||||
|
|
||||||
|
NewLine = CompositionTable.Add();
|
||||||
|
NewLine.Библиотека = "s3";
|
||||||
|
NewLine.Модуль = "OPI_S3";
|
||||||
|
NewLine.Метод = "GetObjectDownloadLink";
|
||||||
|
NewLine.МетодПоиска = "GETOBJECTDOWNLOADLINK";
|
||||||
|
NewLine.Параметр = "--headers";
|
||||||
|
NewLine.Описание = "Additional request headers, if necessary (optional, def. val. - Empty value)";
|
||||||
|
NewLine.Область = "Objects management";
|
||||||
|
|
||||||
Return CompositionTable;
|
Return CompositionTable;
|
||||||
EndFunction
|
EndFunction
|
||||||
|
|
||||||
|
@ -1170,7 +1170,7 @@
|
|||||||
|
|
||||||
// Получить ссылку скачивания объекта
|
// Получить ссылку скачивания объекта
|
||||||
// Получает прямую ссылку для скачивания объекта без дополнительной авторизации
|
// Получает прямую ссылку для скачивания объекта без дополнительной авторизации
|
||||||
//
|
//
|
||||||
// Примечание:
|
// Примечание:
|
||||||
// О механизме в документации AWS: [Download and upload objects with presigned URLs](@docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)
|
// О механизме в документации AWS: [Download and upload objects with presigned URLs](@docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)
|
||||||
//
|
//
|
||||||
@ -1188,21 +1188,21 @@
|
|||||||
, Знач ОсновныеДанные
|
, Знач ОсновныеДанные
|
||||||
, Знач ВремяЖизни = 3600
|
, Знач ВремяЖизни = 3600
|
||||||
, Знач Заголовки = Неопределено) Экспорт
|
, Знач Заголовки = Неопределено) Экспорт
|
||||||
|
|
||||||
ОсновныеДанные_ = OPI_Инструменты.КопироватьКоллекцию(ОсновныеДанные);
|
ОсновныеДанные_ = OPI_Инструменты.КопироватьКоллекцию(ОсновныеДанные);
|
||||||
|
|
||||||
ПроверитьОсновныеДанные(ОсновныеДанные_);
|
ПроверитьОсновныеДанные(ОсновныеДанные_);
|
||||||
ЗаполнитьURLОбъекта(ОсновныеДанные_, Наименование, Бакет);
|
ЗаполнитьURLОбъекта(ОсновныеДанные_, Наименование, Бакет);
|
||||||
|
|
||||||
Подпись = СоздатьПодписьURL(ОсновныеДанные_, Наименование, "GET", ВремяЖизни, Заголовки);
|
Подпись = СоздатьПодписьURL(ОсновныеДанные_, Наименование, "GET", ВремяЖизни, Заголовки);
|
||||||
URL = ОсновныеДанные_["URL"] + Подпись;
|
URL = ОсновныеДанные_["URL"] + Подпись;
|
||||||
|
|
||||||
Возврат URL;
|
Возврат URL;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
|
||||||
#Область СлужебныеПроцедурыИФункции
|
#Область СлужебныеПроцедурыИФункции
|
||||||
@ -1218,11 +1218,11 @@
|
|||||||
Запрос.Заголовки.Вставить("Host" , Соединение.Сервер);
|
Запрос.Заголовки.Вставить("Host" , Соединение.Сервер);
|
||||||
|
|
||||||
ОсновныеЧасти = ПолучитьОсновныеСоставляющиеПодписи(СтруктураДанных, Запрос, Соединение, Метод, ТекущаяДата);
|
ОсновныеЧасти = ПолучитьОсновныеСоставляющиеПодписи(СтруктураДанных, Запрос, Соединение, Метод, ТекущаяДата);
|
||||||
|
|
||||||
Скоуп = ОсновныеЧасти["Скоуп"];
|
Скоуп = ОсновныеЧасти["Скоуп"];
|
||||||
Сигнатура = ОсновныеЧасти["Сигнатура"];
|
Сигнатура = ОсновныеЧасти["Сигнатура"];
|
||||||
КлючиЗаголовков = ОсновныеЧасти["КлючиЗаголовков"];
|
КлючиЗаголовков = ОсновныеЧасти["КлючиЗаголовков"];
|
||||||
|
|
||||||
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
|
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
|
||||||
|
|
||||||
Возврат ЗаголовокАвторизации;
|
Возврат ЗаголовокАвторизации;
|
||||||
@ -1230,49 +1230,49 @@
|
|||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
Функция СоздатьПодписьURL(Знач СтруктураДанных, Знач Наименование, Знач Метод, Знач ВремяЖизни, Знач Заголовки)
|
Функция СоздатьПодписьURL(Знач СтруктураДанных, Знач Наименование, Знач Метод, Знач ВремяЖизни, Знач Заголовки)
|
||||||
|
|
||||||
AccessKey = СтруктураДанных["AccessKey"];
|
AccessKey = СтруктураДанных["AccessKey"];
|
||||||
SecretKey = СтруктураДанных["SecretKey"];
|
SecretKey = СтруктураДанных["SecretKey"];
|
||||||
Region = СтруктураДанных["Region"];
|
Region = СтруктураДанных["Region"];
|
||||||
Service = СтруктураДанных["Service"];
|
Service = СтруктураДанных["Service"];
|
||||||
URL = СтруктураДанных["URL"];
|
URL = СтруктураДанных["URL"];
|
||||||
|
|
||||||
РазбитыйURL = OPI_Инструменты.РазбитьURL(URL);
|
РазбитыйURL = OPI_Инструменты.РазбитьURL(URL);
|
||||||
|
|
||||||
Сервер = РазбитыйURL["Сервер"];
|
Сервер = РазбитыйURL["Сервер"];
|
||||||
Адрес = РазбитыйURL["Адрес"];
|
Адрес = РазбитыйURL["Адрес"];
|
||||||
|
|
||||||
ДопЗаголовки = Новый Структура("Host", Сервер);
|
ДопЗаголовки = Новый Структура("Host", Сервер);
|
||||||
ДобавитьДополнительныеЗаголовки(Заголовки, ДопЗаголовки);
|
ДобавитьДополнительныеЗаголовки(Заголовки, ДопЗаголовки);
|
||||||
|
|
||||||
ТекущаяДата = ТекущаяУниверсальнаяДата();
|
ТекущаяДата = ТекущаяУниверсальнаяДата();
|
||||||
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
|
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
|
||||||
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
|
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
|
||||||
ВременнаяМетка = OPI_Инструменты.ВременнаяМеткаISO(ТекущаяДата);
|
ВременнаяМетка = OPI_Инструменты.ВременнаяМеткаISO(ТекущаяДата);
|
||||||
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Заголовки);
|
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Заголовки);
|
||||||
Основа = КодироватьСтроку(AccessKey + "/" + Скоуп, СпособКодированияСтроки.КодировкаURL);
|
Основа = КодироватьСтроку(AccessKey + "/" + Скоуп, СпособКодированияСтроки.КодировкаURL);
|
||||||
|
|
||||||
СтрокаЗаголовков = ПолучитьСтрокуЗаголовков(Заголовки);
|
СтрокаЗаголовков = ПолучитьСтрокуЗаголовков(Заголовки);
|
||||||
СтрокаХеша = "UNSIGNED-PAYLOAD";
|
СтрокаХеша = "UNSIGNED-PAYLOAD";
|
||||||
|
|
||||||
ПараметрыURL = Новый ТаблицаЗначений;
|
ПараметрыURL = Новый ТаблицаЗначений;
|
||||||
|
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Algorithm" , "AWS4-HMAC-SHA256");
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Algorithm" , "AWS4-HMAC-SHA256");
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Credential" , Основа);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Credential" , Основа);
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Date" , ВременнаяМетка);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Date" , ВременнаяМетка);
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Expires" , ВремяЖизни);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Expires" , ВремяЖизни);
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-SignedHeaders", КлючиЗаголовков);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-SignedHeaders", КлючиЗаголовков);
|
||||||
|
|
||||||
ПараметрыСтрокой = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
ПараметрыСтрокой = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
||||||
ПараметрыСтрокой = Прав(ПараметрыСтрокой, СтрДлина(ПараметрыСтрокой) - 1);
|
ПараметрыСтрокой = Прав(ПараметрыСтрокой, СтрДлина(ПараметрыСтрокой) - 1);
|
||||||
ШаблонЗапроса = "";
|
ШаблонЗапроса = "";
|
||||||
|
|
||||||
Для Н = 1 По 6 Цикл
|
Для Н = 1 По 6 Цикл
|
||||||
|
|
||||||
ШаблонЗапроса = ШаблонЗапроса + "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
|
ШаблонЗапроса = ШаблонЗапроса + "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
|
||||||
|
|
||||||
КонецЦикла;
|
КонецЦикла;
|
||||||
|
|
||||||
КаноническийЗапрос = СтрШаблон(ШаблонЗапроса
|
КаноническийЗапрос = СтрШаблон(ШаблонЗапроса
|
||||||
, Метод
|
, Метод
|
||||||
, Адрес
|
, Адрес
|
||||||
@ -1280,18 +1280,18 @@
|
|||||||
, СтрокаЗаголовков
|
, СтрокаЗаголовков
|
||||||
, КлючиЗаголовков
|
, КлючиЗаголовков
|
||||||
, СтрокаХеша);
|
, СтрокаХеша);
|
||||||
|
|
||||||
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
|
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
|
||||||
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
||||||
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
||||||
|
|
||||||
|
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Signature", Сигнатура);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Signature", Сигнатура);
|
||||||
|
|
||||||
ПодписьURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
ПодписьURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
||||||
|
|
||||||
Возврат ПодписьURL;
|
Возврат ПодписьURL;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
Функция ПолучитьОсновныеСоставляющиеПодписи(Знач СтруктураДанных
|
Функция ПолучитьОсновныеСоставляющиеПодписи(Знач СтруктураДанных
|
||||||
@ -1299,27 +1299,27 @@
|
|||||||
, Знач Соединение
|
, Знач Соединение
|
||||||
, Знач Метод
|
, Знач Метод
|
||||||
, Знач ТекущаяДата)
|
, Знач ТекущаяДата)
|
||||||
|
|
||||||
SecretKey = СтруктураДанных["SecretKey"];
|
SecretKey = СтруктураДанных["SecretKey"];
|
||||||
Region = СтруктураДанных["Region"];
|
Region = СтруктураДанных["Region"];
|
||||||
Service = СтруктураДанных["Service"];
|
Service = СтруктураДанных["Service"];
|
||||||
|
|
||||||
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
|
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
|
||||||
КаноническийЗапрос = СоздатьКаноническийЗапрос(Запрос, Соединение, Метод);
|
КаноническийЗапрос = СоздатьКаноническийЗапрос(Запрос, Соединение, Метод);
|
||||||
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
|
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
|
||||||
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
|
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
|
||||||
|
|
||||||
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
||||||
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
||||||
|
|
||||||
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос.Заголовки);
|
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос.Заголовки);
|
||||||
|
|
||||||
СтруктураЧастей = Новый Структура;
|
СтруктураЧастей = Новый Структура;
|
||||||
|
|
||||||
СтруктураЧастей.Вставить("Скоуп" , Скоуп);
|
СтруктураЧастей.Вставить("Скоуп" , Скоуп);
|
||||||
СтруктураЧастей.Вставить("Сигнатура" , Сигнатура);
|
СтруктураЧастей.Вставить("Сигнатура" , Сигнатура);
|
||||||
СтруктураЧастей.Вставить("КлючиЗаголовков", КлючиЗаголовков);
|
СтруктураЧастей.Вставить("КлючиЗаголовков", КлючиЗаголовков);
|
||||||
|
|
||||||
Возврат СтруктураЧастей;
|
Возврат СтруктураЧастей;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
@ -1347,7 +1347,7 @@
|
|||||||
ШаблонЗапроса = "";
|
ШаблонЗапроса = "";
|
||||||
ТелоЗапроса = OPI_Инструменты.ПолучитьТелоЗапроса(Запрос);
|
ТелоЗапроса = OPI_Инструменты.ПолучитьТелоЗапроса(Запрос);
|
||||||
ХешСумма = OPI_Криптография.Хеш(ТелоЗапроса, ХешФункция.SHA256);
|
ХешСумма = OPI_Криптография.Хеш(ТелоЗапроса, ХешФункция.SHA256);
|
||||||
|
|
||||||
Запрос.Заголовки.Вставить("x-amz-content-sha256", нРег(ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма)));
|
Запрос.Заголовки.Вставить("x-amz-content-sha256", нРег(ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма)));
|
||||||
|
|
||||||
Для Н = 1 По 6 Цикл
|
Для Н = 1 По 6 Цикл
|
||||||
|
@ -15569,8 +15569,8 @@
|
|||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
Процедура S3_ПолучитьСсылкуСкачиванияОбъекта(ПараметрыФункции)
|
Процедура S3_ПолучитьСсылкуСкачиванияОбъекта(ПараметрыФункции)
|
||||||
|
|
||||||
Картинка = ПараметрыФункции["Picture"]; // SKIP
|
Картинка = ПараметрыФункции["Picture"]; // SKIP
|
||||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); // SKIP
|
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); // SKIP
|
||||||
НеобходимыйРазмер = Картинка.Размер(); // SKIP
|
НеобходимыйРазмер = Картинка.Размер(); // SKIP
|
||||||
|
|
||||||
@ -15585,15 +15585,15 @@
|
|||||||
Бакет = "opi-gpbucket3";
|
Бакет = "opi-gpbucket3";
|
||||||
|
|
||||||
Результат = OPI_S3.ПолучитьСсылкуСкачиванияОбъекта(Наименование, Бакет, ОсновныеДанные, 7200);
|
Результат = OPI_S3.ПолучитьСсылкуСкачиванияОбъекта(Наименование, Бакет, ОсновныеДанные, 7200);
|
||||||
|
|
||||||
// END
|
// END
|
||||||
|
|
||||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияОбъекта", "S3");
|
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияОбъекта", "S3");
|
||||||
OPI_ПолучениеДанныхТестов.Проверка_Строка(Результат);
|
OPI_ПолучениеДанныхТестов.Проверка_Строка(Результат);
|
||||||
|
|
||||||
Результат = OPI_Инструменты.Get(Результат);
|
Результат = OPI_Инструменты.Get(Результат);
|
||||||
|
|
||||||
OPI_ПолучениеДанныхТестов.Проверка_ДвоичныеДанные(Результат, НеобходимыйРазмер);
|
OPI_ПолучениеДанныхТестов.Проверка_ДвоичныеДанные(Результат, НеобходимыйРазмер);
|
||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
|
@ -2040,9 +2040,9 @@
|
|||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
Функция ПолучитьОбщийМодуль(Знач Имя)
|
Функция ПолучитьОбщийМодуль(Знач Имя)
|
||||||
|
|
||||||
Модуль = Вычислить(Имя);
|
Модуль = Вычислить(Имя);
|
||||||
|
|
||||||
Возврат Модуль;
|
Возврат Модуль;
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@
|
|||||||
Если Не ЗначениеЗаполнено(Порт) Тогда
|
Если Не ЗначениеЗаполнено(Порт) Тогда
|
||||||
Порт = ?(Защищенное, 443, 80);
|
Порт = ?(Защищенное, 443, 80);
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
Если Защищенное Тогда
|
Если Защищенное Тогда
|
||||||
|
|
||||||
Если ЭтоOneScript() Тогда
|
Если ЭтоOneScript() Тогда
|
||||||
@ -319,7 +319,7 @@
|
|||||||
СтрокаПараметров = ?(Начало, "?", "&");
|
СтрокаПараметров = ?(Начало, "?", "&");
|
||||||
|
|
||||||
Для Каждого Параметр Из Параметры Цикл
|
Для Каждого Параметр Из Параметры Цикл
|
||||||
|
|
||||||
ТекущееЗначение = Параметр.Значение;
|
ТекущееЗначение = Параметр.Значение;
|
||||||
ТекущийКлюч = Параметр.Ключ;
|
ТекущийКлюч = Параметр.Ключ;
|
||||||
|
|
||||||
@ -358,19 +358,19 @@
|
|||||||
Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1);
|
Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1);
|
||||||
Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1);
|
Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1);
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
Если СтрНайти(Сервер, ":") <> 0 Тогда
|
Если СтрНайти(Сервер, ":") <> 0 Тогда
|
||||||
|
|
||||||
СерверПорт = СтрРазделить(Сервер, ":");
|
СерверПорт = СтрРазделить(Сервер, ":");
|
||||||
Сервер = СерверПорт[0];
|
Сервер = СерверПорт[0];
|
||||||
Порт = СерверПорт[1];
|
Порт = СерверПорт[1];
|
||||||
|
|
||||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(Порт);
|
OPI_ПреобразованиеТипов.ПолучитьЧисло(Порт);
|
||||||
|
|
||||||
Иначе
|
Иначе
|
||||||
|
|
||||||
Порт = ?(ЗащищенноеСоединение, 443, 80);
|
Порт = ?(ЗащищенноеСоединение, 443, 80);
|
||||||
|
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
Если ЭтоOneScript() И ЗащищенноеСоединение Тогда
|
Если ЭтоOneScript() И ЗащищенноеСоединение Тогда
|
||||||
@ -956,38 +956,38 @@
|
|||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
Процедура ДобавитьКлючЗначение(Таблица, Знач Ключ, Знач Значение) Экспорт
|
Процедура ДобавитьКлючЗначение(Таблица, Знач Ключ, Знач Значение) Экспорт
|
||||||
|
|
||||||
ЕстьКлюч = Ложь;
|
ЕстьКлюч = Ложь;
|
||||||
ЕстьЗначение = Ложь;
|
ЕстьЗначение = Ложь;
|
||||||
|
|
||||||
Для Каждого Колонка Из Таблица.Колонки Цикл
|
Для Каждого Колонка Из Таблица.Колонки Цикл
|
||||||
|
|
||||||
Если Колонка.Имя = "Ключ" Тогда
|
Если Колонка.Имя = "Ключ" Тогда
|
||||||
|
|
||||||
ЕстьКлюч = Истина;
|
ЕстьКлюч = Истина;
|
||||||
|
|
||||||
ИначеЕсли Колонка.Имя = "Значение" Тогда
|
ИначеЕсли Колонка.Имя = "Значение" Тогда
|
||||||
|
|
||||||
ЕстьЗначение = Истина;
|
ЕстьЗначение = Истина;
|
||||||
|
|
||||||
Иначе
|
Иначе
|
||||||
Продолжить;
|
Продолжить;
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
КонецЦикла;
|
КонецЦикла;
|
||||||
|
|
||||||
Если Не ЕстьКлюч Тогда
|
Если Не ЕстьКлюч Тогда
|
||||||
Таблица.Колонки.Добавить("Ключ");
|
Таблица.Колонки.Добавить("Ключ");
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
Если Не ЕстьЗначение Тогда
|
Если Не ЕстьЗначение Тогда
|
||||||
Таблица.Колонки.Добавить("Значение");
|
Таблица.Колонки.Добавить("Значение");
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
НовоеЗначение = Таблица.Добавить();
|
НовоеЗначение = Таблица.Добавить();
|
||||||
НовоеЗначение.Ключ = Ключ;
|
НовоеЗначение.Ключ = Ключ;
|
||||||
НовоеЗначение.Значение = Значение;
|
НовоеЗначение.Значение = Значение;
|
||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Airtable.os
|
// OneScript: ./OInt/core/Modules/OPI_Airtable.os
|
||||||
// Lib: Airtable
|
// Lib: Airtable
|
||||||
// CLI: airtable
|
// CLI: airtable
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Bitrix24.os
|
// OneScript: ./OInt/core/Modules/OPI_Bitrix24.os
|
||||||
// Lib: Bitrix24
|
// Lib: Bitrix24
|
||||||
// CLI: bitrix24
|
// CLI: bitrix24
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_CDEK.os
|
// OneScript: ./OInt/core/Modules/OPI_CDEK.os
|
||||||
// Lib: CDEK
|
// Lib: CDEK
|
||||||
// CLI: cdek
|
// CLI: cdek
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Dropbox.os
|
// OneScript: ./OInt/core/Modules/OPI_Dropbox.os
|
||||||
// Lib: Dropbox
|
// Lib: Dropbox
|
||||||
// CLI: dropbox
|
// CLI: dropbox
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_GoogleCalendar.os
|
// OneScript: ./OInt/core/Modules/OPI_GoogleCalendar.os
|
||||||
// Lib: Google Calendar
|
// Lib: Google Calendar
|
||||||
// CLI: gcalendar
|
// CLI: gcalendar
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_GoogleDrive.os
|
// OneScript: ./OInt/core/Modules/OPI_GoogleDrive.os
|
||||||
// Lib: Google Drive
|
// Lib: Google Drive
|
||||||
// CLI: gdrive
|
// CLI: gdrive
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_GoogleSheets.os
|
// OneScript: ./OInt/core/Modules/OPI_GoogleSheets.os
|
||||||
// Lib: Google Sheets
|
// Lib: Google Sheets
|
||||||
// CLI: gsheets
|
// CLI: gsheets
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_GoogleWorkspace.os
|
// OneScript: ./OInt/core/Modules/OPI_GoogleWorkspace.os
|
||||||
// Lib: Google Workspace
|
// Lib: Google Workspace
|
||||||
// CLI: google
|
// CLI: google
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Neocities.os
|
// OneScript: ./OInt/core/Modules/OPI_Neocities.os
|
||||||
// Lib: Neocities
|
// Lib: Neocities
|
||||||
// CLI: neocities
|
// CLI: neocities
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Notion.os
|
// OneScript: ./OInt/core/Modules/OPI_Notion.os
|
||||||
// Lib: Notion
|
// Lib: Notion
|
||||||
// CLI: notion
|
// CLI: notion
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Ozon.os
|
// OneScript: ./OInt/core/Modules/OPI_Ozon.os
|
||||||
// Lib: Ozon
|
// Lib: Ozon
|
||||||
// CLI: ozon
|
// CLI: ozon
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_S3.os
|
// OneScript: ./OInt/core/Modules/OPI_S3.os
|
||||||
// Lib: S3
|
// Lib: S3
|
||||||
// CLI: s3
|
// CLI: s3
|
||||||
|
|
||||||
@ -1170,7 +1170,7 @@
|
|||||||
|
|
||||||
// Получить ссылку скачивания объекта
|
// Получить ссылку скачивания объекта
|
||||||
// Получает прямую ссылку для скачивания объекта без дополнительной авторизации
|
// Получает прямую ссылку для скачивания объекта без дополнительной авторизации
|
||||||
//
|
//
|
||||||
// Примечание:
|
// Примечание:
|
||||||
// О механизме в документации AWS: [Download and upload objects with presigned URLs](@docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)
|
// О механизме в документации AWS: [Download and upload objects with presigned URLs](@docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)
|
||||||
//
|
//
|
||||||
@ -1188,21 +1188,21 @@
|
|||||||
, Знач ОсновныеДанные
|
, Знач ОсновныеДанные
|
||||||
, Знач ВремяЖизни = 3600
|
, Знач ВремяЖизни = 3600
|
||||||
, Знач Заголовки = Неопределено) Экспорт
|
, Знач Заголовки = Неопределено) Экспорт
|
||||||
|
|
||||||
ОсновныеДанные_ = OPI_Инструменты.КопироватьКоллекцию(ОсновныеДанные);
|
ОсновныеДанные_ = OPI_Инструменты.КопироватьКоллекцию(ОсновныеДанные);
|
||||||
|
|
||||||
ПроверитьОсновныеДанные(ОсновныеДанные_);
|
ПроверитьОсновныеДанные(ОсновныеДанные_);
|
||||||
ЗаполнитьURLОбъекта(ОсновныеДанные_, Наименование, Бакет);
|
ЗаполнитьURLОбъекта(ОсновныеДанные_, Наименование, Бакет);
|
||||||
|
|
||||||
Подпись = СоздатьПодписьURL(ОсновныеДанные_, Наименование, "GET", ВремяЖизни, Заголовки);
|
Подпись = СоздатьПодписьURL(ОсновныеДанные_, Наименование, "GET", ВремяЖизни, Заголовки);
|
||||||
URL = ОсновныеДанные_["URL"] + Подпись;
|
URL = ОсновныеДанные_["URL"] + Подпись;
|
||||||
|
|
||||||
Возврат URL;
|
Возврат URL;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
|
||||||
#Область СлужебныеПроцедурыИФункции
|
#Область СлужебныеПроцедурыИФункции
|
||||||
@ -1218,11 +1218,11 @@
|
|||||||
Запрос.Заголовки.Вставить("Host" , Соединение.Сервер);
|
Запрос.Заголовки.Вставить("Host" , Соединение.Сервер);
|
||||||
|
|
||||||
ОсновныеЧасти = ПолучитьОсновныеСоставляющиеПодписи(СтруктураДанных, Запрос, Соединение, Метод, ТекущаяДата);
|
ОсновныеЧасти = ПолучитьОсновныеСоставляющиеПодписи(СтруктураДанных, Запрос, Соединение, Метод, ТекущаяДата);
|
||||||
|
|
||||||
Скоуп = ОсновныеЧасти["Скоуп"];
|
Скоуп = ОсновныеЧасти["Скоуп"];
|
||||||
Сигнатура = ОсновныеЧасти["Сигнатура"];
|
Сигнатура = ОсновныеЧасти["Сигнатура"];
|
||||||
КлючиЗаголовков = ОсновныеЧасти["КлючиЗаголовков"];
|
КлючиЗаголовков = ОсновныеЧасти["КлючиЗаголовков"];
|
||||||
|
|
||||||
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
|
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
|
||||||
|
|
||||||
Возврат ЗаголовокАвторизации;
|
Возврат ЗаголовокАвторизации;
|
||||||
@ -1230,49 +1230,49 @@
|
|||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
Функция СоздатьПодписьURL(Знач СтруктураДанных, Знач Наименование, Знач Метод, Знач ВремяЖизни, Знач Заголовки)
|
Функция СоздатьПодписьURL(Знач СтруктураДанных, Знач Наименование, Знач Метод, Знач ВремяЖизни, Знач Заголовки)
|
||||||
|
|
||||||
AccessKey = СтруктураДанных["AccessKey"];
|
AccessKey = СтруктураДанных["AccessKey"];
|
||||||
SecretKey = СтруктураДанных["SecretKey"];
|
SecretKey = СтруктураДанных["SecretKey"];
|
||||||
Region = СтруктураДанных["Region"];
|
Region = СтруктураДанных["Region"];
|
||||||
Service = СтруктураДанных["Service"];
|
Service = СтруктураДанных["Service"];
|
||||||
URL = СтруктураДанных["URL"];
|
URL = СтруктураДанных["URL"];
|
||||||
|
|
||||||
РазбитыйURL = OPI_Инструменты.РазбитьURL(URL);
|
РазбитыйURL = OPI_Инструменты.РазбитьURL(URL);
|
||||||
|
|
||||||
Сервер = РазбитыйURL["Сервер"];
|
Сервер = РазбитыйURL["Сервер"];
|
||||||
Адрес = РазбитыйURL["Адрес"];
|
Адрес = РазбитыйURL["Адрес"];
|
||||||
|
|
||||||
ДопЗаголовки = Новый Структура("Host", Сервер);
|
ДопЗаголовки = Новый Структура("Host", Сервер);
|
||||||
ДобавитьДополнительныеЗаголовки(Заголовки, ДопЗаголовки);
|
ДобавитьДополнительныеЗаголовки(Заголовки, ДопЗаголовки);
|
||||||
|
|
||||||
ТекущаяДата = ТекущаяУниверсальнаяДата();
|
ТекущаяДата = ТекущаяУниверсальнаяДата();
|
||||||
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
|
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
|
||||||
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
|
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
|
||||||
ВременнаяМетка = OPI_Инструменты.ВременнаяМеткаISO(ТекущаяДата);
|
ВременнаяМетка = OPI_Инструменты.ВременнаяМеткаISO(ТекущаяДата);
|
||||||
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Заголовки);
|
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Заголовки);
|
||||||
Основа = КодироватьСтроку(AccessKey + "/" + Скоуп, СпособКодированияСтроки.КодировкаURL);
|
Основа = КодироватьСтроку(AccessKey + "/" + Скоуп, СпособКодированияСтроки.КодировкаURL);
|
||||||
|
|
||||||
СтрокаЗаголовков = ПолучитьСтрокуЗаголовков(Заголовки);
|
СтрокаЗаголовков = ПолучитьСтрокуЗаголовков(Заголовки);
|
||||||
СтрокаХеша = "UNSIGNED-PAYLOAD";
|
СтрокаХеша = "UNSIGNED-PAYLOAD";
|
||||||
|
|
||||||
ПараметрыURL = Новый ТаблицаЗначений;
|
ПараметрыURL = Новый ТаблицаЗначений;
|
||||||
|
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Algorithm" , "AWS4-HMAC-SHA256");
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Algorithm" , "AWS4-HMAC-SHA256");
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Credential" , Основа);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Credential" , Основа);
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Date" , ВременнаяМетка);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Date" , ВременнаяМетка);
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Expires" , ВремяЖизни);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Expires" , ВремяЖизни);
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-SignedHeaders", КлючиЗаголовков);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-SignedHeaders", КлючиЗаголовков);
|
||||||
|
|
||||||
ПараметрыСтрокой = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
ПараметрыСтрокой = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
||||||
ПараметрыСтрокой = Прав(ПараметрыСтрокой, СтрДлина(ПараметрыСтрокой) - 1);
|
ПараметрыСтрокой = Прав(ПараметрыСтрокой, СтрДлина(ПараметрыСтрокой) - 1);
|
||||||
ШаблонЗапроса = "";
|
ШаблонЗапроса = "";
|
||||||
|
|
||||||
Для Н = 1 По 6 Цикл
|
Для Н = 1 По 6 Цикл
|
||||||
|
|
||||||
ШаблонЗапроса = ШаблонЗапроса + "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
|
ШаблонЗапроса = ШаблонЗапроса + "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
|
||||||
|
|
||||||
КонецЦикла;
|
КонецЦикла;
|
||||||
|
|
||||||
КаноническийЗапрос = СтрШаблон(ШаблонЗапроса
|
КаноническийЗапрос = СтрШаблон(ШаблонЗапроса
|
||||||
, Метод
|
, Метод
|
||||||
, Адрес
|
, Адрес
|
||||||
@ -1280,18 +1280,18 @@
|
|||||||
, СтрокаЗаголовков
|
, СтрокаЗаголовков
|
||||||
, КлючиЗаголовков
|
, КлючиЗаголовков
|
||||||
, СтрокаХеша);
|
, СтрокаХеша);
|
||||||
|
|
||||||
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
|
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
|
||||||
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
||||||
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
||||||
|
|
||||||
|
|
||||||
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Signature", Сигнатура);
|
OPI_Инструменты.ДобавитьКлючЗначение(ПараметрыURL, "X-Amz-Signature", Сигнатура);
|
||||||
|
|
||||||
ПодписьURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
ПодписьURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
|
||||||
|
|
||||||
Возврат ПодписьURL;
|
Возврат ПодписьURL;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
Функция ПолучитьОсновныеСоставляющиеПодписи(Знач СтруктураДанных
|
Функция ПолучитьОсновныеСоставляющиеПодписи(Знач СтруктураДанных
|
||||||
@ -1299,27 +1299,27 @@
|
|||||||
, Знач Соединение
|
, Знач Соединение
|
||||||
, Знач Метод
|
, Знач Метод
|
||||||
, Знач ТекущаяДата)
|
, Знач ТекущаяДата)
|
||||||
|
|
||||||
SecretKey = СтруктураДанных["SecretKey"];
|
SecretKey = СтруктураДанных["SecretKey"];
|
||||||
Region = СтруктураДанных["Region"];
|
Region = СтруктураДанных["Region"];
|
||||||
Service = СтруктураДанных["Service"];
|
Service = СтруктураДанных["Service"];
|
||||||
|
|
||||||
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
|
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
|
||||||
КаноническийЗапрос = СоздатьКаноническийЗапрос(Запрос, Соединение, Метод);
|
КаноническийЗапрос = СоздатьКаноническийЗапрос(Запрос, Соединение, Метод);
|
||||||
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
|
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
|
||||||
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
|
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
|
||||||
|
|
||||||
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
||||||
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
||||||
|
|
||||||
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос.Заголовки);
|
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос.Заголовки);
|
||||||
|
|
||||||
СтруктураЧастей = Новый Структура;
|
СтруктураЧастей = Новый Структура;
|
||||||
|
|
||||||
СтруктураЧастей.Вставить("Скоуп" , Скоуп);
|
СтруктураЧастей.Вставить("Скоуп" , Скоуп);
|
||||||
СтруктураЧастей.Вставить("Сигнатура" , Сигнатура);
|
СтруктураЧастей.Вставить("Сигнатура" , Сигнатура);
|
||||||
СтруктураЧастей.Вставить("КлючиЗаголовков", КлючиЗаголовков);
|
СтруктураЧастей.Вставить("КлючиЗаголовков", КлючиЗаголовков);
|
||||||
|
|
||||||
Возврат СтруктураЧастей;
|
Возврат СтруктураЧастей;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
@ -1347,7 +1347,7 @@
|
|||||||
ШаблонЗапроса = "";
|
ШаблонЗапроса = "";
|
||||||
ТелоЗапроса = OPI_Инструменты.ПолучитьТелоЗапроса(Запрос);
|
ТелоЗапроса = OPI_Инструменты.ПолучитьТелоЗапроса(Запрос);
|
||||||
ХешСумма = OPI_Криптография.Хеш(ТелоЗапроса, ХешФункция.SHA256);
|
ХешСумма = OPI_Криптография.Хеш(ТелоЗапроса, ХешФункция.SHA256);
|
||||||
|
|
||||||
Запрос.Заголовки.Вставить("x-amz-content-sha256", нРег(ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма)));
|
Запрос.Заголовки.Вставить("x-amz-content-sha256", нРег(ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма)));
|
||||||
|
|
||||||
Для Н = 1 По 6 Цикл
|
Для Н = 1 По 6 Цикл
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Slack.os
|
// OneScript: ./OInt/core/Modules/OPI_Slack.os
|
||||||
// Lib: Slack
|
// Lib: Slack
|
||||||
// CLI: slack
|
// CLI: slack
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Telegram.os
|
// OneScript: ./OInt/core/Modules/OPI_Telegram.os
|
||||||
// Lib: Telegram
|
// Lib: Telegram
|
||||||
// CLI: telegram
|
// CLI: telegram
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Twitter.os
|
// OneScript: ./OInt/core/Modules/OPI_Twitter.os
|
||||||
// Lib: Twitter
|
// Lib: Twitter
|
||||||
// CLI: twitter
|
// CLI: twitter
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_VK.os
|
// OneScript: ./OInt/core/Modules/OPI_VK.os
|
||||||
// Lib: VK
|
// Lib: VK
|
||||||
// CLI: vk
|
// CLI: vk
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_VKTeams.os
|
// OneScript: ./OInt/core/Modules/OPI_VKTeams.os
|
||||||
// Lib: VKTeams
|
// Lib: VKTeams
|
||||||
// CLI: vkteams
|
// CLI: vkteams
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_Viber.os
|
// OneScript: ./OInt/core/Modules/OPI_Viber.os
|
||||||
// Lib: Viber
|
// Lib: Viber
|
||||||
// CLI: viber
|
// CLI: viber
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_YandexDisk.os
|
// OneScript: ./OInt/core/Modules/OPI_YandexDisk.os
|
||||||
// Lib: Yandex Disk
|
// Lib: Yandex Disk
|
||||||
// CLI: yadisk
|
// CLI: yadisk
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_YandexID.os
|
// OneScript: ./OInt/core/Modules/OPI_YandexID.os
|
||||||
// Lib: Yandex ID
|
// Lib: Yandex ID
|
||||||
// CLI: yandex
|
// CLI: yandex
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_YandexMarket.os
|
// OneScript: ./OInt/core/Modules/OPI_YandexMarket.os
|
||||||
// Lib: Yandex Market
|
// Lib: Yandex Market
|
||||||
// CLI: yamarket
|
// CLI: yamarket
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/core/Modules/OPI_YandexMetrika.os
|
// OneScript: ./OInt/core/Modules/OPI_YandexMetrika.os
|
||||||
// Lib: Yandex Metrika
|
// Lib: Yandex Metrika
|
||||||
// CLI: metrika
|
// CLI: metrika
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
|
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
|
||||||
|
|
||||||
// MIT License
|
// MIT License
|
||||||
|
|
||||||
@ -196,7 +196,7 @@
|
|||||||
Если Не ЗначениеЗаполнено(Порт) Тогда
|
Если Не ЗначениеЗаполнено(Порт) Тогда
|
||||||
Порт = ?(Защищенное, 443, 80);
|
Порт = ?(Защищенное, 443, 80);
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
Если Защищенное Тогда
|
Если Защищенное Тогда
|
||||||
|
|
||||||
Если ЭтоOneScript() Тогда
|
Если ЭтоOneScript() Тогда
|
||||||
@ -319,7 +319,7 @@
|
|||||||
СтрокаПараметров = ?(Начало, "?", "&");
|
СтрокаПараметров = ?(Начало, "?", "&");
|
||||||
|
|
||||||
Для Каждого Параметр Из Параметры Цикл
|
Для Каждого Параметр Из Параметры Цикл
|
||||||
|
|
||||||
ТекущееЗначение = Параметр.Значение;
|
ТекущееЗначение = Параметр.Значение;
|
||||||
ТекущийКлюч = Параметр.Ключ;
|
ТекущийКлюч = Параметр.Ключ;
|
||||||
|
|
||||||
@ -358,19 +358,19 @@
|
|||||||
Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1);
|
Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1);
|
||||||
Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1);
|
Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1);
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
Если СтрНайти(Сервер, ":") <> 0 Тогда
|
Если СтрНайти(Сервер, ":") <> 0 Тогда
|
||||||
|
|
||||||
СерверПорт = СтрРазделить(Сервер, ":");
|
СерверПорт = СтрРазделить(Сервер, ":");
|
||||||
Сервер = СерверПорт[0];
|
Сервер = СерверПорт[0];
|
||||||
Порт = СерверПорт[1];
|
Порт = СерверПорт[1];
|
||||||
|
|
||||||
OPI_ПреобразованиеТипов.ПолучитьЧисло(Порт);
|
OPI_ПреобразованиеТипов.ПолучитьЧисло(Порт);
|
||||||
|
|
||||||
Иначе
|
Иначе
|
||||||
|
|
||||||
Порт = ?(ЗащищенноеСоединение, 443, 80);
|
Порт = ?(ЗащищенноеСоединение, 443, 80);
|
||||||
|
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
Если ЭтоOneScript() И ЗащищенноеСоединение Тогда
|
Если ЭтоOneScript() И ЗащищенноеСоединение Тогда
|
||||||
@ -956,38 +956,38 @@
|
|||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
Процедура ДобавитьКлючЗначение(Таблица, Знач Ключ, Знач Значение) Экспорт
|
Процедура ДобавитьКлючЗначение(Таблица, Знач Ключ, Знач Значение) Экспорт
|
||||||
|
|
||||||
ЕстьКлюч = Ложь;
|
ЕстьКлюч = Ложь;
|
||||||
ЕстьЗначение = Ложь;
|
ЕстьЗначение = Ложь;
|
||||||
|
|
||||||
Для Каждого Колонка Из Таблица.Колонки Цикл
|
Для Каждого Колонка Из Таблица.Колонки Цикл
|
||||||
|
|
||||||
Если Колонка.Имя = "Ключ" Тогда
|
Если Колонка.Имя = "Ключ" Тогда
|
||||||
|
|
||||||
ЕстьКлюч = Истина;
|
ЕстьКлюч = Истина;
|
||||||
|
|
||||||
ИначеЕсли Колонка.Имя = "Значение" Тогда
|
ИначеЕсли Колонка.Имя = "Значение" Тогда
|
||||||
|
|
||||||
ЕстьЗначение = Истина;
|
ЕстьЗначение = Истина;
|
||||||
|
|
||||||
Иначе
|
Иначе
|
||||||
Продолжить;
|
Продолжить;
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
КонецЦикла;
|
КонецЦикла;
|
||||||
|
|
||||||
Если Не ЕстьКлюч Тогда
|
Если Не ЕстьКлюч Тогда
|
||||||
Таблица.Колонки.Добавить("Ключ");
|
Таблица.Колонки.Добавить("Ключ");
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
Если Не ЕстьЗначение Тогда
|
Если Не ЕстьЗначение Тогда
|
||||||
Таблица.Колонки.Добавить("Значение");
|
Таблица.Колонки.Добавить("Значение");
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
НовоеЗначение = Таблица.Добавить();
|
НовоеЗначение = Таблица.Добавить();
|
||||||
НовоеЗначение.Ключ = Ключ;
|
НовоеЗначение.Ключ = Ключ;
|
||||||
НовоеЗначение.Значение = Значение;
|
НовоеЗначение.Значение = Значение;
|
||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
|
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
|
||||||
|
|
||||||
// MIT License
|
// MIT License
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
|
// OneScript: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
|
||||||
|
|
||||||
// MIT License
|
// MIT License
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
|
// OneScript: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
|
||||||
|
|
||||||
// MIT License
|
// MIT License
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
|
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
|
||||||
|
|
||||||
// MIT License
|
// MIT License
|
||||||
|
|
||||||
@ -15569,8 +15569,8 @@
|
|||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
Процедура S3_ПолучитьСсылкуСкачиванияОбъекта(ПараметрыФункции)
|
Процедура S3_ПолучитьСсылкуСкачиванияОбъекта(ПараметрыФункции)
|
||||||
|
|
||||||
Картинка = ПараметрыФункции["Picture"]; // SKIP
|
Картинка = ПараметрыФункции["Picture"]; // SKIP
|
||||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); // SKIP
|
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); // SKIP
|
||||||
НеобходимыйРазмер = Картинка.Размер(); // SKIP
|
НеобходимыйРазмер = Картинка.Размер(); // SKIP
|
||||||
|
|
||||||
@ -15585,15 +15585,15 @@
|
|||||||
Бакет = "opi-gpbucket3";
|
Бакет = "opi-gpbucket3";
|
||||||
|
|
||||||
Результат = OPI_S3.ПолучитьСсылкуСкачиванияОбъекта(Наименование, Бакет, ОсновныеДанные, 7200);
|
Результат = OPI_S3.ПолучитьСсылкуСкачиванияОбъекта(Наименование, Бакет, ОсновныеДанные, 7200);
|
||||||
|
|
||||||
// END
|
// END
|
||||||
|
|
||||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияОбъекта", "S3");
|
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияОбъекта", "S3");
|
||||||
OPI_ПолучениеДанныхТестов.Проверка_Строка(Результат);
|
OPI_ПолучениеДанныхТестов.Проверка_Строка(Результат);
|
||||||
|
|
||||||
Результат = OPI_Инструменты.Get(Результат);
|
Результат = OPI_Инструменты.Get(Результат);
|
||||||
|
|
||||||
OPI_ПолучениеДанныхТестов.Проверка_ДвоичныеДанные(Результат, НеобходимыйРазмер);
|
OPI_ПолучениеДанныхТестов.Проверка_ДвоичныеДанные(Результат, НеобходимыйРазмер);
|
||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// OneScript: ./OInt/tests/Modules/internal/OPI_ТестыCLI.os
|
// OneScript: ./OInt/tests/Modules/internal/OPI_ТестыCLI.os
|
||||||
|
|
||||||
// MIT License
|
// MIT License
|
||||||
|
|
||||||
|
@ -1513,6 +1513,57 @@
|
|||||||
НоваяСтрока.Описание = "Дополнительные заголовки запроса, если необходимо (необяз. по ум. - Пустое значение)";
|
НоваяСтрока.Описание = "Дополнительные заголовки запроса, если необходимо (необяз. по ум. - Пустое значение)";
|
||||||
НоваяСтрока.Область = "Работа с объектами";
|
НоваяСтрока.Область = "Работа с объектами";
|
||||||
|
|
||||||
|
|
||||||
|
НоваяСтрока = ТаблицаСостава.Добавить();
|
||||||
|
НоваяСтрока.Библиотека = "s3";
|
||||||
|
НоваяСтрока.Модуль = "OPI_S3";
|
||||||
|
НоваяСтрока.Метод = "ПолучитьСсылкуСкачиванияОбъекта";
|
||||||
|
НоваяСтрока.МетодПоиска = "ПОЛУЧИТЬССЫЛКУСКАЧИВАНИЯОБЪЕКТА";
|
||||||
|
НоваяСтрока.Параметр = "--name";
|
||||||
|
НоваяСтрока.Описание = "Наименование объекта в бакете";
|
||||||
|
НоваяСтрока.Область = "Работа с объектами";
|
||||||
|
НоваяСтрока.ОписаниеМетода = "Получает прямую ссылку для скачивания объекта без дополнительной авторизации";
|
||||||
|
|
||||||
|
|
||||||
|
НоваяСтрока = ТаблицаСостава.Добавить();
|
||||||
|
НоваяСтрока.Библиотека = "s3";
|
||||||
|
НоваяСтрока.Модуль = "OPI_S3";
|
||||||
|
НоваяСтрока.Метод = "ПолучитьСсылкуСкачиванияОбъекта";
|
||||||
|
НоваяСтрока.МетодПоиска = "ПОЛУЧИТЬССЫЛКУСКАЧИВАНИЯОБЪЕКТА";
|
||||||
|
НоваяСтрока.Параметр = "--bucket";
|
||||||
|
НоваяСтрока.Описание = "Имя бакета для загрузки объекта";
|
||||||
|
НоваяСтрока.Область = "Работа с объектами";
|
||||||
|
|
||||||
|
|
||||||
|
НоваяСтрока = ТаблицаСостава.Добавить();
|
||||||
|
НоваяСтрока.Библиотека = "s3";
|
||||||
|
НоваяСтрока.Модуль = "OPI_S3";
|
||||||
|
НоваяСтрока.Метод = "ПолучитьСсылкуСкачиванияОбъекта";
|
||||||
|
НоваяСтрока.МетодПоиска = "ПОЛУЧИТЬССЫЛКУСКАЧИВАНИЯОБЪЕКТА";
|
||||||
|
НоваяСтрока.Параметр = "--basic";
|
||||||
|
НоваяСтрока.Описание = "Основные данные запроса. См. ПолучитьСтруктуруДанных";
|
||||||
|
НоваяСтрока.Область = "Работа с объектами";
|
||||||
|
|
||||||
|
|
||||||
|
НоваяСтрока = ТаблицаСостава.Добавить();
|
||||||
|
НоваяСтрока.Библиотека = "s3";
|
||||||
|
НоваяСтрока.Модуль = "OPI_S3";
|
||||||
|
НоваяСтрока.Метод = "ПолучитьСсылкуСкачиванияОбъекта";
|
||||||
|
НоваяСтрока.МетодПоиска = "ПОЛУЧИТЬССЫЛКУСКАЧИВАНИЯОБЪЕКТА";
|
||||||
|
НоваяСтрока.Параметр = "--expires";
|
||||||
|
НоваяСтрока.Описание = "Время жизни ссылки в секундах. 604800 максимум (необяз. по ум. - 3600)";
|
||||||
|
НоваяСтрока.Область = "Работа с объектами";
|
||||||
|
|
||||||
|
|
||||||
|
НоваяСтрока = ТаблицаСостава.Добавить();
|
||||||
|
НоваяСтрока.Библиотека = "s3";
|
||||||
|
НоваяСтрока.Модуль = "OPI_S3";
|
||||||
|
НоваяСтрока.Метод = "ПолучитьСсылкуСкачиванияОбъекта";
|
||||||
|
НоваяСтрока.МетодПоиска = "ПОЛУЧИТЬССЫЛКУСКАЧИВАНИЯОБЪЕКТА";
|
||||||
|
НоваяСтрока.Параметр = "--headers";
|
||||||
|
НоваяСтрока.Описание = "Дополнительные заголовки запроса, если необходимо (необяз. по ум. - Пустое значение)";
|
||||||
|
НоваяСтрока.Область = "Работа с объектами";
|
||||||
|
|
||||||
Возврат ТаблицаСостава;
|
Возврат ТаблицаСостава;
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user