1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2026-05-22 10:05:29 +02:00

S3: Создание и удаление бакета

This commit is contained in:
Anton
2024-11-12 23:04:50 +03:00
parent 773bb45993
commit dfa07e2ca0
33 changed files with 5789 additions and 5523 deletions
+5437 -5425
View File
File diff suppressed because it is too large Load Diff
+121 -32
View File
@@ -70,8 +70,9 @@
ЗаголовокАвторизации = СоздатьЗаголовокАвторизации(Авторизация, Запрос, Соединение, Метод);
Запрос.Заголовки.Вставить("Authorization", ЗаголовокАвторизации);
Ответ = OPI_Инструменты.ВыполнитьЗапрос(Запрос, Соединение, Метод);
Ответ = OPI_Инструменты.ВыполнитьЗапрос(Запрос, Соединение, Метод, , Истина);
Ответ = ОформитьОтвет(Ответ);
Возврат Ответ;
КонецФункции
@@ -82,23 +83,26 @@
Функция СоздатьБакет(Знач Имя, Знач Авторизация) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
URL = ПолучитьURLСервиса(Авторизация);
URL = URL + Имя;
Ответ = ОтправитьЗапросБезТела(URL, Авторизация, "PUT");
Ответ = УправлениеБакетом(Имя, Авторизация, "PUT");
Возврат Ответ;
КонецФункции
Функция УдалитьБакет(Знач Имя, Знач Авторизация) Экспорт
Ответ = УправлениеБакетом(Имя, Авторизация, "DELETE");
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область Авторизация
Функция СоздатьЗаголовокАвторизации(Знач СтруктураДанных, Знач Запрос, Знач Соединение, Знач Метод)
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураДанных);
@@ -124,15 +128,18 @@
Region = СтруктураДанных["Region"];
Service = СтруктураДанных["Service"];
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
ТекущаяДата = ТекущаяУниверсальнаяДата();
Запрос.Заголовки.Вставить("x-amz-date", OPI_Инструменты.ВременнаяМеткаISO(ТекущаяДата));
Запрос.Заголовки.Вставить("Host" , Соединение.Сервер);
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
КаноническийЗапрос = СоздатьКаноническийЗапрос(Запрос, Соединение, Метод);
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
Сигнатура = ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура);
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
@@ -146,12 +153,15 @@
СекретныйКлюч = ПолучитьДвоичныеДанныеИзСтроки("AWS4" + СекретныйКлюч);
ДанныеДата = ПолучитьДвоичныеДанныеИзСтроки(Формат(ТекущаяДата, "ДФ=yyyyMMdd;"));
Регион = ПолучитьДвоичныеДанныеИзСтроки(Регион);
Сервис = ПолучитьДвоичныеДанныеИзСтроки(Сервис);
AWSЗапрос = ПолучитьДвоичныеДанныеИзСтроки("aws4_request");
КлючДанных = OPI_Криптография.HMACSHA256(СекретныйКлюч, ДанныеДата);
КлючРегиона = OPI_Криптография.HMACSHA256(КлючДанных, Регион);
КлючСервиса = OPI_Криптография.HMACSHA256(КлючРегиона, Сервис);
ФинальныйКлюч = OPI_Криптография.HMACSHA256(КлючСервиса, "aws4_request");
ФинальныйКлюч = OPI_Криптография.HMACSHA256(КлючСервиса, AWSЗапрос);
Возврат ФинальныйКлюч;
@@ -159,11 +169,19 @@
Функция СоздатьКаноническийЗапрос(Знач Запрос, Знач Соединение, Знач Метод)
ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные();
ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные();
Если Не ЗначениеЗаполнено(ТелоЗапроса) Тогда
ТелоЗапроса = ПолучитьДвоичныеДанныеИзСтроки("");
КонецЕсли;
ХешСумма = OPI_Криптография.Хеш(ТелоЗапроса, ХешФункция.SHA256);
Запрос.Заголовки.Вставить("x-amz-content-sha256", нРег(ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма)));
ШаблонЗапроса = "";
Для Н = 1 По 6 Цикл
ШаблонЗапроса = "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
ШаблонЗапроса = ШаблонЗапроса + "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
КонецЦикла;
Метод = вРег(Метод);
@@ -172,8 +190,7 @@
СтрокаЗаголовков = ПолучитьСтрокуЗаголовков(Запрос);
СтрокаКлючей = ПолучитьСтрокуКлючейЗаголовков(Запрос);
ХэшСумма = OPI_Криптография.Хеш(ТелоЗапроса, ХешФункция.SHA256);
СтрокаХэша = ПолучитьHexСтрокуИзДвоичныхДанных(ХэшСумма);
СтрокаХэша = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма));
КаноническийЗапрос = СтрШаблон(ШаблонЗапроса
, Метод
@@ -205,16 +222,21 @@
Функция СоздатьСтрокуПодписи(Знач КаноническийЗапрос, Знач Скоуп, Знач ТекущаяДата)
ШаблонСтроки = "";
Алгоритм = "AWS4-HMAC-SHA256";
ДатаISO = Лев(XMLСтрока(ТекущаяДата), 19) + "Z";
ШаблонСтроки = "";
Алгоритм = "AWS4-HMAC-SHA256";
ДатаISO = OPI_Инструменты.ВременнаяМеткаISO(ТекущаяДата);
КаноническийЗапрос = ПолучитьДвоичныеДанныеИзСтроки(КаноническийЗапрос);
КаноническийЗапрос = OPI_Криптография.Хеш(КаноническийЗапрос, ХешФункция.SHA256);
КаноническийЗапрос = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(КаноническийЗапрос));
Для Н = 1 По 4 Цикл
ШаблонСтроки = "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
ШаблонСтроки = ШаблонСтроки + "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
КонецЦикла;
СтрокаПодписи = СтрШаблон(ШаблонСтроки, Алгоритм, ДатаISO, Скоуп, КаноническийЗапрос);
СтрокаПодписи = ПолучитьДвоичныеДанныеИзСтроки(СтрокаПодписи);
Возврат СтрокаПодписи;
КонецФункции
@@ -225,8 +247,10 @@
URI = ?(СтрНачинаетсяС(URI, "/"), URI, "/" + URI);
НачалоПараметров = СтрНайти(URI, "?");
URI = Лев(URI, НачалоПараметров - 1);
Если НачалоПараметров <> 0 Тогда
URI = Лев(URI, НачалоПараметров - 1);
КонецЕсли;
Возврат URI;
@@ -237,7 +261,7 @@
НачалоПараметров = СтрНайти(URI, "?");
Если НачалоПараметров = 0 Тогда
СтрокаПараметров = Символы.ПС;
СтрокаПараметров = "";
Иначе
ДлинаURI = СтрДлина(URI);
СтрокаПараметров = Прав(URI, ДлинаURI - НачалоПараметров);
@@ -261,8 +285,15 @@
Заголовки = Запрос.Заголовки;
Для Каждого Заголовок Из Заголовки Цикл
СтрокаЗаголовка = нРег(Заголовок.Ключ + ":" + Заголовок.Значение);
ТекущийКлюч = Заголовок.Ключ;
ТекущийКлючН = нРег(ТекущийКлюч);
Если Не СтрНачинаетсяС(ТекущийКлючН, "host") И Не СтрНачинаетсяС(ТекущийКлючН, "x-amz") Тогда
Продолжить;
КонецЕсли;
СтрокаЗаголовка = нРег(ТекущийКлюч) + ":" + Заголовок.Значение;
СписокЗаголовков.Добавить(СтрокаЗаголовка);
КонецЦикла;
@@ -271,7 +302,7 @@
СтрокаЗаголовков = СтрСоединить(СписокЗаголовков.ВыгрузитьЗначения(), Символы.ПС);
Возврат СтрокаЗаголовков;
Возврат СтрокаЗаголовков + Символы.ПС;
КонецФункции
@@ -281,8 +312,15 @@
Заголовки = Запрос.Заголовки;
Для Каждого Заголовок Из Заголовки Цикл
СтрокаЗаголовка = нРег(Заголовок.Ключ);
ТекущийКлюч = Заголовок.Ключ;
ТекущийКлючН = нРег(ТекущийКлюч);
Если Не СтрНачинаетсяС(ТекущийКлючН, "host") И Не СтрНачинаетсяС(ТекущийКлючН, "x-amz") Тогда
Продолжить;
КонецЕсли;
СтрокаЗаголовка = нРег(ТекущийКлюч);
СписокЗаголовков.Добавить(СтрокаЗаголовка);
КонецЦикла;
@@ -309,7 +347,7 @@
Функция СформироватьЗаголовокАвторизации(Знач AccessKey, Знач Скоуп, Знач Сигнатура, Знач КлючиЗаголовков)
ШаблонЗаголовка = "Authorization: AWS4-HMAC-SHA256 "
ШаблонЗаголовка = "AWS4-HMAC-SHA256 "
+ "Credential=%1/%2, "
+ "SignedHeaders=%3, "
+ "Signature=%4";
@@ -321,3 +359,54 @@
КонецФункции
#КонецОбласти
#Область Прочее
Функция УправлениеБакетом(Знач Имя, Знач Авторизация, Знач Метод)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
URL = ПолучитьURLСервиса(Авторизация);
URL = URL + Имя;
Ответ = ОтправитьЗапросБезТела(URL, Авторизация, Метод);
Возврат Ответ;
КонецФункции
Функция ОформитьОтвет(Знач Ответ)
ШаблонОтвета = Новый Структура();
Статус = Ответ.КодСостояния;
OPI_Инструменты.ОбработатьОтвет(Ответ);
Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
КонецЕсли;
Если ПоддерживаемыйОтвет(Ответ) Тогда
ШаблонОтвета.Вставить("message", Ответ);
Иначе
ШаблонОтвета.Вставить("message", "Неподдерживаемое сообщение");
КонецЕсли;
ШаблонОтвета.Вставить("status", Статус);
Возврат ШаблонОтвета;
КонецФункции
Функция ПоддерживаемыйОтвет(Знач Ответ)
Возврат ТипЗнч(Ответ) = Тип("Строка")
Или ТипЗнч(Ответ) = Тип("Структура")
Или ТипЗнч(Ответ) = Тип("Соответствие")
Или ТипЗнч(Ответ) = Тип("Массив");
КонецФункции
#КонецОбласти
#КонецОбласти
@@ -2111,6 +2111,7 @@
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("S3_URL" , ПараметрыТеста);
S3_СоздатьБакет(ПараметрыТеста);
S3_УдалитьБакет(ПараметрыТеста);
КонецПроцедуры
@@ -14612,18 +14613,38 @@
URL = ПараметрыФункции["S3_URL"];
AccessKey = ПараметрыФункции["S3_AccessKey"];
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "ru-central1";
Region = "BTC";
Авторизация = OPI_S3.ПолучитьСтруктуруАвторизации(URL, AccessKey, SecretKey, Region);
Имя = "NewBacket1";
Имя = "newbucket2";
Результат = OPI_S3.СоздатьБакет(Имя, Авторизация);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБакет", "S3");
OPI_ПолучениеДанныхТестов.Проверка_Соответствие(Результат);
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат);
КонецПроцедуры
Процедура S3_УдалитьБакет(ПараметрыФункции)
URL = ПараметрыФункции["S3_URL"];
AccessKey = ПараметрыФункции["S3_AccessKey"];
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
Авторизация = OPI_S3.ПолучитьСтруктуруАвторизации(URL, AccessKey, SecretKey, Region);
Имя = "newbucket2";
Результат = OPI_S3.УдалитьБакет(Имя, Авторизация);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет", "S3");
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат);
КонецПроцедуры
@@ -1970,6 +1970,13 @@
ОжидаетЧто(Результат["counters"]).ИмеетТип("Массив").Заполнено();
КонецПроцедуры
Процедура Проверка_S3Успех(Знач Результат) Экспорт
Успех = Результат["status"] >= 200 И Результат["status"] < 300;
ОжидаетЧто(Успех).Равно(Истина);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
@@ -634,6 +634,16 @@
КонецФункции
Функция ВременнаяМеткаISO(Знач Дата) Экспорт
Метка = Лев(XMLСтрока(Дата), 19) + "Z";
Метка = СтрЗаменить(Метка, "-", "");
Метка = СтрЗаменить(Метка, ":", "");
Возврат Метка;
КонецФункции
Процедура ЗначениеВМассив(Значение) Экспорт
Значение_ = Новый Массив;
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Airtable.os
// OneScript: ./OInt/core/Modules/OPI_Airtable.os
// Lib: Airtable
// CLI: airtable
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Bitrix24.os
// OneScript: ./OInt/core/Modules/OPI_Bitrix24.os
// Lib: Bitrix24
// CLI: bitrix24
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_CDEK.os
// OneScript: ./OInt/core/Modules/OPI_CDEK.os
// Lib: CDEK
// CLI: cdek
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Dropbox.os
// OneScript: ./OInt/core/Modules/OPI_Dropbox.os
// Lib: Dropbox
// CLI: dropbox
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_GoogleCalendar.os
// OneScript: ./OInt/core/Modules/OPI_GoogleCalendar.os
// Lib: Google Calendar
// CLI: gcalendar
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_GoogleDrive.os
// OneScript: ./OInt/core/Modules/OPI_GoogleDrive.os
// Lib: Google Drive
// CLI: gdrive
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_GoogleSheets.os
// OneScript: ./OInt/core/Modules/OPI_GoogleSheets.os
// Lib: Google Sheets
// CLI: gsheets
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_GoogleWorkspace.os
// OneScript: ./OInt/core/Modules/OPI_GoogleWorkspace.os
// Lib: Google Workspace
// CLI: google
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Neocities.os
// OneScript: ./OInt/core/Modules/OPI_Neocities.os
// Lib: Neocities
// CLI: neocities
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Notion.os
// OneScript: ./OInt/core/Modules/OPI_Notion.os
// Lib: Notion
// CLI: notion
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Ozon.os
// OneScript: ./OInt/core/Modules/OPI_Ozon.os
// Lib: Ozon
// CLI: ozon
+122 -33
View File
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_S3.os
// OneScript: ./OInt/core/Modules/OPI_S3.os
// Lib: S3
// CLI: s3
@@ -70,8 +70,9 @@
ЗаголовокАвторизации = СоздатьЗаголовокАвторизации(Авторизация, Запрос, Соединение, Метод);
Запрос.Заголовки.Вставить("Authorization", ЗаголовокАвторизации);
Ответ = OPI_Инструменты.ВыполнитьЗапрос(Запрос, Соединение, Метод);
Ответ = OPI_Инструменты.ВыполнитьЗапрос(Запрос, Соединение, Метод, , Истина);
Ответ = ОформитьОтвет(Ответ);
Возврат Ответ;
КонецФункции
@@ -82,23 +83,26 @@
Функция СоздатьБакет(Знач Имя, Знач Авторизация) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
URL = ПолучитьURLСервиса(Авторизация);
URL = URL + Имя;
Ответ = ОтправитьЗапросБезТела(URL, Авторизация, "PUT");
Ответ = УправлениеБакетом(Имя, Авторизация, "PUT");
Возврат Ответ;
КонецФункции
Функция УдалитьБакет(Знач Имя, Знач Авторизация) Экспорт
Ответ = УправлениеБакетом(Имя, Авторизация, "DELETE");
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область Авторизация
Функция СоздатьЗаголовокАвторизации(Знач СтруктураДанных, Знач Запрос, Знач Соединение, Знач Метод)
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураДанных);
@@ -124,15 +128,18 @@
Region = СтруктураДанных["Region"];
Service = СтруктураДанных["Service"];
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
ТекущаяДата = ТекущаяУниверсальнаяДата();
Запрос.Заголовки.Вставить("x-amz-date", OPI_Инструменты.ВременнаяМеткаISO(ТекущаяДата));
Запрос.Заголовки.Вставить("Host" , Соединение.Сервер);
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service, ТекущаяДата);
КаноническийЗапрос = СоздатьКаноническийЗапрос(Запрос, Соединение, Метод);
Скоуп = СоздатьСкоуп(Region, Service, ТекущаяДата);
СтрокаДляПодписи = СоздатьСтрокуПодписи(КаноническийЗапрос, Скоуп, ТекущаяДата);
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
Сигнатура = ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура);
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
@@ -146,12 +153,15 @@
СекретныйКлюч = ПолучитьДвоичныеДанныеИзСтроки("AWS4" + СекретныйКлюч);
ДанныеДата = ПолучитьДвоичныеДанныеИзСтроки(Формат(ТекущаяДата, "ДФ=yyyyMMdd;"));
Регион = ПолучитьДвоичныеДанныеИзСтроки(Регион);
Сервис = ПолучитьДвоичныеДанныеИзСтроки(Сервис);
AWSЗапрос = ПолучитьДвоичныеДанныеИзСтроки("aws4_request");
КлючДанных = OPI_Криптография.HMACSHA256(СекретныйКлюч, ДанныеДата);
КлючРегиона = OPI_Криптография.HMACSHA256(КлючДанных, Регион);
КлючСервиса = OPI_Криптография.HMACSHA256(КлючРегиона, Сервис);
ФинальныйКлюч = OPI_Криптография.HMACSHA256(КлючСервиса, "aws4_request");
ФинальныйКлюч = OPI_Криптография.HMACSHA256(КлючСервиса, AWSЗапрос);
Возврат ФинальныйКлюч;
@@ -159,11 +169,19 @@
Функция СоздатьКаноническийЗапрос(Знач Запрос, Знач Соединение, Знач Метод)
ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные();
ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные();
Если Не ЗначениеЗаполнено(ТелоЗапроса) Тогда
ТелоЗапроса = ПолучитьДвоичныеДанныеИзСтроки("");
КонецЕсли;
ХешСумма = OPI_Криптография.Хеш(ТелоЗапроса, ХешФункция.SHA256);
Запрос.Заголовки.Вставить("x-amz-content-sha256", нРег(ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма)));
ШаблонЗапроса = "";
Для Н = 1 По 6 Цикл
ШаблонЗапроса = "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
ШаблонЗапроса = ШаблонЗапроса + "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
КонецЦикла;
Метод = вРег(Метод);
@@ -172,8 +190,7 @@
СтрокаЗаголовков = ПолучитьСтрокуЗаголовков(Запрос);
СтрокаКлючей = ПолучитьСтрокуКлючейЗаголовков(Запрос);
ХэшСумма = OPI_Криптография.Хеш(ТелоЗапроса, ХешФункция.SHA256);
СтрокаХэша = ПолучитьHexСтрокуИзДвоичныхДанных(ХэшСумма);
СтрокаХэша = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма));
КаноническийЗапрос = СтрШаблон(ШаблонЗапроса
, Метод
@@ -205,16 +222,21 @@
Функция СоздатьСтрокуПодписи(Знач КаноническийЗапрос, Знач Скоуп, Знач ТекущаяДата)
ШаблонСтроки = "";
Алгоритм = "AWS4-HMAC-SHA256";
ДатаISO = Лев(XMLСтрока(ТекущаяДата), 19) + "Z";
ШаблонСтроки = "";
Алгоритм = "AWS4-HMAC-SHA256";
ДатаISO = OPI_Инструменты.ВременнаяМеткаISO(ТекущаяДата);
КаноническийЗапрос = ПолучитьДвоичныеДанныеИзСтроки(КаноническийЗапрос);
КаноническийЗапрос = OPI_Криптография.Хеш(КаноническийЗапрос, ХешФункция.SHA256);
КаноническийЗапрос = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(КаноническийЗапрос));
Для Н = 1 По 4 Цикл
ШаблонСтроки = "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
ШаблонСтроки = ШаблонСтроки + "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
КонецЦикла;
СтрокаПодписи = СтрШаблон(ШаблонСтроки, Алгоритм, ДатаISO, Скоуп, КаноническийЗапрос);
СтрокаПодписи = ПолучитьДвоичныеДанныеИзСтроки(СтрокаПодписи);
Возврат СтрокаПодписи;
КонецФункции
@@ -225,8 +247,10 @@
URI = ?(СтрНачинаетсяС(URI, "/"), URI, "/" + URI);
НачалоПараметров = СтрНайти(URI, "?");
URI = Лев(URI, НачалоПараметров - 1);
Если НачалоПараметров <> 0 Тогда
URI = Лев(URI, НачалоПараметров - 1);
КонецЕсли;
Возврат URI;
@@ -237,7 +261,7 @@
НачалоПараметров = СтрНайти(URI, "?");
Если НачалоПараметров = 0 Тогда
СтрокаПараметров = Символы.ПС;
СтрокаПараметров = "";
Иначе
ДлинаURI = СтрДлина(URI);
СтрокаПараметров = Прав(URI, ДлинаURI - НачалоПараметров);
@@ -261,8 +285,15 @@
Заголовки = Запрос.Заголовки;
Для Каждого Заголовок Из Заголовки Цикл
СтрокаЗаголовка = нРег(Заголовок.Ключ + ":" + Заголовок.Значение);
ТекущийКлюч = Заголовок.Ключ;
ТекущийКлючН = нРег(ТекущийКлюч);
Если Не СтрНачинаетсяС(ТекущийКлючН, "host") И Не СтрНачинаетсяС(ТекущийКлючН, "x-amz") Тогда
Продолжить;
КонецЕсли;
СтрокаЗаголовка = нРег(ТекущийКлюч) + ":" + Заголовок.Значение;
СписокЗаголовков.Добавить(СтрокаЗаголовка);
КонецЦикла;
@@ -271,7 +302,7 @@
СтрокаЗаголовков = СтрСоединить(СписокЗаголовков.ВыгрузитьЗначения(), Символы.ПС);
Возврат СтрокаЗаголовков;
Возврат СтрокаЗаголовков + Символы.ПС;
КонецФункции
@@ -281,8 +312,15 @@
Заголовки = Запрос.Заголовки;
Для Каждого Заголовок Из Заголовки Цикл
СтрокаЗаголовка = нРег(Заголовок.Ключ);
ТекущийКлюч = Заголовок.Ключ;
ТекущийКлючН = нРег(ТекущийКлюч);
Если Не СтрНачинаетсяС(ТекущийКлючН, "host") И Не СтрНачинаетсяС(ТекущийКлючН, "x-amz") Тогда
Продолжить;
КонецЕсли;
СтрокаЗаголовка = нРег(ТекущийКлюч);
СписокЗаголовков.Добавить(СтрокаЗаголовка);
КонецЦикла;
@@ -309,7 +347,7 @@
Функция СформироватьЗаголовокАвторизации(Знач AccessKey, Знач Скоуп, Знач Сигнатура, Знач КлючиЗаголовков)
ШаблонЗаголовка = "Authorization: AWS4-HMAC-SHA256 "
ШаблонЗаголовка = "AWS4-HMAC-SHA256 "
+ "Credential=%1/%2, "
+ "SignedHeaders=%3, "
+ "Signature=%4";
@@ -321,3 +359,54 @@
КонецФункции
#КонецОбласти
#Область Прочее
Функция УправлениеБакетом(Знач Имя, Знач Авторизация, Знач Метод)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
URL = ПолучитьURLСервиса(Авторизация);
URL = URL + Имя;
Ответ = ОтправитьЗапросБезТела(URL, Авторизация, Метод);
Возврат Ответ;
КонецФункции
Функция ОформитьОтвет(Знач Ответ)
ШаблонОтвета = Новый Структура();
Статус = Ответ.КодСостояния;
OPI_Инструменты.ОбработатьОтвет(Ответ);
Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
КонецЕсли;
Если ПоддерживаемыйОтвет(Ответ) Тогда
ШаблонОтвета.Вставить("message", Ответ);
Иначе
ШаблонОтвета.Вставить("message", "Неподдерживаемое сообщение");
КонецЕсли;
ШаблонОтвета.Вставить("status", Статус);
Возврат ШаблонОтвета;
КонецФункции
Функция ПоддерживаемыйОтвет(Знач Ответ)
Возврат ТипЗнч(Ответ) = Тип("Строка")
Или ТипЗнч(Ответ) = Тип("Структура")
Или ТипЗнч(Ответ) = Тип("Соответствие")
Или ТипЗнч(Ответ) = Тип("Массив");
КонецФункции
#КонецОбласти
#КонецОбласти
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Slack.os
// OneScript: ./OInt/core/Modules/OPI_Slack.os
// Lib: Slack
// CLI: slack
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Telegram.os
// OneScript: ./OInt/core/Modules/OPI_Telegram.os
// Lib: Telegram
// CLI: telegram
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Twitter.os
// OneScript: ./OInt/core/Modules/OPI_Twitter.os
// Lib: Twitter
// CLI: twitter
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_VK.os
// OneScript: ./OInt/core/Modules/OPI_VK.os
// Lib: VK
// CLI: vk
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_VKTeams.os
// OneScript: ./OInt/core/Modules/OPI_VKTeams.os
// Lib: VKTeams
// CLI: vkteams
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_Viber.os
// OneScript: ./OInt/core/Modules/OPI_Viber.os
// Lib: Viber
// CLI: viber
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_YandexDisk.os
// OneScript: ./OInt/core/Modules/OPI_YandexDisk.os
// Lib: Yandex Disk
// CLI: yadisk
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_YandexID.os
// OneScript: ./OInt/core/Modules/OPI_YandexID.os
// Lib: Yandex ID
// CLI: yandex
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_YandexMarket.os
// OneScript: ./OInt/core/Modules/OPI_YandexMarket.os
// Lib: Yandex Market
// CLI: yamarket
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_YandexMetrika.os
// OneScript: ./OInt/core/Modules/OPI_YandexMetrika.os
// Lib: Yandex Metrika
// CLI: metrika
@@ -1,4 +1,4 @@
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
// MIT License
@@ -634,6 +634,16 @@
КонецФункции
Функция ВременнаяМеткаISO(Знач Дата) Экспорт
Метка = Лев(XMLСтрока(Дата), 19) + "Z";
Метка = СтрЗаменить(Метка, "-", "");
Метка = СтрЗаменить(Метка, ":", "");
Возврат Метка;
КонецФункции
Процедура ЗначениеВМассив(Значение) Экспорт
Значение_ = Новый Массив;
@@ -1,4 +1,4 @@
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
// MIT License
@@ -1,4 +1,4 @@
// OneScript: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
// OneScript: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
// MIT License
@@ -1970,6 +1970,13 @@
ОжидаетЧто(Результат["counters"]).ИмеетТип("Массив").Заполнено();
КонецПроцедуры
Процедура Проверка_S3Успех(Знач Результат) Экспорт
Успех = Результат["status"] >= 200 И Результат["status"] < 300;
ОжидаетЧто(Успех).Равно(Истина);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
@@ -1,4 +1,4 @@
// OneScript: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
// OneScript: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
// MIT License
@@ -1,4 +1,4 @@
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// MIT License
@@ -2111,6 +2111,7 @@
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("S3_URL" , ПараметрыТеста);
S3_СоздатьБакет(ПараметрыТеста);
S3_УдалитьБакет(ПараметрыТеста);
КонецПроцедуры
@@ -14612,18 +14613,38 @@
URL = ПараметрыФункции["S3_URL"];
AccessKey = ПараметрыФункции["S3_AccessKey"];
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "ru-central1";
Region = "BTC";
Авторизация = OPI_S3.ПолучитьСтруктуруАвторизации(URL, AccessKey, SecretKey, Region);
Имя = "NewBacket1";
Имя = "newbucket2";
Результат = OPI_S3.СоздатьБакет(Имя, Авторизация);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБакет", "S3");
OPI_ПолучениеДанныхТестов.Проверка_Соответствие(Результат);
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат);
КонецПроцедуры
Процедура S3_УдалитьБакет(ПараметрыФункции)
URL = ПараметрыФункции["S3_URL"];
AccessKey = ПараметрыФункции["S3_AccessKey"];
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
Авторизация = OPI_S3.ПолучитьСтруктуруАвторизации(URL, AccessKey, SecretKey, Region);
Имя = "newbucket2";
Результат = OPI_S3.УдалитьБакет(Имя, Авторизация);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет", "S3");
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат);
КонецПроцедуры
@@ -1,4 +1,4 @@
// OneScript: ./OInt/tests/Modules/internal/OPI_ТестыCLI.os
// OneScript: ./OInt/tests/Modules/internal/OPI_ТестыCLI.os
// MIT License