From c80acbd26dcd174e1e901b99136e30c810f27580 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Sat, 7 Oct 2023 11:07:29 +0300 Subject: [PATCH] Fix signature --- .../graphics/pro/js/wasm/js/drawingfile_base.js | 4 ++++ PdfFile/PdfReader.cpp | 6 +++--- PdfFile/SrcReader/PdfAnnot.cpp | 11 +++++++++++ PdfFile/SrcWriter/Annotation.cpp | 16 +++++++++------- PdfFile/test/test.cpp | 10 +++++----- 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js index a528e67238..76f78f9006 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_base.js @@ -831,6 +831,10 @@ rec["doNotSpellCheck"] = (rec["flag"] >> 22) & 1; // DoNotSpellCheck rec["commitOnSelChange"] = (rec["flag"] >> 26) & 1; // CommitOnSelChange } + else if (rec["type"] == 33) + { + rec["Sig"] = rec["flag"] >> 9) & 1; + } res["Fields"].push(rec); } diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index 9b2eddcc95..f13fa84889 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -803,13 +803,12 @@ BYTE* CPdfReader::VerifySign(const std::wstring& sFile, ICertificate* pCertifica { AcroFormField* pField = pAcroForms->getField(i); AcroFormFieldType oType = pField->getAcroFormFieldType(); - if (oType != acroFormFieldSignature || nWidget >= 0 && i != nWidget) + if (oType != acroFormFieldSignature || (nWidget >= 0 && i != nWidget)) continue; Object oObj, oObj1; - if (!pField->fieldLookup("V", &oObj)->isDict() || !oObj.dictLookup("Type", &oObj1)->isName("Sig")) + if (!pField->fieldLookup("V", &oObj)->isDict()) continue; - oObj1.free(); std::vector arrByteOffset, arrByteLength; if (oObj.dictLookup("ByteRange", &oObj1)->isArray()) @@ -836,6 +835,7 @@ BYTE* CPdfReader::VerifySign(const std::wstring& sFile, ICertificate* pCertifica int nByteOffset = 0; for (int j = 0; j < arrByteOffset.size(); ++j) { + // TODO проверка длины файла и ByteRange memcpy(pDataForVerify + nByteOffset, pFileData + arrByteOffset[j], arrByteLength[j]); nByteOffset += arrByteLength[j]; } diff --git a/PdfFile/SrcReader/PdfAnnot.cpp b/PdfFile/SrcReader/PdfAnnot.cpp index ae3e88254d..6551a6e2bf 100644 --- a/PdfFile/SrcReader/PdfAnnot.cpp +++ b/PdfFile/SrcReader/PdfAnnot.cpp @@ -654,7 +654,18 @@ CAnnotWidgetCh::CAnnotWidgetCh(PDFDoc* pdfDoc, AcroFormField* pField) : CAnnotWi CAnnotWidgetSig::CAnnotWidgetSig(PDFDoc* pdfDoc, AcroFormField* pField) : CAnnotWidget(pdfDoc, pField) { + Object oObj; + Object oFieldRef, oField; + pField->getFieldRef(&oFieldRef); + oFieldRef.fetch(pdfDoc->getXRef(), &oField); + oFieldRef.free(); + // 10 - Значение + if (oField.dictLookup("V", &oObj)->isDict()) + m_unFlags |= (1 << 9); + oObj.free(); + + oField.free(); } CAnnotWidget::CAnnotWidget(PDFDoc* pdfDoc, AcroFormField* pField) : CAnnot(pdfDoc, pField) diff --git a/PdfFile/SrcWriter/Annotation.cpp b/PdfFile/SrcWriter/Annotation.cpp index 6f0a6751c0..716ed317b0 100644 --- a/PdfFile/SrcWriter/Annotation.cpp +++ b/PdfFile/SrcWriter/Annotation.cpp @@ -938,20 +938,22 @@ namespace PdfWriter { } - - // TODO: + //---------------------------------------------------------------------------------------- + // CTextWidget + //---------------------------------------------------------------------------------------- CTextWidget::CTextWidget(CXref* pXref) : CWidgetAnnotation(pXref, AnnotWidget) { - } - + //---------------------------------------------------------------------------------------- + // CChoiceWidget + //---------------------------------------------------------------------------------------- CChoiceWidget::CChoiceWidget(CXref* pXref) : CWidgetAnnotation(pXref, AnnotWidget) { - } - + //---------------------------------------------------------------------------------------- + // CSignatureWidget + //---------------------------------------------------------------------------------------- CSignatureWidget::CSignatureWidget(CXref* pXref) : CWidgetAnnotation(pXref, AnnotWidget) { - } } diff --git a/PdfFile/test/test.cpp b/PdfFile/test/test.cpp index 3f42521b93..ac971f9275 100644 --- a/PdfFile/test/test.cpp +++ b/PdfFile/test/test.cpp @@ -93,14 +93,14 @@ int main() } ICertificate* pCertificate = NULL; - if (false) + if (true) { std::wstring wsCertificateFile = NSFile::GetProcessDirectory() + L"/cert.pfx"; std::wstring wsPrivateKeyFile = L""; std::string sCertificateFilePassword = "123456"; std::string sPrivateFilePassword = ""; - //pCertificate = NSCertificate::FromFiles(wsPrivateKeyFile, sPrivateFilePassword, wsCertificateFile, sCertificateFilePassword); + pCertificate = NSCertificate::FromFiles(wsPrivateKeyFile, sPrivateFilePassword, wsCertificateFile, sCertificateFilePassword); std::map properties; properties.insert(std::make_pair(L"DNS", L"8.8.8.8")); @@ -111,7 +111,7 @@ int main() //std::wstring sValueTest = L"ValueTest"; //properties.insert(std::make_pair(sNameTest, sValueTest)); - pCertificate = NSCertificate::GenerateByAlg("ecdsa512", properties); + //pCertificate = NSCertificate::GenerateByAlg("ecdsa512", properties); //pCertificate = NSCertificate::GenerateByAlg("rsa2048", properties); } @@ -210,8 +210,8 @@ int main() { if (pdfFile.EditPage(0)) { - TEST(&pdfFile); - pdfFile.Sign(0, 0, 0, 0, L"", pCertificate); + //TEST(&pdfFile); + pdfFile.Sign(10, 10, 100, 100, NSFile::GetProcessDirectory() + L"/test.jpeg", pCertificate); } } else if (true)