Acl

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

  1. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    Всем привет!

    задача:
    есть полев поле которое может принимать следующие значения или все сразу:
    CanCreateDocuments|1
    CanCreateLSOrJavaAgent|2
    CanCreatePersonalAgent|3
    CanCreatePersonalFolder|4
    CanCreateSharedFolder|5
    CanDeleteDocuments|6
    CanReplicateOrCopyDocuments|7
    IsAdminReaderAuthor|8
    IsAdminServer|9
    IsGroup|10
    IsPerson|11
    IsPublicReader|12
    IsPublicWriter|13
    IsServer|14
    теперь нужно смотреть какие значения в поле и програмно ето перетянуть в ацл бд.
    Код (LotusScript):
    Set upentry = acl.GetEntry(docid)
    levelString = newres.GetItemValue("aclLevel")(0)' newres.aclLevel(0)
    upentry.Level = GetLevelConstant( levelString )
    CanCreateDocumentsString = ???
    CanCreateLSOrJavaAgenString = ???
    CanCreatePersonalAgentString = ???
    CanCreatePersonalFolderString = ???
    CanCreateSharedFolderString = ???
    CanDeleteDocumentsString = ???
    CanReplicateOrCopyDocumentsString = ???
    Call acl.Save
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    проблемы с этим? flag = notesItem.Contains( value )
    eg.: notesACLEntry.CanReplicateOrCopyDocuments = notesItem.Contains("7") ' если поле мультивалью и хранит только алиасы

    Добавлено: или v=doc.GetItemValue("FieldName") и потом обработка массива.
     
  3. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    OKEN
    проблема какраз с масивом....
    не пойму как......
     
  4. nnikishi

    nnikishi Гость

    ForAll v in doc.FieldName

    Select Case v
    Case is = "1": Entry.CanCreateDocuments = True
    'etc

    End Select

    End ForAll

    Call acl.save


    можно еще проверять, отличается ли значение свойства aclentry от назначаемого, чтобы acl.save не дергать без надобности
     
  5. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    вместо
    Case is = "1"
    просто
    Case "1"

    Добавлено: есть еще Entry.CanCreateDocuments = not isNull(ArrayGetIndex(doc.FieldName, "1"))
    но так не советую делать...
     
  6. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    А пошто?
    Я бы именно так и делал бы ;)

    Cleric-Lviv
    И не забудь ACL.Save в конце (на всяк случай напомню)
     
  7. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    Omh , OKEN , nnikishi

    ДСписибо вам огромное, я чтото тормознул и в масиве начал делать через IF
     
  8. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    мб, я просто параноик:) Мне показалось, что сравнение и переход по меткам case быстрее, чем поиск в массиве значений...
     
  9. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    сначала всё зареплейсить потом форалом всё проставить не нужны ифы и кейсы ;)
     
  10. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    а почему бы не зареплейсить как писала OKEN с самого начала?
    или
    тут и "форал" (с) не нужен ))
     
  11. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    У меня вот тоже вопросик, связан с программным редактированием ACL. У меня есть форма, на ней кнопка. На этой форме в полях OrgRole и OrgPersonGroup мы указываем, какую роль и какой Entry проставить в списке баз, который тоже указан на форме в поле OrgAccess. Кнопка вызывает агент, который редактирует ACL.
    Вот код агента

    Sub Initialize
    Print "Проставление доступа к приложениям"
    Dim session As New NotesSession
    Dim dbPoint As NotesDatabase
    Dim aclPoint As NotesACL
    Dim docOrg As NotesDocument
    ' Документ, из которого вызван агент
    Set docOrg = session.CurrentDatabase.GetDocumentByID(session.CurrentAgent.ParameterDocID)
    If docOrg Is Nothing Then Exit Sub

    Dim vOrgAccess As Variant

    vOrgAccess = Evaluate({OrgAccess}, docOrg)
    ' Перебор баз, в которых надо менять ACL
    ForAll x In vOrgAccess

    ' Получаем текущую базу, ее ACL передаем в процедуру для его изменений. Туда же передаем и указанную на форме роль, и Entry

    ChangeACL dbPoint.ACL, docOrg.Getitemvalue("OrgRole")(0), docOrg.Getitemvalue("OrgPersonGroup")(0)
    NextDB:
    End ForAll

    Print "Конец - Проставление доступа к приложениям"
    End Sub

    Sub ChangeACL(aclPoint As NotesACL, sRole As String, sGroup As String)
    Print "Изменение ACL"
    Dim entryPoint As NotesACLEntry
    Dim bRoleExists As Boolean
    bRoleExists=False
    ' Добавляем роль
    ForAll role In aclPoint.Roles
    If ( role = "[" & sRole & "]" ) Then Print "Роль существует" : bRoleExists=True: Exit ForAll

    End ForAll
    If Not bRoleExists Then Print "Создаем роль" : aclPoint.AddRole( sRole )

    ' Добавляем Entry
    Set entryPoint = aclPoint.GetEntry( sGroup)
    ' If Not ( entryPoint Is Nothing ) Then aclPoint.RemoveACLEntry(sGroup)

    If entryPoint Is Nothing Then
    Print "Вхождения нет. Создаем"
    Set entryPoint = aclPoint.Createaclentry(sGroup, ACLLEVEL_READER )
    Else
    Print "Вхождение есть"
    End IF
    entryPoint.Enablerole(sRole)

    entryPoint.UserType = ACLTYPE_MIXED_GROUP

    Print "ACL изменен"
    aclPoint.Save

    End Sub

    На кнопке, вызывающей агента, делаю запуск либо
    agAccess.Run docCur.NoteID
    либо
    agAccess.RunOnServer docCur.NoteID

    Если запускаю на стороне клиента, то в ACL баз создается Entry и роль, все нормально. А вот во втором случае в ACL не добавлялось ни то, ни другое. Хоть при повторном вызове агента мои принты писали в Лог, что они есть. Но увидеть Entry почему-то было нельзя. С чем это может быть связано?
    И еще один вопрос. У меня версия 8.5.3. В коде агента пишу строчку

    If Not ( entryPoint Is Nothing ) Then aclPoint.RemoveACLEntry(sGroup)

    Строка помечается красным, и выводится ошибка "Not a sub or function name: REMOVEACLENTRY". Но в Хелпе-то она есть...
    Спасибо тем, кто поделится опытом )
     
  12. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    офф-топ вопрос: когда же вы начнете оборачивать код тегами и прятать в спойлер? Форматирование же будет, читать удобнее.
    Не первый раз уже просто)

    По проблемам:
    Плохо читали:
    Удаляйте через: Call notesACLEntry .Remove

    База что ли сервером не открывается?
    Тут только часть кода, нет ни получения базы, ни её открытия.
    Проверте права сервера в базе, если база на другом сервере, убедитесь, что ваш сервер доверенный к тому.
     
  13. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Да, извиняюсь.
    Пытаюсь выбирать главное. Базы лежат на одном сервере и в одной папке. Среди них есть база-свич. В ней представление. В нем документы, хранящие алиас баз и путь к ним. Путь к самому свичу прописан в переменных окружения.

    Базы открываю так

    Код (Text):
            Dim eval As Variant
    vOrgAccess = Evaluate({OrgAccess}, docOrg)

    ForAll x In vOrgAccess
    ' Получаю базы через свич. OrgAccess хранит только алиасы баз, адреса к ним хранит база-свич


    eval = Evaluate({v := @DbLookup ("":""; @Environment("Switch" + "S":"F");"viewAlias";"} & x & {";"Address"); @If(@IsError(v); ""; v);})
    Set dbPoint= session.GetDatabase(eval(0), eval(1), False)
    If dbPoint Is Nothing Then Exit Function
    If Not dbPoint.IsOpen Then Exit Function


    ChangeACL dbPoint.ACL, docOrg.Getitemvalue("OrgRole")(0), docOrg.Getitemvalue("OrgPersonGroup")(0)
    NextDB:    
    End ForAll
     
  14. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Реплик нет?
    Admin server тот же?
    Галочка на репликацию ACL на всех серверах?
    Что пишется в истории изменения ACL?
     
  15. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    а как проверяете? может, просто кеширует ACL
     
  16. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Реплик нет. Админ сервер указан тот, на котором базы лежат. Когда выполняю агент на стороне сервера, в log в ACL ничего не пишется. Кеш чищу, но все равно Entry и роль не отображаются
     
  17. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    ???
    If dbPoint.IsOpen Then Exit Function

    Добавлено: тут опечатка или неведомая логика?
     
  18. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Можно и Goto NextDB. Отсутствие этой строки не помогло
     
  19. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Код (LotusScript):
    If dbPoint.IsOpen Then Exit Function
    Перевожу намек OKEN: Если базу открыли - выходим из функции.
    Надо:
    Код (LotusScript):
    If Not dbPoint.IsOpen Then Exit Function
     
  20. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Да, у меня так
    If Not db.IsOpen Then Exit Function
    Опечатка , пишу ручками
     
Загрузка...
Похожие Темы - Acl
  1. cLif
    Ответов:
    0
    Просмотров:
    88
  2. NickProstoNick
    Ответов:
    14
    Просмотров:
    659
  3. Cleric-Lviv
    Ответов:
    5
    Просмотров:
    578
  4. anna
    Ответов:
    17
    Просмотров:
    1.687
  5. CBOSS
    Ответов:
    0
    Просмотров:
    1.059

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