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

Тема в разделе "Lotus - Программирование", создана пользователем fedotxxl, 16 авг 2010.

  1. fedotxxl

    fedotxxl Well-Known Member

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    сорри, если туплю - рассмотрены и исключены проблемы с правами у пользователя или сервера?
    В заглавии темы - вопрос про доступ сервера, а описываете права пользователя...
    а для сервиса не влияет максимальный доступ для веб? мб, там автора случайно поставили?
     
  3. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    OKEN
    Пользователь, сервер... сервер ведь тоже пользователь

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

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Проверьте, возможно на сервере блокируете с помощью NS.UserName.
     
  5. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    VladSh
    Не понял о чем речь? блокируется внутри кода WS => от имени подписавшего. При блокировании указываю выдуманного пользователя ("ABC_User_1234").
     
  6. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Lock method
    IsDocumentLockingEnabled in NotesDatabase must be True or this method raises an error.
    Оно?

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

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Все-таки я не нашел явного указания, что пользователь должен иметь авторский доступ к документу.
    Я так понимаю, что если не указать локхолдера, то по-умолчанию будет effective user
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Ну это само собой разумеется исходя, из принципов доступа на изменение.
    И nvy правильно сказал про NotesSession.EffectiveUserName, я именно это и имел ввиду.

    Да, но интерес-то ведь в том, чтобы кроме текущего забивать ещё какого-нибудь :)
    И вообще, с параметром настраиваемо.
     
  9. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Вот прикол... проблема повторилась, а решения все еще нет...
     
  10. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Если у кого возникнет такая проблема - пользователь должен иметь авторский доступ к документу, если база распределена на несколько серверов. Советую вам, так же, посмотреть функцию CodeLock
     
  11. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Само собой разумеется, т.к. об этом в сообщении об ошибке говорится:
    в чём открытие?
     
  12. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Открытие в том, что должен иметь доступ пользователь, которым блокируется документ. А не тот, от имени которого исполняется код
    + данная проблема возникает только при наличии реплик
     
  13. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Ну да. Я ещё даю доступ серверу, чтобы он мог изменять доки.

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

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Для интереса решил подписать дизайн сервером и при всех условиях, на которых работало железно (блокировка EffectiveUserName, нет галки "Enforcing a consistent access control"), получил на сервере Err=4000:<!--QuoteBegin-Notes error+-->
    <table border="0" cellpadding="0" cellspacing="0" align="center" width="98%"> [tr] <td class="vbquote"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="75" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="50px"> [tr] <td class="vbquote" width="28" valign="top">[​IMG]</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quote-bg.gif'); background-position: center;" valign="middle"><span class="vbquote">Цитата:</span></td> <td class="vbquote" valign="top">[​IMG]</td> [/tr] </table> </td> <td class="vbquote" align="left" style="background-image: url('style_images/ckr/quotes/quot-lr-bg.gif')" valign="bottom"></td><td class="vbquote" width="0" align="left" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="200"> [tr] <td class="vbquote" valign="top">[​IMG]</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quot-bye-bg.gif')" align="left" valign="middle" nowrap="nowrap"><span class="vbquote">(Notes error)</span></td> <td class="vbquote" valign="top">[​IMG]</td> [/tr] </table> </td><td class="vbquote" width="100%" align="right" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="100%"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" style="background-image: url('style_images/ckr/quotes/quot-top-bg.gif')" width="100%" valign="middle"></td> <td class="vbquote" align="left" valign="top">[​IMG]</td> [/tr] </table> </td> [/tr] </table> </td> [/tr] </table> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-left.gif')"></td> <td class="vbquotemain" width="100%" valign="top"></td> <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-right.gif')"></td> [/tr] [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quot-left-bg.gif')"></td> <td class="vbquotemain" width="100%" valign="top"><!--QuoteEBegin-->You cannot update or delete the document(s) since you are not listed as an allowable Author for this document
    она же:
    Вы не можете обновлять и удалять документы, так как не входите в список авторов<!--QuoteEnd--></td> [/tr] [tr] [/tr] </table> </td> [/tr] </table>
    <!--QuoteEEnd-->Сильно удивился, т.к. до сих пор были известны такие причины её возникновения:<!--QuoteBegin-личная БЗ+-->
    <table border="0" cellpadding="0" cellspacing="0" align="center" width="98%"> [tr] <td class="vbquote"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="75" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="50px"> [tr] <td class="vbquote" width="28" valign="top">[​IMG]</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quote-bg.gif'); background-position: center;" valign="middle"><span class="vbquote">Цитата:</span></td> <td class="vbquote" valign="top">[​IMG]</td> [/tr] </table> </td> <td class="vbquote" align="left" style="background-image: url('style_images/ckr/quotes/quot-lr-bg.gif')" valign="bottom"></td><td class="vbquote" width="0" align="left" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="200"> [tr] <td class="vbquote" valign="top">[​IMG]</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quot-bye-bg.gif')" align="left" valign="middle" nowrap="nowrap"><span class="vbquote">(личная БЗ)</span></td> <td class="vbquote" valign="top">[​IMG]</td> [/tr] </table> </td><td class="vbquote" width="100%" align="right" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="100%"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" style="background-image: url('style_images/ckr/quotes/quot-top-bg.gif')" width="100%" valign="middle"></td> <td class="vbquote" align="left" valign="top">[​IMG]</td> [/tr] </table> </td> [/tr] </table> </td> [/tr] </table> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-left.gif')"></td> <td class="vbquotemain" width="100%" valign="top"></td> <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-right.gif')"></td> [/tr] [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quot-left-bg.gif')"></td> <td class="vbquotemain" width="100%" valign="top"><!--QuoteEBegin-->1. Нет прав на изменение (NotesDocument.Save) документа (пользователя нет в полях типа Authors).

    2. При попытке блокировки сервером:
    • сервер реально не имеет права на обработку документа (см. п.1); случается крайне редко.
    • при попытке блокировать с помощью NS.UserName.
    • при использовании в БД общего ACL (стоит галка "Enforcing a consistent access control").<!--QuoteEnd--></td> [/tr] [tr] [/tr] </table> </td> [/tr] </table>
    <!--QuoteEEnd--><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">
    Код (LotusScript):
    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:
    <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">
    Код (LotusScript):
    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
    Т.е. при подписании дизайна сервером, невозможно указать и, соответственно, определить текущим ли процессом заблокирован документ или нет.
    Получили ещё один минус и ограничение по использованию такого решения.
     
Загрузка...

Поделиться этой страницей