Вхождение юзера в группу, разворачивание групп

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
Вот так проверяю:
Visual Basic:
ismemb = False

Forall dr In vDoc.AuthorizedReaders        'получить из дока допустимые группы
    Set docUserGroup = viewreg.GetDocumentByKey(dr, True)        'найти группу с юзерами
    If Not (docUserGroup Is Nothing) Then
        Forall memb In docUserGroup.Members        'в этой группе ищем юзера
            If user = memb Then
                ismemb = True
            Else                                           
                'ismemb = False
            End If
        End Forall
    End If
End Forall
Результатом должен стать флажок ismemb. Я его далее использую.
Полагаю, что вышеописанный код далеко не оптимален. Пока в группе юзеров не много - работает быстро.

Может есть более красивое решение узнать входит юзер в группу или нет?
или перефразирую
Быстро узнать имеет юзер доступ к доку или нет? (это задается в vDoc.AuthorizedReaders группой)
 
Последнее редактирование модератором:
H

hosm

по приведенному коду. Поле - массив, т.е. проверять arraygetindex(docUserGroup.Members, memb) не лучше?
или еще может подойдет Exit Forall
If user = memb Then
ismemb = True
Exit Forall
Может есть более красивое решение узнать входит юзер в группу или нет?
вроде еще что-то на формулах было, я сейчас не вспомню... хотя - может, только для текущего юзера, тогда это может не подойти.
 
N

nvyush

Visual Basic:
Function HasDocAccess(doc as NotesDocument, AccessItemName as String) As Boolean
    'doc - документ, AccessItemName - имя поля с именами пользователей, групп, ролей, которым разрешён доступ к документу
    Dim v as Variant
    v = Evaluate(AccessItemName + { *= @UserNamesList}, doc)
    HasDocAccess = v(0)
End Function

P.S. Только для текущего пользователя. И почему у функций @UserNamesList, @UserRoles нет аргумента UserName?...
 
Последнее редактирование модератором:

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
NetWood
Visual Basic:
if instr(implode(docUserGroup.Members), user)>0 then ismemb = True
для большей уверенности луче всё еще снабдить lcase чтобы точно сошлось и косые поотсекать

ну а если совсем по правильному то лучше свою процедуру написать но никак не циклами это дело гонять
 
Последнее редактирование модератором:
D

Darker

Visual Basic:
ismemb = instr(implode(docUserGroup.Members), user) > 0
еще короче))
 
Последнее редактирование модератором:
A

Akupaka

ужасно!

Visual Basic:
if instr(implode(docUserGroup.Members), user)>0 then ismemb = True
Ужасно! ))))) Да еще и после такого поста это писать!
Поле - массив, т.е. проверять arraygetindex(docUserGroup.Members, memb) не лучше?
Немного допишу:
Visual Basic:
If Not(IsNull(ArrayGetIndex(docUserGroup.Members, user, 5))) Then
    ismemb = True
End If
Либо так:
Visual Basic:
ismemb = Not(IsNull(ArrayGetIndex(docUserGroup.Members, user, 5)))

Добавлено:
ну а если совсем по правильному то лучше свою процедуру написать но никак не циклами это дело гонять
Чего же? Поиск в массиве классически решается циклом.
 
Последнее редактирование модератором:
H

hosm

Немного допишу:
прав. я с параметром накосячила... поздно было, тупила) но идея-то правильная.
Еще была собака для раскрытия групп @ExpandNameList, но она странноватая и недокументированная и для этой задачи лишняя...
 
O

Omh

для текущего, кстати, есть и скриптовый notesSession.UserGroupNameList, т.е. можно не делать эвалюэйтов
Я уж возрадовался, думал то, что мне надо!
Неа.
Этот UserGroupNameList возвращает какую-то порнографию: array of notesname/
Причём про группы там ничего нету.
 
H

hosm

точно, она имена со * возвращает
извините.
 
A

Akupaka

Этот UserGroupNameList возвращает какую-то порнографию...
Причём про группы там ничего нету.
)))))))
Вообще, замечательная функция ))) айбиэм радует )))

NotesSession.UserGroupNameList
Read-only. The groups to which the current user belongs.

Data type
Array of NotesName objects

Syntax
To get: notesNameArray = notesSession.UserGroupNameList

Usage
The "groups" include the hierarchical parents of the user ID. For Mary Smith/Department One/Acme, for example, the groups include */Department One/Acme and */Acme.
The groups include those to which the user belongs in the Domino Directory or Personal Address Book where the program is running.

Господа, я полагаю в ваших организациях используется сложная иерархическая структура нотес-имен? ;)
А в группы вы входите? ;)

Вот для меня она возвращает такие имена: */Организация/UA; */UA; Developers
Хотя инетереснее то, что я вхожу не только в эту группу )))
 
Последнее редактирование модератором:
A

amigolinx

вроде еще что-то на формулах было
в свое время юзал где-то спертую формульную конструкцию:
Код:
SelectedPerson:=@PickList([NAME]:[SINGLE]);
@If(
SelectedPerson != "";
@Do(
ServerName := "server/merver";
UserName1 := @Name([Canonicalize];SelectedPerson);
val := @DbLookup( "" : "NoCache"; ServerName : "names.nsf"; "($ServerAccess)"; UserName1;2);
@If(
@IsError(val);
"";
@Sort(@Explode(val;";"))
)
);
""
);
@Prompt([OkCancelList]; ""; ""; ""; val)
 
A

Akupaka

в свое время юзал где-то спертую формульную конструкцию
Хорошая, только отдает только прямые группы, т.е. где пользователь явно указан.
Поэтому, для полного списка, надо разворачивать группы ручками.
Либо смотреть апишки, если такие есть.
 
O

Omh

Камрады, выложите пожалуйста этот класс "NotesGroupManager"
Песочницу уже оказывается закопали, а на опеннтф не нашёл.
Заранее преблагодарен.
 

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
Действительно: The Lotus Sandbox was closed to all new submissions in 2007. Downloads of previous submissions were still available as an archived resource following that closure, but effective September 2010, downloads from the Lotus Sandbox are no longer available.

Чем она им помешала? закапывают лотус собственными руками :( - яркий пример победы маркетинга над здравым смыслом.

------------
upd: 2012-10-19
This is the code sample for the article, " ."
1. Ссылка на саму базу с классом на бережно сохраненном Сандбоксе.


2. Вот базулина с этим классом. Резервная ссылка
Ну мало тут 1 метра для загрузки. Не загрузить :(
----------

Class NotesGroupManager
Properties
Methods
New
LoadPublicAddressBooks
LoadPrivateAddressBooks
LoadAddressBook
GetGroup
CreateGroup
RenameGroup
AddToGroup
RemoveFromGroup
SortGroup
SortAll
SaveAll
LoadAllGroups
LoadGroup
FTSearch
RemoveGroup
Uncache
ClearCache
Class NotesGroup
Properties
Methods
setModified
Consolidate
Save
AddMembers
RemoveMembers
SortMembers
Remove
 
O

Omh

Что-то я туплю.
Перечитал хелп и не могу понять, как вернуть список групп для произвольного пользователя.

Сделал
Код:
Dim gman As New NotesGroupManager(True)
Call gman.LoadPublicAddressBooks
Call gman.LoadAllGroups

Теперь думал пробежаться по gman.ObjGroupsList и проверить мемберов, но эта пропертя приватная.

Хелп, не соображаю с утра.
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
46
Что-то я туплю.
Перечитал хелп и не могу понять, как вернуть список групп для произвольного пользователя.
Теперь думал пробежаться по gman.ObjGroupsList и проверить мемберов, но эта пропертя приватная.
Хелп, не соображаю с утра.

Visual Basic:
Public Function GetUserGroup(db As NotesDatabase, UserNameText As Variant, mask As Variant)
    Static cnt As Integer   
    Dim k As Integer
    Dim doc As NotesDocument
    Dim coll As NotesDocumentCollection
    Dim UserGroup As Variant
    Dim GroupCount As Integer
    Dim Vtmp As NotesView
    Dim UserName As New NotesName(UserNameText)
    Redim UserGroup(0)
    UserGroup(0) = UserName.Canonical
    
    If cnt = 0 Then
        Static dbnames() As NotesDatabase
        Static vname() As NotesView
        Redim Preserve dbnames(cnt)
        Redim Preserve vname(cnt)
        
        Forall dbn In db.Parent.AddressBooks
            If dbn.IsPublicAddressBook Then
                If Not dbn.IsOpen Then Call dbn.Open("", "")
                If dbn.IsOpen Then
                    Set Vtmp=dbn.GetView("($ServerAccess)")
                    If Not Vtmp Is Nothing Then
                        Redim Preserve dbnames(cnt)
                        Redim Preserve vname(cnt)
                        Set dbnames(cnt) = db.Parent.GetDatabase(dbn.Server, dbn.FilePath)
                        Set vname(cnt) = dbnames(cnt).GetView("($ServerAccess)")
                        cnt = cnt + 1
                    End If
                End If
            End If
        End Forall
    End If
    
    Do
        For k = 0 To Ubound(vname)
            Set coll = vname(k).GetAlldocumentsByKey(Lcase(UserGroup(GroupCount)), True)
            Set doc = coll.GetFirstDocument
            Do While Not doc Is Nothing
                If Isnull(Arraygetindex(UserGroup, doc.ListName(0), 5)) Then
                    UserGroup = Arrayappend(UserGroup, doc.GetItemValue("ListName"))
                End If
                Set doc = coll.GetNextDocument(doc)
            Loop
        Next
        GroupCount = GroupCount+1
    Loop While GroupCount <= Ubound(UserGroup)
    
    UserGroup(0) = ""
    If Len(mask) <> 0 Then
        For k = 1 To Ubound(UserGroup)
            If Not UserGroup(k) Like mask Then UserGroup(k) = ""
        Next
    End If
    
    UserGroup = Fulltrim(UserGroup)
    If Len(UserGroup(0)) = 0 Then
        GetUserGroup = ""
    Else
        GetUserGroup = UserGroup
    End If
End Function
 
Последнее редактирование модератором:
O

Omh

rinsk
Спасибо, но функция не воркает с нестед группами, верно?

Я пошёл джедайским путём, просто сделал ObjGroupsList публичным.
 
Мы в соцсетях:

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