После защиты паролем через библиотеку, макрос перестал работать

Автор Konstanta, 7 февраля 2020, 10:54

0 Пользователи и 1 гость просматривают эту тему.

Kadet

Цитата: mikekaganski от 18 августа 2020, 13:49Но написать то, что Вы написали в ответе #54 - это ничего не написать. Нет предмета (примера).
Да. Действительно нужно сварганить какой-нибудь простенький пример, с минимумом сопутствующих. Может пока буду делать и сам чего-то догоню.

mikekaganski

Цитата: mikekaganski от 18 августа 2020, 14:54как-то слишком геморойно, громоздко

Если Вы хотите работать с макросами внутри другого документа - то нормально. Просто сделайте ограниченный интерфейс (API) для вызова в случайных местах, и всё запихайте внутрь функций, которые будут уже внутри нужного окружения работать. Чтобы весь "простенький код" был уже внутри функции, которую Вы вызовете как-то типа

CallProtectedFunction("dlgALL.Search", oDoc)

а уж она определяла тип документа внутри, и всё остальное делала. Уж извините, Вы пишете большую вещь, и попадаете в область, изучаемую на соответствующих специальностях.
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от 18 августа 2020, 14:54да нет же, это не макросы другого документа, это макросы глобального менеджера. Вы в *глобальный менеджер* загружаете макросы из глобальных библиотек.
Т.е. - и тогда я могу их использовать из любого документа?!

И возможности в глобальный менеджер загрузить внутренние макросы - нет никакой?

Цитата: mikekaganski от 18 августа 2020, 15:03Вы пишете большую вещь
Я то её уже написал, а теперь пытаюсь немного модернизировать для узкого использования.

Однако, так не хочется крыжить глобальные макросы, которые уже хорошо себя показывают и работают рабочей базе, под нужды демо-версии.

Ладно, спасибо большое за содействие. Мне таки кажется, что если нельзя загрузить внутреннюю библиотеку к глобальному менеджеру, и чтобы не переписывать весь модуль StartSet под демку, после чего рабочая база может и заглючить, то проще саму библиотеку временно переносить в глобальное пространство с последующим её удалением (мой обходной вариант). Тогда ничего, кроме небольшого макросы, особо дописывать не требуется. Если гора не хочет идти к Магомеду, то нужно Магомеда привезти к горе. Пока я не найду или придумаю другой вариант, более умный, простой и профессиональный.

mikekaganski

Цитата: Kadet от 18 августа 2020, 15:10
Цитата: mikekaganski от 18 августа 2020, 15:03Вы пишете большую вещь
Я то её уже написал, а теперь пытаюсь немного модернизировать для узкого использования.

... и натыкаетесь на все грабли, которые сами себе прилежно расставляли. Собственно, именно на то, что всё время вызывает столь резкую реакцию rami.
С уважением,
Михаил Каганский

Kadet

Цитата: mikekaganski от 18 августа 2020, 15:50... и натыкаетесь на все грабли, которые сами себе прилежно расставляли. Собственно, именно на то, что всё время вызывает столь резкую реакцию rami.
Ну, то, что я не профессионал я не скрываю. И что программа далека от совершенства. Это бесспорно.
А то, что она уже год как работает и прекрасно себя зарекомендовала, при всём своём несовершенстве, это тоже факт.
А на "грабли" я натыкаюсь лишь тогда, когда пытаюсь что-то улучшить и усовершенствовать, хотя можно и так оставить, ведь "лучшее хуже хорошего" всегда.
Ладно, это не так тема для обсуждения. Вернёмся лучше к нашим баранам.

economist

В версии LO4 была странная проблема с загружаемыми не-Standard библиотеками:
Call macro_name() - работало, а просто macro_name() - нет, не видело макрос.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Цитата: mikekaganski от 18 августа 2020, 13:49Например, использование global Raskroy() в модуле с таким же именем. Оно не работает. Это, конечно, баг.

Для сведения - в Excel так же могут быть большие проблемы, если имя модуля совпадает с именем функции или Public переменной.
Владимир.

Kadet

Цитата: economist от 18 августа 2020, 17:08Call macro_name() - работало, а просто macro_name() - нет, не видело макрос.
А чем чёрт не шутит. Попробую.  ;D

Вот, в принципе сварганил некоторое подобие демки с переносом внутреней библиотеки в глобал и последующее удаление её при закрытии БД. Вроде бы всё работает. (во вложение)

С паролированием никак не могу разобраться. У Питоньяка нашёл 4 метода относительно паролирования библиотек:
changeLibraryPassword(Name, Pass, NewPass) - Изменение пароля библиотеки.
isLibraryPasswordProtected(Name) - Значение true, если библиотека защищена паролем.
isLibraryPasswordVerified(Name) - Значение true, если пароль уже был использован для того чтобы открыть библиотеку.
verifyLibraryPassword(Name, Pass) - Разблокировать защищенные паролем библиотеки.
Метода "установить пароль" нет. Полагаю, что это решается с помощью метода changeLibraryPassword(Name, Pass, NewPass), но что вносить в параметр "Pass" если пароля ещё нет. Пустая строка - "" не помогает, null - несовместимые типы. Пока не разобрался. Выдаёт исключение - IllegalArgumentException.
Не понятен вот этот метод - isLibraryPasswordVerified(Name).

Kadet

Цитата: sokol92 от 18 августа 2020, 17:13
Цитата: mikekaganski от 18 августа 2020, 13:49Например, использование global Raskroy() в модуле с таким же именем. Оно не работает. Это, конечно, баг.

Для сведения - в Excel так же могут быть большие проблемы, если имя модуля совпадает с именем функции или Public переменной.

Это не более чем недогляд.

Kadet

Цитата: economist от 18 августа 2020, 17:08Call macro_name() - работало, а просто macro_name() - нет, не видело макрос.
Опробовал. Не работает.

rami

Цитата: Kadet от 18 августа 2020, 20:31Метода "установить пароль" нет. Полагаю, что это решается с помощью метода changeLibraryPassword(Name, Pass, NewPass), но что вносить в параметр "Pass" если пароля ещё нет. Пустая строка - "" не помогает...
Очень даже помогает, проверяйте:
Sub Main
Dim oLibs
oLibs = GlobalScope.BasicLibraries
oLibs.changeLibraryPassword("Library1", "", "password")   'задаёт пароль
msgbox(oLibs.isLibraryPasswordProtected("Library1"))      'true — есть пароль
oLibs.changeLibraryPassword("Library1", "password", "")   'удаляет пароль
msgbox(oLibs.isLibraryPasswordProtected("Library1"))      'false — нет пароля
End Sub




P.S. выкладывайте на форуме документы с разными именами: Cyanopica.zip, Cyanopica1.zip, Cyanopica2.zip и т.д.

bk

//Выдаёт исключение - IllegalArgumentException - значит, что нет такой библиотеки (не видит её). Второй вариант вызова исключения - что метод verifyLibraryPassword(Name, Pass) уже применялся, т.е. пароль уже проверен.

//Не понятен вот этот метод - isLibraryPasswordVerified(Name) - если пароль уже проверен (и он правильный) - возвращает True.

Kadet

Цитата: rami от 18 августа 2020, 21:22P.S. выкладывайте на форуме документы с разными именами: Cyanopica.zip, Cyanopica1.zip, Cyanopica2.zip и т.д.
Хорошо.
С паролями вроде разобрался. Почитал описание методов в api. Да и собеседникам спасибо!
Только грузится и закрывается очень долго. Мало того, что копирование библиотек не быстрая процедура, но пароли ставятся и снимаются - просто катастрофа какая-то. Очень долго.

Однако, до задницы эти пароли. Открываю базу. Захожу в Сервис/Макросы... "Правка". Что одна, что другая библиотеки доступны. Спокойно открываются и редактируются, хотя в "Сервис/Макросы/управление маросами" при попытке доступа к ним спрашивает пароль и в закладке "Библиотеки" на них замочек висит.
Может это у меня такой глюк? Может на других машинах по-другому?

(Во вложении библиотеки паролятся и небольшие изменения внесены и в библиотеку и в саму базу)

economist

Цитата: Kadet от 18 августа 2020, 23:22грузится и закрывается очень долго.

Можно подойти к защите с другого боку, воспользовавшись силой коммьюнити и готовых наработок, но путь этот непрост:

- установить pip в подкапотный Питон в LO, командой в его папке python.exe get-pip.py, сам скрипт с https://pip.pypa.io/en/stable/installing/

- Установить свободную спецбиблиотеку защиты ПО - PyArmor и "шифровалку" hashids

- PyArmor умеет привязываться к железу: CPU ID, HDD ID, VOLUME SERIAL и создавать постоянные, с "числом лицензий" по сети или триальные по дате/числу запусков SHA-ключи. Момент создания ключа - скажем, при загрузке с флешки в ОC Linux, либо по присланному вам MACHINE ID от клиента. Т.е. всё по взрослому. Ломать такое отладчиком берутся от 2000 USD и вряд ли это возможно быстро. К тому времени обычно пишут другую версию с другой защитой.

- написать небольшой макрос на Python, куда вынести нужные библиотеки, ресурсоемкие расчеты или check-вызовы. В бизнес-приложениях часто чекают вездесущие в доках ИНН, ОГРН итд (иногда раз в минуту, или при ожидаемом действии), но не напрямую, а через хэши. Py-код работает в ~4 раза быстрее макросов LO, а математика - в 10-30 раз, так что медленнее не будет. Сам Python легок в изучении, и он в Top-3 популярности, потраченное на него время окупится 100%. Это DS, ML, NLP и прочие хайповые вещи. 

- py-макрос армором обфусцируется и шифруется, либо компилируется в exe-шник на языке С или dll. Такая защита эквивалентна аппаратным ключам типа iLock стоимостью 6-8 тыс. руб. за шт., но гибче и сложнее, как говорят "ломальщики".
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Цитата: Kadet от 18 августа 2020, 23:22Открываю базу. Захожу в Сервис/Макросы... "Правка". Что одна, что другая библиотеки доступны. Спокойно открываются и редактируются
Макросы библиотеки MyLibrary из документа Cyanopica2.odb (сообщение #72) невозможно редактировать без знания пароля.

О медленном шифровании библиотек. Если глобальные библиотеки обновлять только при смене версии (см. #56), то скорость не критична.
Владимир.