diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html index 8b1fcacb7..464726488 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html @@ -39,6 +39,7 @@
Загрузка...
+ | + |"; + +КонецПроцедуры + +&НаКлиенте +Процедура АвторизоватьсяНаПочтовомСервере() + + ВыполнитьПереходПоАдресу(СтрокаЗапросаАвторизации()); + +КонецПроцедуры + +&НаСервере +Функция СтрокаЗапросаАвторизации() + + СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(НастройкиАвторизации.АдресАвторизации); + АдресСервера = СтруктураURI.Хост; + АдресРесурса = "/" + СтруктураURI.ПутьНаСервере; + + ИдентификаторЗапроса = Строка(Новый УникальныйИдентификатор()); + ПроверочныйКод = РаботаСПочтовымиСообщениямиСлужебный.СгенерироватьПроверочныйКод(); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("client_id", ИдентификаторПриложения); + ПараметрыЗапроса.Вставить("response_type", "code"); + ПараметрыЗапроса.Вставить("redirect_uri", АдресПеренаправления); + + Если ЗначениеЗаполнено(НастройкиАвторизации["ЗапрашиваемыеРазрешения"]) Тогда + ПараметрыЗапроса.Вставить("scope", НастройкиАвторизации["ЗапрашиваемыеРазрешения"]); + КонецЕсли; + + ПараметрыЗапроса.Вставить("state", ИдентификаторЗапроса); + ПараметрыЗапроса.Вставить("login_hint", АдресЭлектроннойПочты); + + Если НастройкиАвторизации.ИспользоватьКлючПроверкиПодлинностиPKCE Тогда + ПараметрыЗапроса.Вставить("code_challenge", РаботаСПочтовымиСообщениямиСлужебный.КодироватьСтрокуМетодомS256(ПроверочныйКод)); + ПараметрыЗапроса.Вставить("code_challenge_method", "S256"); + КонецЕсли; + + Если ЗначениеЗаполнено(НастройкиАвторизации["ДополнительныеПараметрыАвторизации"]) Тогда + Для Каждого Элемент Из СтрРазделить(НастройкиАвторизации["ДополнительныеПараметрыАвторизации"], " ", Ложь) Цикл + ОписаниеПараметра = СтрРазделить(Элемент, "=", Истина); + ИмяПараметра = ОписаниеПараметра[0]; + ЗначениеПараметра = ""; + Если ОписаниеПараметра.Количество() = 2 Тогда + ЗначениеПараметра = ОписаниеПараметра[1]; + КонецЕсли; + ПараметрыЗапроса.Вставить(ИмяПараметра, ЗначениеПараметра); + КонецЦикла; + КонецЕсли; + + HTTPЗапрос = РаботаСПочтовымиСообщениямиСлужебный.ПодготовитьHTTPЗапрос(АдресРесурса, ПараметрыЗапроса, Ложь); + + СтрокаЗапроса = "https://" + АдресСервера + HTTPЗапрос.АдресРесурса; + Возврат СтрокаЗапроса; + +КонецФункции + +&НаКлиенте +Процедура ВебСтраницаДокументСформирован(Элемент) + Если СтрНачинаетсяС(НРег(Элемент.Документ.URL), НРег(АдресПеренаправления)) Тогда + ПриПолученииОтветаПочтовогоСервера(Элемент.Документ.URL, НастройкиАвторизации.АдресПолученияКлюча); + ПерейтиНаСледующуюСтраницу(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПриПолученииОтветаПочтовогоСервера(СтрокаURI, АдресПолученияКлюча) + + Ответ = ПараметрыИзСтрокиURI(СтрокаURI); + КодАвторизации = Ответ["code"]; + КодОшибки = Ответ["error"]; + ТекстОшибки = Ответ["error_description"]; + + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ТекстОшибки = РаскодироватьСтроку(ТекстОшибки, СпособКодированияСтроки.КодировкаURL); + КонецЕсли; + + Если ИдентификаторЗапроса <> Ответ["state"] Тогда + СообщенияОбОшибках = НСтр("ru = 'Не удалось авторизоваться на сервере %1. Неверный идентификатор ответа.'"); + ПроверкаЗавершиласьСОшибками = Истина; + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(КодОшибки) Тогда + СообщенияОбОшибках = ОписаниеОшибкиАвторизацииПочтовогоСервера(КодОшибки, ТекстОшибки); + ПроверкаЗавершиласьСОшибками = Истина; + Возврат; + КонецЕсли; + + Если Не ПолучитьКлючиДоступаКПочтовомуСерверу(КодАвторизации, АдресПолученияКлюча) Тогда + ПроверкаЗавершиласьСОшибками = Истина; + Возврат; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ПолучитьКлючиДоступаКПочтовомуСерверу(КодАвторизации, АдресПолученияКлюча) + + СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(АдресПолученияКлюча); + АдресСервера = СтруктураURI.Хост; + АдресРесурса = "/" + СтруктураURI.ПутьНаСервере; + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("client_id", ИдентификаторПриложения); + + Если ЗначениеЗаполнено(НастройкиАвторизации["ЗапрашиваемыеРазрешения"]) Тогда + ПараметрыЗапроса.Вставить("scope", НастройкиАвторизации["ЗапрашиваемыеРазрешения"]); + КонецЕсли; + + ПараметрыЗапроса.Вставить("code", КодАвторизации); + ПараметрыЗапроса.Вставить("redirect_uri", АдресПеренаправления); + ПараметрыЗапроса.Вставить("grant_type", "authorization_code"); + + Если НастройкиАвторизации.ИспользоватьКлючПроверкиПодлинностиPKCE Тогда + ПараметрыЗапроса.Вставить("code_verifier", ПроверочныйКод); + КонецЕсли; + + Если ЗначениеЗаполнено(ПарольПриложения) Тогда + ПараметрыЗапроса.Вставить("client_secret", ПарольПриложения); + КонецЕсли; + + ВремяЗапроса = ТекущаяДатаСеанса(); + + РезультатЗапроса = РаботаСПочтовымиСообщениямиСлужебный.ВыполнитьЗапрос(АдресСервера, АдресРесурса, ПараметрыЗапроса); + + Попытка + ПараметрыОтвета = РаботаСПочтовымиСообщениямиСлужебный.JSONВЗначение(РезультатЗапроса.ОтветСервера); + Исключение + ПараметрыОтвета = Новый Соответствие; + КонецПопытки; + + ТокенДоступа = ПараметрыОтвета["access_token"]; + СрокДействияТокенаДоступа = ПараметрыОтвета["expires_in"]; + ТокенОбновления = ПараметрыОтвета["refresh_token"]; + КодОшибки = ПараметрыОтвета["error"]; + ТекстОшибки = ПараметрыОтвета["error_description"]; + + Если ЗначениеЗаполнено(КодОшибки) Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить ключи доступа к учетной записи почты %1 по причине: + |%2'"), АдресЭлектроннойПочты, ТекстОшибки); + + ТехническиеПодробности = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ответ сервера: + |%1'"), РезультатЗапроса.ОтветСервера); + + ЗаписьЖурналаРегистрации(РаботаСПочтовымиСообщениямиСлужебный.ИмяСобытияАвторизацияПоПротоколуOAuth(), + УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки + Символы.ПС + ТехническиеПодробности); + СообщенияОбОшибках = ТекстОшибки; + Возврат Ложь; + ИначеЕсли Не РезультатЗапроса.ЗапросВыполнен Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось получить ключи доступа к учетной записи почты %1 по причине: + |Запрос не выполнен.'"), АдресЭлектроннойПочты); + + ТехническиеПодробности = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ответ сервера: + |%1'"), РезультатЗапроса.ОтветСервера); + + ЗаписьЖурналаРегистрации(РаботаСПочтовымиСообщениямиСлужебный.ИмяСобытияАвторизацияПоПротоколуOAuth(), + УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки + Символы.ПС + ТехническиеПодробности); + СообщенияОбОшибках = ТекстОшибки; + Возврат Ложь; + КонецЕсли; + + Если ЗначениеЗаполнено(СрокДействияТокенаДоступа) Тогда + СрокДействияТокенаДоступа = ВремяЗапроса + СрокДействияТокенаДоступа; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +&НаСервере +Функция ПараметрыИзСтрокиURI(СтрокаURI) + + ЗначенияПараметров = Новый Соответствие; + СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(СтрокаURI); + Для Каждого ЧастьСтроки Из СтрРазделить(СтруктураURI.ПутьНаСервере, "?&") Цикл + ПараметрИЗначение = СтрРазделить(ЧастьСтроки, "=", Истина); + ИмяПараметра = ПараметрИЗначение[0]; + Если ПараметрИЗначение.Количество() > 1 Тогда + ЗначениеПараметра = ПараметрИЗначение[1]; + ЗначенияПараметров.Вставить(ИмяПараметра, ЗначениеПараметра); + КонецЕсли; + КонецЦикла; + + Возврат ЗначенияПараметров; + +КонецФункции + +&НаСервереБезКонтекста +Функция ОписаниеОшибкиАвторизацииПочтовогоСервера(Знач КодОшибки, Знач ТекстОшибки) + + Результат = Строка(ТекстОшибки) + Символы.ПС + КодОшибки; + Результат = СокрЛП(Результат); + + Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Не удалось авторизоваться на почтовом сервере: + |%1'"), Результат); + + Возврат Результат; + +КонецФункции + +// Возвращаемое значение: +// см. Справочники.УчетныеЗаписиЭлектроннойПочты.НастройкиПодключенияПоАдресуЭлектроннойПочты +// +&НаСервере +Функция НастройкиПодключенияПоАдресуЭлектроннойПочты() + + УстановитьПривилегированныйРежим(Истина); + Возврат Справочники.УчетныеЗаписиЭлектроннойПочты.НастройкиПодключенияПоАдресуЭлектроннойПочты(АдресЭлектроннойПочты, ПарольДляПолученияПисем); + +КонецФункции + +// Возвращаемое значение: +// см. Справочники.НастройкиАвторизацииИнтернетСервисов.НастройкиАвторизацииИнтернетСервиса +// +&НаСервере +Функция НастройкиАвторизацииНаПочтовомСервере() + + Возврат НастройкиПодключенияПоАдресуЭлектроннойПочты().НастройкиАвторизации; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form index 4356788e8..f623e2e8e 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form @@ -567,23 +567,24 @@