1
0
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:
Vitaly the Alpaca (bot)
2025-05-08 09:05:34 +03:00
parent 62cedd64df
commit 828cc2c5db
35 changed files with 8899 additions and 8111 deletions
+4
View File
@@ -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
View File
@@ -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 | &#x2714; | Encryption algorithm: HMAC, RSA |
| HashFunction | --hash | String | &#x2714; | 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 | &#x2714; | 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 | - | Строка | &#x2714; | Token для авторизации |
| Secret | - | Строка | &#x2714; | Secret для авторизации |
| ConsumerKey | - | Строка | &#x2714; | Consumer key для авторизации |
| ConsumerSecret | - | Строка | &#x2714; | Consumer secret для авторизации |
| Версия | - | Строка | &#x2714; | Версия 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 | Строка | &#x2714; | Алгоритм шифрования: HMAC, RSA |
| ХешФункция | --hash | Строка | &#x2714; | Хеш функция для сигнатуры: 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 | Булево | &#x2714; | Признак использования multipart полей в OAuth |
Возвращаемое значение: ОбработкаОбъект.OPI_HTTPКлиент - Этот же объект обработки
<br/>
:::tip
По умлчанию multipart поля используются при расчете подписи
:::
<br/>
```bsl title="Пример использования для 1С:Предприятие/OneScript"
```
+7539 -7539
View File
File diff suppressed because it is too large Load Diff
+6 -5
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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>
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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Коллекцию(Истина, Истина);
Возврат Результат;
КонецФункции
#КонецОбласти
@@ -2464,9 +2464,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции
@@ -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";
@@ -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
View File
@@ -1,4 +1,4 @@
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// MIT License
@@ -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", ЗаголовокАвторизации);
Возврат ЭтотОбъект;
КонецФункции