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

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

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

Kadet

Цитата: economist от 19 августа 2020, 09:11Можно подойти к защите с другого боку,
М-да, идея, конечно, заманчивая. Много думал как бы всю базу перевести в нечнто-подобное .exe, хотя бы демку. Но пока не находил решения.
Однако, переписывать всё в pyton это... конечно нечто. Даже с учётом легкости изучения - полгода-год кропотливой работы. В теории можно попробовать. Но, как это неннелегко.
К тому же при входных данных - "сделать демку", потому что в оригинале базу придётся предлагать в оригинальном рабочем виде.

Хотя, если рассматривать возможность "абонентская плата" причём "срочная", то да. Этот вариант прорабатывать всё равно придётся. Работаем месяц, а потом вносим плату, иначе - ой-йой-йой.
Но пока этот вариант лишь в перспективе... в далёкой-далёкой.... ведь и в оригинальном виде - пару вопросов и до обсуждения и конкретики пока ни разу не дошло.
Спасибо! Если соберусь, буду с вами консультироваться...

Kadet

Цитата: sokol92 от 19 августа 2020, 13:49Макросы библиотеки MyLibrary из документа Cyanopica2.odb (сообщение #72) невозможно редактировать без знания пароля.
Это радует. Значит это у меня некий глюк. Пароль - 111

Kadet

Цитата: sokol92 от 19 августа 2020, 13:49Если глобальные библиотеки обновлять только при смене версии (см. #56), то скорость не критична.
Не понял?!?

sokol92

Глобальные библиотеки Basic являются копией эталонной версии, которая хранится на доступном ресурсе. Если (и только если) меняется эталонная версия, то перезаливаются глобальные библиотеки (и, естественно, работают до следующей смены версии).
Владимир.

Kadet

Цитата: sokol92 от 19 августа 2020, 16:00Глобальные библиотеки Basic являются копией эталонной версии, которая хранится на доступном ресурсе. Если (и только если) меняется эталонная версия, то перезаливаются глобальные библиотеки (и, естественно, работают до следующей смены версии).
Т.е. - библиотеки хранить где-то в инете, а у пользователя - ссылка на инет сервер?
У меня подобное реализована в рамках рабочей сети. А в инете... у меня нет инет сервера, ни сайта. Это обеспечить проблематично.

sokol92

Не обязательно в интернете, сетевые файлы тоже можно указывать в URL-формате, например, file:///O:/Tests/LO/TestDoc.ods.
Об этом подробно написано в цитированной выше книге Питоньяка.
Владимир.

Kadet

sokol92, так я же говорю. Сетевой вариант давно опробован и прекрасно работает.
Вопрос в том, чтобы отправить демку далеко-далеко... не открывая ему доступ к своей сети, и не факт, что у него самого вообще есть какая-нибудь сеть. И при этом он мог поюзать, но при этом ничего не смог выковырять из кода.

Kadet

Бред, какой-то. Ничего не пойму. Вот макрос.
Sub ThisDBDoc(oEvent)
Dim Ps
Ps = ""
ThisDatabaseDocument = ThisComponent
ThisDatabaseDocument.DataSource.Settings.RespectDriverResultSetType = false
sDBname = ThisDatabaseDocument.DataSource.URL

sDBURL=ThisDatabaseDocument.URL

If ThisDatabaseDocument.Title="Cyanopica.odb" Then
ON LOCAL ERROR GOTO Error0:
ThisDatabaseDocument.BasicLibraries.LoadLibrary("MyLibrary")
ThisDatabaseDocument.DialogLibraries.loadLibrary("MyLibrary")
Error0:
ON LOCAL ERROR GOTO 0
CallProtectedFunction("StartUp.StartOsn", Pass)
If ThisDatabaseDocument.BasicLibraries.isLibraryPasswordProtected("MyLibrary") Then ThisDatabaseDocument.BasicLibraries.verifyLibraryPassword("MyLibrary",Pass)
If GlobalScope.BasicLibraries.hasByName("MyLibrary") Then If GlobalScope.BasicLibraries.isLibraryPasswordProtected("MyLibrary") Then GlobalScope.BasicLibraries.verifyLibraryPassword("MyLibrary",Pass)
AddOneLib("MyLibrary", "MyLibrary", ThisDatabaseDocument.BasicLibraries, GlobalScope.BasicLibraries, true)
AddOneLib("MyLibrary", "MyLibrary", ThisDatabaseDocument.DialogLibraries, GlobalScope.DialogLibraries, false)
GlobalScope.BasicLibraries.loadLibrary("MyLibrary")
GlobalScope.DialogLibraries.loadLibrary("MyLibrary")
ThisDatabaseDocument.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)
GlobalScope.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)
UserName = "Manager1"
Else
GlobalScope.BasicLibraries.loadLibrary("DBLibrary")
GlobalScope.DialogLibraries.loadLibrary("DBLibrary")
UserName = ThisDatabaseDocument.DataSource.User
End If

LoginID(UserName)
OpenForm0
' If ThisDatabaseDocument.BasicLibraries.hasByName("MyLibrary") Then ThisDatabaseDocument.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)
' If GlobalScope.BasicLibraries.hasByName("MyLibrary") Then GlobalScope.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)

End Sub

Вот этот кусок - работает:
GlobalScope.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)
А вот этот, если заремить первый, выдаёт ошибку:
If GlobalScope.BasicLibraries.hasByName("MyLibrary") Then GlobalScope.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)

Почему? Не пойму.
Между ними только два вызова макроса - LoginID(UserName) и OpenForm0
LoginID(UserName) - ищет ID юзера по логину и сохраняет его в глобальной переменной.
OpenForm0 - открывает форму "ОСНОВНАЯ", при котором запускается масса прочих макросов.

bk

Цитата: Kadet от 19 августа 2020, 20:46Вот этот кусок - работает:
Код:
GlobalScope.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)
А вот этот, если заремить первый, выдаёт ошибку:
Код:
If GlobalScope.BasicLibraries.hasByName("MyLibrary") Then GlobalScope.BasicLibraries.changeLibraryPassword("MyLibrary",Ps,Pass)
Почему?

у метода два типа ошибок, какая у Вас выскакивает?
по-моему, у Вас во втором случае библиотека не загружена.

Kadet

Цитата: bk от 19 августа 2020, 22:51по-моему, у Вас во втором случае библиотека не загружена.
А почему тогда в первом случае, который гораздо раньше и другие макросы ещё не оттянули время, чтобы библиотека загрузилась, ошибки нет?
В общем, дело ясное, что дело тёмное.

rami

Библиотеку нужно загружать один раз, лучше в самом начале при запуске.

Kadet

В общем, сварганил я демку. Упростил загрузку. Теперь никаких дополнительных библиотек не нужно подгружать. Всё внутри. Можно попробовать. (Если у вас есть библиотека под названием "MyLybrary" её нужно удалить, или перенести куда-нибудь).

В общем, работа с библиотеками строится таким образом. Так как со внутренними макросами половина моей базы не работает, то библиотеку приходится копировать в глобальное пространство. Программа проверяет есть ли в глобе библиотека с именем "MyLybrary" и если нет, то переносит, а если да - то не переносит (именно поэтому и прошу убрать другие библиотеки с таким именем, ибо база просто не перенесёт нужные ей макросы и работать не будет). Это сделано для того, чтобы исключить достаточно длительное копирование библиотеки при каждой загрузке программы. Последующее удаление я убрал. Слишком долго. Просто запаролил библиотеки.

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

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

И ещё одна мелочь. Есть встроенные функции в формах, повешенные на кнопки, типа "закрыть", "отменить"... Стандарные LO функции. Так вот, почему-то "отменить" у меня перестала работать. Не закрывает форму. Я ещё толком не разобрался - это только в моей демке выскочило или во всей LO7.

P.S. Пароль - 111

Kadet

Цитата: rami от 22 августа 2020, 08:28Библиотеку нужно загружать один раз, лучше в самом начале при запуске.
Я так и решил эту проблему.

bk

Цитата: Kadet от 22 августа 2020, 08:23А почему тогда в первом случае, который гораздо раньше и другие макросы ещё не оттянули время, чтобы библиотека загрузилась, ошибки нет?

может я не до конца понял Ваш код, но мне кажется, что в первом случае у Вас библиотека загружается в условии If. А второй случай у Вас начинается за пределами этого условия.

Kadet

bk, это так и есть. В первом случает пароль ставится при инсталяции программы, т.е. - сразу после копирования библиотеки из вну в глобал. А во втором случае - должно работать при любых раскладах - хоть только что скопировалась библиотека, хоть уже существует. А он не работает.
If здесь нужен для того, чтобы понять - копировать библиотеку или она уже существует. И за пределами If она должна уже существовать по-любому. Для этого во втором случае и ставится проверка на "есть ли пароль", чтобы не пароллировать дважды.