• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Acl и Lotusscript

  • Автор темы LIGHT
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

LIGHT

Помогите выловить багу, досталась по наследству.
В общем суть такова, есть документ который может редактировать только юзер с ролью [Admin]
Заколбашена функция проверки, которую я уже тупо упростил до безобразия. Т.е. просто проверяю выведит ли ф-ия список ролей юзера

Код:
Function isAdmin
............
Dim acl As NotesACL
Dim aclentry As NotesACLEntry
Set db = ns.CurrentDatabase

Set acl = db.acl
Set aclentry = acl.GetEntry(ns.UserName)

Forall r In aclentryRoles
Messagebox(r)
End Forall 

End Function

Я сейчас вырезал все лишнее, хочу что бы функция только выдавала Message ролей у юзера.
Но происходит Object Variable not Set
Где копать уже ума не приложу.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Копай здесь:
<!--QuoteBegin-LIGHT+26:06:2007, 12:08 -->
<span class="vbquote">(LIGHT @ 26:06:2007, 12:08 )</span><!--QuoteEBegin-->Forall r In aclentryRoles
[snapback]70601" rel="nofollow" target="_blank[/snapback]​
[/quote]
 
L

LIGHT

Да, тут и копаю, только уже почти закопался :)
 
H

Hedg

aclentryRoles - точка пропущена Forall r In aclentry.Roles
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-LIGHT+26:06:2007, 12:17 -->
<span class="vbquote">(LIGHT @ 26:06:2007, 12:17 )</span><!--QuoteEBegin-->Да, тут и копаю, только уже почти закопался
[snapback]70604" rel="nofollow" target="_blank[/snapback]​
[/quote]
Точку поставить забыл в "aclentryRoles". Найдешь где? :)

<!--QuoteBegin-LIGHT+26:06:2007, 12:08 -->
<span class="vbquote">(LIGHT @ 26:06:2007, 12:08 )</span><!--QuoteEBegin-->В общем суть такова, есть документ который может редактировать только юзер с ролью [Admin]
[snapback]70601" rel="nofollow" target="_blank[/snapback]​
[/quote]
Сделай по-нормальному через поле типа Authors.

А так можно еще через Evaluate сделать:
Код:
Dim result As Variant

result = Evaluate({@IsMember("[Admin]"; @UserRoles)})
if result(0) = 1 Then 'Админ
 
L

LIGHT

А точку я тут забыл поставить, в бивал код кучками. В оригинале она есть.
Другие методы не подходят по ряду причин. Интересует именно почему не работает в такой конструкцие, причем в хелпе есть аналогичный пример.
 

Murtas

Green Team
11.04.2006
137
1
BIT
4
..в каком месте останавливается хотя бы - так гадать трудно ... может у тебя например ns не инициализированно
 
H

Hedg

У меня получилось так

Код:
	Dim acl As NotesACL
Dim aclentry As NotesACLEntry
Dim session As New NotesSession
Set db=session.CurrentDatabase
Set acl = db.acl
Set aclentry = acl.GetEntry(session.UserName)

Forall r In aclentry.Roles
Messagebox(r)
End Forall
 
L

LIGHT

<!--QuoteBegin-Medevic+26:06:2007, 12:26 -->
<span class="vbquote">(Medevic @ 26:06:2007, 12:26 )</span><!--QuoteEBegin-->Dim result As Variant

result = Evaluate({@IsMember("[Admin]"; @UserRoles)})
if result(0) = 1 Then 'Админ
[snapback]70606" rel="nofollow" target="_blank[/snapback]​
[/quote]

Взял этот пример, работает. Еще не изучил как повлияет на логику остального кода...
Почему не рабоал мой пример фиг знает.
Все переменные инициализированы.... в общем какая-то бяка, дебагер затыкался тут<!--QuoteBegin-LIGHT+26:06:2007, 12:08 -->
<span class="vbquote">(LIGHT @ 26:06:2007, 12:08 )</span><!--QuoteEBegin-->Forall r In aclentry.Roles
[snapback]70601" rel="nofollow" target="_blank[/snapback]​
[/quote]
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Для: LIGHT
<!--QuoteBegin-LIGHT+26:06:2007, 12:08 -->
<span class="vbquote">(LIGHT @ 26:06:2007, 12:08 )</span><!--QuoteEBegin-->Set aclentry = acl.GetEntry(ns.UserName)
[snapback]70601" rel="nofollow" target="_blank[/snapback]​
[/quote]

Пользователь ns.UserName в ACL точно есть?
 
L

LIGHT

<!--QuoteBegin-Medevic+26:06:2007, 14:33 -->
<span class="vbquote">(Medevic @ 26:06:2007, 14:33 )</span><!--QuoteEBegin-->Пользователь ns.UserName в ACL точно есть?
[snapback]70633" rel="nofollow" target="_blank[/snapback]​
[/quote]
Конечно есть
 
D

Domino6

проверь
как написано

aclentry.Roles

или

aсlentry.Roles


Смотри в сторону русской "с"
 
P

pashacrush

У меня получилось так

Код:
	Dim acl As NotesACL
Dim aclentry As NotesACLEntry
Dim session As New NotesSession
Set db=session.CurrentDatabase
Set acl = db.acl
Set aclentry = acl.GetEntry(session.UserName)

Forall r In aclentry.Roles
Messagebox(r)
End Forall

Если пользователя нет явно в ALC(например он будет просто в какой-то группе), то код выдас ошибку
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Вот я себе такое писал. Функция проверяет права пользователя на документ. В моем случае нужна проверка минимум на чтение.
Функция берет роли пользователя, всех пользователей из необходимых Names-полей документа, далее берет всех пользователей из возможных груп и проверяет вхождение ролей пользователя или самого пользователя в полученном списке
входной параметр UName - в каноническом виде
на выходе True - есть доступ и False - соответственно нет.
Код:
Function CheckUserRoles( Doc As NotesDocument, UName As Variant ) As Boolean
Dim Session As New NotesSession	
Dim DB As NotesDatabase	
Dim RolesArray As Variant
Dim MembersArray As Variant
Dim res
Dim i As Integer


Redim RolesArray(0) As Variant

Set DB = Session.CurrentDatabase

MembersArray = {
authors := AuthorsID:AddAuthorsID:DefAuthorsID:ReadersID:AddReadersID;
authors := @ExpandNameList(@Subset(@DbName; 1);authors);
@Unique(@Trim(authors)); }

MembersArray = Evaluate( MembersArray, Doc )

RolesArray = DB.QueryAccessRoles( Uname )

MembersArray = Arrayreplace( MembersArray, RolesArray, "^" )
res = Arraygetindex( MembersArray, "^" )

If Not Isnull( res ) Then
CheckUserRoles = True				
Exit Function
End If

MembersArray = Arrayreplace( MembersArray, UName, "^" )	
res = Arraygetindex( MembersArray, "^" )

If Not Isnull( res ) Then
CheckUserRoles = True				
Exit Function
End If

For i = 0 To Ubound( MembersArray )

If Instr( MembersArray(i), "<тут я пишу начало названия группы. у меня оно одинаковое для всех групп>" ) = 0 Then
MembersArray(i) = ""
End If	

Next

MembersArray = Fulltrim( MembersArray )

For i = 0 To Ubound( MembersArray )

RolesArray = Arrayappend( RolesArray, Split( GetGroupMembers( "", "", MembersArray(i), ";", False ), ";" ) )
Next


MembersArray = Arrayreplace( RolesArray, UName, "^" )	
res = Arraygetindex( MembersArray, "^" )

If Not Isnull( res ) Then
CheckUserRoles = True				
End If

End Function

GetGroupMembers - функция возвращает список пользователей всех групп, включая вложенности.
ее уже пиши сам или выкидывай если не надо
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
без понятия. да и разбираться не хочется. я поделился тем что у меня работает
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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