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

seoman2

Green Team
17.02.2010
507
1
BIT
72
А когда подписывающий выполняет проверку подписи и проверку, обнаружение изменений подписанных данных работает?
Нет, даже при изменении поля СОДЕРЖАНИЕ_ при нажатиии "Проверка подписи" , doc.Signer содержит имя подписавшего.
Хотя, при нарушении подписи, первый раз "невалидно", а второй раз если нажать "Проверка подписи" то подпись валидна.
 
N

nvyush

Нет, даже при изменении поля СОДЕРЖАНИЕ_ при нажатиии "Проверка подписи" , doc.Signer содержит имя подписавшего.
Хотя, при нарушении подписи, первый раз "невалидно", а второй раз если нажать "Проверка подписи" то подпись валидна.
Похоже, после проверки подписи и получения "невалидно" происходить переподписание.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Вот залил тестовую базку

Что поражает, если клиент А подписал документ, а Клинет Б изменил поле СОДЕРЖАНИЕ_ , , то подпись сохраненется, doc.Signer = клиент А
Если Клиент Б подписал док, и клиент А открыл док и изменил СОДЕРЖАНИЕ_, то подпись нарушается.
С клиентов С - все корректно работает...
 
T

TIA

Что поражает, если клиент А подписал документ, а Клинет Б изменил поле СОДЕРЖАНИЕ_ , , то подпись сохраненется, doc.Signer = клиент А
Если Клиент Б подписал док, и клиент А открыл док и изменил СОДЕРЖАНИЕ_, то подпись нарушается.
Попробовал. Работает корректно.
Как выполняется переключение пользователей, через Switch Id или открытием БД с другого рабочего места? Если второе, то вероятно виновата версия нотес. В 7.0.1 и 6.5.5 была ошибка, из-за которой не верно вычисляется Signer:

SPR # BHIR6NUMTG Fixed in release:
6.5.6
7.0.2 Regression in 6.5.5

Product Area: Designer Technical Area: LotusScript Platform: Cross Platform

SPR# BHIR6NUMTG - Prior to Release 6.5.5, doc.signer returned null if the doc had been modified since signed. Starting in Release 6.5.5, doc.signer returned the signer irrespective of the doc being changed. This fix brings back the old 6.54 behavior.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Да, дело было в разных версиях клиентов. Все работает замечательно!
Вот думаю, куда лучше сунуть проверку подписи? Так, чтобы юзеру не надо было нажимать кнопку проверить, а влагом скрывался или появлялся текст предупреждения . События quertyopen postopen и quertysave postsave не подходят...
 
N

nvyush

Да, дело было в разных версиях клиентов. Все работает замечательно!
Вот думаю, куда лучше сунуть проверку подписи? Так, чтобы юзеру не надо было нажимать кнопку проверить, а влагом скрывался или появлялся текст предупреждения . События quertyopen postopen и quertysave postsave не подходят...
OnLoad :rolleyes:
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
При вставке проверки на событие OnLoad
1 - подпись слетает при изменении любого поля.
2 - получается мы открыли док, а потом пересчитали скрытие одного поля, если нарушена подпись. И надо снова рефрешить.

Было бы лучше на момент сохранения или закрытия дока сделать проверку...
Все события перепробовал уже!
 
N

nvyush

Мне кажется, проверку лучше делать в QueryOpen.
Установили нужным полям isSigned, восстановили из копии поле подписи $Signature, проверили подпись, вернули всё в исходное, обновили cfd-поле флага корректности подписи на форме по результатам проверки и всё.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
в QueryOpen код прверки всегда выдает doc.Signer="" при изменении любого поля документа... Я уже все события проверил...
 
N

nvyush

seoman2
Качнул Вашу тестовую базку. Добавил библиотеку с функцией:
Код:
Public Function GetDocSigner(doc As NotesDocument) As String
Dim item As NotesItem
Set item = doc.GetFirstItem("$Sign_2")
Call doc.CopyItem(item, "$Signature")
Set item = doc.GetFirstItem("СОДЕРЖАНИЕ_")
item.IsSigned = True
GetDocSigner = doc.Signer
End Function
В форме добавил cfd-поле "DocSigner" с формулой "@ThisValue" и событие Queryopen
Код:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
Dim doc As NotesDocument
Set doc = Source.Document
Call doc.ReplaceItemValue("DocSigner", GetDocSigner(doc))	
End Sub
У меня всё работает.
Добавлено Спасибо что побудили разобраться с вопросом подписывания — как раз в очередном проекте потребуется.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Странно, если подписываю 2 поля
' цифр подпись
Dim doc As NotesDocument
Set doc = uiworkspace.CurrentDocument.Document
Dim item As NotesItem
Dim item2 As NotesItem
Dim itemTMP As NotesItem
If doc.form(0)="VnutrStandart" Then
Set item = CurDoc.GetFirstItem("СОДЕРЖАНИЕ")
Set item2 = CurDoc.GetFirstItem("ПРИЛОЖЕНИЯ")
Else
Set item = CurDoc.GetFirstItem("СОДЕРЖАНИЕ_")
Set item2 = CurDoc.GetFirstItem("ПРИЛОЖЕНИЯ_")
End If
item.IsSigned = True
item2.IsSigned = True
Call CurDoc.Sign
Set itemTMP = CurDoc.GetFirstItem("$Signature")
Call CurDoc.CopyItem(itemTMP, "$Sign_2")
CurDoc.RemoveItem "$Signature"
item.IsSigned = False
item2.IsSigned = False

то цифровая подпись всегда неваидна. Поле ПРИЛОЖЕНИЯ_ имеет все те же признаки что и СОДЕРЖАНИЕ_
Или для каждого поля надо свой $Sign_ делать?
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Для нескольких подписываемых полей нужно
в одном поле возвести флаг IsSigned = True, потом Doc.Sign, потом IsSigned = False
И подпись в $Sign_1 скинуть.
Потом так же со следующим полем?
подпись в $Sign_2 скинуть.
 
N

nvyush

seoman2 , а что Вам собственно нужно? Если хотите контролировать целостность каждого поля в отдельности, то и подписывать их нужно отдельно, т.е. для каждого поля своё соответствующее $Sign_. Если подписываете группу полей, то подпись нарушается при изменении любого из них.
 
D

dimonz80

А в чем собсно проблема использовать разделы? Если не нравится внешний вид то их можно скрыть не скрывая содержимого. Просто выбрать в дезигнере свойства раздела и в окне свойств перейти в свойства текста и выставить галки скрыть в Notes,Mobile и Web. И перед сохранением не забыть раскрыть раздел. В результате содержимое раздела будет видно а заголовок - нет (как будто и нет никакого раздела). + еще работает формула для доступа на редактирование раздела. Т.е. если раздел нельзя менять, то поля не переподпишутся при сохранении документа. Вот.
 
D

dimonz80

По условию задачи в самом первом посте:
Ну это понятно. Просто есть способ спокойно использовать разделы и не морочить голову при визуальном их отсутствии (точнее не видно заголовков с твистерами), а содержимое вполне себе видно. Или задача - просто разминка для ума на изощренность кодинга?
 
Мы в соцсетях:

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