mirror of
https://github.com/Bayselonarrend/TelegramEnterprise.git
synced 2024-11-21 05:05:46 +02:00
Добавлена обработка входных данных из TMA
This commit is contained in:
parent
2c1376c987
commit
4e4107864e
@ -412,6 +412,64 @@
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область TelegramMiniApp
|
||||
|
||||
Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт
|
||||
|
||||
СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
|
||||
СтруктураДанных = ПараметрыЗапросаВСоответствие(СтрокаДанных);
|
||||
Ключ = "WebAppData";
|
||||
Хэш = "";
|
||||
|
||||
Результат = HMACSHA256(ПолучитьДвоичныеДанныеИзСтроки(Ключ), ПолучитьДвоичныеДанныеИзСтроки(Токен));
|
||||
|
||||
ТЗ = Новый ТаблицаЗначений;
|
||||
ТЗ.Колонки.Добавить("Ключ");
|
||||
ТЗ.Колонки.Добавить("Значение");
|
||||
|
||||
Для Каждого Данные Из СтруктураДанных Цикл
|
||||
|
||||
НоваяСтрока = ТЗ.Добавить();
|
||||
НоваяСтрока.Ключ = Данные.Ключ;
|
||||
НоваяСтрока.Значение = Данные.Значение;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
ТЗ.Сортировать("Ключ");
|
||||
|
||||
СоответствиеВозврата = Новый Соответствие;
|
||||
DCS = "";
|
||||
|
||||
Для Каждого СтрокаТЗ Из ТЗ Цикл
|
||||
|
||||
Если СтрокаТЗ.Ключ <> "hash" Тогда
|
||||
DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
|
||||
СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
|
||||
Иначе
|
||||
Хэш = СтрокаТЗ.Значение;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
DCS = Лев(DCS, СтрДлина(DCS) - 1);
|
||||
Подпись = HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));
|
||||
|
||||
Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);
|
||||
|
||||
Если Финал = вРег(Хэш) Тогда
|
||||
Ответ = Истина;
|
||||
Иначе
|
||||
Ответ = Ложь;
|
||||
КонецЕсли;
|
||||
|
||||
СоответствиеВозврата.Вставить("passed", Ответ);
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область Прочее
|
||||
|
||||
Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок, Знач ПодСообщением = Ложь) Экспорт
|
||||
@ -510,4 +568,100 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
|
||||
|
||||
СоответствиеВозврата = Новый Соответствие;
|
||||
КоличествоЧастей = 2;
|
||||
МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
|
||||
|
||||
Для Каждого Параметр Из МассивПараметров Цикл
|
||||
|
||||
МассивКлючЗначение = СтрРазделить(Параметр, "=");
|
||||
|
||||
|
||||
Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
|
||||
СоответствиеВозврата.Вставить(МассивКлючЗначение[0]
|
||||
, МассивКлючЗначение[1]);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область БСП
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright (c) 2019, ООО 1С-Софт
|
||||
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
|
||||
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
|
||||
// Текст лицензии доступен по ссылке:
|
||||
// https://creativecommons.org/licenses/by/4.0/legalcode
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Функция HMACSHA256(Знач Ключ, Знач Данные)
|
||||
|
||||
Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Хеш(ДвоичныеДанные, Тип)
|
||||
|
||||
Хеширование = Новый ХешированиеДанных(Тип);
|
||||
Хеширование.Добавить(ДвоичныеДанные);
|
||||
|
||||
Возврат Хеширование.ХешСумма;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока)
|
||||
|
||||
Если Ключ.Размер() > РазмерБлока Тогда
|
||||
Ключ = Хеш(Ключ, Тип);
|
||||
КонецЕсли;
|
||||
|
||||
Если Ключ.Размер() <= РазмерБлока Тогда
|
||||
Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
|
||||
Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * 2);
|
||||
КонецЕсли;
|
||||
|
||||
Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
|
||||
|
||||
ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
|
||||
opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
|
||||
|
||||
ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
|
||||
ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
|
||||
|
||||
opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
|
||||
okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
|
||||
|
||||
Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2)
|
||||
|
||||
МассивДвоичныхДанных = Новый Массив;
|
||||
МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
|
||||
МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
|
||||
|
||||
Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПовторитьСтроку(Строка, Количество)
|
||||
|
||||
Части = Новый Массив(Количество);
|
||||
Для к = 1 По Количество Цикл
|
||||
Части.Добавить(Строка);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат СтрСоединить(Части, "");
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
Loading…
Reference in New Issue
Block a user