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

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

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

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

Сериализация в Lotus

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
в общем-то хорошая.. но что-то не хочет:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import java.io.Serializable;

class Test implements Serializable {
private static final long serialVersionUID = 8006446806510246677L;
public int i;
}

...
public void test(Document nd) {
try {
final String IN_CUSTOMDATA = "CustomData";

Test t = new Test();
t.i = 235;

String className = t.getClass().getName();

nd.replaceItemValueCustomData(IN_CUSTOMDATA, className, t); // здесь выбивает java.io.NotSerializableException
System.out.println("записано");

if (nd.hasItem(IN_CUSTOMDATA)) {
System.out.println("перед чтением");

Test tt = (Test) nd.getItemValueCustomData(IN_CUSTOMDATA, className);
System.out.println("результат: " + tt.i);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
...[/CODE]
Не пойму, почему кажет ошибку.. может подразумевается, что надо самому реализовывать writeObject и readObject?
Коллеги, у кого-то получилось побороть?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
Класс Test был внутренний, наверное он его не находил, потому и писал ошибку.
Добавил его с помощью New Java Class, т.е. на том же уровне, что и сновной класс агента, теперь данные записывает, но выдеёт такую ошибку:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">NotesException: Supplied Data type name does not match stored CustomData type</div></div><div class="sp-body"><div class="sp-content">at lotus.domino.local.Document.NgetItemValueCustomData(Native Method)
at lotus.domino.local.Document.getItemValueCustomData(Unknown Source)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
Если читать без указания имени типа:
<!--shcode--><pre><code class='java'>Test tt = (Test) nd.getItemValueCustomData(IN_CUSTOMDATA);[/CODE]
то выдаёт:
java.lang.ClassCastException: java.lang.String incompatible with Test
При чтении с помощью класса Item то же самое. Но в item'е точно что-то есть, т.к. item.hashCode() возвращает не 0.

Попробовал записывать с помощью:
<!--shcode--><pre><code class='java'>ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(t);
nd.replaceItemValueCustomDataBytes(IN_CUSTOMDATA, className, baos.toByteArray());
oos.flush();
oos.close();
baos.close();[/CODE]тогда при чтении вылетает <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">java.lang.ClassNotFoundException: Test</div></div><div class="sp-body"><div class="sp-content">
at java.lang.Class.forName(Class.java:172)
at java.io_ObjectInputStream.resolveClass(ObjectInputStream.java:618)
at java.io_ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1592)
at java.io_ObjectInputStream.readClassDesc(ObjectInputStream.java:1513)
at java.io_ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1749)
at java.io_ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io_ObjectInputStream.readObject(ObjectInputStream.java:365)
at lotus.domino.local.Item.getValueCustomData(Unknown Source)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
Спецы, пожалуйста допомогайте, а то идеи закончились! :(
 
Z

Zeka

Засунь Test в JAR и положи его в ext/lib.
И будет тебе счастье :(
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
Zeka
Я так понял, что метод resolveClass, на котором всё валится, вызывается у класслоадера, который ни сном ни духом про мои библиотеки в лотусе?
Осталось разобраться как "засунуть Test в JAR" и как потом обновлять эти jar'ы на клиентах пользователей...
 
Z

Zeka

"засунуть Test в JAR" - я Test.java в обычном Eclipse написал. Там же в два клика экспорт в JAR и сделал.
Не пробывал, но, вроде, и в Domino Designer, если открыть Java perspective, получится точно так же экспортировать класс в JAR.

"как потом обновлять эти jar'ы на клиентах пользователей..." - ручками, ручками... :( А если серьёзно, то кто-то на форуме агента для этого писал.

Хотя, может ещё кто-то подскажет, что там с класслоадером не так и как его "починить"?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
Ага, спасибо! В Eclipse без проблем экспортировал, в Lotus Designer для этого надо чтобы библа была открыта, тогда в навигаторе отображается её пакеджи.
Что интересно, - Eclipse сгенерировал class-файл 371kb, а Lotus Designer - 240, файл MANIFEST.MF у обоих одинаковый, оба jar'а работают..

Хотя, может ещё кто-то подскажет, что там с класслоадером не так и как его "починить"?
Было бы неплохо :)

"как потом обновлять эти jar'ы на клиентах пользователей..." - ручками, ручками...
Тут вопрос в том, как пользователь узнает, что надо обновлять? Или при использовании в самом начале анализировать md5 jar'а? Так это долго..
Как это обычно делается?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
про обновление - достаточно корректный манифест класть в jar, собсно кот. и будет сообщать о версии либы
класслоадеры - дальше древних экспериментов (вне домины) у мя не пошло...
будет время - можно поиграться (но перспективы не радужные, по времени)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
Наверное общеизвестно, но нарыл)):

XStream (при десериализации нужно вручную создать объект класса, в который будут сетиться данные):

всё просто, потому одна ссылка.

JAXB (работает по DTD-схемам):




Сам пока не пробовал, но интересно мнение вкушавших)
 
Мы в соцсетях:

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