Acl

Cleric-Lviv

Lotus team
03.01.2008
600
0
#1
Всем привет!

задача:
есть полев поле которое может принимать следующие значения или все сразу:
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
теперь нужно смотреть какие значения в поле и програмно ето перетянуть в ацл бд.
Код:
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
 

hosm

* so what *
18.05.2009
2 442
6
#2
проблемы с этим? flag = notesItem.Contains( value )
eg.: notesACLEntry.CanReplicateOrCopyDocuments = notesItem.Contains("7") ' если поле мультивалью и хранит только алиасы

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

nnikishi

#4
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 не дергать без надобности
 

hosm

* so what *
18.05.2009
2 442
6
#5
вместо
Case is = "1"
просто
Case "1"

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

Cleric-Lviv

Lotus team
03.01.2008
600
0
#7
Omh , OKEN , nnikishi

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

hosm

* so what *
18.05.2009
2 442
6
#8
мб, я просто параноик:) Мне показалось, что сравнение и переход по меткам case быстрее, чем поиск в массиве значений...
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#9
сначала всё зареплейсить потом форалом всё проставить не нужны ифы и кейсы ;)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#10
а почему бы не зареплейсить как писала OKEN с самого начала?
notesACLEntry.CanReplicateOrCopyDocuments = notesItem.Contains("7") ' если поле мультивалью и хранит только алиасы
или
Entry.CanCreateDocuments = not isNull(ArrayGetIndex(doc.FieldName, "1"))
тут и "форал" (с) не нужен ))
 
A

Anonimous

#11
У меня вот тоже вопросик, связан с программным редактированием 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". Но в Хелпе-то она есть...
Спасибо тем, кто поделится опытом )
 

savl

Lotus team
28.10.2011
2 136
105
#12
офф-топ вопрос: когда же вы начнете оборачивать код тегами и прятать в спойлер? Форматирование же будет, читать удобнее.
Не первый раз уже просто)

По проблемам:
Но в Хелпе-то она есть...
Плохо читали:
RemoveACLEntry
Note: This method is supported in COM only.
Удаляйте через: Call notesACLEntry .Remove

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

Anonimous

#13
Да, извиняюсь.
Пытаюсь выбирать главное. Базы лежат на одном сервере и в одной папке. Среди них есть база-свич. В ней представление. В нем документы, хранящие алиас баз и путь к ним. Путь к самому свичу прописан в переменных окружения.

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

Код:
		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
 

savl

Lotus team
28.10.2011
2 136
105
#14
Реплик нет?
Admin server тот же?
Галочка на репликацию ACL на всех серверах?
Что пишется в истории изменения ACL?
 
A

Anonimous

#16
Реплик нет. Админ сервер указан тот, на котором базы лежат. Когда выполняю агент на стороне сервера, в log в ACL ничего не пишется. Кеш чищу, но все равно Entry и роль не отображаются
 

hosm

* so what *
18.05.2009
2 442
6
#17
???
If dbPoint.IsOpen Then Exit Function

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

savl

Lotus team
28.10.2011
2 136
105
#19
Код:
If dbPoint.IsOpen Then Exit Function
Перевожу намек OKEN: Если базу открыли - выходим из функции.
Надо:
Код:
If Not dbPoint.IsOpen Then Exit Function
 
A

Anonimous

#20
Да, у меня так
If Not db.IsOpen Then Exit Function
Опечатка , пишу ручками