ЭЦП одного поля в документе

seoman2

Well-Known Member
Lotus team
#1
Как правильно подписать без секции только одно поле в документе?
И так, чтобы если в поле ничегоне меняли, а в других полях были изменения, т подпись у этого поля осталась.

Вот кнопка подписать:
Код:
Dim session As New NotesSession
Dim uiworkspace As New NotesUIWorkspace	

Dim doc As NotesDocument
Dim item As NotesItem
Dim item2 As NotesItem
Set doc = uiworkspace.CurrentDocument.Document
Set item = doc.GetFirstItem("СОДЕРЖАНИЕ_")
item.IsSigned="true"
Call doc.Sign
Set item2=doc.GetFirstItem("$Signature")
Call item2.CopyItemToDocument(doc, "$SignatureOf_" & session.UserName)
Call doc.Save( False, True )

Messagebox "подписали содержание"
А вот кнопка проверки подписи:
Код:
Dim session As New NotesSession
Dim uiworkspace As New NotesUIWorkspace	
Dim doc As NotesDocument
Dim item As NotesItem
Dim item2 As NotesItem
Set doc = uiworkspace.CurrentDocument.Document
Set item2 = doc.ReplaceItemValue("$Signature","$SignatureOf_" & session.UserName)
Call doc.Save(True, False)
Set item = doc.GetFirstItem("СОДЕРЖАНИЕ_")

If item.IsSigned Then
Messagebox "Signed"
Else
Messagebox "Not signed"
End If
 

TIA

:-)
Lotus team
15.05.2009
790
1
#4
При подписании документа методом NotesDocument.Sign, подписываются все поля, имеющие признак NotesItem.IsSigned. В св-вах документа такие поля имеют признак SIGN. Т.е. подписывается как-бы весь документ.
Св-во NotesItem.IsSigned не говорит о том, подписано ли уже поле или нет, а лишь что оно подписываемо и что должно проверяться при проверке подписи. Проверить подписан ли документ в целом можно через NotesDocument.IsSigned. Проверка валидности подписи документа скриптом выполняется методом NotesDocument.Signer (глючит в некоторых версиях Notes, кажется в 7.0.2). NotesDocument.Signer пуст, если подпись нарушена.

Т.о., отвечая на ваш вопрос, установите NotesItem.IsSigned только у одного поля, подписывайте через NotesDocument.Sign, и получите требуемую функциональность.
 

seoman2

Well-Known Member
Lotus team
#5
В итоге сделал кнопку подписать:
Dim session As New NotesSession
Dim uiworkspace As New NotesUIWorkspace
Dim doc As NotesDocument
Dim item As NotesItem
Set doc = uiworkspace.CurrentDocument.Document
Set item = doc.GetFirstItem("СОДЕРЖАНИЕ_")

item.IsSigned="true"
Call doc.Sign
Call doc.Save( False, True )
Messagebox "подписали содержание"
и кнопку проверки подписи:
Dim session As New NotesSession
Dim uiworkspace As New NotesUIWorkspace
Dim doc As NotesDocument
Dim item As NotesItem
Set item = doc.GetFirstItem("СОДЕРЖАНИЕ_")

If item.IsSigned Then
Messagebox "Signed"
Else
Messagebox "Not signed"
End If

Dim person As String
person = doc.Signer
Messagebox person
Так вот, если в документе изменить любое поле и сохранить док, то подпись исчезает, а в person попадает имя текущего юзера. А надо, чтобы подпись была только у у поля СОДЕРЖАНИЕ_, и изменялась (нарушалась) подпись в случае изменения только этого поля.
 

TIA

:-)
Lotus team
15.05.2009
790
1
#6
Так вот, если в документе изменить любое поле и сохранить док, то подпись исчезает,
Вероятно, потому что вы после doc.Save выполняете сохранение в UI. UI-сохранение перезаписывает результат подписи. Возможно даже поле $Signature у вас не появляется.
Для такого случая лучше подойдёт галка в св-вах формы "Sign documents that use this form". При UI-сохранении (скажем, через NotesUIDocument.Save) в такой форме, документ сам подпишется и не нужно подписание через NotesDocument.Save
 

Constantin A Chervonenko

Well-Known Member
Lotus team
#7
Вероятно, потому что вы после doc.Save выполняете сохранение в UI.
Во-во..
Если искомое поле есть на форме - при сохранении соотв item будет перезаписан (подпись - побита).
Не включайте поле в форму! Отображайте (если оч.надо) через ComputedText или CFD-поля
 

seoman2

Well-Known Member
Lotus team
#8
Sign documents that use this form - и так стоит.
Да, юзеры будут сохранять в UI документ. После этого $Signature исчезает вообще.
Мне необходимо оставить поле на форме, причем чтобы его можно было редактировать. и если изменить, то чтобы было видно кто нарушил подпись.
Расскажите поподробнее как это сделать ?
 
K

Klido

Гость
#9
чтобы его можно было редактировать. и если изменить, то чтобы было видно кто нарушил подпись
непонятно зачем так... если даем менять - последняя подпись и будет того, кто поменял...
а сами изменения - отдельно лог надо делать, ибо изменения могут быть условными - катопейст, например, содержимого поля в себя же...
 

seoman2

Well-Known Member
Lotus team
#10
Klido верно.
А можно лотус скриптом сделать поле на форме вычисляемым?
Что бы после подписи его нельзя было изменить?
А то играться с 2 полями - одно на редактированние и второе на чтение и их скрытием неинтересно.
Можно пример кода создания лога для одного поля?
 

TIA

:-)
Lotus team
15.05.2009
790
1
#11
Да, юзеры будут сохранять в UI документ. После этого $Signature исчезает вообще.
Если юзеры уже сохраняЮТ UI-методами и уже сейчас $Signature исчезаЕТ, тогда вы что-то сделали не так. Установлен ли у вашего поля признак "Sign if mailed or saved in section"?
Мне необходимо оставить поле на форме, причем чтобы его можно было редактировать. и если изменить, то чтобы было видно кто нарушил подпись.
Как отличить, меняется ли поле с нарушением или легально?
 

seoman2

Well-Known Member
Lotus team
#12
Шас поставил у поля Sign if mailed or saved in section и у формы Sign documents that use this form.
Поле $Signature не прпадает.
ПОкажите пример кода, как подписывать только одно поле? У меня это содержание документа.
Человек заполнил его, а потом хочет подписать только это поле и боьлше не редактировать.
 

TIA

:-)
Lotus team
15.05.2009
790
1
#13
1. Чтобы запретить изменение подписанного роля, см. здесь. Только секцию с управляемым доступом исключите.

2. Вот весь код для подписания одного поля в документе (точнее, всего документа):

dim ws as new NotesUIWorkspace
ws.CurrentDocument.Save
ws.CurrentDocument.Close

Остальное настройками. :) Перечитайте внимательно данный топик.
 

seoman2

Well-Known Member
Lotus team
#14
2. Вот весь код для подписания одного поля в документе (точнее, всего документа):
dim ws as new NotesUIWorkspace
ws.CurrentDocument.Save
ws.CurrentDocument.Close
Остальное настройками. Перечитайте внимательно данный топик.
Мне не надо весь документ подписывать, а только одно поле. Настройки не помогают.

Ещё вопрос - цифровая подпись на одно поле хранится в документе где?
Может при подписании можно скопировать её в другое свое поле, а при проверке поля востанавливать?

Если я изменяю в документе одно неподписываемое поле, то ц.подпись на подписываемое поле изменится? В лотусе.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
34
Kiev, Ukraine
#15
чесгря, не игрался с подписанием, но, что, если попытаться хранить информацию, которую пользователь подписывает не в этом документе, а в другом, а текущий док сделать как-бы средством для отображения и изменения этой информации, соотв., и подписывать тот другой документ с одним его полем, которое хранит информацию.
 

TIA

:-)
Lotus team
15.05.2009
790
1
#16
Если я изменяю в документе одно неподписываемое поле, то ц.подпись на подписываемое поле изменится? В лотусе.
Нет, не изменится. Поэтому, подписывая документ, фактически подписываются лишь подписываемые поля. Чем вам это не требуемое по условию подписание одного поля?
Ещё вопрос - цифровая подпись на одно поле хранится в документе где?
На все подписываемые поля хранится в поле $Signature