CRM-система для УК и ТСЖ

Поддержка длинных строк

Будете спамить рекламой - будем нещадно банить)))
Сообщение
Автор
two_oceans
Ветеран
Сообщений: 544
Зарегистрирован: 30 сен 2016, 17:17
Благодарил (а): 432 раза
Поблагодарили: 411 раза

Поддержка длинных строк

#41 Сообщение two_oceans » 09 окт 2017, 07:34

В четверг придумал новую идею - сделать библиотеку-основу для генерации XML и к ней подключать библиотеки-плагины с описанием определителя адреса сервиса, конкретных сервисов и частей сервисов. Предполагается встроенная поддержка тестового сервиса СМЭВ. Регистрацию плагинов сделал, дело за их перечислением и загрузкой. Количество библиотек явно возрастет. 4 библиотеки без отладочных символов (182 Кб) + приложение с отладочными (825 Кб) = 1007 Кб. Основа для генерации - 90 Кб, не сплюсована, потому что частично дублирует программу.
С длинными строками эпопея продолжается - попробовал подключить FindFirstFileA копированием декларации из модуля windows (так как там все и сразу - много ненужного) - не взлетело, Access Violation. Сначала подумал, что функции ядра не принимают память выделенную процессу, углубился в это и не нашел ничего необычного, через кучу промежуточных вызовов и коррекций размера дело пришло к HeapAlloc(GetProcessHeap(),0,size), то есть используется куча по-умолчанию, а не какая-то другая и приватная. Память из стека или из программы тоже не сработала.
Потом подключил весь модуль windows целиком - взлетело. Путем разбора деталей выяснилось, что все просто - в исходниках модуля windows проставлено stdcall по умолчанию для всех функций, а в декларации каждой отдельной stdcall не написано. В моей программе по умолчанию не stdcall и потому его нужно указывать. Дописал в скопированную строчку stdcall; и тадам - теперь файл читается не вслепую, а с учетом информации о его существовании и размере. Попутно починил и другие скопированные декларации, как ни удивительно, некоторые функции каким-то чудом работали и без этого.

two_oceans
Ветеран
Сообщений: 544
Зарегистрирован: 30 сен 2016, 17:17
Благодарил (а): 432 раза
Поблагодарили: 411 раза

Поддержка длинных строк

#42 Сообщение two_oceans » 17 ноя 2017, 13:27

За прошедший месяц внес некоторые изменения в схему - вынес в отдельные библиотеки работу с HTTP, алгоритмами ГОСТ и пространствами имен. Подписание тоже вынесено в библиотеку. Суммарно вышло 11 библиотек, при проверке подписи используются 7 из них; 3 отвечают за генерацию; 1 за HTTP. Базовые адреса им назначил разные, теперь смотрю как их по памяти оптимизировать.

Идея с основой для соап и подключаемыми библиотеками тоже в некоторой степени реализована, но еще не до конца, продолжаю менять форму и форматы. На текущий момент предполагается 3-4 уровня надстроек над основой - 1) концентратор сервисов (пространство узлов на которых сервисы совпадают, но могут отличаться по количеству сервисов, например, ГИС ЖКХ и СМЭВ), тут реализуются процедуры адресации и базовые части для всех сервисов одного концентратора; 2) сервис и операция (формирование сервисного тега); 3) подсервис - формирование внутреннего содержания сервисного тега. Естественно будут еще процедуры для формирования повторяющихся в сервисе тегов, но они будут вызываться внутри подсервиса и не регистрирутся. Уровня 3 или 4 пока не ясно - не могу понять стоит ли выделять операцию в отдельный уровень.
Предполагается, что уровни взаимодействуют через основу, в которой регистрируются адреса процедур, поэтому уровни могут быть как в одной библиотеке, так и в разных. Также основа отвечает за базовое формирование конверта SOAP, настройку взаимодействия с адресом сервиса по http и прочие базовые операции (вроде формирования guid). Плюс предполагается функция-комбайин, которая будет принимать указатели на стируктуры параметры для разных уровней, потом собирать из этого XML, вызывая зарегистрированные адреса концентраторов, сервисов и подсервисов.

В ходе проектирования этой структуры пришел к объединению контекста предков и списка ключей частоиспользуемых пространств в 1 структуру (не мог решить что лучше - оставил оба варианта) и набросал процедуры синхронизации частей структуры. С другой стороны, несколько структур поделил из соображений принадлежности к разным уровням.

В плане алгоритмов попробовал проверить подпись для гис жкх и не смог, так как у меня более-менее отлажена эксклюзивная каноникализация, а там - то вообще не указана никакая, то указана не-эксклюзивная. Полистал примеры не-эксклюзивной - по примерам весь контекст предков включается в тег верхнего уровня фрагмента. Не могу понять, что делать если вообще не указана. Оставить без изменений нельзя, потому что тогда во фрагменте нет определения пространств имен (и контекста предков вообще), но по не-эксклюзивной тоже сумма не выходит.

two_oceans
Ветеран
Сообщений: 544
Зарегистрирован: 30 сен 2016, 17:17
Благодарил (а): 432 раза
Поблагодарили: 411 раза

Поддержка длинных строк

#43 Сообщение two_oceans » 18 дек 2017, 06:36

За прошедший месяц - не было особо времени на библиотеки, понемногу отлаживал соединение измененной структуры библиотек: тестовый сервис СМЭВ - тело формируется и проверяется правильно, а вот с конвертом замечены странности.

Немного разобрался как FreePascal трассирует стек при ошибках. Теперь при объявлении композитной строки мини-менеджер еще и запрашивает строку (номер строки и имя файла по адресу в фрейме стека, в котором произошло объявление) и записывает ее в контрольную таблицу. Чтобы выводило отладочную информацию нужно чтобы и библиотека строк и библиотека в которой объявление были собраны с отладочной информацией. Если собраны, то просто в конце программы вызываю статистику по оставшимся строкам и вижу где объявлены строки которые "утекли". Имена функций которые задействованы в самом объявлении и объявлении составных типов исключаются (трассировка переходит к вызвавшей их функции).

По другому поводу (для входа в ЕГИССО) попробовал установить Vipnet CSP 4.2 (ЕГИССО видите ли TLS 1.2 требует, а криптопро 3.6 только 1.0 в большинстве случаев дает) - в итоге сломался вход на госзакупки (нарушилась работа криптопро). После попыток настроить на работу с криптопро, снес випнет (госзакупки не починились) и заодно обновился до криптопро 4.0 (тут починились и ЕГИССО тоже заработал). Как и предполагал - обновление с 3.6 на 4.0.9842 (сертифицированную) прошло не очень гладко для библиотеки формирования подписи. Особым шоком стало, что эта версия иногда не возвращает длину записанной строки - передаешь буффер 1024 байт, запрашиваешь, например, оид хэша, криптопро пишет около 20 байт и #0, но длина остается 1024. Пришлось отлавливать #0 у строк. При этом длина бинарных данных, например сертификата (который может содержать #0 в середине), возвращается корректно.
Судя по протоколу изменений позже ошибку исправили, но версия с исправлением еще не сертифицирована.

Стартовая проверка на доступность криптопровайдеров тоже идет странно - на все типы 75,80,81 (доступные в криптопро 4.0) возвращает ошибку "Плохая подпись", хотя там еще и подписи нет, но потом с хэшем и подписью нормально работает.

Отправлено спустя 14 минуты 48 секунды:
Разобрался как получить хэш сертификата (для поиска в хранилище), но пока не искал. Заодно получил идентификатор ключа (хэш от открытого ключа).


Вернуться в «ГИС ЖКХ. Форум разработчиков программного обеспечения и всего, что с ним связано»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 1 гость