• 🚨 29 мая стартует курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    После старта курса запись открыта еще 10 дней Подробнее о курсе ...

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

Notesuiview.documents Порядок

  • Автор темы Автор темы lmike
  • Дата начала Дата начала

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
8 002
610
как часто вы оказываетесь в ситуации, когда вот ..
и вам нужен порядок как во вьюшке а не по порядку добавления доков в БД (вышеозначенная ф-ция выдаст именно в нем)
небольшой ПОК( )
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"LS"</div></div><div class="sp-body"><div class="sp-content">
Код:
%REM
*--------------------------------------------
Function EnumDCbyView
Description: расставляет документы по порядку следования во вью
у доков находим $REF и по нему группируем
%END REM
Function Enum4ParentByView(NDC As NotesDocumentCollection, view As NotesView) As NotesDocumentCollection
Dim routineName As String
routineName="EnumDCbyView"
On Error GoTo ErrH
'your code here
Dim res As NotesDocumentCollection:Set res=db.CreateDocumentCollection()
Dim lstByParent List As Variant, lstNavParent List As NotesViewNavigator
Dim punid As String, doc As NotesDocument
Set doc=NDC.Getfirstdocument():punid=doc.Parentdocumentunid
Do While Not doc Is Nothing
Dim tmp As String:tmp=doc.Parentdocumentunid
Dim tmpdoc As NotesDocument, cnt As Long
Print {unid:} &doc.Universalid &{;parent:} &tmp
If Len(tmp)<1 Then tmp=doc.Universalid
Dim entry As NotesViewEntry
If Not IsElement(lstByParent(tmp)) Then
Set tmpdoc=db.Getdocumentbyunid(tmp)
Dim nav As NotesViewNavigator
Set nav=view.Createviewnav()
Set entry=nav.GetEntry(tmpdoc)
Print {Pos:} &entry.Getposition({.})
'Set tmpdoc=view.Getdocumentbykey(tmpdoc.Getitemvalue(keyfld), true)
Set lstNavParent(tmp)=view.Createviewnavfromdescendants(entry)
cnt=lstNavParent(tmp).Count
'создаем разреженый массив
Dim arr() As NotesDocument:ReDim arr(cnt) As NotesDocument
Set arr(0)=entry.Document
lstByParent(tmp)=arr
End If
If Not tmp=doc.Universalid then
Set entry=lstNavParent(tmp).GetEntry(doc)
Print {Pos:} &entry.Getposition({.})
Dim pos As Integer:pos=CInt(StrRight(entry.Getposition({.}),{.}))
Dim v:v=lstByParent(tmp)
Set v(pos)=doc
End If
Set doc=NDC.Getnextdocument(doc)
Loop
ForAll chlds In lstByParent
ForAll chld In chlds
If Not chld Is Nothing Then Call res.Adddocument(chld)
End ForAll
End ForAll
Set Enum4ParentByView=res
Quit:
Exit Function
ErrH:
Error Err, RaiseError
Resume Quit
End Function
суть сего экзерциза - получить "правильный" порядок следования и с родителем (рассматривается вариант родителя и чайлдов), т.е. - как видим
 
у меня есть нек. подозрения, что поиск в навигаторе осущ. перебором, но вот детали надо
отседова возможен вариант с явным хэшированием по unid
 
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"1 код"</div></div><div class="sp-body"><div class="sp-content">
Код:
	Set doc=NDC.Getfirstdocument():punid=doc.Parentdocumentunid
Do While Not doc Is Nothing
Dim tmp As String:tmp=doc.Parentdocumentunid
Dim tmpdoc As NotesDocument, cnt As Long
Print {unid:} &doc.Universalid &{;parent:} &tmp
If Len(tmp)<1 Then tmp=doc.Universalid
Dim entry As NotesViewEntry
If Not IsElement(lstByParent(tmp)) Then
Set tmpdoc=db.Getdocumentbyunid(tmp)
Dim nav As NotesViewNavigator
Set nav=view.Createviewnav()
Set entry=nav.GetEntry(tmpdoc)
Print {Pos:} &entry.Getposition({.})
'Set tmpdoc=view.Getdocumentbykey(tmpdoc.Getitemvalue(keyfld), true)
'			Set lstNavParent(tmp)=view.Createviewnavfromdescendants(entry)
'			cnt=lstNavParent(tmp).Count
'создаем разреженый массив
'			Dim arr() As NotesDocument:ReDim arr(cnt) As NotesDocument
'			Set arr(0)=entry.Document
'			lstByParent(tmp)=arr
End If
'		If Not tmp=doc.Universalid then
'			Set entry=lstNavParent(tmp).GetEntry(doc)
'			Print {Pos:} &entry.Getposition({.})
'			Dim pos As Integer:pos=CInt(StrRight(entry.Getposition({.}),{.}))
'			Dim v:v=lstByParent(tmp)
'			Set v(pos)=doc
'		End If
Set doc=NDC.Getnextdocument(doc)
Loop
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"2 код"</div></div><div class="sp-body"><div class="sp-content">
Код:
	Set doc=NDC.Getfirstdocument():punid=doc.Parentdocumentunid
Do While Not doc Is Nothing
Dim tmp As String:tmp=doc.Parentdocumentunid
Dim tmpdoc As NotesDocument, cnt As Long
Print {unid:} &doc.Universalid &{;parent:} &tmp
If Len(tmp)<1 Then tmp=doc.Universalid
Dim entry As NotesViewEntry
If Not IsElement(lstByParent(tmp)) Then
Set tmpdoc=db.Getdocumentbyunid(tmp)
Dim nav As NotesViewNavigator
Set nav=view.Createviewnav()
'			Set entry=nav.GetEntry(tmpdoc)
'			Print {Pos:} &entry.Getposition({.})
'Set tmpdoc=view.Getdocumentbykey(tmpdoc.Getitemvalue(keyfld), true)
'			Set lstNavParent(tmp)=view.Createviewnavfromdescendants(entry)
'			cnt=lstNavParent(tmp).Count
'создаем разреженый массив
'			Dim arr() As NotesDocument:ReDim arr(cnt) As NotesDocument
'			Set arr(0)=entry.Document
'			lstByParent(tmp)=arr
End If
'		If Not tmp=doc.Universalid then
'			Set entry=lstNavParent(tmp).GetEntry(doc)
'			Print {Pos:} &entry.Getposition({.})
'			Dim pos As Integer:pos=CInt(StrRight(entry.Getposition({.}),{.}))
'			Dim v:v=lstByParent(tmp)
'			Set v(pos)=doc
'		End If
Set doc=NDC.Getnextdocument(doc)
Loop
ниже результат kdiff
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"1 сниф"</div></div><div class="sp-body"><div class="sp-content">OPEN_NOTE
OPEN_NOTE
READ_OBJECT
READ_OBJECT
GET_NOTE_INFO_BY_UNID
OPEN_NOTE
DB_REPLINFO_GET
OPEN_NOTE
GET_NOTE_INFO_BY_UNID
OPEN_NOTE
OPEN_NOTE
GET_NOTE_INFO_BY_UNID
OPEN_NOTE
LOCATE_NOTE
READ_ENTRIES
OPEN_NOTE

GET_OBJECT_SIZE
WRITE_OBJECT
WRITE_OBJECT
UPDATE_COLLECTION
GET_MODIFIED_NOTES
READ_ENTRIE<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"2 сниф"</div></div><div class="sp-body"><div class="sp-content">OPEN_NOTE
OPEN_NOTE
READ_OBJECT
READ_OBJECT
GET_NOTE_INFO_BY_UNID
OPEN_NOTE
OPEN_NOTE
DB_REPLINFO_GET
OPEN_NOTE
GET_NOTE_INFO_BY_UNID
OPEN_NOTE
OPEN_NOTE
GET_NOTE_INFO_BY_UNID
GET_OBJECT_SIZE
WRITE_OBJECT
WRITE_OBJECT
UPDATE_COLLECTION
GET_MODIFIED_NOTES
READ_ENTRIES
объяснить лишнюю OPEN NOTE я не могу
 
т.о. из снифа можно заключить, что перебор осущ. серверной частью - что +
т.е. мы избавляемся от цикла перебора для поиска соответствия дока коллекции навигатора
 
Akupaka
Так с умным человеком не грех =)
 
Мы в соцсетях:

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

Курс AD