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

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

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

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

Блокировака документов

  • Автор темы FEDAZzZ
  • Дата начала
F

FEDAZzZ

Привет.

Возникла следующая проблемка.....
Есть база в ней поднят флаг Allow document Locking, указан блокирующий сервер...

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

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

Kizarek86

Green Team
20.07.2007
871
7
BIT
37
если из базы выйти некорректно, то документы не разблочиваются.
с этим можно смириться)
 
K

kilcher

если из базы выйти некорректно, то документы не разблочиваются.
с этим можно смириться)


На одном из форумов читала,что можно принудительно удалять эти поля. Агентом например. Сама пока не пробовала. Но думаю скоро тоже придется заняться этим вопросом
 
F

FEDAZzZ

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


Причину вроде как понял.... Если документ, содержащий аттачмент, открыть на редактирование, а затем начать редактировать аттачмент, то даже после закрытия аттачмента и сохранения документа, поля Writtetrs не будут удалены....

А можно подвесить на QueryClose FILED Writers := @DeleteField?

.... но у меня все рано поля не удаляються ...
 
F

FEDAZzZ

Сохранить документ потом нужно.


Да, я это поробовал...

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

Попробую дальше сам пошаманить.... Скорее всего буду вводить какой-нибдуь флаг на удаление...
 
F

FEDAZzZ

Лучше блокировку в топку отправить. :D


А тогда в ручную писать блокировку документов?

Если надо когда один пользователь редактирует документ то другие только его только читают...

Интреттраст такую проверку вроде в ручную делает, пишет свои билиотеки, значит не зря.....
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Я имею в виду вообще отказаться от блокировки. Решить задачу другими способами. Например, через версионность.
 
E

Extraterrestrial

Блокировку можно делать программно: notesDocument.Lock( [ name ] [, provisionalOK ] ) и достаточно, чтобы была включена только опция "Allow design locking" (как оказывается, эта опция имеет отношение не только к болкировкам элементов дизайна). Можно Lock попробовать использовать при переходе документа в режим редактирования на Querymodechange или при открытии документа в режиме редактирования, а разлочивать, ну, возможно, на Terminate... Если закрыть Lotus Notes некорректно или просто питание вырубить, то блокировка висеть останется всё равно. Тут такое дело, обычно можно указывать Timeout при блокировке, но не в Лотусе... В Лотусе нужно видимо просто писать агент, который разлочивает все документы, которые давно заблокированны. Только вот есть ли возможность определить время, когда был заблокирован документ? Если есть, то ОК. В случаях, когда просто пользователь завис в документе надолго, и документ был разблокирован, то при сохранении такого документа блокировать его заново. Наверное так.
 
F

FEDAZzZ

Спасибо всем за советы :)

Кстати глюк насчет блокировки исчезает если не использовать в приложение свойство SaveOptions.... Тогда документы блокируються и разблокируються корректно.
 
T

turumbay

Принудительно снимать блокировку при закрытии формы в UI:

Sub Queryclose(Source As Notesuidocument, Continue As Variant)
On Error Resume Next
Call source.Document.UnLock
End Sub
 
E

Extraterrestrial

Спасибо всем за советы :rolleyes:

Кстати глюк насчет блокировки исчезает если не использовать в приложение свойство SaveOptions.... Тогда документы блокируються и разблокируються корректно.

Кстати, а если включена опция "Allow document locking", то при программном редактировании документа он автоматически блокируется без использования метода Lock? Или, например, кто-то редактирует документ через UI (документ при этом заблокирован) и одновременно агент в него что-то пишет, агент это сможет сделать? Если нет, то видимо завершит свою работу с ошибкой?
 
K

K-Fire

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

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

turumbay

Кстати, а если включена опция "Allow document locking", то при программном редактировании документа он автоматически блокируется без использования метода Lock?
При программном изменении документа (в backend-е) документ не блокируется. Можно принудительно его залочить вызовом doc.lock.
Или, например, кто-то редактирует документ через UI (документ при этом заблокирован) и одновременно агент в него что-то пишет, агент это сможет сделать? Если нет, то видимо завершит свою работу с ошибкой?
Если документ залочен (например открыт на редактирование в UI), то при сохранении документа в backend-е генерится ошибка. Исключение - если агент запущен от имени локера.
Проверка на залоченность перед сохранением возможна - например, через проверку doc.lockholders.
Если контекст задачи по-любому требует сохранения документа, блокировку можно снять( конечно если хватает прав ) через doc.unlock.
 
30.05.2006
1 345
12
BIT
0
По базе топчется десяток агентов (каждый по своим событиям, по своему расписанию), периодически сталкиваясь лбами.
Как тут может помочь doc.Lock, учитывая что разработчик у всех агентов общий? :rolleyes:
 
T

turumbay

По базе топчется десяток агентов (каждый по своим событиям, по своему расписанию), периодически сталкиваясь лбами.
Как тут может помочь doc.Lock, учитывая что разработчик у всех агентов общий? :rolleyes:
Есть мнение, что в этом случае в консерватории надо менять.
А навскидку - блокировку можно использовать примерно так: после получения агентом объекта документа немедленно его лочить. До сохранения. И соответственно разлачивать после сохранения. Ессно при блокировке проверять что документ свободен.
Если все агенты соблюдают этот протокол - проблема "столкновения лбами" переносится на уровень логики приложения.
З.Ы. Я не фанат блокировок. Просто эта возможность существует и ей можно пользоваться. Заявления о кривизне механизма считаю необоснованными. Не кривее всего остального :).
 
E

Extraterrestrial

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

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

Дело в том, что просто timeout нету. Проще написать агент, который будет разблокировать все такие документы, если они долго висят заблокированными.

По базе топчется десяток агентов (каждый по своим событиям, по своему расписанию), периодически сталкиваясь лбами.
Как тут может помочь doc.Lock, учитывая что разработчик у всех агентов общий? :rolleyes:

Ну, а нельзя ли использовать как аргумент у Lock не имя пользователя, а Имя агента + Имя пользователя?
Еще проблема есть, как определить, сколько времени прошло после того, как документ был заблокирован... Есть какой-нибудь timestamp, который Lock ставит?

А навскидку - блокировку можно использовать примерно так: после получения агентом объекта документа немедленно его лочить. До сохранения. И соответственно разлачивать после сохранения. Ессно при блокировке проверять что документ свободен.

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

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

Теперь понятно, вот поля (айтемы) полезные: $Writers и $WritersDate. Последнее нам дает время и дату блокировки.
 
T

turumbay

Как я понимаю, если агенты исполняются с правами одного и того же пользователя, то это работать не будет. Поэтому видимо, если Lock позволяет, то нужно использовать уникальный аргумент, вместо имени пользователя. Кто-нибудь проверял, так работает Lock нормально?
В данном случае все равно, кем заблокирован документ. Важен сам факт того, что он заблокирован.
Перед блокировкой документа агент проверяет lockholders на пустоту, после чего блокирует док. После сохранения - doc.UnLock.
' агент получает документ
set doc = getDocument
if doc.LockHolders(0) <> "" then
' отработка ситуации, согласно логике приложения
Call processConflict( doc )
else
' блокируем
call doc.Lock
' разлочить надо по-любому....
on error goto errhandle
' что-то делаем с документом
Call doSomething( doc )
' сохраняем
Call doc.Save( false , false )
' отпускаем
Call doc.UnLock
end if
exit function
errhandle:
Call doc.UnLock
exit Function
 
E

Extraterrestrial

В данном случае все равно, кем заблокирован документ. Важен сам факт того, что он заблокирован.
Перед блокировкой документа агент проверяет lockholders на пустоту, после чего блокирует док. После сохранения - doc.UnLock.
' агент получает документ
set doc = getDocument
if doc.LockHolders(0) <> "" then
' отработка ситуации, согласно логике приложения
Call processConflict( doc )
else
' блокируем
call doc.Lock
' разлочить надо по-любому....
on error goto errhandle
' что-то делаем с документом
Call doSomething( doc )
' сохраняем
Call doc.Save( false , false )
' отпускаем
Call doc.UnLock
end if
exit function
errhandle:
Call doc.UnLock
exit Function


Дело в том, что не случайно существуют системные блокировки, а не самодельные... Знаете в чем Ваша ошибка? Между проверкой, что какое-то поле непустое, и последующим действием проходит какое-то время. Вот как раз в этот промежуток времени это поле может быть заполнено другим агентом.
 
Мы в соцсетях:

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