• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Ls2j не находит метод

  • Автор темы SkinGreek
  • Дата начала
S

SkinGreek

Всем привет, уже второй день воюю с лотусом. Силы на исходе...
Сначала общая модель зависимостей
- расшариная Java библиотека в которой определен набор необходимых Java классов
- расшариная LS библиотека, выполняющая роль адаптора API Java классов и удобного для вызова из формы
- собственно форма с обработчиком события нажатия на кнопку и вызовом адаптора
Соотвественно инклуды идут снизу вверх
В общем проблема в следующем на Java написан ряд классов для парсинга email строки в различных форматах InternetAddress ("Full Name" <email@test.ru>), X.400, etc. У них есть общий базовый абстрактный класс ContactParse.
Код:
public abstract class ContactParser {
static public ContactParser getInstance(String type) {
if ("email".equals(type)) {
return new EmailAddressParser();
}
return null;
}

public abstract Contact[] parse(String contact) throws AddressException;

static public Contact[] parse(String contact, String type) throws AddressException	{
ContactParser parser = ContactParser.getInstance(type);
return parser.parse(contact);
}
}
Сначало я собирался из LS вызывать getInstance и дальше парсить с помощью инстанции конкретного класса, но он пишет что объект не является классом ContactParser, хотя конкретный класс является наследником от ContactParser. Ну да ладно на это я забил, решил создавать конкретную инстанцию тоже в Java поэтому написал второй метод static public Contact[] parse(String contact, String type), но теперь он вообще не видит ни одного моего метода(выводит только методы класса Object). Причем объективных причин для этого нет.
Под "не видит" я имею ввиду то, что метод не появляется в списке при выполнении следующего кода
Код:
Set jParserClass = jSess.GetClass("parsers.ContactParser")
Dim myMCollection As JavaMethodCollection
Set myMCollection = jParserClass.getClassMethods()
Print "--------------------------------------------------------------------"
Forall m In myMCollection
Print m.MethodName
End Forall
Вчера так же были странности с подключением библиотек. Как я понимаю лотус гдето чтото кеширует, но каким образом не ясно, в общем удаляю для теста из Options в LS библиотеки
Код:
Use "my_java_classes"
Uselsx "*javacon"
и редактирую
Код:
Print "---"
он работает! и выводит измененный Print хотя до этого используются такие типы как JavaClass то есть по идее он должен был заругаться на стадии компиляции(что чаще всего и бывает), а вот вчера такого не происходило. К утру след дня у него это прошло, но появились новые задвиги
Например неведомым образом появилась и исчезла ошибка "Type mismatch on external name: CONTACTPARSER" при следующем коде:
при коде
Код:
Dim parser As ContactParser
...
Set parser = New ContactParser("email")
С чем это связанно до сих пор не понятно...

Скажите плз как с этой "слепостью" и подключенными "фантомами" бороться?
Заранее спасибо за помощь
 
S

SkinGreek

после глупых манипуляций.(удалением, переименованием библиотек и классов и прочими танцами с бубном, метод он всеж находит). но работать он всеж не хочет...
Код:
jSess As JavaSession
jParserClass As JavaClass
jParseMethod As JavaMethod
jContacts As Variant

Set jParserClass = jSess.GetClass("parsers.ContactParser")
Set jParseMethod = jParserClass.GetMethod("parse","(Ljava/lang/String;Ljava/lang/String;)[Lparsers/Contact;")		

Set jContacts = jParseMethod.Invoke(, "test@test.ru", "email")
на последней строке выдает ошибку Type mismatch
Datatype возвращает 8739 то есть динамический массив элемент которого имеет тип - "Product object"
Typename возвращает "Javaobject()"
пробовал определить переменную jContacts и как "jContacts() As Javaobject" и как "jContacts List As Javaobject"
Не ясно зачем введена типизация, если она так коряво работает

Помогите плз, у меня уже фантазия кончается:)((
 
K

Kee_Keekkenen

посмотри хелп, например, по ключу LS2J extended example
обрати внимание на порядок создания объектов
 
S

SkinGreek

нет дело не в том как я не правельно работаю с LS2J.я прочитал доки, понял всю логику работы с ним, но такие задвиги как кеширование на каком то не понятном уровне мне совершенно не ясно.приведу еще пример.перемиенвал в Java класс ContactParser,смо собой все изменил в зависимых Java слассах.импортирую библиотеку подключаю - но вызывающий код
Код:
Set jParserClass = jSess.GetClass("parsers.ContactParser")
оставлю прежним.он работает как было, хотя такого класса уже нет. Причем если я как уже писал изменить внутри скрипта какой нить print, то он применит изменения(только LS скрипта старый Java класс он все так же будет находить)
после неясных манипуляцый таких как:
- нажал на кнопочку Sign
- на библотеке Java потом подписал всю БД под серверным ID
- закрыл все и нотес и админ и дизайнер.
- переоткрыл
изменения применились. как это понимать???:'((
Где происходит кеширование? как сбросить закешированный use? или более того как сбросить закешированные настройки в секции лотусскрипта "Options"?
 
K

Kee_Keekkenen

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

SkinGreek

то есть при каждом изменении в библиотеке, если я хочу увидеть изменения мне надо все по закрывать? очень интересная логика...я встречал что надо сново откомпелировать и/или продеплоить, но чтобы переоткрывать клиента(Notes), который открывает в свою очередь БД чтобы обновить базу это уже не ясно...Еслибы он обновлял/загружал библиотеки хотябы при открытии БД(через меню File->DB->Open) это еще можно было понять...
Признаюсь честно маны читаю не запоем, а как справочником пользуюсь, некоторых особенностей общей работы домино таким образом не знаю.про LS2J почитал, о логике его работы выяснил все - или может быть почти все, по данной трабле такого самом-собой не нашел, потому что это не в той тематике трабла. Но мне кажеться это не повод резюмировать мое незнание такой манипуляции как - "только лохи читаю маны":)
Но всеж большое спасибо за помощь, и последняя просьба... не могли бы вы сказать как вы разрабатываете и отлаживаете код в LS библиотеке? неужели через удаленный раб стол перезапускаете Notes?
 
K

Kee_Keekkenen

клиент необязательно перезапускать.. но нередко бывают проблемы с библиотеками, поэтому приходится переоткрывать базу, если код библиотек используется в событиях в Other--Database resources--Database script, то 100% измененный там код будет работать только после переоткрытия бд..
а причем тут удаленный рабочий стол ? стоит сделать копию с боевой бд на сервер или локально, где и отлаживать код на реальных данных..
про отладку все как обычно..
в каждой процедуре/функции включается обработчик ошибок, например в библиотеке
Код:
Sub Initialize
dim procID as string
try:
On Error Goto catch
procID = "супер-либа"
msgbox ReplaceSubstring("sdasdjaij", "j","W", procID )
Exit sub
catch:
call errh(Getthreadinfo(1), procID, False)
Exit sub
end sub

Function ReplaceSubstring(source As String, subString As String, newString As String, procID As String) As String	
try:
On Error Goto catch
ReplaceSubstring = Implode(Split(source, subString ), newString ) 
Exit Function
catch:
Call errh(Getthreadinfo(1), procID, False)
ReplaceSubstring = source 
Exit Function
End Function

Sub ErrH(thread As String, procID As String, condition As Boolean)	
%REM
Вывод сообщения об ошибке		
%END REM
Dim msg As String
msg = "Ошибка " + Cstr(Err) + ": " + Error + ", в строке " + Cstr(Erl) + " в процессе " + thread + " (" + procID	+ ")"
If condition Then
Msgbox msg, 16, "Lotus Notes error"		
Else
Print msg 		
End If	
End Sub
после создания новой функциональности можно создать шаблон, с которого можно обновлять/заменять дизайн в боевой бд.. корректно обновлять дизайн можно только после того как в шаблоне было указано название шаблона и один раз дизайн был заменен с наследованием изменений с данного шаблона, в дальнейшем изменения можно обновлять
 
S

SkinGreek

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!