You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2026-05-22 10:05:29 +02:00
S3: Создание и удаление бакета
This commit is contained in:
+5437
-5425
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user