You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2026-06-20 09:19:27 +02:00
Main build (Jenkins)
This commit is contained in:
Vendored
+4
@@ -797,6 +797,10 @@ pipeline {
|
||||
powershell encoding: 'UTF-8', script:'1testrunner -run "./src/en/OInt/tests/Modules/internal/OPI_TestsCLI.os" "CLI_HTTP_BodySet"'
|
||||
}
|
||||
|
||||
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
|
||||
powershell encoding: 'UTF-8', script:'1testrunner -run "./src/en/OInt/tests/Modules/internal/OPI_TestsCLI.os" "CLI_HTTP_Settings"'
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Vendored
+4
@@ -797,6 +797,10 @@ pipeline {
|
||||
powershell encoding: 'UTF-8', script:'1testrunner -run "./src/en/OInt/tests/Modules/internal/OPI_Tests.os" "HTTP_BodySet"'
|
||||
}
|
||||
|
||||
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
|
||||
powershell encoding: 'UTF-8', script:'1testrunner -run "./src/en/OInt/tests/Modules/internal/OPI_Tests.os" "HTTP_Settings"'
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
description: Add OAuth V1 authorization and other functions to work with HTTP-client in the Open Integration Package, a free open-source integration library for 1C:Enterprise 8, OneScript and CLI
|
||||
keywords: [1C, 1С, 1С:Enterprise, 1С:Enterprise 8.3, API, Integration, Services, Exchange, OneScript, CLI, HTTP-client]
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
# Add OAuth V1 authorization
|
||||
Adds data for OAuth v1 authorization
|
||||
|
||||
|
||||
|
||||
`Function AddOauthV1Authorization(Val Token, Val Secret, Val ConsumerKey, Val ConsumerSecret, Val Version) Export`
|
||||
|
||||
| Parameter | CLI option | Type | Required | Description |
|
||||
|-|-|-|-|-|
|
||||
| Token | --token | String | ✔ | Token for authorization |
|
||||
| Secret | --secret | String | ✔ | Secret for authorization |
|
||||
| ConsumerKey | --ck | String | ✔ | Consumer key for authorization |
|
||||
| ConsumerSecret | --cs | String | ✔ | Consumer secret for authorization |
|
||||
| Version | --ver | String | ✔ | API version |
|
||||
|
||||
|
||||
Returns: DataProcessorObject.OPI_HTTPClient - This processor object
|
||||
|
||||
<br/>
|
||||
|
||||
:::tip
|
||||
By default, HMAC-SHA256 is used to create the signature. To change the algorithm, you can use `SetOAuthV1Algorithm`
|
||||
:::
|
||||
<br/>
|
||||
|
||||
|
||||
|
||||
```bsl title="1C:Enterprise/OneScript code example"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
description: Set OAuth V1 algorithm and other functions to work with HTTP-client in the Open Integration Package, a free open-source integration library for 1C:Enterprise 8, OneScript and CLI
|
||||
keywords: [1C, 1С, 1С:Enterprise, 1С:Enterprise 8.3, API, Integration, Services, Exchange, OneScript, CLI, HTTP-client]
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
# Set OAuth V1 algorithm
|
||||
Changes the algorithm for OAuth signatures
|
||||
|
||||
|
||||
|
||||
`Function SetOAuthV1Algorithm(Val Algorithm, Val HashFunction) Export`
|
||||
|
||||
| Parameter | CLI option | Type | Required | Description |
|
||||
|-|-|-|-|-|
|
||||
| Algorithm | --alg | String | ✔ | Encryption algorithm: HMAC, RSA |
|
||||
| HashFunction | --hash | String | ✔ | Hash function for signature: SHA1, SHA256 |
|
||||
|
||||
|
||||
Returns: DataProcessorObject.OPI_HTTPClient - This processor object
|
||||
|
||||
<br/>
|
||||
|
||||
|
||||
|
||||
|
||||
```bsl title="1C:Enterprise/OneScript code example"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
description: Use multipart fields at OAuth and other functions to work with HTTP-client in the Open Integration Package, a free open-source integration library for 1C:Enterprise 8, OneScript and CLI
|
||||
keywords: [1C, 1С, 1С:Enterprise, 1С:Enterprise 8.3, API, Integration, Services, Exchange, OneScript, CLI, HTTP-client]
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
# Use multipart fields at OAuth
|
||||
Includes or excludes multipart body fields when calculating the OAuth signature depending on server requirements
|
||||
|
||||
|
||||
|
||||
`Function UseMultipartFieldsAtOAuth(Val Flag) Export`
|
||||
|
||||
| Parameter | CLI option | Type | Required | Description |
|
||||
|-|-|-|-|-|
|
||||
| Flag | --use | Boolean | ✔ | Sign of using multipart fields in OAuth |
|
||||
|
||||
|
||||
Returns: DataProcessorObject.OPI_HTTPClient - This processor object
|
||||
|
||||
<br/>
|
||||
|
||||
:::tip
|
||||
Multipart fields are used for signature calculation by default
|
||||
:::
|
||||
<br/>
|
||||
|
||||
|
||||
|
||||
```bsl title="1C:Enterprise/OneScript code example"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
description: Добавить OAuth v1 авторизацию и другие функции для работы с HTTP-клиент в Открытом пакете интеграций - бесплатной open-source библиотеке интеграций для 1С:Предприятие 8, OneScript и CLI
|
||||
keywords: [1C, 1С, 1С:Предприятие, 1С:Предприятие 8.3, API, Интеграция, Сервисы, Обмен, OneScript, CLI, HTTP-клиент]
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
# Добавить OAuth v1 авторизацию
|
||||
Добавляет данные для OAuth v1 авторизации
|
||||
|
||||
|
||||
|
||||
`Функция ДобавитьOauthV1Авторизацию(Знач Token, Знач Secret, Знач ConsumerKey, Знач ConsumerSecret, Знач Версия) Экспорт`
|
||||
|
||||
| Параметр | CLI опция | Тип | Обяз. | Назначение |
|
||||
|-|-|-|-|-|
|
||||
| Token | - | Строка | ✔ | Token для авторизации |
|
||||
| Secret | - | Строка | ✔ | Secret для авторизации |
|
||||
| ConsumerKey | - | Строка | ✔ | Consumer key для авторизации |
|
||||
| ConsumerSecret | - | Строка | ✔ | Consumer secret для авторизации |
|
||||
| Версия | - | Строка | ✔ | Версия API |
|
||||
|
||||
|
||||
Возвращаемое значение: ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
|
||||
|
||||
<br/>
|
||||
|
||||
:::tip
|
||||
По умолчанию, для создания подписи используется HMAC-SHA256. Для изменения алгоритма можно восопользоваться функцией `УстановитьАлгоритмOAuthV1`
|
||||
:::
|
||||
|
||||
:::caution
|
||||
**NOCLI:** данный метод недоступен для использования в CLI версии
|
||||
:::
|
||||
<br/>
|
||||
|
||||
|
||||
|
||||
```bsl title="Пример использования для 1С:Предприятие/OneScript"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
description: Установить алгоритм OAuth V1 и другие функции для работы с HTTP-клиент в Открытом пакете интеграций - бесплатной open-source библиотеке интеграций для 1С:Предприятие 8, OneScript и CLI
|
||||
keywords: [1C, 1С, 1С:Предприятие, 1С:Предприятие 8.3, API, Интеграция, Сервисы, Обмен, OneScript, CLI, HTTP-клиент]
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
# Установить алгоритм OAuth V1
|
||||
Изменяет алгоритм для подписи OAuth
|
||||
|
||||
|
||||
|
||||
`Функция УстановитьАлгоритмOAuthV1(Знач Алгоритм, Знач ХешФункция) Экспорт`
|
||||
|
||||
| Параметр | CLI опция | Тип | Обяз. | Назначение |
|
||||
|-|-|-|-|-|
|
||||
| Алгоритм | --alg | Строка | ✔ | Алгоритм шифрования: HMAC, RSA |
|
||||
| ХешФункция | --hash | Строка | ✔ | Хеш функция для сигнатуры: SHA1, SHA256 |
|
||||
|
||||
|
||||
Возвращаемое значение: ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
|
||||
|
||||
<br/>
|
||||
|
||||
|
||||
|
||||
|
||||
```bsl title="Пример использования для 1С:Предприятие/OneScript"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
description: Использовать multipart поля в OAuth и другие функции для работы с HTTP-клиент в Открытом пакете интеграций - бесплатной open-source библиотеке интеграций для 1С:Предприятие 8, OneScript и CLI
|
||||
keywords: [1C, 1С, 1С:Предприятие, 1С:Предприятие 8.3, API, Интеграция, Сервисы, Обмен, OneScript, CLI, HTTP-клиент]
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
# Использовать multipart поля в OAuth
|
||||
Включает или исключает поля multipart тела при расчете подписи OAuth в зависимости от требований сервера
|
||||
|
||||
|
||||
|
||||
`Функция ИспользоватьMultipartПоляВOAuth(Знач Флаг) Экспорт`
|
||||
|
||||
| Параметр | CLI опция | Тип | Обяз. | Назначение |
|
||||
|-|-|-|-|-|
|
||||
| Флаг | --use | Булево | ✔ | Признак использования multipart полей в OAuth |
|
||||
|
||||
|
||||
Возвращаемое значение: ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
|
||||
|
||||
<br/>
|
||||
|
||||
:::tip
|
||||
По умлчанию multipart поля используются при расчете подписи
|
||||
:::
|
||||
<br/>
|
||||
|
||||
|
||||
|
||||
```bsl title="Пример использования для 1С:Предприятие/OneScript"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Vendored
+7539
-7539
File diff suppressed because it is too large
Load Diff
Vendored
+6
-5
@@ -1309,7 +1309,7 @@ Function CreateURLSignature(Val DataStructure, Val Method, Val Expire, Val Heade
|
||||
, HashString);
|
||||
|
||||
StringToSign = CreateSignatureString(CanonicalRequest, Scope, CurrentDate);
|
||||
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
||||
Signature = OPI_Cryptography.HMAC(SignKey, StringToSign, "SHA256");
|
||||
Signature = Lower(ПолучитьHexСтрокуИзДвоичныхДанных(Signature));
|
||||
|
||||
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Signature", Signature);
|
||||
@@ -1327,12 +1327,13 @@ Function GetSignatureKey(Val SecretKey, Val Region, Val Service, Val CurrentDate
|
||||
Region = ПолучитьДвоичныеДанныеИзСтроки(Region);
|
||||
Service = ПолучитьДвоичныеДанныеИзСтроки(Service);
|
||||
AWSRequest = ПолучитьДвоичныеДанныеИзСтроки("aws4_request");
|
||||
Sha256_ = "SHA256";
|
||||
|
||||
DataKey = OPI_Cryptography.HMACSHA256(SecretKey, DateData);
|
||||
RegionKey = OPI_Cryptography.HMACSHA256(DataKey, Region);
|
||||
ServiceKey = OPI_Cryptography.HMACSHA256(RegionKey, Service);
|
||||
DataKey = OPI_Cryptography.HMAC(SecretKey, DateData, Sha256_);
|
||||
RegionKey = OPI_Cryptography.HMAC(DataKey, Region, Sha256_);
|
||||
ServiceKey = OPI_Cryptography.HMAC(RegionKey, Service, Sha256_);
|
||||
|
||||
FinalKey = OPI_Cryptography.HMACSHA256(ServiceKey, AWSRequest);
|
||||
FinalKey = OPI_Cryptography.HMAC(ServiceKey, AWSRequest, Sha256_);
|
||||
|
||||
Return FinalKey;
|
||||
|
||||
|
||||
+2
-2
@@ -237,7 +237,7 @@ Function ProcessTMAData(Val DataString, Val Token) Export
|
||||
Hash = "";
|
||||
BinaryKey = ПолучитьДвоичныеДанныеИзСтроки(KeyString);
|
||||
|
||||
Result = OPI_Cryptography.HMACSHA256(BinaryKey, ПолучитьДвоичныеДанныеИзСтроки(Token));
|
||||
Result = OPI_Cryptography.HMACSHA(BinaryKey, ПолучитьДвоичныеДанныеИзСтроки(Token), "SHA256");
|
||||
|
||||
TValue = New ValueTable;
|
||||
TValue.Columns.Add("Key");
|
||||
@@ -268,7 +268,7 @@ Function ProcessTMAData(Val DataString, Val Token) Export
|
||||
EndDo;
|
||||
|
||||
DCS = Left(DCS, StrLen(DCS) - 1);
|
||||
Signature = OPI_Cryptography.HMACSHA256(Result, ПолучитьДвоичныеДанныеИзСтроки(DCS));
|
||||
Signature = OPI_Cryptography.HMAC(Result, ПолучитьДвоичныеДанныеИзСтроки(DCS), "SHA256");
|
||||
|
||||
Final = ПолучитьHexСтрокуИзДвоичныхДанных(Signature);
|
||||
|
||||
|
||||
+87
-135
@@ -100,7 +100,9 @@ Function GetToken(Val Code, Val Parameters = "") Export
|
||||
RequestParameters.Insert("code_verifier", "challenge");
|
||||
|
||||
Response = OPI_HTTPRequests.PostWithBody("https://api.twitter.com/2/oauth2/token"
|
||||
, RequestParameters, , False);
|
||||
, RequestParameters
|
||||
,
|
||||
, False);
|
||||
|
||||
Return Response;
|
||||
|
||||
@@ -125,7 +127,9 @@ Function RefreshToken(Val Parameters = "") Export
|
||||
RequestParameters.Insert("client_id" , Parameters_["client_id"]);
|
||||
|
||||
Response = OPI_HTTPRequests.PostWithBody("https://api.twitter.com/2/oauth2/token"
|
||||
, RequestParameters, , False);
|
||||
, RequestParameters
|
||||
,
|
||||
, False);
|
||||
|
||||
Return Response;
|
||||
|
||||
@@ -218,12 +222,12 @@ Function CreateCustomTweet(Val Text = ""
|
||||
EndIf;
|
||||
|
||||
If ValueIsFilled(Fields["media"]) Then
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters_, New Structure, "POST", URL);
|
||||
IsV2 = False;
|
||||
Else
|
||||
Authorization = CreateAuthorizationHeaderV2(Parameters_);
|
||||
IsV2 = True;
|
||||
EndIf;
|
||||
|
||||
Response = OPI_HTTPRequests.PostWithBody(URL, Fields, Authorization);
|
||||
Response = Post(URL, Fields, Parameters_, True, IsV2);
|
||||
|
||||
Return Response;
|
||||
|
||||
@@ -389,9 +393,7 @@ Function UploadMediaInParts(Val File, Val Type, Val RequestType, Val URL, Parame
|
||||
Fields.Insert("total_bytes" , OPI_Tools.NumberToString(Size));
|
||||
Fields.Insert("media_category", Type);
|
||||
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, RequestType, URL);
|
||||
|
||||
InitializationResponse = OPI_HTTPRequests.PostWithBody(URL, Fields, Authorization, False);
|
||||
InitializationResponse = Post(URL, Fields, Parameters);
|
||||
InitializationID = InitializationResponse[MID];
|
||||
InitializationIDS = InitializationResponse[MIS];
|
||||
|
||||
@@ -409,8 +411,7 @@ Function UploadMediaInParts(Val File, Val Type, Val RequestType, Val URL, Parame
|
||||
Fields.Insert("segment_index", OPI_Tools.NumberToString(Counter));
|
||||
Fields.Insert("media" , Part);
|
||||
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters, New Structure, RequestType, URL);
|
||||
Response = OPI_HTTPRequests.PostMultipart(URL, Fields, , , Authorization);
|
||||
Response = PostMultipart(URL, Fields, Parameters);
|
||||
|
||||
Counter = Counter + 1;
|
||||
|
||||
@@ -443,9 +444,8 @@ Function WaitForProcessingCompletion(Val ProcessingStatus, Val InitializationID,
|
||||
|
||||
While String(ProcessingStatus) = "pending" Or String(ProcessingStatus) = "in_progress" Do
|
||||
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, "GET", URL);
|
||||
Response = OPI_HTTPRequests.Get(URL, Fields, Authorization);
|
||||
Information = Response[ProcessingInfo];
|
||||
Response = Get(URL, Fields, Parameters);
|
||||
Information = Response[ProcessingInfo];
|
||||
|
||||
If Not ValueIsFilled(Information) Then
|
||||
Return Response;
|
||||
@@ -537,132 +537,11 @@ Function GetStandardParameters(Val Parameters = "")
|
||||
|
||||
EndFunction
|
||||
|
||||
Function CreateAuthorizationHeaderV1(Val Parameters, Val Fields, Val RequestType, Val URL)
|
||||
|
||||
CurrentDate = OPI_Tools.GetCurrentDate();
|
||||
AuthorizationHeader = "";
|
||||
HashingMethod = "HMAC-SHA1";
|
||||
APIVersion = "1.0";
|
||||
SignatureString = "";
|
||||
Signature = "";
|
||||
OCK = "oauth_consumer_key";
|
||||
OTK = "oauth_token";
|
||||
CurrentUNIXDate = OPI_Tools.UNIXTime(CurrentDate);
|
||||
CurrentUNIXDate = OPI_Tools.NumberToString(CurrentUNIXDate);
|
||||
ParametersTable = New ValueTable;
|
||||
ParametersTable.Columns.Add("Key");
|
||||
ParametersTable.Columns.Add("Value");
|
||||
|
||||
For Each Field In Fields Do
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = Field.Key;
|
||||
NewLine.Value = Field.Value;
|
||||
|
||||
EndDo;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = OCK;
|
||||
NewLine.Value = Parameters[OCK];
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = OTK;
|
||||
NewLine.Value = Parameters[OTK];
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_version";
|
||||
NewLine.Value = APIVersion;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_signature_method";
|
||||
NewLine.Value = HashingMethod;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_timestamp";
|
||||
NewLine.Value = CurrentUNIXDate;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_nonce";
|
||||
NewLine.Value = CurrentUNIXDate;
|
||||
|
||||
For Each TableRow In ParametersTable Do
|
||||
|
||||
TableRow.Key = EncodeString(TableRow.Key, StringEncodingMethod.URLencoding);
|
||||
TableRow.Value = EncodeString(TableRow.Value, StringEncodingMethod.URLencoding);
|
||||
|
||||
EndDo;
|
||||
|
||||
ParametersTable.Sort("Key");
|
||||
|
||||
For Each TableRow In ParametersTable Do
|
||||
|
||||
SignatureString = SignatureString
|
||||
+ TableRow.Key
|
||||
|
||||
+ "="
|
||||
+ TableRow.Value
|
||||
+ "&";
|
||||
|
||||
EndDo;
|
||||
|
||||
SignatureString = Left(SignatureString, StrLen(SignatureString) - 1);
|
||||
SignatureString = Upper(RequestType)
|
||||
+ "&"
|
||||
+ EncodeString(URL , StringEncodingMethod.URLencoding)
|
||||
+ "&"
|
||||
+ EncodeString(SignatureString, StringEncodingMethod.URLencoding);
|
||||
|
||||
Signature = EncodeString(Parameters["oauth_consumer_secret"], StringEncodingMethod.URLencoding)
|
||||
+ "&"
|
||||
+ EncodeString(Parameters["oauth_token_secret"], StringEncodingMethod.URLencoding);
|
||||
|
||||
Signature = OPI_Cryptography.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Signature)
|
||||
, ПолучитьДвоичныеДанныеИзСтроки(SignatureString)
|
||||
, HashFunction.SHA1
|
||||
, 64);
|
||||
|
||||
Signature = EncodeString(Base64String(Signature), StringEncodingMethod.URLencoding);
|
||||
|
||||
Delimiter = """,";
|
||||
|
||||
AuthorizationHeader = AuthorizationHeader
|
||||
+ "OAuth "
|
||||
+ "oauth_consumer_key=""" + Parameters[OCK] + Delimiter
|
||||
|
||||
+ "oauth_token=""" + Parameters[OTK] + Delimiter
|
||||
|
||||
+ "oauth_signature_method=""" + HashingMethod + Delimiter
|
||||
|
||||
+ "oauth_timestamp=""" + CurrentUNIXDate + Delimiter
|
||||
|
||||
+ "oauth_nonce=""" + CurrentUNIXDate + Delimiter
|
||||
|
||||
+ "oauth_version=""" + APIVersion + Delimiter
|
||||
|
||||
+ "oauth_signature=" + Signature;
|
||||
|
||||
HeaderMapping = New Map;
|
||||
HeaderMapping.Insert("Authorization", AuthorizationHeader);
|
||||
|
||||
Return HeaderMapping;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function CreateAuthorizationHeaderV2(Val Parameters)
|
||||
|
||||
ReturnMapping = New Map;
|
||||
ReturnMapping.Insert("Authorization", "Bearer " + Parameters["access_token"]);
|
||||
|
||||
Return ReturnMapping;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function GetProcessingStatus(Val Parameters, Val Fields, Val URL)
|
||||
|
||||
ProcessingInfo = "processing_info";
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, "POST", URL);
|
||||
|
||||
Response = OPI_HTTPRequests.PostWithBody(URL, Fields, Authorization, False);
|
||||
Response = Post(URL, Fields, Parameters);
|
||||
Information = Response[ProcessingInfo];
|
||||
|
||||
If Not ValueIsFilled(Information) Then
|
||||
@@ -679,4 +558,77 @@ Function GetProcessingStatus(Val Parameters, Val Fields, Val URL)
|
||||
|
||||
EndFunction
|
||||
|
||||
Function Get(Val URL, Val Fields, Val SecretData)
|
||||
|
||||
Token = SecretData["oauth_token"];
|
||||
Secret = SecretData["oauth_token_secret"];
|
||||
UsersKey = SecretData["oauth_consumer_key"];
|
||||
UsersSecret = SecretData["oauth_consumer_secret"];
|
||||
Version = "1.0";
|
||||
|
||||
Result = OPI_HTTPRequests.NewRequest()
|
||||
.Initialize(URL)
|
||||
.SetURLParams(Fields)
|
||||
.AddOauthV1Authorization(Token, Secret, UsersKey, UsersSecret, Version)
|
||||
.SetOAuthV1Algorithm("HMAC", "SHA1")
|
||||
.ProcessRequest("GET")
|
||||
.ReturnResponseAsJSONObject(True, True);
|
||||
|
||||
Return Result;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function Post(Val URL, Val Fields, Val SecretData, Val JSON = False, Val IsV2 = False)
|
||||
|
||||
Token = SecretData["oauth_token"];
|
||||
Secret = SecretData["oauth_token_secret"];
|
||||
UsersKey = SecretData["oauth_consumer_key"];
|
||||
UsersSecret = SecretData["oauth_consumer_secret"];
|
||||
Version = "1.0";
|
||||
|
||||
HttpClient = OPI_HTTPRequests.NewRequest()
|
||||
.Initialize(URL);
|
||||
|
||||
If IsV2 Then
|
||||
HttpClient.AddHeader("Authorization", "Bearer " + SecretData["access_token"]);
|
||||
Else
|
||||
HttpClient.AddOauthV1Authorization(Token, Secret, UsersKey, UsersSecret, Version)
|
||||
.SetOAuthV1Algorithm("HMAC", "SHA1");
|
||||
EndIf;
|
||||
|
||||
If JSON Then
|
||||
HttpClient.SetJsonBody(Fields);
|
||||
Else
|
||||
HttpClient.SetFormBody(Fields);
|
||||
EndIf;
|
||||
|
||||
Return HttpClient.ProcessRequest("POST").ReturnResponseAsJSONObject(True, True);
|
||||
|
||||
EndFunction
|
||||
|
||||
Function PostMultipart(Val URL, Val Fields, Val SecretData)
|
||||
|
||||
Token = SecretData["oauth_token"];
|
||||
Secret = SecretData["oauth_token_secret"];
|
||||
UsersKey = SecretData["oauth_consumer_key"];
|
||||
UsersSecret = SecretData["oauth_consumer_secret"];
|
||||
Version = "1.0";
|
||||
|
||||
HttpClient = OPI_HTTPRequests.NewRequest()
|
||||
.Initialize(URL)
|
||||
.StartMultipartBody()
|
||||
.AddOauthV1Authorization(Token, Secret, UsersKey, UsersSecret, Version)
|
||||
.SetOAuthV1Algorithm("HMAC", "SHA1")
|
||||
.UseMultipartFieldsAtOAuth(False);
|
||||
|
||||
For Each Parameter In Fields Do
|
||||
HttpClient.AddMultipartFormDataField(Parameter.Key, Parameter.Value);
|
||||
EndDo;
|
||||
|
||||
Result = HttpClient.ProcessRequest("POST").ReturnResponseAsJSONObject(True, True);
|
||||
|
||||
Return Result;
|
||||
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
|
||||
+1
-1
@@ -1029,7 +1029,7 @@ Procedure TwitterAPI_Tweets() Export
|
||||
OPI_TestDataRetrieval.ParameterToCollection("GIF" , TestParameters);
|
||||
OPI_TestDataRetrieval.ParameterToCollection("Video" , TestParameters);
|
||||
|
||||
Twitter_CreateTextTweet(TestParameters);
|
||||
//Twitter_CreateTextTweet(TestParameters);
|
||||
Twitter_UploadAttachmentsArray(TestParameters);
|
||||
Twitter_CreateVideoTweet(TestParameters);
|
||||
Twitter_CreateImageTweet(TestParameters);
|
||||
|
||||
+1
-1
@@ -305,7 +305,7 @@ Function GetTestTable() Export
|
||||
NewTest(TestTable, "OLLM_WorkingWithBlob" , "Working with Blob" , Ollama);
|
||||
NewTest(TestTable, "HTTP_Initialization" , "Initialization" , Http);
|
||||
NewTest(TestTable, "HTTP_BodySet" , "Body set" , Http);
|
||||
NewTest(TestTable, "HTTP_Settings" , "Settings" , Http);
|
||||
NewTest(TestTable, "HTTP_Settings" , "Settings" , Http);
|
||||
|
||||
Return TestTable;
|
||||
|
||||
|
||||
+310
-39
@@ -71,6 +71,7 @@ Var RequestDomain; // Domain from the request URL
|
||||
Var RequestMethod; // HTTP method used
|
||||
Var RequestURLParams; // URL parameters structure
|
||||
Var RequestBody; // Request body data
|
||||
Var RequestBodyCollection; // Data of body in view of collection, if maybe
|
||||
Var RequestHeaders; // Request headers mapping
|
||||
Var RequestUser; // User for basic authorization
|
||||
Var RequestPassword; // Password for basic authorization
|
||||
@@ -84,14 +85,10 @@ Var RequestDataType; // MIME type for Content-Type
|
||||
Var RequestTypeSetManualy; // Flag to disable automatic Content-Type detection
|
||||
Var BodyTemporaryFile; // Flag to delete the body file if it was created automatically
|
||||
|
||||
// AWS
|
||||
// Authorization
|
||||
|
||||
Var AWS4Using; // Flag to use AWS4 authorization
|
||||
Var AWS4Data; // Credentials structure
|
||||
|
||||
// Bearer
|
||||
|
||||
Var Bearer; // Bearer token
|
||||
Var AuthType; // View authorization
|
||||
Var AuthData; // Credentials structure
|
||||
|
||||
// Response
|
||||
|
||||
@@ -132,15 +129,15 @@ Function Initialize(Val URL = "") Export
|
||||
Initialized = True;
|
||||
Error = False;
|
||||
|
||||
RequestURLParams = New Array;
|
||||
RequestBody = Undefined;
|
||||
RequestHeaders = New Map;
|
||||
RequestTimeout = 3600;
|
||||
RequestURLParams = New Array;
|
||||
RequestBody = Undefined;
|
||||
RequestBodyCollection = New Structure;
|
||||
RequestHeaders = New Map;
|
||||
RequestTimeout = 3600;
|
||||
|
||||
RequestTypeSetManualy = False;
|
||||
|
||||
BodyTemporaryFile = False;
|
||||
AWS4Using = False;
|
||||
|
||||
ResponseStatusCode = 0;
|
||||
ResponseBody = Undefined;
|
||||
@@ -374,6 +371,36 @@ Function UseGzipCompression(Val Flag) Export
|
||||
|
||||
EndFunction
|
||||
|
||||
// Use multipart fields at OAuth
|
||||
// Includes or excludes multipart body fields when calculating the OAuth signature depending on server requirements
|
||||
//
|
||||
// Note
|
||||
// Multipart fields are used for signature calculation by default
|
||||
//
|
||||
// Parameters:
|
||||
// Flag - Boolean - Sign of using multipart fields in OAuth - use
|
||||
//
|
||||
// Returns:
|
||||
// DataProcessorObject.OPI_HTTPClient - This processor object
|
||||
Function UseMultipartFieldsAtOAuth(Val Flag) Export
|
||||
|
||||
Try
|
||||
|
||||
If StopExecution() Then Return ЭтотОбъект; EndIf;
|
||||
|
||||
AddLog("UseMultipartFieldsAtOAuth: setting the value");
|
||||
OPI_TypeConversion.GetBoolean(Flag);
|
||||
|
||||
SetSetting("MultipartAtOAuth", Flag);
|
||||
|
||||
Return ЭтотОбъект;
|
||||
|
||||
Except
|
||||
Return Error(DetailErrorDescription(ErrorInfo()));
|
||||
EndTry;
|
||||
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
|
||||
#Region BodySet
|
||||
@@ -497,7 +524,13 @@ Function SetJsonBody(Val Data) Export
|
||||
AddLog("SetJsonBody: beginning of body setting");
|
||||
|
||||
If Not TypeOf(Data) = Type("BinaryData") Then
|
||||
|
||||
OPI_TypeConversion.GetCollection(Data);
|
||||
|
||||
If Not TypeOf(Data) = Type("Array") Then
|
||||
RequestBodyCollection = Data;
|
||||
EndIf;
|
||||
|
||||
EndIf;
|
||||
|
||||
SetBodyFromString(Data);
|
||||
@@ -551,7 +584,8 @@ Function SetFormBody(Val Data) Export
|
||||
|
||||
Else
|
||||
|
||||
Data = RequestParametersToString(Data);
|
||||
RequestBodyCollection = Data;
|
||||
Data = RequestParametersToString(Data);
|
||||
|
||||
EndIf;
|
||||
|
||||
@@ -594,6 +628,8 @@ Function StartMultipartBody(UseFile = True, Val View = "form-data") Export
|
||||
Encoding = GetSetting("EncodeRequestBody");
|
||||
RequestDataType = StrTemplate("multipart/%1; boundary=%2", View, Boundary);
|
||||
|
||||
RequestBodyCollection = New Structure;
|
||||
|
||||
If UseFile Then
|
||||
|
||||
AddLog("StartMultipartBody: creating a temporary file");
|
||||
@@ -722,6 +758,7 @@ Function AddMultipartFormDataField(Val FieldName, Val Value) Export
|
||||
|
||||
Value = ?(Value, "true", "false");
|
||||
RequestDataWriter.WriteLine(Value);
|
||||
RequestBodyCollection.Insert(FieldName, Value);
|
||||
|
||||
ElsIf ValeType = Type("BinaryData") Then
|
||||
|
||||
@@ -731,6 +768,7 @@ Function AddMultipartFormDataField(Val FieldName, Val Value) Export
|
||||
|
||||
OPI_TypeConversion.GetLine(Value);
|
||||
RequestDataWriter.WriteLine(Value);
|
||||
RequestBodyCollection.Insert(FieldName, Value);
|
||||
|
||||
EndIf;
|
||||
|
||||
@@ -915,7 +953,9 @@ Function AddBearerAuthorization(Val Token) Export
|
||||
If StopExecution() Then Return ЭтотОбъект; EndIf;
|
||||
|
||||
OPI_TypeConversion.GetLine(Token);
|
||||
Bearer = Token;
|
||||
|
||||
AuthType = "bearer";
|
||||
AuthData = Token;
|
||||
|
||||
Return ЭтотОбъект;
|
||||
|
||||
@@ -942,14 +982,86 @@ Function AddAWS4Authorization(Val AccessKey, Val SecretKey, Val Region, Val Serv
|
||||
|
||||
If StopExecution() Then Return ЭтотОбъект; EndIf;
|
||||
|
||||
String_ = "String";
|
||||
AWS4Using = True;
|
||||
String_ = "String";
|
||||
AuthType = "aws4";
|
||||
|
||||
AWS4Data = New Structure;
|
||||
OPI_Tools.AddField("AccessKey", AccessKey, String_, AWS4Data);
|
||||
OPI_Tools.AddField("SecretKey", SecretKey, String_, AWS4Data);
|
||||
OPI_Tools.AddField("Region" , Region , String_, AWS4Data);
|
||||
OPI_Tools.AddField("Service" , Service , String_, AWS4Data);
|
||||
AuthData = New Structure;
|
||||
OPI_Tools.AddField("AccessKey", AccessKey, String_, AuthData);
|
||||
OPI_Tools.AddField("SecretKey", SecretKey, String_, AuthData);
|
||||
OPI_Tools.AddField("Region" , Region , String_, AuthData);
|
||||
OPI_Tools.AddField("Service" , Service , String_, AuthData);
|
||||
|
||||
Return ЭтотОбъект;
|
||||
|
||||
Except
|
||||
Return Error(DetailErrorDescription(ErrorInfo()));
|
||||
EndTry;
|
||||
|
||||
EndFunction
|
||||
|
||||
// Add OAuth V1 authorization
|
||||
// Adds data for OAuth v1 authorization
|
||||
//
|
||||
// Note
|
||||
// By default, HMAC-SHA256 is used to create the signature. To change the algorithm, you can use^^
|
||||
// `SetOAuthV1Algorithm`
|
||||
//
|
||||
// Parameters:
|
||||
// Token - String - Token for authorization - token
|
||||
// Secret - String - Secret for authorization - secret
|
||||
// ConsumerKey - String - Consumer key for authorization - ck
|
||||
// ConsumerSecret - String - Consumer secret for authorization - cs
|
||||
// Version - String - API version - ver
|
||||
//
|
||||
// Returns:
|
||||
// DataProcessorObject.OPI_HTTPClient - This processor object
|
||||
Function AddOauthV1Authorization(Val Token, Val Secret, Val ConsumerKey, Val ConsumerSecret, Val Version) Export
|
||||
|
||||
Try
|
||||
|
||||
If StopExecution() Then Return ЭтотОбъект; EndIf;
|
||||
|
||||
String_ = "String";
|
||||
AuthType = "oauth1";
|
||||
|
||||
AuthData = New Structure;
|
||||
OPI_Tools.AddField("OAuthToken" , Token , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthSecret" , Secret , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthConsumerKey" , ConsumerKey , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthConsumerSecret", ConsumerSecret , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthAlgorithm" , "HMAC" , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthHashFunction" , "SHA256" , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthAPIVersion" , Version , String_, AuthData);
|
||||
|
||||
Return ЭтотОбъект;
|
||||
|
||||
Except
|
||||
Return Error(DetailErrorDescription(ErrorInfo()));
|
||||
EndTry;
|
||||
|
||||
EndFunction
|
||||
|
||||
// Set OAuth V1 algorithm
|
||||
// Changes the algorithm for OAuth signatures
|
||||
//
|
||||
// Parameters:
|
||||
// Algorithm - String - Encryption algorithm: HMAC, RSA - alg
|
||||
// HashFunction - String - Hash function for signature: SHA1, SHA256 - hash
|
||||
//
|
||||
// Returns:
|
||||
// DataProcessorObject.OPI_HTTPClient - This processor object
|
||||
Function SetOAuthV1Algorithm(Val Algorithm, Val HashFunction) Export
|
||||
|
||||
Try
|
||||
|
||||
If StopExecution() Then Return ЭтотОбъект; EndIf;
|
||||
|
||||
If AuthType <> "oauth1" Then
|
||||
Return Error("SetOAuthV1Algorithm: OAuth v1 authorization must be initialized before the algorithm is changed");
|
||||
EndIf;
|
||||
|
||||
OPI_Tools.AddField("OAuthAlgorithm" , Algorithm , "String", AuthData);
|
||||
OPI_Tools.AddField("OAuthHashFunction", HashFunction, "String", AuthData);
|
||||
|
||||
Return ЭтотОбъект;
|
||||
|
||||
@@ -1530,15 +1642,7 @@ Function CompleteHeaders()
|
||||
|
||||
EndIf;
|
||||
|
||||
If AWS4Using Then
|
||||
AddLog("CompleteHeaders: generating AWS4 Authorization Header");
|
||||
AddAWS4();
|
||||
EndIf;
|
||||
|
||||
If ValueIsFilled(Bearer) Then
|
||||
AddLog("CompleteHeaders: generating Bearer Authorization Header");
|
||||
Request.Headers.Insert("Authorization", StrTemplate("Bearer %1", Bearer));
|
||||
EndIf;
|
||||
CompleteAuthHeaders();
|
||||
|
||||
If GetSetting("gzip") Then
|
||||
AddLog("CompleteHeaders: setting the gzip header");
|
||||
@@ -1561,6 +1665,33 @@ Function CompleteHeaders()
|
||||
|
||||
EndFunction
|
||||
|
||||
Function CompleteAuthHeaders()
|
||||
|
||||
If Not ValueIsFilled(AuthType) Then
|
||||
Return ЭтотОбъект;
|
||||
EndIf;
|
||||
|
||||
If AuthType = "aws4" Then
|
||||
|
||||
AddLog("CompleteAuthHeaders: generating AWS4 Authorization header");
|
||||
AddAWS4();
|
||||
|
||||
ElsIf AuthType = "oauth1" Then
|
||||
|
||||
AddLog("CompleteAuthHeaders: generating OAuth V1 Authorization header");
|
||||
AddOAuthV1Header();
|
||||
|
||||
Else
|
||||
|
||||
AddLog("CompleteAuthHeaders: generating Bearer Authorization header");
|
||||
Request.Headers.Insert("Authorization", StrTemplate("Bearer %1", AuthData));
|
||||
|
||||
EndIf;
|
||||
|
||||
Return ЭтотОбъект;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function SetRequestBody()
|
||||
|
||||
If Multipart Then
|
||||
@@ -2009,7 +2140,7 @@ EndFunction
|
||||
|
||||
Function CreateAuthorizationHeader()
|
||||
|
||||
AccessKey = AWS4Data["AccessKey"];
|
||||
AccessKey = AuthData["AccessKey"];
|
||||
CurrentDate = CurrentUniversalDate();
|
||||
|
||||
Request.Headers.Insert("x-amz-date", OPI_Tools.ISOTimestamp(CurrentDate));
|
||||
@@ -2029,16 +2160,16 @@ EndFunction
|
||||
|
||||
Function GetMainSignatureParts(Val CurrentDate)
|
||||
|
||||
SecretKey = AWS4Data["SecretKey"];
|
||||
Region = AWS4Data["Region"];
|
||||
Service = AWS4Data["Service"];
|
||||
SecretKey = AuthData["SecretKey"];
|
||||
Region = AuthData["Region"];
|
||||
Service = AuthData["Service"];
|
||||
|
||||
SignKey = GetSignatureKey(SecretKey, Region, Service, CurrentDate);
|
||||
CanonicalRequest = CreateCanonicalRequest();
|
||||
Scope = CreateScope(Region, Service, CurrentDate);
|
||||
StringToSign = CreateSignatureString(CanonicalRequest, Scope, CurrentDate);
|
||||
|
||||
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
||||
Signature = OPI_Cryptography.HMAC(SignKey, StringToSign, "SHA256");
|
||||
Signature = Lower(ПолучитьHexСтрокуИзДвоичныхДанных(Signature));
|
||||
|
||||
HeadersKeys = GetHeadersKeysString();
|
||||
@@ -2073,12 +2204,13 @@ Function GetSignatureKey(Val SecretKey, Val Region, Val Service, Val CurrentDate
|
||||
Region = ПолучитьДвоичныеДанныеИзСтроки(Region);
|
||||
Service = ПолучитьДвоичныеДанныеИзСтроки(Service);
|
||||
AWSRequest = ПолучитьДвоичныеДанныеИзСтроки("aws4_request");
|
||||
SHA256_ = "SHA256";
|
||||
|
||||
DataKey = OPI_Cryptography.HMACSHA256(SecretKey, DateData);
|
||||
RegionKey = OPI_Cryptography.HMACSHA256(DataKey, Region);
|
||||
ServiceKey = OPI_Cryptography.HMACSHA256(RegionKey, Service);
|
||||
DataKey = OPI_Cryptography.HMAC(SecretKey, DateData, SHA256_);
|
||||
RegionKey = OPI_Cryptography.HMAC(DataKey, Region, SHA256_);
|
||||
ServiceKey = OPI_Cryptography.HMAC(RegionKey, Service, SHA256_);
|
||||
|
||||
FinalKey = OPI_Cryptography.HMACSHA256(ServiceKey, AWSRequest);
|
||||
FinalKey = OPI_Cryptography.HMAC(ServiceKey, AWSRequest, SHA256_);
|
||||
|
||||
Return FinalKey;
|
||||
|
||||
@@ -2273,6 +2405,144 @@ EndProcedure
|
||||
|
||||
#EndRegion
|
||||
|
||||
#Region OAuth
|
||||
|
||||
Function AddOAuthV1Header()
|
||||
|
||||
OAuthAlgorithm = AuthData["OAuthAlgorithm"];
|
||||
OAuthHashFunction = AuthData["OAuthHashFunction"];
|
||||
OAuthToken = AuthData["OAuthToken"];
|
||||
OAuthSecret = AuthData["OAuthSecret"];
|
||||
OAuthConsumerKey = AuthData["OAuthConsumerKey"];
|
||||
OAuthConsumerSecret = AuthData["OAuthConsumerSecret"];
|
||||
OAuthAPIVersion = AuthData["OAuthAPIVersion"];
|
||||
|
||||
HashingMethod = OAuthAlgorithm + "-" + OAuthHashFunction;
|
||||
CurrentDate = OPI_Tools.GetCurrentDate();
|
||||
AuthorizationHeader = "";
|
||||
SignatureString = "";
|
||||
Signature = "";
|
||||
|
||||
CurrentUNIXDate = OPI_Tools.UNIXTime(CurrentDate);
|
||||
CurrentUNIXDate = OPI_Tools.NumberToString(CurrentUNIXDate);
|
||||
|
||||
ParametersTable = New ValueTable;
|
||||
ParametersTable.Columns.Add("Key");
|
||||
ParametersTable.Columns.Add("Value");
|
||||
|
||||
If Not ValueIsFilled(RequestBodyCollection)
|
||||
Or Not OPI_Tools.ThisIsCollection(RequestBodyCollection, True) Then
|
||||
|
||||
Try
|
||||
RequestBodyCollection = RequestBody;
|
||||
OPI_TypeConversion.GetKeyValueCollection(RequestBodyCollection);
|
||||
Except
|
||||
RequestBodyCollection = New Structure;
|
||||
EndTry;
|
||||
|
||||
EndIf;
|
||||
|
||||
If GetSetting("MultipartAtOAuth") Or Not Multipart Then
|
||||
For Each Field In RequestBodyCollection Do
|
||||
|
||||
If TypeOf(Field.Value) = Type("BinaryData") Then
|
||||
Continue;
|
||||
EndIf;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = Field.Key;
|
||||
NewLine.Value = Field.Value;
|
||||
|
||||
EndDo;
|
||||
EndIf;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_consumer_key";
|
||||
NewLine.Value = OAuthConsumerKey;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_token";
|
||||
NewLine.Value = OAuthToken;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_version";
|
||||
NewLine.Value = OAuthAPIVersion;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_signature_method";
|
||||
NewLine.Value = HashingMethod;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_timestamp";
|
||||
NewLine.Value = CurrentUNIXDate;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_nonce";
|
||||
NewLine.Value = CurrentUNIXDate;
|
||||
|
||||
For Each TableRow In ParametersTable Do
|
||||
|
||||
TableRow.Key = EncodeString(TableRow.Key, StringEncodingMethod.URLencoding);
|
||||
TableRow.Value = EncodeString(TableRow.Value, StringEncodingMethod.URLencoding);
|
||||
|
||||
EndDo;
|
||||
|
||||
ParametersTable.Sort("Key");
|
||||
|
||||
For Each TableRow In ParametersTable Do
|
||||
|
||||
SignatureString = SignatureString
|
||||
+ TableRow.Key
|
||||
|
||||
+ "="
|
||||
+ TableRow.Value
|
||||
+ "&";
|
||||
|
||||
EndDo;
|
||||
|
||||
SignatureString = Left(SignatureString, StrLen(SignatureString) - 1);
|
||||
SignatureString = Upper(RequestMethod)
|
||||
+ "&"
|
||||
+ EncodeString(RequestURL , StringEncodingMethod.URLencoding)
|
||||
+ "&"
|
||||
+ EncodeString(SignatureString, StringEncodingMethod.URLencoding);
|
||||
|
||||
Signature = EncodeString(OAuthConsumerSecret, StringEncodingMethod.URLencoding)
|
||||
+ "&"
|
||||
+ EncodeString(OAuthSecret, StringEncodingMethod.URLencoding);
|
||||
|
||||
SignBD = ПолучитьДвоичныеДанныеИзСтроки(Signature);
|
||||
SignatureBD = ПолучитьДвоичныеДанныеИзСтроки(SignatureString);
|
||||
|
||||
Signature = OPI_Cryptography.CreateSignature(SignBD, SignatureBD, OAuthAlgorithm, OAuthHashFunction);
|
||||
Signature = EncodeString(Base64String(Signature), StringEncodingMethod.URLencoding);
|
||||
|
||||
Delimiter = """,";
|
||||
|
||||
AuthorizationHeader = AuthorizationHeader
|
||||
+ "OAuth "
|
||||
+ "oauth_consumer_key=""" + OAuthConsumerKey + Delimiter
|
||||
|
||||
+ "oauth_token=""" + OAuthToken + Delimiter
|
||||
|
||||
+ "oauth_signature_method=""" + HashingMethod + Delimiter
|
||||
|
||||
+ "oauth_timestamp=""" + CurrentUNIXDate + Delimiter
|
||||
|
||||
+ "oauth_nonce=""" + CurrentUNIXDate + Delimiter
|
||||
|
||||
+ "oauth_version=""" + OAuthAPIVersion + Delimiter
|
||||
|
||||
+ "oauth_signature=" + Signature;
|
||||
|
||||
Request.Headers.Insert("Authorization", AuthorizationHeader);
|
||||
|
||||
Return ЭтотОбъект;
|
||||
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
|
||||
#Region Auxiliary
|
||||
|
||||
Function StopExecution(Val ExceptionOnError = False)
|
||||
@@ -2346,6 +2616,7 @@ Procedure SetDefaultSettings()
|
||||
Settings.Insert("SplitArrayParams" , False);
|
||||
Settings.Insert("URLencoding" , True);
|
||||
Settings.Insert("EncodeRequestBody" , "UTF-8");
|
||||
Settings.Insert("MultipartAtOAuth" , True);
|
||||
|
||||
EndProcedure
|
||||
|
||||
|
||||
+57
-19
@@ -35,6 +35,48 @@
|
||||
|
||||
#Region Internal
|
||||
|
||||
Function CreateSignature(Val SignKey, Val SignatureData, Val Algorithm, Val HashFunc) Export
|
||||
|
||||
OPI_TypeConversion.GetBinaryData(SignKey);
|
||||
OPI_TypeConversion.GetBinaryData(SignatureData);
|
||||
OPI_TypeConversion.GetLine(Algorithm);
|
||||
|
||||
Algorithm = Upper(Algorithm);
|
||||
HashFunc = Upper(HashFunc);
|
||||
|
||||
If Algorithm = "HMAC" Then
|
||||
Result = HMAC(SignKey, SignatureData, HashFunc);
|
||||
ElsIf Algorithm = "RSA" Then
|
||||
Result = RSA(SignKey, SignatureData, HashFunc);
|
||||
Else
|
||||
Raise "Cryptography processing error: unsupported method";
|
||||
EndIf;
|
||||
|
||||
Return Result;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function RSA(Val Key, Val Data, Val HashFunc) Export
|
||||
|
||||
AddIn = OPI_AddIns.GetAddIn("Cryptography");
|
||||
|
||||
If HashFunc = "SHA256" Then
|
||||
Result = AddIn.RsaSha256(Key, Data);
|
||||
ElsIf HashFunc = "SHA1" Then
|
||||
Result = AddIn.RsaSha1(Key, Data);
|
||||
Else
|
||||
Result = "unsupported hashing method";
|
||||
EndIf;
|
||||
|
||||
If TypeOf(Result) = Type("String") Then
|
||||
Raise StrTemplate("Cryptography processing error: %1", Result);
|
||||
Else
|
||||
Return Result;
|
||||
EndIf;
|
||||
|
||||
EndFunction
|
||||
|
||||
|
||||
#Region BSP
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -45,27 +87,14 @@
|
||||
// https://creativecommons.org/licenses/by/4.0/legalcode
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Function HMACSHA256(Val Key, Val Data) Export
|
||||
Function HMAC(Val Key, Val Data, Val HashFunc) Export
|
||||
|
||||
Return HMAC(Key, Data, HashFunction.SHA256, 64);
|
||||
|
||||
EndFunction
|
||||
|
||||
Function Hash(BinaryData, Type) Export
|
||||
|
||||
Hashing = New DataHashing(Type);
|
||||
Hashing.Append(BinaryData);
|
||||
|
||||
Return Hashing.HashSum;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function HMAC(Val Key, Val Data, Type, BlockSize) Export
|
||||
|
||||
Twice = 2;
|
||||
Twice = 2;
|
||||
BlockSize = 64;
|
||||
HashType = HashFunction[HashFunc];
|
||||
|
||||
If Key.Size() > BlockSize Then
|
||||
Key = Hash(Key, Type);
|
||||
Key = Hash(Key, HashType);
|
||||
EndIf;
|
||||
|
||||
If Key.Size() <= BlockSize Then
|
||||
@@ -84,7 +113,16 @@ Function HMAC(Val Key, Val Data, Type, BlockSize) Export
|
||||
Opad.WriteBitwiseXor(0, Key);
|
||||
Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
|
||||
|
||||
Return Hash(UniteBinaryData(okeypad, Hash(UniteBinaryData(ikeypad, Data), Type)), Type);
|
||||
Return Hash(UniteBinaryData(okeypad, Hash(UniteBinaryData(ikeypad, Data), HashType)), HashType);
|
||||
|
||||
EndFunction
|
||||
|
||||
Function Hash(BinaryData, Type) Export
|
||||
|
||||
Hashing = New DataHashing(Type);
|
||||
Hashing.Append(BinaryData);
|
||||
|
||||
Return Hashing.HashSum;
|
||||
|
||||
EndFunction
|
||||
|
||||
|
||||
+57
-19
@@ -35,6 +35,48 @@
|
||||
|
||||
#Region Internal
|
||||
|
||||
Function CreateSignature(Val SignKey, Val SignatureData, Val Algorithm, Val HashFunc) Export
|
||||
|
||||
OPI_TypeConversion.GetBinaryData(SignKey);
|
||||
OPI_TypeConversion.GetBinaryData(SignatureData);
|
||||
OPI_TypeConversion.GetLine(Algorithm);
|
||||
|
||||
Algorithm = Upper(Algorithm);
|
||||
HashFunc = Upper(HashFunc);
|
||||
|
||||
If Algorithm = "HMAC" Then
|
||||
Result = HMAC(SignKey, SignatureData, HashFunc);
|
||||
ElsIf Algorithm = "RSA" Then
|
||||
Result = RSA(SignKey, SignatureData, HashFunc);
|
||||
Else
|
||||
Raise "Cryptography processing error: unsupported method";
|
||||
EndIf;
|
||||
|
||||
Return Result;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function RSA(Val Key, Val Data, Val HashFunc) Export
|
||||
|
||||
AddIn = OPI_AddIns.GetAddIn("Cryptography");
|
||||
|
||||
If HashFunc = "SHA256" Then
|
||||
Result = AddIn.RsaSha256(Key, Data);
|
||||
ElsIf HashFunc = "SHA1" Then
|
||||
Result = AddIn.RsaSha1(Key, Data);
|
||||
Else
|
||||
Result = "unsupported hashing method";
|
||||
EndIf;
|
||||
|
||||
If TypeOf(Result) = Type("String") Then
|
||||
Raise StrTemplate("Cryptography processing error: %1", Result);
|
||||
Else
|
||||
Return Result;
|
||||
EndIf;
|
||||
|
||||
EndFunction
|
||||
|
||||
|
||||
#Region BSP
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -45,27 +87,14 @@
|
||||
// https://creativecommons.org/licenses/by/4.0/legalcode
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Function HMACSHA256(Val Key, Val Data) Export
|
||||
Function HMAC(Val Key, Val Data, Val HashFunc) Export
|
||||
|
||||
Return HMAC(Key, Data, HashFunction.SHA256, 64);
|
||||
|
||||
EndFunction
|
||||
|
||||
Function Hash(BinaryData, Type) Export
|
||||
|
||||
Hashing = New DataHashing(Type);
|
||||
Hashing.Append(BinaryData);
|
||||
|
||||
Return Hashing.HashSum;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function HMAC(Val Key, Val Data, Type, BlockSize) Export
|
||||
|
||||
Twice = 2;
|
||||
Twice = 2;
|
||||
BlockSize = 64;
|
||||
HashType = HashFunction[HashFunc];
|
||||
|
||||
If Key.Size() > BlockSize Then
|
||||
Key = Hash(Key, Type);
|
||||
Key = Hash(Key, HashType);
|
||||
EndIf;
|
||||
|
||||
If Key.Size() <= BlockSize Then
|
||||
@@ -84,7 +113,16 @@ Function HMAC(Val Key, Val Data, Type, BlockSize) Export
|
||||
Opad.WriteBitwiseXor(0, Key);
|
||||
Okeypad = GetBinaryDataFromBinaryDataBuffer(opad);
|
||||
|
||||
Return Hash(UniteBinaryData(okeypad, Hash(UniteBinaryData(ikeypad, Data), Type)), Type);
|
||||
Return Hash(UniteBinaryData(okeypad, Hash(UniteBinaryData(ikeypad, Data), HashType)), HashType);
|
||||
|
||||
EndFunction
|
||||
|
||||
Function Hash(BinaryData, Type) Export
|
||||
|
||||
Hashing = New DataHashing(Type);
|
||||
Hashing.Append(BinaryData);
|
||||
|
||||
Return Hashing.HashSum;
|
||||
|
||||
EndFunction
|
||||
|
||||
|
||||
+6
-5
@@ -1309,7 +1309,7 @@ Function CreateURLSignature(Val DataStructure, Val Method, Val Expire, Val Heade
|
||||
, HashString);
|
||||
|
||||
StringToSign = CreateSignatureString(CanonicalRequest, Scope, CurrentDate);
|
||||
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
||||
Signature = OPI_Cryptography.HMAC(SignKey, StringToSign, "SHA256");
|
||||
Signature = Lower(GetHexStringFromBinaryData(Signature));
|
||||
|
||||
OPI_Tools.AddKeyValue(URLParameters, "X-Amz-Signature", Signature);
|
||||
@@ -1327,12 +1327,13 @@ Function GetSignatureKey(Val SecretKey, Val Region, Val Service, Val CurrentDate
|
||||
Region = GetBinaryDataFromString(Region);
|
||||
Service = GetBinaryDataFromString(Service);
|
||||
AWSRequest = GetBinaryDataFromString("aws4_request");
|
||||
Sha256_ = "SHA256";
|
||||
|
||||
DataKey = OPI_Cryptography.HMACSHA256(SecretKey, DateData);
|
||||
RegionKey = OPI_Cryptography.HMACSHA256(DataKey, Region);
|
||||
ServiceKey = OPI_Cryptography.HMACSHA256(RegionKey, Service);
|
||||
DataKey = OPI_Cryptography.HMAC(SecretKey, DateData, Sha256_);
|
||||
RegionKey = OPI_Cryptography.HMAC(DataKey, Region, Sha256_);
|
||||
ServiceKey = OPI_Cryptography.HMAC(RegionKey, Service, Sha256_);
|
||||
|
||||
FinalKey = OPI_Cryptography.HMACSHA256(ServiceKey, AWSRequest);
|
||||
FinalKey = OPI_Cryptography.HMAC(ServiceKey, AWSRequest, Sha256_);
|
||||
|
||||
Return FinalKey;
|
||||
|
||||
|
||||
+2
-2
@@ -237,7 +237,7 @@ Function ProcessTMAData(Val DataString, Val Token) Export
|
||||
Hash = "";
|
||||
BinaryKey = GetBinaryDataFromString(KeyString);
|
||||
|
||||
Result = OPI_Cryptography.HMACSHA256(BinaryKey, GetBinaryDataFromString(Token));
|
||||
Result = OPI_Cryptography.HMACSHA(BinaryKey, GetBinaryDataFromString(Token), "SHA256");
|
||||
|
||||
TValue = New ValueTable;
|
||||
TValue.Columns.Add("Key");
|
||||
@@ -268,7 +268,7 @@ Function ProcessTMAData(Val DataString, Val Token) Export
|
||||
EndDo;
|
||||
|
||||
DCS = Left(DCS, StrLen(DCS) - 1);
|
||||
Signature = OPI_Cryptography.HMACSHA256(Result, GetBinaryDataFromString(DCS));
|
||||
Signature = OPI_Cryptography.HMAC(Result, GetBinaryDataFromString(DCS), "SHA256");
|
||||
|
||||
Final = GetHexStringFromBinaryData(Signature);
|
||||
|
||||
|
||||
@@ -305,7 +305,7 @@ Function GetTestTable() Export
|
||||
NewTest(TestTable, "OLLM_WorkingWithBlob" , "Working with Blob" , Ollama);
|
||||
NewTest(TestTable, "HTTP_Initialization" , "Initialization" , Http);
|
||||
NewTest(TestTable, "HTTP_BodySet" , "Body set" , Http);
|
||||
NewTest(TestTable, "HTTP_Settings" , "Settings" , Http);
|
||||
NewTest(TestTable, "HTTP_Settings" , "Settings" , Http);
|
||||
|
||||
Return TestTable;
|
||||
|
||||
|
||||
+1
-1
@@ -1029,7 +1029,7 @@ Procedure TwitterAPI_Tweets() Export
|
||||
OPI_TestDataRetrieval.ParameterToCollection("GIF" , TestParameters);
|
||||
OPI_TestDataRetrieval.ParameterToCollection("Video" , TestParameters);
|
||||
|
||||
Twitter_CreateTextTweet(TestParameters);
|
||||
//Twitter_CreateTextTweet(TestParameters);
|
||||
Twitter_UploadAttachmentsArray(TestParameters);
|
||||
Twitter_CreateVideoTweet(TestParameters);
|
||||
Twitter_CreateImageTweet(TestParameters);
|
||||
|
||||
+87
-135
@@ -100,7 +100,9 @@ Function GetToken(Val Code, Val Parameters = "") Export
|
||||
RequestParameters.Insert("code_verifier", "challenge");
|
||||
|
||||
Response = OPI_HTTPRequests.PostWithBody("https://api.twitter.com/2/oauth2/token"
|
||||
, RequestParameters, , False);
|
||||
, RequestParameters
|
||||
,
|
||||
, False);
|
||||
|
||||
Return Response;
|
||||
|
||||
@@ -125,7 +127,9 @@ Function RefreshToken(Val Parameters = "") Export
|
||||
RequestParameters.Insert("client_id" , Parameters_["client_id"]);
|
||||
|
||||
Response = OPI_HTTPRequests.PostWithBody("https://api.twitter.com/2/oauth2/token"
|
||||
, RequestParameters, , False);
|
||||
, RequestParameters
|
||||
,
|
||||
, False);
|
||||
|
||||
Return Response;
|
||||
|
||||
@@ -218,12 +222,12 @@ Function CreateCustomTweet(Val Text = ""
|
||||
EndIf;
|
||||
|
||||
If ValueIsFilled(Fields["media"]) Then
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters_, New Structure, "POST", URL);
|
||||
IsV2 = False;
|
||||
Else
|
||||
Authorization = CreateAuthorizationHeaderV2(Parameters_);
|
||||
IsV2 = True;
|
||||
EndIf;
|
||||
|
||||
Response = OPI_HTTPRequests.PostWithBody(URL, Fields, Authorization);
|
||||
Response = Post(URL, Fields, Parameters_, True, IsV2);
|
||||
|
||||
Return Response;
|
||||
|
||||
@@ -389,9 +393,7 @@ Function UploadMediaInParts(Val File, Val Type, Val RequestType, Val URL, Parame
|
||||
Fields.Insert("total_bytes" , OPI_Tools.NumberToString(Size));
|
||||
Fields.Insert("media_category", Type);
|
||||
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, RequestType, URL);
|
||||
|
||||
InitializationResponse = OPI_HTTPRequests.PostWithBody(URL, Fields, Authorization, False);
|
||||
InitializationResponse = Post(URL, Fields, Parameters);
|
||||
InitializationID = InitializationResponse[MID];
|
||||
InitializationIDS = InitializationResponse[MIS];
|
||||
|
||||
@@ -409,8 +411,7 @@ Function UploadMediaInParts(Val File, Val Type, Val RequestType, Val URL, Parame
|
||||
Fields.Insert("segment_index", OPI_Tools.NumberToString(Counter));
|
||||
Fields.Insert("media" , Part);
|
||||
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters, New Structure, RequestType, URL);
|
||||
Response = OPI_HTTPRequests.PostMultipart(URL, Fields, , , Authorization);
|
||||
Response = PostMultipart(URL, Fields, Parameters);
|
||||
|
||||
Counter = Counter + 1;
|
||||
|
||||
@@ -443,9 +444,8 @@ Function WaitForProcessingCompletion(Val ProcessingStatus, Val InitializationID,
|
||||
|
||||
While String(ProcessingStatus) = "pending" Or String(ProcessingStatus) = "in_progress" Do
|
||||
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, "GET", URL);
|
||||
Response = OPI_HTTPRequests.Get(URL, Fields, Authorization);
|
||||
Information = Response[ProcessingInfo];
|
||||
Response = Get(URL, Fields, Parameters);
|
||||
Information = Response[ProcessingInfo];
|
||||
|
||||
If Not ValueIsFilled(Information) Then
|
||||
Return Response;
|
||||
@@ -537,132 +537,11 @@ Function GetStandardParameters(Val Parameters = "")
|
||||
|
||||
EndFunction
|
||||
|
||||
Function CreateAuthorizationHeaderV1(Val Parameters, Val Fields, Val RequestType, Val URL)
|
||||
|
||||
CurrentDate = OPI_Tools.GetCurrentDate();
|
||||
AuthorizationHeader = "";
|
||||
HashingMethod = "HMAC-SHA1";
|
||||
APIVersion = "1.0";
|
||||
SignatureString = "";
|
||||
Signature = "";
|
||||
OCK = "oauth_consumer_key";
|
||||
OTK = "oauth_token";
|
||||
CurrentUNIXDate = OPI_Tools.UNIXTime(CurrentDate);
|
||||
CurrentUNIXDate = OPI_Tools.NumberToString(CurrentUNIXDate);
|
||||
ParametersTable = New ValueTable;
|
||||
ParametersTable.Columns.Add("Key");
|
||||
ParametersTable.Columns.Add("Value");
|
||||
|
||||
For Each Field In Fields Do
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = Field.Key;
|
||||
NewLine.Value = Field.Value;
|
||||
|
||||
EndDo;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = OCK;
|
||||
NewLine.Value = Parameters[OCK];
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = OTK;
|
||||
NewLine.Value = Parameters[OTK];
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_version";
|
||||
NewLine.Value = APIVersion;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_signature_method";
|
||||
NewLine.Value = HashingMethod;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_timestamp";
|
||||
NewLine.Value = CurrentUNIXDate;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_nonce";
|
||||
NewLine.Value = CurrentUNIXDate;
|
||||
|
||||
For Each TableRow In ParametersTable Do
|
||||
|
||||
TableRow.Key = EncodeString(TableRow.Key, StringEncodingMethod.URLencoding);
|
||||
TableRow.Value = EncodeString(TableRow.Value, StringEncodingMethod.URLencoding);
|
||||
|
||||
EndDo;
|
||||
|
||||
ParametersTable.Sort("Key");
|
||||
|
||||
For Each TableRow In ParametersTable Do
|
||||
|
||||
SignatureString = SignatureString
|
||||
+ TableRow.Key
|
||||
|
||||
+ "="
|
||||
+ TableRow.Value
|
||||
+ "&";
|
||||
|
||||
EndDo;
|
||||
|
||||
SignatureString = Left(SignatureString, StrLen(SignatureString) - 1);
|
||||
SignatureString = Upper(RequestType)
|
||||
+ "&"
|
||||
+ EncodeString(URL , StringEncodingMethod.URLencoding)
|
||||
+ "&"
|
||||
+ EncodeString(SignatureString, StringEncodingMethod.URLencoding);
|
||||
|
||||
Signature = EncodeString(Parameters["oauth_consumer_secret"], StringEncodingMethod.URLencoding)
|
||||
+ "&"
|
||||
+ EncodeString(Parameters["oauth_token_secret"], StringEncodingMethod.URLencoding);
|
||||
|
||||
Signature = OPI_Cryptography.HMAC(GetBinaryDataFromString(Signature)
|
||||
, GetBinaryDataFromString(SignatureString)
|
||||
, HashFunction.SHA1
|
||||
, 64);
|
||||
|
||||
Signature = EncodeString(Base64String(Signature), StringEncodingMethod.URLencoding);
|
||||
|
||||
Delimiter = """,";
|
||||
|
||||
AuthorizationHeader = AuthorizationHeader
|
||||
+ "OAuth "
|
||||
+ "oauth_consumer_key=""" + Parameters[OCK] + Delimiter
|
||||
|
||||
+ "oauth_token=""" + Parameters[OTK] + Delimiter
|
||||
|
||||
+ "oauth_signature_method=""" + HashingMethod + Delimiter
|
||||
|
||||
+ "oauth_timestamp=""" + CurrentUNIXDate + Delimiter
|
||||
|
||||
+ "oauth_nonce=""" + CurrentUNIXDate + Delimiter
|
||||
|
||||
+ "oauth_version=""" + APIVersion + Delimiter
|
||||
|
||||
+ "oauth_signature=" + Signature;
|
||||
|
||||
HeaderMapping = New Map;
|
||||
HeaderMapping.Insert("Authorization", AuthorizationHeader);
|
||||
|
||||
Return HeaderMapping;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function CreateAuthorizationHeaderV2(Val Parameters)
|
||||
|
||||
ReturnMapping = New Map;
|
||||
ReturnMapping.Insert("Authorization", "Bearer " + Parameters["access_token"]);
|
||||
|
||||
Return ReturnMapping;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function GetProcessingStatus(Val Parameters, Val Fields, Val URL)
|
||||
|
||||
ProcessingInfo = "processing_info";
|
||||
Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, "POST", URL);
|
||||
|
||||
Response = OPI_HTTPRequests.PostWithBody(URL, Fields, Authorization, False);
|
||||
Response = Post(URL, Fields, Parameters);
|
||||
Information = Response[ProcessingInfo];
|
||||
|
||||
If Not ValueIsFilled(Information) Then
|
||||
@@ -679,4 +558,77 @@ Function GetProcessingStatus(Val Parameters, Val Fields, Val URL)
|
||||
|
||||
EndFunction
|
||||
|
||||
Function Get(Val URL, Val Fields, Val SecretData)
|
||||
|
||||
Token = SecretData["oauth_token"];
|
||||
Secret = SecretData["oauth_token_secret"];
|
||||
UsersKey = SecretData["oauth_consumer_key"];
|
||||
UsersSecret = SecretData["oauth_consumer_secret"];
|
||||
Version = "1.0";
|
||||
|
||||
Result = OPI_HTTPRequests.NewRequest()
|
||||
.Initialize(URL)
|
||||
.SetURLParams(Fields)
|
||||
.AddOauthV1Authorization(Token, Secret, UsersKey, UsersSecret, Version)
|
||||
.SetOAuthV1Algorithm("HMAC", "SHA1")
|
||||
.ProcessRequest("GET")
|
||||
.ReturnResponseAsJSONObject(True, True);
|
||||
|
||||
Return Result;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function Post(Val URL, Val Fields, Val SecretData, Val JSON = False, Val IsV2 = False)
|
||||
|
||||
Token = SecretData["oauth_token"];
|
||||
Secret = SecretData["oauth_token_secret"];
|
||||
UsersKey = SecretData["oauth_consumer_key"];
|
||||
UsersSecret = SecretData["oauth_consumer_secret"];
|
||||
Version = "1.0";
|
||||
|
||||
HttpClient = OPI_HTTPRequests.NewRequest()
|
||||
.Initialize(URL);
|
||||
|
||||
If IsV2 Then
|
||||
HttpClient.AddHeader("Authorization", "Bearer " + SecretData["access_token"]);
|
||||
Else
|
||||
HttpClient.AddOauthV1Authorization(Token, Secret, UsersKey, UsersSecret, Version)
|
||||
.SetOAuthV1Algorithm("HMAC", "SHA1");
|
||||
EndIf;
|
||||
|
||||
If JSON Then
|
||||
HttpClient.SetJsonBody(Fields);
|
||||
Else
|
||||
HttpClient.SetFormBody(Fields);
|
||||
EndIf;
|
||||
|
||||
Return HttpClient.ProcessRequest("POST").ReturnResponseAsJSONObject(True, True);
|
||||
|
||||
EndFunction
|
||||
|
||||
Function PostMultipart(Val URL, Val Fields, Val SecretData)
|
||||
|
||||
Token = SecretData["oauth_token"];
|
||||
Secret = SecretData["oauth_token_secret"];
|
||||
UsersKey = SecretData["oauth_consumer_key"];
|
||||
UsersSecret = SecretData["oauth_consumer_secret"];
|
||||
Version = "1.0";
|
||||
|
||||
HttpClient = OPI_HTTPRequests.NewRequest()
|
||||
.Initialize(URL)
|
||||
.StartMultipartBody()
|
||||
.AddOauthV1Authorization(Token, Secret, UsersKey, UsersSecret, Version)
|
||||
.SetOAuthV1Algorithm("HMAC", "SHA1")
|
||||
.UseMultipartFieldsAtOAuth(False);
|
||||
|
||||
For Each Parameter In Fields Do
|
||||
HttpClient.AddMultipartFormDataField(Parameter.Key, Parameter.Value);
|
||||
EndDo;
|
||||
|
||||
Result = HttpClient.ProcessRequest("POST").ReturnResponseAsJSONObject(True, True);
|
||||
|
||||
Return Result;
|
||||
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2fbb1523-522e-42e1-8167-986b0706ee39">
|
||||
<name>OPI_Cryptography</name>
|
||||
<synonym>
|
||||
<key>en</key>
|
||||
<value>Cryptography</value>
|
||||
</synonym>
|
||||
<templateType>AddIn</templateType>
|
||||
</mdclass:CommonTemplate>
|
||||
@@ -44,6 +44,7 @@
|
||||
<commonTemplates>CommonTemplate.OPI_RCON</commonTemplates>
|
||||
<commonTemplates>CommonTemplate.OPI_SQLite</commonTemplates>
|
||||
<commonTemplates>CommonTemplate.OPI_TCPClient</commonTemplates>
|
||||
<commonTemplates>CommonTemplate.OPI_Cryptography</commonTemplates>
|
||||
<commonModules>CommonModule.OPI_Airtable</commonModules>
|
||||
<commonModules>CommonModule.OPI_Bitrix24</commonModules>
|
||||
<commonModules>CommonModule.OPI_CDEK</commonModules>
|
||||
|
||||
+310
-39
@@ -71,6 +71,7 @@ Var RequestDomain; // Domain from the request URL
|
||||
Var RequestMethod; // HTTP method used
|
||||
Var RequestURLParams; // URL parameters structure
|
||||
Var RequestBody; // Request body data
|
||||
Var RequestBodyCollection; // Data of body in view of collection, if maybe
|
||||
Var RequestHeaders; // Request headers mapping
|
||||
Var RequestUser; // User for basic authorization
|
||||
Var RequestPassword; // Password for basic authorization
|
||||
@@ -84,14 +85,10 @@ Var RequestDataType; // MIME type for Content-Type
|
||||
Var RequestTypeSetManualy; // Flag to disable automatic Content-Type detection
|
||||
Var BodyTemporaryFile; // Flag to delete the body file if it was created automatically
|
||||
|
||||
// AWS
|
||||
// Authorization
|
||||
|
||||
Var AWS4Using; // Flag to use AWS4 authorization
|
||||
Var AWS4Data; // Credentials structure
|
||||
|
||||
// Bearer
|
||||
|
||||
Var Bearer; // Bearer token
|
||||
Var AuthType; // View authorization
|
||||
Var AuthData; // Credentials structure
|
||||
|
||||
// Response
|
||||
|
||||
@@ -132,15 +129,15 @@ Function Initialize(Val URL = "") Export
|
||||
Initialized = True;
|
||||
Error = False;
|
||||
|
||||
RequestURLParams = New Array;
|
||||
RequestBody = Undefined;
|
||||
RequestHeaders = New Map;
|
||||
RequestTimeout = 3600;
|
||||
RequestURLParams = New Array;
|
||||
RequestBody = Undefined;
|
||||
RequestBodyCollection = New Structure;
|
||||
RequestHeaders = New Map;
|
||||
RequestTimeout = 3600;
|
||||
|
||||
RequestTypeSetManualy = False;
|
||||
|
||||
BodyTemporaryFile = False;
|
||||
AWS4Using = False;
|
||||
|
||||
ResponseStatusCode = 0;
|
||||
ResponseBody = Undefined;
|
||||
@@ -374,6 +371,36 @@ Function UseGzipCompression(Val Flag) Export
|
||||
|
||||
EndFunction
|
||||
|
||||
// Use multipart fields at OAuth
|
||||
// Includes or excludes multipart body fields when calculating the OAuth signature depending on server requirements
|
||||
//
|
||||
// Note
|
||||
// Multipart fields are used for signature calculation by default
|
||||
//
|
||||
// Parameters:
|
||||
// Flag - Boolean - Sign of using multipart fields in OAuth - use
|
||||
//
|
||||
// Returns:
|
||||
// DataProcessorObject.OPI_HTTPClient - This processor object
|
||||
Function UseMultipartFieldsAtOAuth(Val Flag) Export
|
||||
|
||||
Try
|
||||
|
||||
If StopExecution() Then Return ThisObject; EndIf;
|
||||
|
||||
AddLog("UseMultipartFieldsAtOAuth: setting the value");
|
||||
OPI_TypeConversion.GetBoolean(Flag);
|
||||
|
||||
SetSetting("MultipartAtOAuth", Flag);
|
||||
|
||||
Return ThisObject;
|
||||
|
||||
Except
|
||||
Return Error(DetailErrorDescription(ErrorInfo()));
|
||||
EndTry;
|
||||
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
|
||||
#Region BodySet
|
||||
@@ -497,7 +524,13 @@ Function SetJsonBody(Val Data) Export
|
||||
AddLog("SetJsonBody: beginning of body setting");
|
||||
|
||||
If Not TypeOf(Data) = Type("BinaryData") Then
|
||||
|
||||
OPI_TypeConversion.GetCollection(Data);
|
||||
|
||||
If Not TypeOf(Data) = Type("Array") Then
|
||||
RequestBodyCollection = Data;
|
||||
EndIf;
|
||||
|
||||
EndIf;
|
||||
|
||||
SetBodyFromString(Data);
|
||||
@@ -551,7 +584,8 @@ Function SetFormBody(Val Data) Export
|
||||
|
||||
Else
|
||||
|
||||
Data = RequestParametersToString(Data);
|
||||
RequestBodyCollection = Data;
|
||||
Data = RequestParametersToString(Data);
|
||||
|
||||
EndIf;
|
||||
|
||||
@@ -594,6 +628,8 @@ Function StartMultipartBody(UseFile = True, Val View = "form-data") Export
|
||||
Encoding = GetSetting("EncodeRequestBody");
|
||||
RequestDataType = StrTemplate("multipart/%1; boundary=%2", View, Boundary);
|
||||
|
||||
RequestBodyCollection = New Structure;
|
||||
|
||||
If UseFile Then
|
||||
|
||||
AddLog("StartMultipartBody: creating a temporary file");
|
||||
@@ -722,6 +758,7 @@ Function AddMultipartFormDataField(Val FieldName, Val Value) Export
|
||||
|
||||
Value = ?(Value, "true", "false");
|
||||
RequestDataWriter.WriteLine(Value);
|
||||
RequestBodyCollection.Insert(FieldName, Value);
|
||||
|
||||
ElsIf ValeType = Type("BinaryData") Then
|
||||
|
||||
@@ -731,6 +768,7 @@ Function AddMultipartFormDataField(Val FieldName, Val Value) Export
|
||||
|
||||
OPI_TypeConversion.GetLine(Value);
|
||||
RequestDataWriter.WriteLine(Value);
|
||||
RequestBodyCollection.Insert(FieldName, Value);
|
||||
|
||||
EndIf;
|
||||
|
||||
@@ -915,7 +953,9 @@ Function AddBearerAuthorization(Val Token) Export
|
||||
If StopExecution() Then Return ThisObject; EndIf;
|
||||
|
||||
OPI_TypeConversion.GetLine(Token);
|
||||
Bearer = Token;
|
||||
|
||||
AuthType = "bearer";
|
||||
AuthData = Token;
|
||||
|
||||
Return ThisObject;
|
||||
|
||||
@@ -942,14 +982,86 @@ Function AddAWS4Authorization(Val AccessKey, Val SecretKey, Val Region, Val Serv
|
||||
|
||||
If StopExecution() Then Return ThisObject; EndIf;
|
||||
|
||||
String_ = "String";
|
||||
AWS4Using = True;
|
||||
String_ = "String";
|
||||
AuthType = "aws4";
|
||||
|
||||
AWS4Data = New Structure;
|
||||
OPI_Tools.AddField("AccessKey", AccessKey, String_, AWS4Data);
|
||||
OPI_Tools.AddField("SecretKey", SecretKey, String_, AWS4Data);
|
||||
OPI_Tools.AddField("Region" , Region , String_, AWS4Data);
|
||||
OPI_Tools.AddField("Service" , Service , String_, AWS4Data);
|
||||
AuthData = New Structure;
|
||||
OPI_Tools.AddField("AccessKey", AccessKey, String_, AuthData);
|
||||
OPI_Tools.AddField("SecretKey", SecretKey, String_, AuthData);
|
||||
OPI_Tools.AddField("Region" , Region , String_, AuthData);
|
||||
OPI_Tools.AddField("Service" , Service , String_, AuthData);
|
||||
|
||||
Return ThisObject;
|
||||
|
||||
Except
|
||||
Return Error(DetailErrorDescription(ErrorInfo()));
|
||||
EndTry;
|
||||
|
||||
EndFunction
|
||||
|
||||
// Add OAuth V1 authorization
|
||||
// Adds data for OAuth v1 authorization
|
||||
//
|
||||
// Note
|
||||
// By default, HMAC-SHA256 is used to create the signature. To change the algorithm, you can use^^
|
||||
// `SetOAuthV1Algorithm`
|
||||
//
|
||||
// Parameters:
|
||||
// Token - String - Token for authorization - token
|
||||
// Secret - String - Secret for authorization - secret
|
||||
// ConsumerKey - String - Consumer key for authorization - ck
|
||||
// ConsumerSecret - String - Consumer secret for authorization - cs
|
||||
// Version - String - API version - ver
|
||||
//
|
||||
// Returns:
|
||||
// DataProcessorObject.OPI_HTTPClient - This processor object
|
||||
Function AddOauthV1Authorization(Val Token, Val Secret, Val ConsumerKey, Val ConsumerSecret, Val Version) Export
|
||||
|
||||
Try
|
||||
|
||||
If StopExecution() Then Return ThisObject; EndIf;
|
||||
|
||||
String_ = "String";
|
||||
AuthType = "oauth1";
|
||||
|
||||
AuthData = New Structure;
|
||||
OPI_Tools.AddField("OAuthToken" , Token , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthSecret" , Secret , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthConsumerKey" , ConsumerKey , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthConsumerSecret", ConsumerSecret , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthAlgorithm" , "HMAC" , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthHashFunction" , "SHA256" , String_, AuthData);
|
||||
OPI_Tools.AddField("OAuthAPIVersion" , Version , String_, AuthData);
|
||||
|
||||
Return ThisObject;
|
||||
|
||||
Except
|
||||
Return Error(DetailErrorDescription(ErrorInfo()));
|
||||
EndTry;
|
||||
|
||||
EndFunction
|
||||
|
||||
// Set OAuth V1 algorithm
|
||||
// Changes the algorithm for OAuth signatures
|
||||
//
|
||||
// Parameters:
|
||||
// Algorithm - String - Encryption algorithm: HMAC, RSA - alg
|
||||
// HashFunction - String - Hash function for signature: SHA1, SHA256 - hash
|
||||
//
|
||||
// Returns:
|
||||
// DataProcessorObject.OPI_HTTPClient - This processor object
|
||||
Function SetOAuthV1Algorithm(Val Algorithm, Val HashFunction) Export
|
||||
|
||||
Try
|
||||
|
||||
If StopExecution() Then Return ThisObject; EndIf;
|
||||
|
||||
If AuthType <> "oauth1" Then
|
||||
Return Error("SetOAuthV1Algorithm: OAuth v1 authorization must be initialized before the algorithm is changed");
|
||||
EndIf;
|
||||
|
||||
OPI_Tools.AddField("OAuthAlgorithm" , Algorithm , "String", AuthData);
|
||||
OPI_Tools.AddField("OAuthHashFunction", HashFunction, "String", AuthData);
|
||||
|
||||
Return ThisObject;
|
||||
|
||||
@@ -1530,15 +1642,7 @@ Function CompleteHeaders()
|
||||
|
||||
EndIf;
|
||||
|
||||
If AWS4Using Then
|
||||
AddLog("CompleteHeaders: generating AWS4 Authorization Header");
|
||||
AddAWS4();
|
||||
EndIf;
|
||||
|
||||
If ValueIsFilled(Bearer) Then
|
||||
AddLog("CompleteHeaders: generating Bearer Authorization Header");
|
||||
Request.Headers.Insert("Authorization", StrTemplate("Bearer %1", Bearer));
|
||||
EndIf;
|
||||
CompleteAuthHeaders();
|
||||
|
||||
If GetSetting("gzip") Then
|
||||
AddLog("CompleteHeaders: setting the gzip header");
|
||||
@@ -1561,6 +1665,33 @@ Function CompleteHeaders()
|
||||
|
||||
EndFunction
|
||||
|
||||
Function CompleteAuthHeaders()
|
||||
|
||||
If Not ValueIsFilled(AuthType) Then
|
||||
Return ThisObject;
|
||||
EndIf;
|
||||
|
||||
If AuthType = "aws4" Then
|
||||
|
||||
AddLog("CompleteAuthHeaders: generating AWS4 Authorization header");
|
||||
AddAWS4();
|
||||
|
||||
ElsIf AuthType = "oauth1" Then
|
||||
|
||||
AddLog("CompleteAuthHeaders: generating OAuth V1 Authorization header");
|
||||
AddOAuthV1Header();
|
||||
|
||||
Else
|
||||
|
||||
AddLog("CompleteAuthHeaders: generating Bearer Authorization header");
|
||||
Request.Headers.Insert("Authorization", StrTemplate("Bearer %1", AuthData));
|
||||
|
||||
EndIf;
|
||||
|
||||
Return ThisObject;
|
||||
|
||||
EndFunction
|
||||
|
||||
Function SetRequestBody()
|
||||
|
||||
If Multipart Then
|
||||
@@ -2009,7 +2140,7 @@ EndFunction
|
||||
|
||||
Function CreateAuthorizationHeader()
|
||||
|
||||
AccessKey = AWS4Data["AccessKey"];
|
||||
AccessKey = AuthData["AccessKey"];
|
||||
CurrentDate = CurrentUniversalDate();
|
||||
|
||||
Request.Headers.Insert("x-amz-date", OPI_Tools.ISOTimestamp(CurrentDate));
|
||||
@@ -2029,16 +2160,16 @@ EndFunction
|
||||
|
||||
Function GetMainSignatureParts(Val CurrentDate)
|
||||
|
||||
SecretKey = AWS4Data["SecretKey"];
|
||||
Region = AWS4Data["Region"];
|
||||
Service = AWS4Data["Service"];
|
||||
SecretKey = AuthData["SecretKey"];
|
||||
Region = AuthData["Region"];
|
||||
Service = AuthData["Service"];
|
||||
|
||||
SignKey = GetSignatureKey(SecretKey, Region, Service, CurrentDate);
|
||||
CanonicalRequest = CreateCanonicalRequest();
|
||||
Scope = CreateScope(Region, Service, CurrentDate);
|
||||
StringToSign = CreateSignatureString(CanonicalRequest, Scope, CurrentDate);
|
||||
|
||||
Signature = OPI_Cryptography.HMACSHA256(SignKey, StringToSign);
|
||||
Signature = OPI_Cryptography.HMAC(SignKey, StringToSign, "SHA256");
|
||||
Signature = Lower(GetHexStringFromBinaryData(Signature));
|
||||
|
||||
HeadersKeys = GetHeadersKeysString();
|
||||
@@ -2073,12 +2204,13 @@ Function GetSignatureKey(Val SecretKey, Val Region, Val Service, Val CurrentDate
|
||||
Region = GetBinaryDataFromString(Region);
|
||||
Service = GetBinaryDataFromString(Service);
|
||||
AWSRequest = GetBinaryDataFromString("aws4_request");
|
||||
SHA256_ = "SHA256";
|
||||
|
||||
DataKey = OPI_Cryptography.HMACSHA256(SecretKey, DateData);
|
||||
RegionKey = OPI_Cryptography.HMACSHA256(DataKey, Region);
|
||||
ServiceKey = OPI_Cryptography.HMACSHA256(RegionKey, Service);
|
||||
DataKey = OPI_Cryptography.HMAC(SecretKey, DateData, SHA256_);
|
||||
RegionKey = OPI_Cryptography.HMAC(DataKey, Region, SHA256_);
|
||||
ServiceKey = OPI_Cryptography.HMAC(RegionKey, Service, SHA256_);
|
||||
|
||||
FinalKey = OPI_Cryptography.HMACSHA256(ServiceKey, AWSRequest);
|
||||
FinalKey = OPI_Cryptography.HMAC(ServiceKey, AWSRequest, SHA256_);
|
||||
|
||||
Return FinalKey;
|
||||
|
||||
@@ -2273,6 +2405,144 @@ EndProcedure
|
||||
|
||||
#EndRegion
|
||||
|
||||
#Region OAuth
|
||||
|
||||
Function AddOAuthV1Header()
|
||||
|
||||
OAuthAlgorithm = AuthData["OAuthAlgorithm"];
|
||||
OAuthHashFunction = AuthData["OAuthHashFunction"];
|
||||
OAuthToken = AuthData["OAuthToken"];
|
||||
OAuthSecret = AuthData["OAuthSecret"];
|
||||
OAuthConsumerKey = AuthData["OAuthConsumerKey"];
|
||||
OAuthConsumerSecret = AuthData["OAuthConsumerSecret"];
|
||||
OAuthAPIVersion = AuthData["OAuthAPIVersion"];
|
||||
|
||||
HashingMethod = OAuthAlgorithm + "-" + OAuthHashFunction;
|
||||
CurrentDate = OPI_Tools.GetCurrentDate();
|
||||
AuthorizationHeader = "";
|
||||
SignatureString = "";
|
||||
Signature = "";
|
||||
|
||||
CurrentUNIXDate = OPI_Tools.UNIXTime(CurrentDate);
|
||||
CurrentUNIXDate = OPI_Tools.NumberToString(CurrentUNIXDate);
|
||||
|
||||
ParametersTable = New ValueTable;
|
||||
ParametersTable.Columns.Add("Key");
|
||||
ParametersTable.Columns.Add("Value");
|
||||
|
||||
If Not ValueIsFilled(RequestBodyCollection)
|
||||
Or Not OPI_Tools.ThisIsCollection(RequestBodyCollection, True) Then
|
||||
|
||||
Try
|
||||
RequestBodyCollection = RequestBody;
|
||||
OPI_TypeConversion.GetKeyValueCollection(RequestBodyCollection);
|
||||
Except
|
||||
RequestBodyCollection = New Structure;
|
||||
EndTry;
|
||||
|
||||
EndIf;
|
||||
|
||||
If GetSetting("MultipartAtOAuth") Or Not Multipart Then
|
||||
For Each Field In RequestBodyCollection Do
|
||||
|
||||
If TypeOf(Field.Value) = Type("BinaryData") Then
|
||||
Continue;
|
||||
EndIf;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = Field.Key;
|
||||
NewLine.Value = Field.Value;
|
||||
|
||||
EndDo;
|
||||
EndIf;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_consumer_key";
|
||||
NewLine.Value = OAuthConsumerKey;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_token";
|
||||
NewLine.Value = OAuthToken;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_version";
|
||||
NewLine.Value = OAuthAPIVersion;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_signature_method";
|
||||
NewLine.Value = HashingMethod;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_timestamp";
|
||||
NewLine.Value = CurrentUNIXDate;
|
||||
|
||||
NewLine = ParametersTable.Add();
|
||||
NewLine.Key = "oauth_nonce";
|
||||
NewLine.Value = CurrentUNIXDate;
|
||||
|
||||
For Each TableRow In ParametersTable Do
|
||||
|
||||
TableRow.Key = EncodeString(TableRow.Key, StringEncodingMethod.URLencoding);
|
||||
TableRow.Value = EncodeString(TableRow.Value, StringEncodingMethod.URLencoding);
|
||||
|
||||
EndDo;
|
||||
|
||||
ParametersTable.Sort("Key");
|
||||
|
||||
For Each TableRow In ParametersTable Do
|
||||
|
||||
SignatureString = SignatureString
|
||||
+ TableRow.Key
|
||||
|
||||
+ "="
|
||||
+ TableRow.Value
|
||||
+ "&";
|
||||
|
||||
EndDo;
|
||||
|
||||
SignatureString = Left(SignatureString, StrLen(SignatureString) - 1);
|
||||
SignatureString = Upper(RequestMethod)
|
||||
+ "&"
|
||||
+ EncodeString(RequestURL , StringEncodingMethod.URLencoding)
|
||||
+ "&"
|
||||
+ EncodeString(SignatureString, StringEncodingMethod.URLencoding);
|
||||
|
||||
Signature = EncodeString(OAuthConsumerSecret, StringEncodingMethod.URLencoding)
|
||||
+ "&"
|
||||
+ EncodeString(OAuthSecret, StringEncodingMethod.URLencoding);
|
||||
|
||||
SignBD = GetBinaryDataFromString(Signature);
|
||||
SignatureBD = GetBinaryDataFromString(SignatureString);
|
||||
|
||||
Signature = OPI_Cryptography.CreateSignature(SignBD, SignatureBD, OAuthAlgorithm, OAuthHashFunction);
|
||||
Signature = EncodeString(Base64String(Signature), StringEncodingMethod.URLencoding);
|
||||
|
||||
Delimiter = """,";
|
||||
|
||||
AuthorizationHeader = AuthorizationHeader
|
||||
+ "OAuth "
|
||||
+ "oauth_consumer_key=""" + OAuthConsumerKey + Delimiter
|
||||
|
||||
+ "oauth_token=""" + OAuthToken + Delimiter
|
||||
|
||||
+ "oauth_signature_method=""" + HashingMethod + Delimiter
|
||||
|
||||
+ "oauth_timestamp=""" + CurrentUNIXDate + Delimiter
|
||||
|
||||
+ "oauth_nonce=""" + CurrentUNIXDate + Delimiter
|
||||
|
||||
+ "oauth_version=""" + OAuthAPIVersion + Delimiter
|
||||
|
||||
+ "oauth_signature=" + Signature;
|
||||
|
||||
Request.Headers.Insert("Authorization", AuthorizationHeader);
|
||||
|
||||
Return ThisObject;
|
||||
|
||||
EndFunction
|
||||
|
||||
#EndRegion
|
||||
|
||||
#Region Auxiliary
|
||||
|
||||
Function StopExecution(Val ExceptionOnError = False)
|
||||
@@ -2346,6 +2616,7 @@ Procedure SetDefaultSettings()
|
||||
Settings.Insert("SplitArrayParams" , False);
|
||||
Settings.Insert("URLencoding" , True);
|
||||
Settings.Insert("EncodeRequestBody" , "UTF-8");
|
||||
Settings.Insert("MultipartAtOAuth" , True);
|
||||
|
||||
EndProcedure
|
||||
|
||||
|
||||
+15
-15
@@ -101,7 +101,7 @@
|
||||
|
||||
Ответ = OPI_ЗапросыHTTP.PostСТелом("https://api.twitter.com/2/oauth2/token"
|
||||
, ПараметрыЗапроса
|
||||
,
|
||||
,
|
||||
, Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
Ответ = OPI_ЗапросыHTTP.PostСТелом("https://api.twitter.com/2/oauth2/token"
|
||||
, ПараметрыЗапроса
|
||||
,
|
||||
,
|
||||
, Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
@@ -226,7 +226,7 @@
|
||||
Иначе
|
||||
ЭтоV2 = Истина;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Ответ = Post(URL, Поля, Параметры_, Истина, ЭтоV2);
|
||||
|
||||
Возврат Ответ;
|
||||
@@ -444,8 +444,8 @@
|
||||
|
||||
Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
|
||||
|
||||
Ответ = Get(URL, Поля, Параметры);
|
||||
Информация = Ответ[ProcessingInfo];
|
||||
Ответ = Get(URL, Поля, Параметры);
|
||||
Информация = Ответ[ProcessingInfo];
|
||||
|
||||
Если Не ЗначениеЗаполнено(Информация) Тогда
|
||||
Возврат Ответ;
|
||||
@@ -565,7 +565,7 @@
|
||||
КлючПользователя = УчетныеДанные["oauth_consumer_key"];
|
||||
СекретПользователя = УчетныеДанные["oauth_consumer_secret"];
|
||||
Версия = "1.0";
|
||||
|
||||
|
||||
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
|
||||
.Инициализировать(URL)
|
||||
.УстановитьПараметрыURL(Поля)
|
||||
@@ -575,22 +575,22 @@
|
||||
.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Post(Знач URL, Знач Поля, Знач УчетныеДанные, Знач JSON = Ложь, Знач ЭтоV2 = Ложь)
|
||||
|
||||
|
||||
Токен = УчетныеДанные["oauth_token"];
|
||||
Секрет = УчетныеДанные["oauth_token_secret"];
|
||||
КлючПользователя = УчетныеДанные["oauth_consumer_key"];
|
||||
СекретПользователя = УчетныеДанные["oauth_consumer_secret"];
|
||||
Версия = "1.0";
|
||||
|
||||
|
||||
HttpКлиент = OPI_ЗапросыHTTP.НовыйЗапрос()
|
||||
.Инициализировать(URL);
|
||||
|
||||
Если ЭтоV2 Тогда
|
||||
HttpКлиент.ДобавитьЗаголовок("Authorization", "Bearer " + УчетныеДанные["access_token"]);
|
||||
|
||||
Если ЭтоV2 Тогда
|
||||
HttpКлиент.ДобавитьЗаголовок("Authorization", "Bearer " + УчетныеДанные["access_token"]);
|
||||
Иначе
|
||||
HttpКлиент.ДобавитьOauthV1Авторизацию(Токен, Секрет, КлючПользователя, СекретПользователя, Версия)
|
||||
.УстановитьАлгоритмOAuthV1("HMAC", "SHA1");
|
||||
@@ -603,7 +603,7 @@
|
||||
КонецЕсли;
|
||||
|
||||
Возврат HttpКлиент.ОбработатьЗапрос("POST").ВернутьОтветКакJSONКоллекцию(Истина, Истина);
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция PostMultipart(Знач URL, Знач Поля, Знач УчетныеДанные)
|
||||
@@ -613,7 +613,7 @@
|
||||
КлючПользователя = УчетныеДанные["oauth_consumer_key"];
|
||||
СекретПользователя = УчетныеДанные["oauth_consumer_secret"];
|
||||
Версия = "1.0";
|
||||
|
||||
|
||||
HttpКлиент = OPI_ЗапросыHTTP.НовыйЗапрос()
|
||||
.Инициализировать(URL)
|
||||
.НачатьЗаписьТелаMultipart()
|
||||
@@ -628,7 +628,7 @@
|
||||
Результат = HttpКлиент.ОбработатьЗапрос("POST").ВернутьОтветКакJSONКоллекцию(Истина, Истина);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
+2
-2
@@ -2464,9 +2464,9 @@
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьОбщийМодуль(Знач Имя)
|
||||
|
||||
|
||||
Модуль = Вычислить(Имя);
|
||||
|
||||
|
||||
Возврат Модуль;
|
||||
КонецФункции
|
||||
|
||||
|
||||
+52
-52
@@ -131,7 +131,7 @@
|
||||
|
||||
ЗапросПараметрыURL = Новый Массив;
|
||||
ЗапросТело = Неопределено;
|
||||
ЗапросТелоКоллекция = Новый Структура;
|
||||
ЗапросТелоКоллекция = Новый Структура;
|
||||
ЗапросЗаголовки = Новый Соответствие;
|
||||
ЗапросТаймаут = 3600;
|
||||
|
||||
@@ -373,12 +373,12 @@
|
||||
|
||||
// Использовать multipart поля в OAuth
|
||||
// Включает или исключает поля multipart тела при расчете подписи OAuth в зависимости от требований сервера
|
||||
//
|
||||
//
|
||||
// Примечание:
|
||||
// По умлчанию multipart поля используются при расчете подписи
|
||||
//
|
||||
// Параметры:
|
||||
// Флаг - Булево - Признак использования multipart поле в OAuth - use
|
||||
// Флаг - Булево - Признак использования multipart полей в OAuth - use
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
|
||||
@@ -524,13 +524,13 @@
|
||||
ДобавитьЛог("УстановитьJsonТело: начало установки тела");
|
||||
|
||||
Если Не ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
|
||||
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
|
||||
|
||||
|
||||
Если Не ТипЗнч(Данные) = Тип("Массив") Тогда
|
||||
ЗапросТелоКоллекция = Данные;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
УстановитьТелоИзСтроки(Данные);
|
||||
@@ -583,9 +583,9 @@
|
||||
КонецЕсли;
|
||||
|
||||
Иначе
|
||||
|
||||
|
||||
ЗапросТелоКоллекция = Данные;
|
||||
Данные = ПараметрыЗапросаВСтроку(Данные);
|
||||
Данные = ПараметрыЗапросаВСтроку(Данные);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
@@ -627,7 +627,7 @@
|
||||
РазделительСтрок = Символы.ВК + Символы.ПС;
|
||||
Кодировка = ПолучитьНастройку("КодировкаТелаЗапроса");
|
||||
ЗапросТипДанных = СтрШаблон("multipart/%1; boundary=%2", Вид, Boundary);
|
||||
|
||||
|
||||
ЗапросТелоКоллекция = Новый Структура;
|
||||
|
||||
Если ИспользоватьФайл Тогда
|
||||
@@ -769,7 +769,7 @@
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
|
||||
ЗапросЗаписьДанных.ЗаписатьСтроку(Значение);
|
||||
ЗапросТелоКоллекция.Вставить(ИмяПоля, Значение);
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
ЗапросЗаписьДанных.ЗаписатьСтроку(РазделительСтрок);
|
||||
@@ -953,7 +953,7 @@
|
||||
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
|
||||
|
||||
|
||||
AuthВид = "bearer";
|
||||
AuthДанные = Токен;
|
||||
|
||||
@@ -1001,26 +1001,26 @@
|
||||
|
||||
// Добавить OAuth v1 авторизацию !NOCLI
|
||||
// Добавляет данные для OAuth v1 авторизации
|
||||
//
|
||||
//
|
||||
// Примечание:
|
||||
// По умолчанию, для создания подписи используется HMAC-SHA256. Для изменения алгоритма можно восопользоваться функцией^^
|
||||
// `УстановитьАлгоритмOAuthV1`
|
||||
//
|
||||
//
|
||||
// Параметры:
|
||||
// Token - Строка - Token для авторизации - token
|
||||
// Secret - Строка - Secret для авторизации - secret
|
||||
// ConsumerKey - Строка - Consumer key для авторизации - ck
|
||||
// ConsumerSecret - Строка - Consumer secret для авторизации - cs
|
||||
// Версия - Строка - Версия API - ver
|
||||
//
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
|
||||
Функция ДобавитьOauthV1Авторизацию(Знач Token, Знач Secret, Знач ConsumerKey, Знач ConsumerSecret, Знач Версия) Экспорт
|
||||
|
||||
Попытка
|
||||
|
||||
|
||||
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
|
||||
|
||||
|
||||
Строка_ = "Строка";
|
||||
AuthВид = "oauth1";
|
||||
|
||||
@@ -1038,24 +1038,24 @@
|
||||
Исключение
|
||||
Возврат Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
|
||||
КонецПопытки;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Установить алгоритм OAuth V1
|
||||
// Изменяет алгоритм для подписи OAuth
|
||||
//
|
||||
//
|
||||
// Параметры:
|
||||
// Алгоритм - Строка - Алгоритм шифрования: HMAC, RSA - alg
|
||||
// Алгоритм - Строка - Алгоритм шифрования: HMAC, RSA - alg
|
||||
// ХешФункция - Строка - Хеш функция для сигнатуры: SHA1, SHA256 - hash
|
||||
//
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
|
||||
Функция УстановитьАлгоритмOAuthV1(Знач Алгоритм, Знач ХешФункция) Экспорт
|
||||
|
||||
Попытка
|
||||
|
||||
|
||||
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
|
||||
|
||||
|
||||
Если AuthВид <> "oauth1" Тогда
|
||||
Возврат Ошибка("УстановитьАлгоритмOAuthV1: перед установкой алгоритма авторизация OAuth v1 должна быть инициализирована");
|
||||
КонецЕсли;
|
||||
@@ -1068,7 +1068,7 @@
|
||||
Исключение
|
||||
Возврат Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
|
||||
КонецПопытки;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
@@ -1641,7 +1641,7 @@
|
||||
Запрос.Заголовки.Вставить("Content-Length" , РазмерТела);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
ДополнитьЗаголовкиАвторизации();
|
||||
|
||||
Если ПолучитьНастройку("gzip") Тогда
|
||||
@@ -1670,26 +1670,26 @@
|
||||
Если Не ЗначениеЗаполнено(AuthВид) Тогда
|
||||
Возврат ЭтотОбъект;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Если AuthВид = "aws4" Тогда
|
||||
|
||||
|
||||
ДобавитьЛог("ДополнитьЗаголовкиАвторизации: формирование заголовка AWS4 авторизации");
|
||||
ДобавитьAWS4();
|
||||
|
||||
|
||||
ИначеЕсли AuthВид = "oauth1" Тогда
|
||||
|
||||
|
||||
ДобавитьЛог("ДополнитьЗаголовкиАвторизации: формирование заголовка OAuth V1 авторизации");
|
||||
ДобавитьЗаголовокOAuthV1();
|
||||
|
||||
|
||||
Иначе
|
||||
|
||||
|
||||
ДобавитьЛог("ДополнитьЗаголовкиАвторизации: формирование заголовка Bearer авторизации");
|
||||
Запрос.Заголовки.Вставить("Authorization", СтрШаблон("Bearer %1", AuthДанные));
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Возврат ЭтотОбъект;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция УстановитьТелоЗапроса()
|
||||
@@ -2408,13 +2408,13 @@
|
||||
#Область OAuth
|
||||
|
||||
Функция ДобавитьЗаголовокOAuthV1()
|
||||
|
||||
|
||||
OAuthАлгоритм = AuthДанные["OAuthАлгоритм"];
|
||||
OAuthХешФункция = AuthДанные["OAuthХешФункция"];
|
||||
OAuthToken = AuthДанные["OAuthToken"];
|
||||
OAuthSecret = AuthДанные["OAuthSecret"];
|
||||
OAuthConsumerKey = AuthДанные["OAuthConsumerKey"];
|
||||
OAuthConsumerSecret = AuthДанные["OAuthConsumerSecret"];
|
||||
OAuthConsumerSecret = AuthДанные["OAuthConsumerSecret"];
|
||||
OAuthВерсияAPI = AuthДанные["OAuthВерсияAPI"];
|
||||
|
||||
МетодХэширования = OAuthАлгоритм + "-" + OAuthХешФункция;
|
||||
@@ -2422,37 +2422,37 @@
|
||||
ЗаголовокАвторизации = "";
|
||||
СтрокаСигнатуры = "";
|
||||
Подпись = "";
|
||||
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата);
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
|
||||
|
||||
ТаблицаПараметров = Новый ТаблицаЗначений;
|
||||
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата);
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
|
||||
|
||||
ТаблицаПараметров = Новый ТаблицаЗначений;
|
||||
ТаблицаПараметров.Колонки.Добавить("Ключ");
|
||||
ТаблицаПараметров.Колонки.Добавить("Значение");
|
||||
|
||||
Если Не ЗначениеЗаполнено(ЗапросТелоКоллекция)
|
||||
|
||||
Если Не ЗначениеЗаполнено(ЗапросТелоКоллекция)
|
||||
Или Не OPI_Инструменты.ЭтоКоллекция(ЗапросТелоКоллекция, Истина) Тогда
|
||||
|
||||
|
||||
Попытка
|
||||
ЗапросТелоКоллекция = ЗапросТело;
|
||||
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ЗапросТелоКоллекция);
|
||||
Исключение
|
||||
ЗапросТелоКоллекция = Новый Структура;
|
||||
КонецПопытки;
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если ПолучитьНастройку("MultipartВOAuth") Или Не Multipart Тогда
|
||||
Для Каждого Поле Из ЗапросТелоКоллекция Цикл
|
||||
|
||||
|
||||
Если ТипЗнч(Поле.Значение) = Тип("ДвоичныеДанные") Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = Поле.Ключ;
|
||||
НоваяСтрока.Значение = Поле.Значение;
|
||||
|
||||
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
|
||||
@@ -2503,7 +2503,7 @@
|
||||
СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
|
||||
СтрокаСигнатуры = вРег(ЗапросМетод)
|
||||
+ "&"
|
||||
+ КодироватьСтроку(ЗапросURL, СпособКодированияСтроки.КодировкаURL)
|
||||
+ КодироватьСтроку(ЗапросURL , СпособКодированияСтроки.КодировкаURL)
|
||||
+ "&"
|
||||
+ КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
|
||||
|
||||
@@ -2513,8 +2513,8 @@
|
||||
|
||||
ПодписьДД = ПолучитьДвоичныеДанныеИзСтроки(Подпись);
|
||||
СигнатураДД = ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры);
|
||||
|
||||
Сигнатура = OPI_Криптография.СоздатьПодпись(ПодписьДД, СигнатураДД, OAuthАлгоритм, OAuthХешФункция);
|
||||
|
||||
Сигнатура = OPI_Криптография.СоздатьПодпись(ПодписьДД, СигнатураДД, OAuthАлгоритм, OAuthХешФункция);
|
||||
Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
|
||||
|
||||
Разделитель = """,";
|
||||
@@ -2534,9 +2534,9 @@
|
||||
+ "oauth_version=""" + OAuthВерсияAPI + Разделитель
|
||||
|
||||
+ "oauth_signature=" + Сигнатура;
|
||||
|
||||
|
||||
Запрос.Заголовки.Вставить("Authorization", ЗаголовокАвторизации);
|
||||
|
||||
|
||||
Возврат ЭтотОбъект;
|
||||
|
||||
КонецФункции
|
||||
|
||||
@@ -727,9 +727,9 @@
|
||||
|
||||
Попытка
|
||||
|
||||
ЭтоОтладка = Неопределено;
|
||||
ЭтоОтладка = Неопределено;
|
||||
ЭтоОтладка = ПолучитьПеременнуюСреды("OINT_DEBUG");
|
||||
ЭтоОтладка = ?(ЗначениеЗаполнено(ЭтоОтладка), ЭтоОтладка, "NO");
|
||||
ЭтоОтладка = ?(ЗначениеЗаполнено(ЭтоОтладка), ЭтоОтладка, "NO");
|
||||
|
||||
Исключение
|
||||
ЭтоОтладка = "NO";
|
||||
|
||||
+14
-14
@@ -40,34 +40,34 @@
|
||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(КлючПодписи);
|
||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ДанныеПодписи);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Алгоритм);
|
||||
|
||||
|
||||
Алгоритм = вРег(Алгоритм);
|
||||
ФункцияХеша = вРег(ФункцияХеша);
|
||||
|
||||
|
||||
Если Алгоритм = "HMAC" Тогда
|
||||
Результат = HMAC(КлючПодписи, ДанныеПодписи, ФункцияХеша);
|
||||
Результат = HMAC(КлючПодписи, ДанныеПодписи, ФункцияХеша);
|
||||
ИначеЕсли Алгоритм = "RSA" Тогда
|
||||
Результат = RSA(КлючПодписи, ДанныеПодписи, ФункцияХеша);
|
||||
Иначе
|
||||
ВызватьИсключение "Ошибка работы с криптографией: неподдерживаемый метод";
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция RSA(Знач Ключ, Знач Данные, Знач ФункцияХеша) Экспорт
|
||||
|
||||
|
||||
Компонента = OPI_Компоненты.ПолучитьКомпоненту("Cryptography");
|
||||
|
||||
Если ФункцияХеша = "SHA256" Тогда
|
||||
Результат = Компонента.RsaSha256(Ключ, Данные);
|
||||
ИначеЕсли ФункцияХеша = "SHA1" Тогда
|
||||
Результат = Компонента.RsaSha1(Ключ, Данные);
|
||||
Иначе
|
||||
Результат = "неподдержииваемый метод хеширования";
|
||||
|
||||
Если ФункцияХеша = "SHA256" Тогда
|
||||
Результат = Компонента.RsaSha256(Ключ, Данные);
|
||||
ИначеЕсли ФункцияХеша = "SHA1" Тогда
|
||||
Результат = Компонента.RsaSha1(Ключ, Данные);
|
||||
Иначе
|
||||
Результат = "неподдержииваемый метод хеширования";
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Если ТипЗнч(Результат) = Тип("Строка") Тогда
|
||||
ВызватьИсключение СтрШаблон("Ошибка работы с криптографией: %1", Результат);
|
||||
Иначе
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
|
||||
Ответ = OPI_ЗапросыHTTP.PostСТелом("https://api.twitter.com/2/oauth2/token"
|
||||
, ПараметрыЗапроса
|
||||
,
|
||||
,
|
||||
, Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
Ответ = OPI_ЗапросыHTTP.PostСТелом("https://api.twitter.com/2/oauth2/token"
|
||||
, ПараметрыЗапроса
|
||||
,
|
||||
,
|
||||
, Ложь);
|
||||
|
||||
Возврат Ответ;
|
||||
@@ -226,7 +226,7 @@
|
||||
Иначе
|
||||
ЭтоV2 = Истина;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Ответ = Post(URL, Поля, Параметры_, Истина, ЭтоV2);
|
||||
|
||||
Возврат Ответ;
|
||||
@@ -444,8 +444,8 @@
|
||||
|
||||
Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
|
||||
|
||||
Ответ = Get(URL, Поля, Параметры);
|
||||
Информация = Ответ[ProcessingInfo];
|
||||
Ответ = Get(URL, Поля, Параметры);
|
||||
Информация = Ответ[ProcessingInfo];
|
||||
|
||||
Если Не ЗначениеЗаполнено(Информация) Тогда
|
||||
Возврат Ответ;
|
||||
@@ -565,7 +565,7 @@
|
||||
КлючПользователя = УчетныеДанные["oauth_consumer_key"];
|
||||
СекретПользователя = УчетныеДанные["oauth_consumer_secret"];
|
||||
Версия = "1.0";
|
||||
|
||||
|
||||
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
|
||||
.Инициализировать(URL)
|
||||
.УстановитьПараметрыURL(Поля)
|
||||
@@ -575,22 +575,22 @@
|
||||
.ВернутьОтветКакJSONКоллекцию(Истина, Истина);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Post(Знач URL, Знач Поля, Знач УчетныеДанные, Знач JSON = Ложь, Знач ЭтоV2 = Ложь)
|
||||
|
||||
|
||||
Токен = УчетныеДанные["oauth_token"];
|
||||
Секрет = УчетныеДанные["oauth_token_secret"];
|
||||
КлючПользователя = УчетныеДанные["oauth_consumer_key"];
|
||||
СекретПользователя = УчетныеДанные["oauth_consumer_secret"];
|
||||
Версия = "1.0";
|
||||
|
||||
|
||||
HttpКлиент = OPI_ЗапросыHTTP.НовыйЗапрос()
|
||||
.Инициализировать(URL);
|
||||
|
||||
Если ЭтоV2 Тогда
|
||||
HttpКлиент.ДобавитьЗаголовок("Authorization", "Bearer " + УчетныеДанные["access_token"]);
|
||||
|
||||
Если ЭтоV2 Тогда
|
||||
HttpКлиент.ДобавитьЗаголовок("Authorization", "Bearer " + УчетныеДанные["access_token"]);
|
||||
Иначе
|
||||
HttpКлиент.ДобавитьOauthV1Авторизацию(Токен, Секрет, КлючПользователя, СекретПользователя, Версия)
|
||||
.УстановитьАлгоритмOAuthV1("HMAC", "SHA1");
|
||||
@@ -603,7 +603,7 @@
|
||||
КонецЕсли;
|
||||
|
||||
Возврат HttpКлиент.ОбработатьЗапрос("POST").ВернутьОтветКакJSONКоллекцию(Истина, Истина);
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция PostMultipart(Знач URL, Знач Поля, Знач УчетныеДанные)
|
||||
@@ -613,7 +613,7 @@
|
||||
КлючПользователя = УчетныеДанные["oauth_consumer_key"];
|
||||
СекретПользователя = УчетныеДанные["oauth_consumer_secret"];
|
||||
Версия = "1.0";
|
||||
|
||||
|
||||
HttpКлиент = OPI_ЗапросыHTTP.НовыйЗапрос()
|
||||
.Инициализировать(URL)
|
||||
.НачатьЗаписьТелаMultipart()
|
||||
@@ -628,7 +628,7 @@
|
||||
Результат = HttpКлиент.ОбработатьЗапрос("POST").ВернутьОтветКакJSONКоллекцию(Истина, Истина);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
@@ -40,34 +40,34 @@
|
||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(КлючПодписи);
|
||||
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ДанныеПодписи);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Алгоритм);
|
||||
|
||||
|
||||
Алгоритм = вРег(Алгоритм);
|
||||
ФункцияХеша = вРег(ФункцияХеша);
|
||||
|
||||
|
||||
Если Алгоритм = "HMAC" Тогда
|
||||
Результат = HMAC(КлючПодписи, ДанныеПодписи, ФункцияХеша);
|
||||
Результат = HMAC(КлючПодписи, ДанныеПодписи, ФункцияХеша);
|
||||
ИначеЕсли Алгоритм = "RSA" Тогда
|
||||
Результат = RSA(КлючПодписи, ДанныеПодписи, ФункцияХеша);
|
||||
Иначе
|
||||
ВызватьИсключение "Ошибка работы с криптографией: неподдерживаемый метод";
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция RSA(Знач Ключ, Знач Данные, Знач ФункцияХеша) Экспорт
|
||||
|
||||
|
||||
Компонента = OPI_Компоненты.ПолучитьКомпоненту("Cryptography");
|
||||
|
||||
Если ФункцияХеша = "SHA256" Тогда
|
||||
Результат = Компонента.RsaSha256(Ключ, Данные);
|
||||
ИначеЕсли ФункцияХеша = "SHA1" Тогда
|
||||
Результат = Компонента.RsaSha1(Ключ, Данные);
|
||||
Иначе
|
||||
Результат = "неподдержииваемый метод хеширования";
|
||||
|
||||
Если ФункцияХеша = "SHA256" Тогда
|
||||
Результат = Компонента.RsaSha256(Ключ, Данные);
|
||||
ИначеЕсли ФункцияХеша = "SHA1" Тогда
|
||||
Результат = Компонента.RsaSha1(Ключ, Данные);
|
||||
Иначе
|
||||
Результат = "неподдержииваемый метод хеширования";
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Если ТипЗнч(Результат) = Тип("Строка") Тогда
|
||||
ВызватьИсключение СтрШаблон("Ошибка работы с криптографией: %1", Результат);
|
||||
Иначе
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
|
||||
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
|
||||
|
||||
// MIT License
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// OneScript: ./OInt/tools/Modules/internal/Classes/OPI_HTTPКлиент.os
|
||||
// OneScript: ./OInt/tools/Modules/internal/Classes/OPI_HTTPКлиент.os
|
||||
// Lib: HTTP-клиент
|
||||
// CLI: none
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
ЗапросПараметрыURL = Новый Массив;
|
||||
ЗапросТело = Неопределено;
|
||||
ЗапросТелоКоллекция = Новый Структура;
|
||||
ЗапросТелоКоллекция = Новый Структура;
|
||||
ЗапросЗаголовки = Новый Соответствие;
|
||||
ЗапросТаймаут = 3600;
|
||||
|
||||
@@ -373,7 +373,7 @@
|
||||
|
||||
// Использовать multipart поля в OAuth
|
||||
// Включает или исключает поля multipart тела при расчете подписи OAuth в зависимости от требований сервера
|
||||
//
|
||||
//
|
||||
// Примечание:
|
||||
// По умлчанию multipart поля используются при расчете подписи
|
||||
//
|
||||
@@ -524,13 +524,13 @@
|
||||
ДобавитьЛог("УстановитьJsonТело: начало установки тела");
|
||||
|
||||
Если Не ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
|
||||
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
|
||||
|
||||
|
||||
Если Не ТипЗнч(Данные) = Тип("Массив") Тогда
|
||||
ЗапросТелоКоллекция = Данные;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
УстановитьТелоИзСтроки(Данные);
|
||||
@@ -583,9 +583,9 @@
|
||||
КонецЕсли;
|
||||
|
||||
Иначе
|
||||
|
||||
|
||||
ЗапросТелоКоллекция = Данные;
|
||||
Данные = ПараметрыЗапросаВСтроку(Данные);
|
||||
Данные = ПараметрыЗапросаВСтроку(Данные);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
@@ -627,7 +627,7 @@
|
||||
РазделительСтрок = Символы.ВК + Символы.ПС;
|
||||
Кодировка = ПолучитьНастройку("КодировкаТелаЗапроса");
|
||||
ЗапросТипДанных = СтрШаблон("multipart/%1; boundary=%2", Вид, Boundary);
|
||||
|
||||
|
||||
ЗапросТелоКоллекция = Новый Структура;
|
||||
|
||||
Если ИспользоватьФайл Тогда
|
||||
@@ -769,7 +769,7 @@
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
|
||||
ЗапросЗаписьДанных.ЗаписатьСтроку(Значение);
|
||||
ЗапросТелоКоллекция.Вставить(ИмяПоля, Значение);
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
ЗапросЗаписьДанных.ЗаписатьСтроку(РазделительСтрок);
|
||||
@@ -953,7 +953,7 @@
|
||||
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
|
||||
|
||||
|
||||
AuthВид = "bearer";
|
||||
AuthДанные = Токен;
|
||||
|
||||
@@ -1001,26 +1001,26 @@
|
||||
|
||||
// Добавить OAuth v1 авторизацию !NOCLI
|
||||
// Добавляет данные для OAuth v1 авторизации
|
||||
//
|
||||
//
|
||||
// Примечание:
|
||||
// По умолчанию, для создания подписи используется HMAC-SHA256. Для изменения алгоритма можно восопользоваться функцией^^
|
||||
// `УстановитьАлгоритмOAuthV1`
|
||||
//
|
||||
//
|
||||
// Параметры:
|
||||
// Token - Строка - Token для авторизации - token
|
||||
// Secret - Строка - Secret для авторизации - secret
|
||||
// ConsumerKey - Строка - Consumer key для авторизации - ck
|
||||
// ConsumerSecret - Строка - Consumer secret для авторизации - cs
|
||||
// Версия - Строка - Версия API - ver
|
||||
//
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
|
||||
Функция ДобавитьOauthV1Авторизацию(Знач Token, Знач Secret, Знач ConsumerKey, Знач ConsumerSecret, Знач Версия) Экспорт
|
||||
|
||||
Попытка
|
||||
|
||||
|
||||
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
|
||||
|
||||
|
||||
Строка_ = "Строка";
|
||||
AuthВид = "oauth1";
|
||||
|
||||
@@ -1038,24 +1038,24 @@
|
||||
Исключение
|
||||
Возврат Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
|
||||
КонецПопытки;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Установить алгоритм OAuth V1
|
||||
// Изменяет алгоритм для подписи OAuth
|
||||
//
|
||||
//
|
||||
// Параметры:
|
||||
// Алгоритм - Строка - Алгоритм шифрования: HMAC, RSA - alg
|
||||
// Алгоритм - Строка - Алгоритм шифрования: HMAC, RSA - alg
|
||||
// ХешФункция - Строка - Хеш функция для сигнатуры: SHA1, SHA256 - hash
|
||||
//
|
||||
//
|
||||
// Возвращаемое значение:
|
||||
// ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
|
||||
Функция УстановитьАлгоритмOAuthV1(Знач Алгоритм, Знач ХешФункция) Экспорт
|
||||
|
||||
Попытка
|
||||
|
||||
|
||||
Если ОстановитьРаботу() Тогда Возврат ЭтотОбъект; КонецЕсли;
|
||||
|
||||
|
||||
Если AuthВид <> "oauth1" Тогда
|
||||
Возврат Ошибка("УстановитьАлгоритмOAuthV1: перед установкой алгоритма авторизация OAuth v1 должна быть инициализирована");
|
||||
КонецЕсли;
|
||||
@@ -1068,7 +1068,7 @@
|
||||
Исключение
|
||||
Возврат Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
|
||||
КонецПопытки;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
@@ -1641,7 +1641,7 @@
|
||||
Запрос.Заголовки.Вставить("Content-Length" , РазмерТела);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
ДополнитьЗаголовкиАвторизации();
|
||||
|
||||
Если ПолучитьНастройку("gzip") Тогда
|
||||
@@ -1670,26 +1670,26 @@
|
||||
Если Не ЗначениеЗаполнено(AuthВид) Тогда
|
||||
Возврат ЭтотОбъект;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Если AuthВид = "aws4" Тогда
|
||||
|
||||
|
||||
ДобавитьЛог("ДополнитьЗаголовкиАвторизации: формирование заголовка AWS4 авторизации");
|
||||
ДобавитьAWS4();
|
||||
|
||||
|
||||
ИначеЕсли AuthВид = "oauth1" Тогда
|
||||
|
||||
|
||||
ДобавитьЛог("ДополнитьЗаголовкиАвторизации: формирование заголовка OAuth V1 авторизации");
|
||||
ДобавитьЗаголовокOAuthV1();
|
||||
|
||||
|
||||
Иначе
|
||||
|
||||
|
||||
ДобавитьЛог("ДополнитьЗаголовкиАвторизации: формирование заголовка Bearer авторизации");
|
||||
Запрос.Заголовки.Вставить("Authorization", СтрШаблон("Bearer %1", AuthДанные));
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
Возврат ЭтотОбъект;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция УстановитьТелоЗапроса()
|
||||
@@ -2408,13 +2408,13 @@
|
||||
#Область OAuth
|
||||
|
||||
Функция ДобавитьЗаголовокOAuthV1()
|
||||
|
||||
|
||||
OAuthАлгоритм = AuthДанные["OAuthАлгоритм"];
|
||||
OAuthХешФункция = AuthДанные["OAuthХешФункция"];
|
||||
OAuthToken = AuthДанные["OAuthToken"];
|
||||
OAuthSecret = AuthДанные["OAuthSecret"];
|
||||
OAuthConsumerKey = AuthДанные["OAuthConsumerKey"];
|
||||
OAuthConsumerSecret = AuthДанные["OAuthConsumerSecret"];
|
||||
OAuthConsumerSecret = AuthДанные["OAuthConsumerSecret"];
|
||||
OAuthВерсияAPI = AuthДанные["OAuthВерсияAPI"];
|
||||
|
||||
МетодХэширования = OAuthАлгоритм + "-" + OAuthХешФункция;
|
||||
@@ -2422,37 +2422,37 @@
|
||||
ЗаголовокАвторизации = "";
|
||||
СтрокаСигнатуры = "";
|
||||
Подпись = "";
|
||||
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата);
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
|
||||
|
||||
ТаблицаПараметров = Новый ТаблицаЗначений;
|
||||
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата);
|
||||
ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
|
||||
|
||||
ТаблицаПараметров = Новый ТаблицаЗначений;
|
||||
ТаблицаПараметров.Колонки.Добавить("Ключ");
|
||||
ТаблицаПараметров.Колонки.Добавить("Значение");
|
||||
|
||||
Если Не ЗначениеЗаполнено(ЗапросТелоКоллекция)
|
||||
|
||||
Если Не ЗначениеЗаполнено(ЗапросТелоКоллекция)
|
||||
Или Не OPI_Инструменты.ЭтоКоллекция(ЗапросТелоКоллекция, Истина) Тогда
|
||||
|
||||
|
||||
Попытка
|
||||
ЗапросТелоКоллекция = ЗапросТело;
|
||||
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ЗапросТелоКоллекция);
|
||||
Исключение
|
||||
ЗапросТелоКоллекция = Новый Структура;
|
||||
КонецПопытки;
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если ПолучитьНастройку("MultipartВOAuth") Или Не Multipart Тогда
|
||||
Для Каждого Поле Из ЗапросТелоКоллекция Цикл
|
||||
|
||||
|
||||
Если ТипЗнч(Поле.Значение) = Тип("ДвоичныеДанные") Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
НоваяСтрока = ТаблицаПараметров.Добавить();
|
||||
НоваяСтрока.Ключ = Поле.Ключ;
|
||||
НоваяСтрока.Значение = Поле.Значение;
|
||||
|
||||
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
|
||||
@@ -2503,7 +2503,7 @@
|
||||
СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
|
||||
СтрокаСигнатуры = вРег(ЗапросМетод)
|
||||
+ "&"
|
||||
+ КодироватьСтроку(ЗапросURL, СпособКодированияСтроки.КодировкаURL)
|
||||
+ КодироватьСтроку(ЗапросURL , СпособКодированияСтроки.КодировкаURL)
|
||||
+ "&"
|
||||
+ КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
|
||||
|
||||
@@ -2513,8 +2513,8 @@
|
||||
|
||||
ПодписьДД = ПолучитьДвоичныеДанныеИзСтроки(Подпись);
|
||||
СигнатураДД = ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры);
|
||||
|
||||
Сигнатура = OPI_Криптография.СоздатьПодпись(ПодписьДД, СигнатураДД, OAuthАлгоритм, OAuthХешФункция);
|
||||
|
||||
Сигнатура = OPI_Криптография.СоздатьПодпись(ПодписьДД, СигнатураДД, OAuthАлгоритм, OAuthХешФункция);
|
||||
Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
|
||||
|
||||
Разделитель = """,";
|
||||
@@ -2534,9 +2534,9 @@
|
||||
+ "oauth_version=""" + OAuthВерсияAPI + Разделитель
|
||||
|
||||
+ "oauth_signature=" + Сигнатура;
|
||||
|
||||
|
||||
Запрос.Заголовки.Вставить("Authorization", ЗаголовокАвторизации);
|
||||
|
||||
|
||||
Возврат ЭтотОбъект;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Reference in New Issue
Block a user