• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Гуру, ошибка с аттачментами

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

Omh

Товарищи, сложилась дебильная ситуация.

У клиента, к которому у меня нет доступа, есть плавающая ошибка.
Повторить её никак не могу.

Хочу спросить, почему теоретически может появляться такая ошибка, а там уж решу, как действовать.

Ошибка с аттачметами.
Есть документа с author полями, в котором есть пара RT полей с аттачментами.
Этот документ процесситься, врямя от времени аттачи убираются из документа с помощью хитрого скрипта (наследие):
<!--shcode--><pre><code class='vb'>Dim RTItem As NotesRichTextItem

Dim RTItemNames(1) As String 'имена полей с аттачами
RTItemNames(0) = "RTFieldName1"
RTItemNames(1) = "RTFieldName2"

Forall x In RTItemNames
Call doc.RemoveItem(x)
Set RTItem = New NotesRichTextItem(doc, x)
RTItem.IsSigned = False
RTItem.IsEncrypted = False
End Forall[/CODE]
В скрипте делается новый айтем с тем же именем, потому что его наличие обязательно в документе - потом дибильный скрипт переносит этот айтем в документ из другой базы и если айтема нет, то материться. Тоже наследие :)

Посел того, как аттачи удалены, зачастую в эти же поля прикладываются новые аттачи.

Ну и время от времени высплывает такая ошибка:
иконки аттачментов в документе есть, но при вызывании окошка пропертиес аттачмета поле Length у нас серенького цвета и с вопросительныым значком в скобках.
При попытке открыть выкидывает ошибку "One or more of the source document's attachment are missing.Run fix up to delete the document in the source database".

Как я понимаю, от настоящего аттачмента у нас осталась только картинка ведущая в никуда ;)

Есть идеи, в каком случае эта ошибка возникает и что может вызвать такое поведение?
Пересмотрю скрипты, попробую поменять потенциально опасное место.

Заранее спс!
 
а где ты док потом сохраняешь - в этом же куске кода ниже? Апдейт рт поля не поможет?
 
Ниже апдейтятся ещё пачка полей, в основном текстовые.
Потом документ сохраняется, и если doc.save(True, True) вернул True, то поля синхронизируются в документ в другой базе.

Куда предлагаешь засунуть Update? (гусары, молчать!)

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

Поле "$File" нигде не удаляеться, если что...
 
Процессинг документа в UI или BE? Документ сохраняется через UI или BE? Новые аттачи сразу после удаления? Новые аттачи в UI или BE?
 
Удаляется всё в BE, потом происхоlит переоткрытие.
Документ сохраняется через бэкграунд - doc.Save(True, True)

Новые аттачи прикладываются через UI (File-Attach).
Новые аттачи могут прикладываться как сразу, так и через какое-то время.

Вообще, это типа процесс согласования.
 
Omh
думаю тут проблема в том, что кто-то в сухую обращается к полям $File и прибивает их
разбираясь с ЕЦП + DXML я замечат, что в РТ поле лежит иконка на аттач, но лежит она там тоже хитро:
Код:
<item name='Body' seal='true'><richtext>
<pardef id='2' leftmargin='1in' hide='copy'/>
<par def='2'><run><font size='8pt'/></run><attachmentref name='logoR.gif'
displayname='logoR.gif'><picture height='47px' width='50px'><notesbitmap>
.......
</notesbitmap></picture></attachmentref><run></par></richtext></item>
есть большая вероятность, что:
1) если не обращаться через стандартные средства и не делать апдейт РТ полю, то иконка в никуда может там остаться навечно
2) если файл называется так же как и предыдущий то иконка не пересоздаётся а юзается та же
3) если сервер этим занимается и не находит соотстветствия типу файл+иконка то апдейт РТ поля не происходит вообще
 
Очень похожая ситуация, после сохранения, так же "плавающе" получается что файлы не прикрепляются в свои поля, а висят под внизу чертой.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Пример кода</div></div><div class="sp-body"><div class="sp-content">
Код:
	Set docA = collection.GetFirstDocument()
If Not (docA Is Nothing) Then

Set docB = New NotesDocument( db )
Call docA.CopyAllItems( docB, True )
' переименование вложенных файлов		
Set cbody = docB.GetFirstItem( "Info" )
Set cbody_1 = docB.GetFirstItem( "Info_1" )
Set cbody_1_1 = docB.GetFirstItem( "Info_1_1" )
Set rtitem = docB.GetFirstItem( "Info_2" )
If docB.HasItem("$FILE"	) Then
If Not (Isempty(cbody.EmbeddedObjects)) Then
Forall o In cbody.EmbeddedObjects	
filenamesave = Right(o.Source,8)
Call o.ExtractFile ( "c:\lotustemp\" & filenamesave)
Call cbody.embedObject(EMBED_ATTACHMENT,"", "c:\lotustemp\"+filenamesave )	
Call o.Remove
End Forall
End If
If Not (Isempty(cbody_1.EmbeddedObjects)) Then
Forall o_1 In cbody_1.EmbeddedObjects				
filenamesave = Right(o_1.Source,10)
Call o_1.ExtractFile ( "c:\lotustemp\" & filenamesave)
Call cbody_1.embedObject(EMBED_ATTACHMENT,"", "c:\lotustemp\"+filenamesave )
Call o_1.Remove
End Forall
End If
If Not (Isempty(cbody_1_1.EmbeddedObjects)) Then
Forall o_1_1 In cbody_1_1.EmbeddedObjects				
filenamesave = Right(o_1_1.Source,10)
Call o_1_1.ExtractFile ( "c:\lotustemp\" & filenamesave)
Call cbody_1_1.embedObject(EMBED_ATTACHMENT,"", "c:\lotustemp\"+filenamesave )
Call o_1_1.Remove
End Forall
End If
Else
Exit Sub
End If

If Not (Isempty(rtitem.EmbeddedObjects)) Then
Forall o_2 In rtitem.EmbeddedObjects						
Call o_2.Remove
End Forall
End If

Call docB.Save( True, True )
Else
Messagebox "Не выбран документ, на базе которого" &Chr(13)&" был бы создан новый документ"
Exit Sub
End If
Messagebox "Если вы создали документ из зарегистрированного документа," &Chr(13) &_
"то отредактируйте (удалите дату и номер подписания) проект и имеющиеся приложения"

Dim unid As String
unid = docB.UniversalID
If unid = "" Then Exit Sub
Set parentDoc = db.GetDocumentByUNID(unid)
Call ws.EditDocument(True, parentDoc)
 
Omh
Удаляется всё в BE, потом происхоlит переоткрытие.
Документ сохраняется через бэкграунд - doc.Save(True, True)
подозреваю что тут еще одна ошибочка
при таком "плавающем" переходе от УИ в бекграунду ты не делаешь
а это в определенные моменты и вызывает потерю иконки

Добавлено: allex
в вашем примере отсутствует обязательный апдейт РТ поля
 
Еще иногда пользователь умудряется задвоить иконку (или приатачить 2 одинокао-именованных файла). И у скрипта сносит крышу при обращении к имени объекта
 
allex
Update method

Example
Processes all pending operations on a rich text item.
Note This method is new with Release 6.
Defined in
NotesRichTextItem
Syntax
Call notesRichTextItem.Update
Usage
Operations on a rich text item are queued for efficiency. The order and time of completion are not predictable. Use this method to ensure that processing is complete at a certain point.
This method is useful when interacting with the front-end classes.
 
подозреваю что тут еще одна ошибочка
при таком "плавающем" переходе от УИ в бекграунду ты не делаешь Call uidoc.Refresh(True)
Кнопка выглядит примерно так:
<!--shcode--><pre><code class='vb'>Dim ws As New NotesUIWorkspace
Dim uiDoc As NotesUiDocument
Dim Doc As NotesDocument
Set uiDoc = ws.CurrentDocument
Set Doc = uiDoc.Document
If CreateNewVersion(doc) Then Call ReopenUIDoc[/CODE]

В ф-ии CreateNewVersion нет вообще никакой работы с UI объектами: там удаляются те самые ричтексты, апдейтятся другие поля.
Она возвращает True, если doc.Save(True, True) возвратил True.

Ф-ия ReopenUIDoc выглядит примерно так:
<!--shcode--><pre><code class='vb'>Sub lsp_ReopenUIDoc
Dim ws As New NotesUIWorkspace
Dim uiDoc As NotesUiDocument
Set uiDoc = ws.CurrentDocument

If Not uidoc Is Nothing Then
Dim UIDocEditMode As Integer
UIDocEditMode = UIDoc.EditMode

Dim Doc As NotesDocument
Set Doc = uiDoc.Document

If Not doc Is Nothing Then
Call doc.ReplaceItemValue("SaveOptions", "0")
Call uidoc.Close

Call UncacheDocument(doc) 'считайте тут документс берётся из view
Set uidoc = ws.EditDocument(UIDocEditMode, Doc)
If Not uidoc Is Nothing Then Call uidoc.RefreshHideFormulas
End If
End If

End Sub[/CODE]

Если честно, я не вижу плавающего перехода.
Сначала все операции с NotesDocument, потом все операции с NotesUIDocument.
Хотя, я, конечно, переоткрытие очень не люблю.

Работы отдельно с $File нету, всё через RichTextItem.
Я могу получить похожую ошибку, если напрямую удалить из документа поле $File.
Но там ошибка немного другая: "Note item not found" + Properties Box аттачмента не показывает размер даже серым :what?:
Точнее показывает 0 байт.

Куда предлагаете засунуть Update?
После удаления айтема и создания нового?

Добавлено: Поля $File в документе есть.
Смотрел на экспортнутый документ через File-Export.

Такое ощущение, что рушиться связь между картинкой и $File

Добавлено: Полагаю, перед появлением ProopertiesBox аттачмента выскакивает ошибка "Invalid or not existent document".
Но это предположение сделаное по скриншоту.

Добавлено: Вот такую ошибку надо получить.
 

Вложения

  • Err.jpg
    Err.jpg
    21,4 КБ · Просмотры: 462
Omh
еще на ум приходи - а не юзаете ли вы антивири?
они порой тестят аттачи так, что линки слетают
 
Ну вот я завтра, либо в понедельник поеду смотреть на продукции.
Достану DXL документов, заодно узнаю и про антивирусы.

Пока что я в растеряности.
 
воще все игры с аттачами луча делать при закрытом uidoc и порожденном doc
особливо при убиении и аттаче заново
т.е. полчаем юнид, убиваем объекты uidoc, doc
получаем doc из базы
хреначим аттачи, цепляем новые
сохраняем
открываем ui
 
lmike
да никтож не спорит, только косяк call uidoc.Close(True) еще никто не обоше :what?:
а значит прибить УИ так легко не удастся, разве что через запуск агента, которому передается УНИД
 
вот отрывок кода, и он работает, в 7.0.4:
Код:
	Set db=ws.CurrentDatabase.Database	
Set uidoc=ws.Currentdocument
Call uidoc.Refresh(True)
'	Call ws.ViewRefresh()
Set doc=uidoc.Document
Call doc.Save(True,False)
condition=doc.GetItemValue("condition")(0)
viewName=doc.GetItemValue("viewTitle")(0)
uid=doc.UniversalID
pwd$=uid
uidoc.Close(True)

Set doc=db.GetDocumentByUNID(uid)
по кнопке, в форме, главное - шоб uidoc НЕ нагадил, а то что его видно - это мелочь :what?:
 
lmike
не знаю как там у вас
но у мну uidoc.Close(True) в 90% заканчивается редбоксом вне зависимости от версии
 
я не точно выразился - кнопка, на форме, но вызывает агента
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab