Проблемы при блокировке документов

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

fedotxxl

Привет,
стала логироваться странная ошибка: внутри web service'а пытаемся вызвать метод документа .lock. Возвращает ошибку 4000 "You cannot update or delete the document(s) since you are not listed as an allowable Author for this document". Пользователь имеет манагерские права к базе.
В чем проблема?
 
H

hosm

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

fedotxxl

OKEN
Пользователь, сервер... сервер ведь тоже пользователь

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

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Проверьте, возможно на сервере блокируете с помощью NS.UserName.
 
F

fedotxxl

VladSh
Не понял о чем речь? блокируется внутри кода WS => от имени подписавшего. При блокировании указываю выдуманного пользователя ("ABC_User_1234").
 
N

nvyush

Lock method
IsDocumentLockingEnabled in NotesDatabase must be True or this method raises an error.
Оно?

При блокировании указываю выдуманного пользователя ("ABC_User_1234")
Прочитайте внимательно справку про данный метод. Кмк, там нужно указывать NotesSession.EffectiveUserName. У пользователя "ABC_User_1234" скорее всего действительно нет прав на редактирование документа.
 
F

fedotxxl

Прочитайте внимательно справку про данный метод. Кмк, там нужно указывать NotesSession.EffectiveUserName. У пользователя "ABC_User_1234" скорее всего действительно нет прав на редактирование документа.
Все-таки я не нашел явного указания, что пользователь должен иметь авторский доступ к документу.
Each lock holder must be a user or group. Defaults to one lock holder: the effective user.
Я так понимаю, что если не указать локхолдера, то по-умолчанию будет effective user
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Все-таки я не нашел явного указания, что пользователь должен иметь авторский доступ к документу.
Ну это само собой разумеется исходя, из принципов доступа на изменение.
И nvy правильно сказал про NotesSession.EffectiveUserName, я именно это и имел ввиду.

Я так понимаю, что если не указать локхолдера, то по-умолчанию будет effective user
Да, но интерес-то ведь в том, чтобы кроме текущего забивать ещё какого-нибудь :)
И вообще, с параметром настраиваемо.
 
F

fedotxxl

Вот прикол... проблема повторилась, а решения все еще нет...
 
F

fedotxxl

Если у кого возникнет такая проблема - пользователь должен иметь авторский доступ к документу, если база распределена на несколько серверов. Советую вам, так же, посмотреть функцию CodeLock
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Если у кого возникнет такая проблема - пользователь должен иметь авторский доступ к документу, если база распределена на несколько серверов.
Само собой разумеется, т.к. об этом в сообщении об ошибке говорится:
You cannot update or delete the document(s) since you are not listed as an allowable Author for this document
в чём открытие?
 
F

fedotxxl

Открытие в том, что должен иметь доступ пользователь, которым блокируется документ. А не тот, от имени которого исполняется код
+ данная проблема возникает только при наличии реплик
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Открытие в том, что должен иметь доступ пользователь, которым блокируется документ. А не тот, от имени которого исполняется код
Ну да. Я ещё даю доступ серверу, чтобы он мог изменять доки.

+ данная проблема возникает только при наличии реплик
Предполагаю, что это не от наличия реплик, а от использования общего ACL (стоит галка "Enforcing a consistent access control").
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Для интереса решил подписать дизайн сервером и при всех условиях, на которых работало железно (блокировка EffectiveUserName, нет галки "Enforcing a consistent access control"), получил на сервере Err=4000:
Notes error: You cannot update or delete the document(s) since you are not listed as an allowable Author for this document
она же:
Вы не можете обновлять и удалять документы, так как не входите в список авторов

Сильно удивился, т.к. до сих пор были известны такие причины её возникновения:
1. Нет прав на изменение (NotesDocument.Save) документа (пользователя нет в полях типа Authors).

2. При попытке блокировки сервером:
• сервер реально не имеет права на обработку документа (см. п.1); случается крайне редко.
• при попытке блокировать с помощью NS.UserName.
• при использовании в БД общего ACL (стоит галка "Enforcing a consistent access control").
Код:
Class Locker
'...

'кем будем пытаться заблокировать
Private m_arrLockers() As String

'...

%REM
Sub setLockers
Description: установка списка блокировщиков
%END REM
Private Sub setLockers()
Dim ns As New NotesSession
ReDim Me.m_arrLockers(1)
Me.m_arrLockers(0) = ns.EffectiveUserName
Me.m_arrLockers(1) = Join(Evaluate(|@Unique|))    '"ID" текущего процесса
End Sub

%REM
Function lockDoc
Description: штатная блокировка
%END REM
Private Function lockDoc() As Boolean
If Not Me.IsLocked() Then
Call Me.m_ndSource.Lock(Me.m_arrLockers)
Me.lockDoc = Me.IsLocked()
End If
End Function

'...
End Class
Сервер, естественно, Manager.
Уже и добавлял его куда только можно на закладке Security документа сервера - бесполезно.

После разбирательств добавилась ещё одна причина в п.2:
• при соблюдении всех вышеуказанных условий ошибка вылетает на документах, в которых вообще нет READERS/AUTHORS-item'ов, при попытке записи дополнительного значения в списке блокировщиков, не находящегося в АК сервера, и когда EffectiveUserName (кем подписан дизайн) = UserName (запустивший агент, т.е. сервер).
<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">
Код:
Private Sub setLockers()
Dim ns As New NotesSession

If ns.IsOnServer Then
If ns.EffectiveUserName = ns.UserName Then
'Ненормальная ситуация: кем_подписан_дизайн = сервер_запустивший_агент
ReDim Me.m_arrLockers(0)
Me.m_arrLockers(0) = ns.EffectiveUserName
Exit Sub
End If
End If

ReDim Me.m_arrLockers(1)
Me.m_arrLockers(0) = ns.EffectiveUserName
Me.m_arrLockers(1) = Join(Evaluate(|@Unique|))    '"ID" текущего процесса
End Sub
Т.е. при подписании дизайна сервером, невозможно указать и, соответственно, определить текущим ли процессом заблокирован документ или нет.
Получили ещё один минус и ограничение по использованию такого решения.
 
Мы в соцсетях:

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