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

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

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

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

Изменялся Ли Документ

KingGLEB

Active member
08.05.2008
30
0
BIT
0
Как определить перед записью документа изменялся ли он на сервере? Т.е. клиент открыл документ на редактирование и ушел, а в этот момент серверный агент его изменил. Как отказать в записи документа, когда юзер вернулся и жмет сохранить документ?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Взять документ и сравнить с данными, которые есть в in-memory документе
 
D

Dragon108

Как определить перед записью документа изменялся ли он на сервере? Т.е. клиент открыл документ на редактирование и ушел, а в этот момент серверный агент его изменил. Как отказать в записи документа, когда юзер вернулся и жмет сохранить документ?


При сохранении брать текущий открытый док и бэкэндный по UNID и сравнить, не помогает?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
у Xpages основной документ - это in-memory. Т.е. это тот датасорс, который ты указываешь на странице.
Код:
document1
От этого датасорса берется докуметн, который на сервере.
Код:
document1.getDocument()
Т.е. document1 и document1.getDocument() могут отличаться.

Значит тебе можно сравнить
JavaScript:
if(document1.getItemValueString(item) != document1.getDocument().getItemValueString(item)){
...
}
 

KingGLEB

Active member
08.05.2008
30
0
BIT
0
А другого способа нет, не прогоняя все items?
getItemValueString не сравнит поля типа Data & Number. И как быть если поле в документ добавилось сервером? Т.е. придется прогонять все итемы и от документа у клиента и от документа на сервере, т.е. делать 2 цикла.
Хотя можно пойти другим путем, при открытии на редактирование запомнить @Modify, а при записи сравнить с @Modify на серваке. Если сошлись, то сохранять.

Во, точно.
В postOpenDocument пишем
Код:
viewScope["DateChange"] = currentDocument.getDocument().getLastModified()

В querySaveDocument
Код:
if (docMain.getDocument().getLastModified()!=viewScope["DateChange"]) {
print("Документ был изменен на сервере.")
return false;
}

Конечно, стоит предусмотреть в названии переменной во viewScope UNID документа (если работаешь с несколькими датасоурсами), но это уже детали.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
не самое удачное решение.
Нужно копировать ключевые данные в память, а перед сохранением проверять.
Проверка по getLastModified ничего не решит.
 

KingGLEB

Active member
08.05.2008
30
0
BIT
0
getLastModified изменяется. Проверил только что. Открыл xpages. В нем кнопка которая принтует на сервер currentDocument.getDocument().getLastModified()
Зашел тулзой (внешней) в этот же документ и пересохранил его. Нажал опять кнопку в xpages и отпринтовалось другое время.
Написать, то я написал, только не могу сохранить никуда getLastModified при открытии документа. Пока не понял почему.
 
D

Dragon108

getLastModified изменяется. Проверил только что. Открыл xpages. В нем кнопка которая принтует на сервер currentDocument.getDocument().getLastModified()
Зашел тулзой (внешней) в этот же документ и пересохранил его. Нажал опять кнопку в xpages и отпринтовалось другое время.
Написать, то я написал, только не могу сохранить никуда getLastModified при открытии документа. Пока не понял почему.

А когда и куда пишете?

Data source мог еще не проинициализироваться - , но при записи в непроинициализрованный док вывалилась бы ошибка.

Если в бэкэндный док (document1.getDocument() или currentDocument().getDocument()), то не будет записываться, так как нужно сохранить док


Да и вообще, действительно, чем viewScope не устраивает?
 

KingGLEB

Active member
08.05.2008
30
0
BIT
0
Что то не захотел у меня viewScope в postOpenDocument сохранять NotesDateTime. Вернее сохранять сохранял, но значения его потом я так и не увидел.

Сделал так

postOpenDocument
Код:
viewScope.put("DateChange", currentDocument.getLastModified().toString())

querySaveDocument
Код:
if (currentDocument.getDocument().getLastModified().toString()!=viewScope["DateChange"]) {
print("Документ был изменен на сервере или другим пользователем.")
return false;
}
Вот так заработало как надо.

PS: вот почему как только напишешь на форум, так сразу и решение приходит?! :) А не пишешь, так в голову ничего не лезет. ;)
 
Мы в соцсетях:

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