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

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

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

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

Размножение RT-поля при добавлении значения

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

oshmianski

Доброго времени суток.

Есть класс, где объявляется документ и RT поле (body) в нем. Есть метод этого класса (AddLogEvent), который добавляет строку в это поле и сохраняет документ. При этом сам класс продолжает "жить". Метод AddLogEvent может вызываться очень много раз (~1000). Так вот проблема в том, что как только я добавляю текст в RT поле и сохраняю документ, в нем (документе) создается новая копия RT поля body c новым, только что добавленным значением. Т.е. в документе при просмотре его свойств у меня столько RT полей Body, сколько раз я сохранял документ.

Вопрос: можно \ нужно ли этого избежать и если можно, то каким образом?
 
K

K-Fire

а какой код создания объекта NotesRichTextItem ?
 
O

oshmianski

Для: K-Fire
вся библа

Код:
Option Public
Option Declare
'Use "libStringTools"
'****************************************************Описание****************
******************************************************
' 03.02.2006 Винцелович Сергей
' 07.02.2007 добавлено: указывается база, где должно производиться логгирование
' 13.02.2007 изменено: Body = RichText + возможность использовать стиль для этого поля
' Класс журнала.
' Для нормальной работы библиотеки нужно:
'	1. Вид "Log~LogDateBegin~Num". Без него все документы журнала будут иметь номер -1 (функция GetNumDocLog).
'	Первая колонка = @Date(LogDateBegin), категория, сортировка убывающая; вторая = Num, сортировка убывающая
'	View selection = SELECT Form="Log"
'	2. Форма "Log".
'	3. Картинка "SectionDiv.gif" для формы "Log", если будешь использовать форму из этой бд.
'	4. Поле на форме "Log", куда пишется история должно называться "Body", текстовое. Размер этого поля ограничивается 32К 
'	(функция isBodySize32K). AllowMultipleValues = true, Display separate values with = New Line
'	5. В поле "LogDateBegin" пишется дата начала сессии создания журнала
'	6. В поле "LogDateEnd" пишется дата окончания сессии создания журнала
'	7. В поле "Num" пишется номер документа журнала в "сегодняшнем дне"
'	8. В поле "Type" тип документа лога
'****************************************************************************
**********************************************************
Const BEGIN_LOG = "Создание сессии записи в журнал"
Const END_LOG = "Закрытие сессии записи в журнал"
Const HYPHEN = "  "
Class EventsLog
log_session As NotesSession
log_db As NotesDatabase
log_doc As NotesDocument
log_DocNum As Double	'с этого номера буду начинать
log_countDocsInSession As Double	'количество доков в данной сессии
log_type As String	'тип отчета
log_body As NotesRichTextItem
log_rtStyle As NotesRichTextStyle
' конструктор
Sub New(db As NotesDatabase)
Set log_session = New NotesSession
Set log_db = db
log_DocNum = -1
log_countDocsInSession = 0
End Sub
' создаю сессию
Sub OpenSession
Set log_doc = log_db.CreateDocument
log_DocNum = GetNumDocLog(Me.log_db)
log_doc.Form = "Log"
Set log_rtStyle = log_session.CreateRichTextStyle
log_rtStyle.NotesFont = FONT_COURIER
log_rtStyle.FontSize = 8
Set log_body = New NotesRichTextItem( log_doc, "Body" )
Call log_body.AppendStyle(log_rtStyle)
log_doc.LogDateBegin = Now
log_doc.Num = log_DocNum
AddLogEvent BEGIN_LOG
End Sub
' установить тип отчета
Sub SetType(typeLog As String)
If Not (log_doc Is Nothing) Then
log_doc.Type = typeLog
End If
End Sub
' добавить запись в конец документа журнала с сохранением документа
Sub AddLogEvent(strEvent As String)
On Error Goto errorhandler
If Not (log_doc Is Nothing) Then
If Not (isBodySize32K(log_body, StrEvent)) Then
log_body.AppendText Cstr(Now) & HYPHEN & strEvent
log_body.AddNewline 1
log_doc.LogDateEnd = Now
log_doc.Save True, False
Else
errorhandler:
' считаю создаваемые доки на случай зацикливания
log_countDocsInSession = log_countDocsInSession + 1
If log_countDocsInSession < 1000 Then
Dim tLog As String
If Not (log_doc Is Nothing) Then
tLog = log_doc.Type(0)
End If
OpenSession	'создаю новый
SetType tLog
AddLogEvent strEvent
End If
End If
End If
End Sub
' закончили, закрываю сессию
Sub CloseSession
AddLogEvent END_LOG
'log_doc.Save True, False
End Sub
End Class
Function GetNumDocLog(db As NotesDatabase) As Double
'****************************************************Описание****************
**************************************************
' Функция получает следующий номер документа журнала.
' Возвращаемое значение: Double (следующий номер) - если все нормально; -1 - если произошла ошибка.
'****************************************************************************
******************************************************
On Error Goto errorhandler
Dim session As New NotesSession
Dim view As Notesview
Dim docLog As NotesDocument
Dim n As Variant
GetNumDocLog = -1
Set view = db.GetView("Log~LogDateBegin~Num")
If Not (view Is Nothing) Then
view.Refresh
Set docLog = view.GetFirstDocument
If Not (docLog Is Nothing) Then
n = Evaluate ({@if(@Date(LogDateBegin)=@Date(@Now); "1"; "0")}, docLog)
If n(0)="1" Then
GetNumDocLog = docLog.Num(0) + 1
Else
GetNumDocLog = 1
End If
Else
GetNumDocLog = 1
End If		
End If
Ex:
Exit Function
errorhandler:
Resume Ex
End Function
Function isBodySize32K(rtitem As NotesRichTextItem, NewStr As String) As Boolean
'****************************************************Описание****************
**************************************************
' Функция проверяет размер поля Body.
' Возвращаемое значение: true - если произошла ошибка или больше; false - если меньше.
'****************************************************************************
******************************************************
On Error Goto errorhandler
isBodySize32K = True
Dim ni As NotesItem
Dim strLen As Double
If Not (rtitem Is Nothing) Then
strLen = rtItem.ValueLength + Lenb(NewStr)
If strLen < 32660 Then
isBodySize32K = False
End If
End If
Ex:
Exit Function
errorhandler:
Resume Ex
End Function
 
O

oshmianski

Для: Medevic
чем мне это грозит? если их будет 1000?
 
K

K-Fire

Set log_body = New NotesRichTextItem( log_doc, "Body" )

Вообще вот строка которая создает заново каждый раз. Я так понимаю что подразумевалось что этот метод только 1 раз вызывается? Похоже что не 1 раз :)
Замените на что-нить типа:

Set log_body = log_doc.GetFirstItem ("Body")
if log_body is nothing then
Set log_body = New NotesRichTextItem( log_doc, "Body" )
end if
 
O

oshmianski

Для: K-Fire
метод вызывается один раз
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Для: K-Fire
Дело не в этом.
И, судя по всему, это не баг, а фича. Наверное, связанная с особенностью ричтекста. :)
 
O

oshmianski

скорее всего это связано с тем, что RT объявлен в классе. хотя могу и ошибаться
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-oshmianski+14:02:2007, 11:41 -->
<span class="vbquote">(oshmianski @ 14:02:2007, 11:41 )</span><!--QuoteEBegin-->скорее всего это связано с тем, что RT объявлен в классе. хотя могу и ошибаться
[snapback]56117" rel="nofollow" target="_blank[/snapback]​
[/quote]
Не связано.

ЗЫ. Как я посмотрел, эта багофича известна техподдержке как минимум с 2001 года.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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