Signer странное поведение на некоторых машинах

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

MaxP

Приветствую.
Есть док подписанный ЭЦП. На большинстве машин проверка дока проходит нормально, на паре машин Signer выдает "". Версии клиентов Notes на кривых и нормальных машинах одинаковые.
На кривых машинах делал переустановку Notes, выгружал все процессы, не помогает.
Да, есть одно но. Тот кто подписывал док, кроссертифицирован в нашей АК на сервере.
Цитата из хелпа по сигнеру: "If the signer is not trusted, returns an empty string."
Грешу что клиент не воспринимает подписчика как доверенного, хотя кроссы есть в локальной АК.
Куда копнуть?
 
M

MaxP

Дело не в кроссе. Состряпал код, подписал док учеткой из АК, проверил, также возврат ""
 
M

MaxP

Еще эксперимент не прошел :( Скопировал рабочий клиент, запустил на проблемной машине, ошибка та же.
Значит дело в системе.
 
M

MaxP

Ошибка системно возникает на машинах с WinXP SP3, на Win8 проблем нет.
 

Domino-Designer

Людям надо поморгать!
Lotus Team
06.12.2011
617
223
BIT
26
нечто подобное ловил в 6.5.4 +ВинХР
подпись документа на LS и Notes Java API ведут себя по разному. Пришлось для подписи запускать еще и Java agent.
 
M

MaxP

Задачку так и не решил. Писал в IBM, отправлял логи, ничего.
Может кто-то разбирается глубоко в вопросе? Может быть механизм подписи поменять и поможет?
Вообщем, готов заплатить за решение задачки. Подробности в личке.
[doublepost=1488969867,1488898277][/doublepost]Вообщем, разобрался.
Был у меня такой код. Взялся он откуда не знаю, но может и с форума:
Код:
Public Class SignatureDocument
    Private session As NotesSession
    Private curdb As NotesDatabase
    Private item As NotesItem
    Private debugMode As String
    Private Log As NotesStream

    Sub New ()
    Set Me.session = New NotesSession
    Set Me.curdb = Me.session.currentDatabase
End Sub
    Public Sub sign(doc As NotesDocument)

    'Подписать
    Dim dialog As NotesDocument
fields = doc.GetItemValue("dspSignedFields" )
    Set dialog = Me.curdb.createDocument
    Call dialog.replaceItemValue("SaveOptions", "0")
    ForAll fname In fields
    If Not fname = "Signer"  Then
        Call Me.copyItemToDialogDoc(doc, dialog, CStr(fname))
    End If
End ForAll
    Set item = dialog.replaceItemValue("Signer" , Me.signer)
    item.IsSigned = True
    Set item = dialog.replaceItemValue("SignedFields" , doc.GetItemValue("dspSignedFields" ))
    item.IsSigned = True

    Set item = dialog.replaceItemValue("$signed" , Now())
    item.IsSigned = True
    Call dialog.Sign()
    If dialog.HasItem("$Signature") Then
    Set item = dialog.GetFirstItem("$Signature")
    Call item.CopyItemToDocument(doc, "$Signature1" )
    Set item = doc.replaceItemValue("Signer" , dialog.GetItemValue("Signer" ))
    Set item = doc.replaceItemValue("SignedFields" , dialog.GetItemValue("SignedFields" ))
    Set item = dialog.GetFirstItem("$signed" )
    Call item.CopyItemToDocument(doc, "$signed" )
Else
    Print "Нет поля $Signature"
End If
   
End Sub
    Private Sub copyItemToDialogDoc(doc As NotesDocument, dialog As NotesDocument, fname As String)
    If Not doc.hasItem(fname) Then Exit Sub
    Set item = doc.GetFirstItem(fname)
    Call item.CopyItemToDocument(dialog, fname)
    Set item = dialog.GetFirstItem(fname)
    item.IsSigned = True
End Sub
    Private Function signer As Variant
    Dim usernamelist As Variant
    usernamelist = Me.session.usernameList
    Dim v As Variant
    Dim ub%
    If UBound(usernamelist) > 0 Then ub% = 1 Else ub% = 0
    ReDim v(ub%)
    v(0) = usernamelist(0).canonical
    If ub% = 1 Then v(1) = usernamelist(1).canonical
    signer = v
End Function
    Public function verifySign(doc As NotesDocument) As Boolean
        verifySign=false
    Dim dialog As NotesDocument
    fields = doc.GetItemValue("SignedFields" )
    Set dialog = Me.curdb.createDocument
    Call dialog.replaceItemValue("SaveOptions", "0")
    ForAll fname In fields
    Call copyItemToDialogDoc(doc, dialog, CStr(fname))
End ForAll
    Set item = dialog.replaceItemValue("Signer" , doc.getItemValue("Signer" ))
    item.IsSigned = True
    Set item = dialog.replaceItemValue("SignedFields" , doc.getItemValue("signedFields" ))
    item.IsSigned = True
    Set item = dialog.replaceItemValue("$signed" , doc.getItemValue("$signed" ))
    item.IsSigned = True
    Set item = doc.GetFirstItem("$Signature1" )
    Call item.CopyItemToDocument(dialog, "$Signature")
    If dialog.IsSigned Then
    If dialog.Signer = ""  then Exit function
    Dim nam As NotesName
    Set nam = Me.session.CreateName(dialog.Signer)
        verifySign=true
Else
   
End If
   
End function


End Class

И как раз в некоторых случаях код давал signer="" без какой-то логики.

Я решил пойти сначала, и сделал простой код подписи документа целиком.
Код:
Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim doc As NotesDocument
    Set doc=ws.CurrentDocument.Document
    Call doc.Sign
    Call doc.Save(True,False)
End Sub

Проверил на проблемной машине таким кодом
Код:
Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim doc As NotesDocument
    Set doc=ws.CurrentDocument.Document
    Print doc.Signer
End Sub

Без проблем все сработало как надо, возвращается подписант.
Соответственно, если документ пересохраняется, то signer возвращает пустое значение.
Однако, есть проблемка. Если собакоагентом присвоить значение поля какое-то в док, то подпись не слетает.
Лечится тем, что у поля надо указать свойство на 3-й закладке: sign if mailed or saved in section.

Вообщем, для многих эта инфа уже очевидная, но решил написать. Главное, не мудрить, там где это не надо :)
 
Мы в соцсетях:

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