Merge branch 'hotfix/v7.4.1' into develop

This commit is contained in:
Oleg Korshul
2023-07-12 17:16:26 +03:00
37 changed files with 3046 additions and 2963 deletions

View File

@ -1,19 +0,0 @@
SET SCRIPTPATH=%~dp0
CD /D %~dp0
call hg clone https://hg.mozilla.org/projects/nspr
call hg clone https://hg.mozilla.org/projects/nss
cd nss
export USE_64=1
make nss_build_all
git clone https://github.com/openssl/openssl.git openssl
cd openssl
perl ./Configure linux-64
./config
make
#call git clone -b master https://github.com/lsh123/xmlsec.git
#download from http://www.aleksey.com/xmlsec/download/xmlsec1-1.2.23.tar.gz
# get from our git repository

View File

@ -1,312 +0,0 @@
#-------------------------------------------------
#
# Project created by QtCreator 2014-10-10T14:24:04
#
#-------------------------------------------------
QT -= core gui
TARGET = libxmlsec
TEMPLATE = lib
QMAKE_CXXFLAGS += -Wall -g
#CONFIG += shared
#CONFIG += plugin
CONFIG += staticlib
CORE_ROOT_DIR = $$PWD/../..
PWD_ROOT_DIR = $$PWD
include($$CORE_ROOT_DIR/Common/base.pri)
INCLUDEPATH += \
$$PWD_ROOT_DIR/xmlsec/include \
$$CORE_ROOT_DIR/DesktopEditor/xml/build/qt
DEFINES += \
LIBXML_READER_ENABLED \
LIBXML_PUSH_ENABLED \
LIBXML_HTML_ENABLED \
LIBXML_XPATH_ENABLED \
LIBXML_OUTPUT_ENABLED \
LIBXML_C14N_ENABLED \
LIBXML_SAX1_ENABLED \
LIBXML_TREE_ENABLED \
LIBXML_XPTR_ENABLED \
IN_LIBXML \
LIBXML_STATIC
include($$CORE_ROOT_DIR/DesktopEditor/xml/build/qt/libxml2_src.pri)
DEFINES += PACKAGE=\\\"xmlsec1\\\"
DEFINES += VERSION=\\\"1.2.23\\\"
DEFINES += XMLSEC_DEFAULT_CRYPTO=\\\"openssl\\\"
DEFINES += \
IN_XMLSEC \
XMLSEC_STATIC
core_linux {
#CONFIG += use_gcrypt
#CONFIG += use_gnutls
#CONFIG += use_mscrypto
#CONFIG += use_nss
CONFIG += use_openssl
#CONFIG += use_skeleton
#CONFIG += use_xslt
}
core_windows {
CONFIG += use_mscrypto
}
HEADERS += \
xmlsec/include/xmlsec/app.h \
xmlsec/include/xmlsec/base64.h \
xmlsec/include/xmlsec/bn.h \
xmlsec/include/xmlsec/buffer.h \
xmlsec/include/xmlsec/crypto.h \
xmlsec/include/xmlsec/dl.h \
xmlsec/include/xmlsec/errors.h \
xmlsec/include/xmlsec/exports.h \
xmlsec/include/xmlsec/io.h \
xmlsec/include/xmlsec/keyinfo.h \
xmlsec/include/xmlsec/keys.h \
xmlsec/include/xmlsec/keysdata.h \
xmlsec/include/xmlsec/keysmngr.h \
xmlsec/include/xmlsec/list.h \
xmlsec/include/xmlsec/membuf.h \
xmlsec/include/xmlsec/nodeset.h \
xmlsec/include/xmlsec/parser.h \
xmlsec/include/xmlsec/private.h \
xmlsec/include/xmlsec/soap.h \
xmlsec/include/xmlsec/strings.h \
xmlsec/include/xmlsec/templates.h \
xmlsec/include/xmlsec/transforms.h \
xmlsec/include/xmlsec/version.h \
xmlsec/include/xmlsec/version.h.in \
xmlsec/include/xmlsec/x509.h \
xmlsec/include/xmlsec/xmldsig.h \
xmlsec/include/xmlsec/xmlenc.h \
xmlsec/include/xmlsec/xmlsec.h \
xmlsec/include/xmlsec/xmltree.h \
xmlsec/src/globals.h \
xmlsec/src/kw_aes_des.h
SOURCES += \
xmlsec/src/app.c \
xmlsec/src/base64.c \
xmlsec/src/bn.c \
xmlsec/src/buffer.c \
xmlsec/src/c14n.c \
xmlsec/src/dl.c \
xmlsec/src/enveloped.c \
xmlsec/src/errors.c \
xmlsec/src/io.c \
xmlsec/src/keyinfo.c \
xmlsec/src/keys.c \
xmlsec/src/keysdata.c \
xmlsec/src/keysmngr.c \
xmlsec/src/kw_aes_des.c \
xmlsec/src/list.c \
xmlsec/src/membuf.c \
xmlsec/src/nodeset.c \
xmlsec/src/parser.c \
xmlsec/src/relationship.c \
xmlsec/src/soap.c \
xmlsec/src/strings.c \
xmlsec/src/templates.c \
xmlsec/src/transforms.c \
xmlsec/src/x509.c \
xmlsec/src/xmldsig.c \
xmlsec/src/xmlenc.c \
xmlsec/src/xmlsec.c \
xmlsec/src/xmltree.c \
xmlsec/src/xpath.c
use_gcrypt {
HEADERS += \
xmlsec/include/xmlsec/gcrypt/app.h \
xmlsec/include/xmlsec/gcrypt/crypto.h \
xmlsec/include/xmlsec/gcrypt/symbols.h \
\
xmlsec/src/gcrypt/asn1.h \
xmlsec/src/gcrypt/globals.h
SOURCES += \
xmlsec/src/gcrypt/app.c \
xmlsec/src/gcrypt/asn1.c \
xmlsec/src/gcrypt/asymkeys.c \
xmlsec/src/gcrypt/ciphers.c \
xmlsec/src/gcrypt/crypto.c \
xmlsec/src/gcrypt/digests.c \
xmlsec/src/gcrypt/hmac.c \
xmlsec/src/gcrypt/kw_aes.c \
xmlsec/src/gcrypt/kw_des.c \
xmlsec/src/gcrypt/signatures.c \
xmlsec/src/gcrypt/symkeys.c
}
use_gnutls {
HEADERS += \
xmlsec/include/xmlsec/gnutls/app.h \
xmlsec/include/xmlsec/gnutls/crypto.h \
xmlsec/include/xmlsec/gnutls/symbols.h \
xmlsec/include/xmlsec/gnutls/x509.h \
\
xmlsec/src/gnutls/globals.h \
xmlsec/src/gnutls/x509utils.h
SOURCES += \
xmlsec/src/gnutls/app.c \
xmlsec/src/gnutls/asymkeys.c \
xmlsec/src/gnutls/ciphers.c \
xmlsec/src/gnutls/crypto.c \
xmlsec/src/gnutls/digests.c \
xmlsec/src/gnutls/hmac.c \
xmlsec/src/gnutls/kw_aes.c \
xmlsec/src/gnutls/kw_des.c \
xmlsec/src/gnutls/signatures.c \
xmlsec/src/gnutls/symkeys.c \
xmlsec/src/gnutls/x509.c \
xmlsec/src/gnutls/x509utils.c \
xmlsec/src/gnutls/x509vfy.c
}
use_mscrypto {
DEFINES += XMLSEC_CRYPTO_MSCRYPTO
HEADERS += \
xmlsec/include/xmlsec/mscrypto/app.h \
xmlsec/include/xmlsec/mscrypto/certkeys.h \
xmlsec/include/xmlsec/mscrypto/crypto.h \
xmlsec/include/xmlsec/mscrypto/keysstore.h \
xmlsec/include/xmlsec/mscrypto/symbols.h \
xmlsec/include/xmlsec/mscrypto/x509.h \
\
xmlsec/src/mscrypto/csp_calg.h \
xmlsec/src/mscrypto/csp_oid.h \
xmlsec/src/mscrypto/globals.h \
xmlsec/src/mscrypto/private.h \
xmlsec/src/mscrypto/xmlsec-mingw.h
SOURCES += \
xmlsec/src/mscrypto/app.c \
xmlsec/src/mscrypto/certkeys.c \
xmlsec/src/mscrypto/ciphers.c \
xmlsec/src/mscrypto/crypto.c \
xmlsec/src/mscrypto/digests.c \
xmlsec/src/mscrypto/hmac.c \
xmlsec/src/mscrypto/keysstore.c \
xmlsec/src/mscrypto/kt_rsa.c \
xmlsec/src/mscrypto/kw_aes.c \
xmlsec/src/mscrypto/kw_des.c \
xmlsec/src/mscrypto/signatures.c \
xmlsec/src/mscrypto/symkeys.c \
xmlsec/src/mscrypto/x509.c \
xmlsec/src/mscrypto/x509vfy.c
}
use_nss {
HEADERS += \
xmlsec/include/xmlsec/nss/app.h \
xmlsec/include/xmlsec/nss/bignum.h \
xmlsec/include/xmlsec/nss/crypto.h \
xmlsec/include/xmlsec/nss/keysstore.h \
xmlsec/include/xmlsec/nss/pkikeys.h \
xmlsec/include/xmlsec/nss/symbols.h \
xmlsec/include/xmlsec/nss/x509.h \
\
xmlsec/src/nss/globals.h
SOURCES += \
xmlsec/src/nss/app.c \
xmlsec/src/nss/bignum.c \
xmlsec/src/nss/ciphers.c \
xmlsec/src/nss/crypto.c \
xmlsec/src/nss/digests.c \
xmlsec/src/nss/hmac.c \
xmlsec/src/nss/keysstore.c \
xmlsec/src/nss/keytrans.c \
xmlsec/src/nss/kw_aes.c \
xmlsec/src/nss/kw_des.c \
xmlsec/src/nss/pkikeys.c \
xmlsec/src/nss/signatures.c \
xmlsec/src/nss/symkeys.c \
xmlsec/src/nss/x509.c \
xmlsec/src/nss/x509vfy.c
}
use_openssl {
DEFINES += XMLSEC_OPENSSL_110
INCLUDEPATH += $$PWD/openssl/include
HEADERS += \
xmlsec/include/xmlsec/openssl/app.h \
xmlsec/include/xmlsec/openssl/bn.h \
xmlsec/include/xmlsec/openssl/crypto.h \
xmlsec/include/xmlsec/openssl/evp.h \
xmlsec/include/xmlsec/openssl/symbols.h \
xmlsec/include/xmlsec/openssl/x509.h \
\
xmlsec/src/openssl/globals.h \
xmlsec/src/openssl/openssl11_wrapper.h
SOURCES += \
xmlsec/src/openssl/_app.c \
xmlsec/src/openssl/_bn.c \
xmlsec/src/openssl/_ciphers.c \
xmlsec/src/openssl/_crypto.c \
xmlsec/src/openssl/_digests.c \
xmlsec/src/openssl/_evp.c \
xmlsec/src/openssl/_evp_signatures.c \
xmlsec/src/openssl/_hmac.c \
xmlsec/src/openssl/_kt_rsa.c \
xmlsec/src/openssl/_kw_aes.c \
xmlsec/src/openssl/_kw_des.c \
xmlsec/src/openssl/_signatures.c \
xmlsec/src/openssl/_symkeys.c \
xmlsec/src/openssl/_x509.c \
xmlsec/src/openssl/_x509vfy.c
}
use_skeleton {
HEADERS += \
xmlsec/include/xmlsec/skeleton/app.h \
xmlsec/include/xmlsec/skeleton/crypto.h \
xmlsec/include/xmlsec/skeleton/symbols.h \
\
xmlsec/src/skeleton/globals.h
SOURCES += \
xmlsec/src/skeleton/app.c \
xmlsec/src/skeleton/crypto.c
}
use_xslt {
HEADERS += \
xmlsec/include/xmlsec/private/xslt.h
SOURCES += \
xmlsec/src/xslt.c
} else {
DEFINES += \
XMLSEC_NO_XSLT
}

View File

@ -7,23 +7,23 @@ class COOXMLSigner_private;
class OPENSSL_DECL COOXMLSigner
{
public:
COOXMLSigner(const std::wstring& sFolder, ICertificate* pContext);
COOXMLSigner(unsigned char* data, unsigned long length, ICertificate* pContext);
~COOXMLSigner();
COOXMLSigner(const std::wstring& sFolder, ICertificate* pContext);
COOXMLSigner(unsigned char* data, unsigned long length, ICertificate* pContext);
~COOXMLSigner();
void SetGuid (const std::wstring& guid);
void SetImageValid (const std::wstring& file);
void SetImageInvalid(const std::wstring& file);
void SetImageValid (unsigned char* data, unsigned long length);
void SetImageInvalid(unsigned char* data, unsigned long length);
void SetGuid (const std::wstring& guid);
void SetImageValid (const std::wstring& file);
void SetImageInvalid(const std::wstring& file);
void SetImageValid (unsigned char* data, unsigned long length);
void SetImageInvalid(unsigned char* data, unsigned long length);
int Sign(unsigned char*& pFiletoWrite, unsigned long& dwLenFiletoWrite);
int Sign(unsigned char*& pFiletoWrite, unsigned long& dwLenFiletoWrite);
// Simle alias to Sign(data, len) for folder realization
int Sign();
// Simle alias to Sign(data, len) for folder realization
int Sign();
private:
COOXMLSigner_private* m_internal;
COOXMLSigner_private* m_internal;
};
#endif //_XML_OOXMLSIGNER_H_

View File

@ -7,48 +7,49 @@
#define OOXML_SIGNATURE_INVALID 1
#define OOXML_SIGNATURE_NOTSUPPORTED 2
#define OOXML_SIGNATURE_BAD 3
#define OOXML_SIGNATURE_PARTIALLY 4
class COOXMLSignature_private;
class OPENSSL_DECL COOXMLSignature
{
public:
COOXMLSignature();
~COOXMLSignature();
COOXMLSignature();
~COOXMLSignature();
public:
int GetValid();
std::string GetGuid();
std::string GetDate();
ICertificate* GetCertificate();
std::string GetImageValidBase64();
std::string GetImageInvalidBase64();
int GetValid();
std::string GetGuid();
std::string GetDate();
ICertificate* GetCertificate();
std::string GetImageValidBase64();
std::string GetImageInvalidBase64();
std::wstring GetFile();
std::wstring GetFile();
public:
void Check();
void Check();
friend class COOXMLVerifier_private;
friend class COOXMLVerifier;
friend class COOXMLVerifier_private;
friend class COOXMLVerifier;
private:
COOXMLSignature_private* m_internal;
COOXMLSignature_private* m_internal;
};
class COOXMLVerifier_private;
class Q_DECL_EXPORT COOXMLVerifier
{
public:
COOXMLVerifier(const std::wstring& sFolder);
COOXMLVerifier(unsigned char* data, unsigned long length);
~COOXMLVerifier();
COOXMLVerifier(const std::wstring& sFolder);
COOXMLVerifier(unsigned char* data, unsigned long length);
~COOXMLVerifier();
int GetSignatureCount();
COOXMLSignature* GetSignature(const int& index);
int GetSignatureCount();
COOXMLSignature* GetSignature(const int& index);
void RemoveSignature(const std::string& sGuid);
void RemoveSignature(const std::string& sGuid);
private:
COOXMLVerifier_private* m_internal;
COOXMLVerifier_private* m_internal;
};
#endif //_XML_OOXMLVERIFIER_H_

View File

@ -27,6 +27,7 @@ HEADERS += \
src/XmlTransform.h
SOURCES += \
src/common.h \
src/XmlTransform.cpp \
src/CertificateCommon.cpp \
src/OOXMLSigner.cpp \

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -5,213 +5,258 @@
#include "../../../common/File.h"
#include "../../../common/Directory.h"
#include "../../../../OfficeUtils/src/ZipFolder.h"
#include <set>
class CManifestFileInfo
{
public:
IFolder* m_pFolder;
protected:
std::wstring m_sFile;
std::wstring m_sAliasDirectory;
int m_nCountUnexistedFile;
public:
CManifestFileInfo()
{
m_pFolder = NULL;
m_sFile = L"";
m_nCountUnexistedFile = 0;
}
std::wstring& GetFilePath()
{
return m_sFile;
}
void SetFilePath(const std::wstring& sFilePath)
{
m_sFile = sFilePath;
m_sAliasDirectory = NSFile::GetDirectoryName(sFilePath);
m_sAliasDirectory = NSFile::GetDirectoryName(m_sAliasDirectory); // ../ from _rels/
}
void CheckAliasExist(const std::wstring& sFile)
{
if (!m_pFolder->exists(GetHeadPath(sFile)))
++m_nCountUnexistedFile;
}
bool IsExitRemovedFile()
{
return (0 != m_nCountUnexistedFile) ? true : false;
}
std::wstring GetHeadPath(const std::wstring& sFile)
{
return m_sAliasDirectory + L"/" + sFile;
}
};
class COOXMLRelationship
{
public:
std::wstring rid;
std::wstring type;
std::wstring target;
std::wstring target_mode;
std::wstring rid;
std::wstring type;
std::wstring target;
std::wstring target_mode;
public:
COOXMLRelationship()
{
}
COOXMLRelationship()
{
}
COOXMLRelationship(XmlUtils::CXmlNode& node)
{
rid = node.GetAttribute("Id");
type = node.GetAttribute("Type");
target = node.GetAttribute("Target");
target_mode = node.GetAttribute("TargetMode");
COOXMLRelationship(XmlUtils::CXmlNode& node)
{
rid = node.GetAttribute("Id");
type = node.GetAttribute("Type");
target = node.GetAttribute("Target");
target_mode = node.GetAttribute("TargetMode");
CheckTargetMode();
}
CheckTargetMode();
}
std::wstring GetXml()
{
NSStringUtils::CStringBuilder builder;
builder.WriteString(L"<Relationship Id=\"");
builder.WriteEncodeXmlString(rid);
builder.WriteString(L"\" Type=\"");
builder.WriteEncodeXmlString(type);
builder.WriteString(L"\" Target=\"");
builder.WriteEncodeXmlString(target);
builder.WriteString(L"\" TargetMode=\"");
builder.WriteEncodeXmlString(target_mode);
builder.WriteString(L"\" />");
return builder.GetData();
}
std::wstring GetXml()
{
NSStringUtils::CStringBuilder builder;
builder.WriteString(L"<Relationship Id=\"");
builder.WriteEncodeXmlString(rid);
builder.WriteString(L"\" Type=\"");
builder.WriteEncodeXmlString(type);
builder.WriteString(L"\" Target=\"");
builder.WriteEncodeXmlString(target);
builder.WriteString(L"\" TargetMode=\"");
builder.WriteEncodeXmlString(target_mode);
builder.WriteString(L"\" />");
return builder.GetData();
}
static bool Compare(const COOXMLRelationship& i, const COOXMLRelationship& j)
{
return i.rid < j.rid;
}
static bool Compare(const COOXMLRelationship& i, const COOXMLRelationship& j)
{
return i.rid < j.rid;
}
protected:
void CheckTargetMode()
{
if (!target_mode.empty())
return;
void CheckTargetMode()
{
if (!target_mode.empty())
return;
if (0 == target.find(L"http") || 0 == target.find(L"www") || 0 == target.find(L"ftp"))
target_mode = L"External";
else
target_mode = L"Internal";
}
if (0 == target.find(L"http") || 0 == target.find(L"www") || 0 == target.find(L"ftp"))
target_mode = L"External";
else
target_mode = L"Internal";
}
};
class COOXMLRelationships
{
public:
std::vector<COOXMLRelationship> rels;
IFolder* m_pFolder;
std::vector<COOXMLRelationship> rels;
CManifestFileInfo* m_pFileInfo;
public:
COOXMLRelationships()
{
m_pFolder = NULL;
}
COOXMLRelationships()
{
}
COOXMLRelationships(const std::string& xml, std::map<std::wstring, bool>* check_need = NULL)
{
XmlUtils::CXmlNode oNode;
if (!oNode.FromXmlStringA(xml))
return;
COOXMLRelationships(const std::string& xml, CManifestFileInfo* pFileInfo, std::set<std::wstring>* check_need = NULL)
{
m_pFileInfo = pFileInfo;
XmlUtils::CXmlNode oNode;
if (!oNode.FromXmlStringA(xml))
return;
FromXmlNode(oNode, check_need);
}
FromXmlNode(oNode, check_need);
}
COOXMLRelationships(const std::wstring& xml, IFolder* pFolder, std::map<std::wstring, bool>* check_need = NULL)
{
XmlUtils::CXmlNode oNode;
COOXMLRelationships(CManifestFileInfo* pFileInfo, std::set<std::wstring>* check_need = NULL)
{
m_pFileInfo = pFileInfo;
if (NULL == pFolder)
{
if (!oNode.FromXmlString(xml))
return;
}
else
{
m_pFolder = pFolder;
oNode = pFolder->getNodeFromFile(xml);
if (!oNode.IsValid())
return;
}
if (!m_pFileInfo || NULL == m_pFileInfo->m_pFolder)
return;
FromXmlNode(oNode, check_need);
}
XmlUtils::CXmlNode oNode = m_pFileInfo->m_pFolder->getNodeFromFile(m_pFileInfo->GetFilePath());
if (!oNode.IsValid())
return;
void FromXmlNode(XmlUtils::CXmlNode& oNode, std::map<std::wstring, bool>* check_need = NULL)
{
std::vector<XmlUtils::CXmlNode> oNodes;
if (!oNode.GetNodes(L"Relationship", oNodes))
return;
FromXmlNode(oNode, check_need);
}
size_t nCount = oNodes.size();
for (size_t i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode &oRel = oNodes[i];
void FromXmlNode(XmlUtils::CXmlNode& oNode, std::set<std::wstring>* check_need = NULL)
{
std::vector<XmlUtils::CXmlNode> oNodes = oNode.GetNodes(L"Relationship");
size_t nCount = oNodes.size();
for (size_t i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode oRel = oNodes[i];
if (NULL == check_need)
{
rels.push_back(COOXMLRelationship(oRel));
}
else
{
std::wstring sRid = oRel.GetAttribute("Id");
if (check_need->find(sRid) != check_need->end())
rels.push_back(COOXMLRelationship(oRel));
}
}
}
COOXMLRelationship oCurrentRel(oRel);
if (NULL == check_need)
{
rels.push_back(oCurrentRel);
}
else
{
std::wstring sRid = oRel.GetAttribute("Id");
if (check_need->find(sRid) != check_need->end())
rels.push_back(oCurrentRel);
}
std::wstring GetXml()
{
NSStringUtils::CStringBuilder builder;
if (oCurrentRel.target_mode == L"Internal")
{
m_pFileInfo->CheckAliasExist(oCurrentRel.target);
}
}
}
builder.WriteString(L"<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">");
std::wstring GetXml()
{
NSStringUtils::CStringBuilder builder;
// sort by rId
std::sort(rels.begin(), rels.end(), COOXMLRelationship::Compare);
builder.WriteString(L"<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">");
for (std::vector<COOXMLRelationship>::iterator i = rels.begin(); i != rels.end(); i++)
builder.WriteString(i->GetXml());
// sort by rId
std::sort(rels.begin(), rels.end(), COOXMLRelationship::Compare);
builder.WriteString(L"</Relationships>");
for (std::vector<COOXMLRelationship>::iterator i = rels.begin(); i != rels.end(); i++)
builder.WriteString(i->GetXml());
return builder.GetData();
}
builder.WriteString(L"</Relationships>");
std::wstring GetTransforms()
{
NSStringUtils::CStringBuilder builder;
return builder.GetData();
}
builder.WriteString(L"<Transforms><Transform Algorithm=\"http://schemas.openxmlformats.org/package/2006/RelationshipTransform\">");
std::wstring GetTransforms()
{
NSStringUtils::CStringBuilder builder;
for (std::vector<COOXMLRelationship>::iterator i = rels.begin(); i != rels.end(); i++)
{
builder.WriteString(L"<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"");
builder.WriteEncodeXmlString(i->rid);
builder.WriteString(L"\" />");
}
builder.WriteString(L"<Transforms><Transform Algorithm=\"http://schemas.openxmlformats.org/package/2006/RelationshipTransform\">");
builder.WriteString(L"</Transform><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/></Transforms>");
for (std::vector<COOXMLRelationship>::iterator i = rels.begin(); i != rels.end(); i++)
{
builder.WriteString(L"<mdssi:RelationshipReference xmlns:mdssi=\"http://schemas.openxmlformats.org/package/2006/digital-signature\" SourceId=\"");
builder.WriteEncodeXmlString(i->rid);
builder.WriteString(L"\" />");
}
return builder.GetData();
}
builder.WriteString(L"</Transform><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/></Transforms>");
void CheckOriginSigs(const std::wstring& file)
{
int rId = 0;
std::string sReplace = "";
std::vector<COOXMLRelationship>::iterator i = rels.begin();
while (i != rels.end())
{
if (0 == i->target.find(L"_xmlsignatures/"))
{
sReplace = U_TO_UTF8(i->target);
break;
}
return builder.GetData();
}
std::wstring rid = i->rid;
rid = rid.substr(3);
void CheckOriginSigs(const std::wstring& file)
{
int rId = 0;
std::string sReplace = "";
std::vector<COOXMLRelationship>::iterator i = rels.begin();
while (i != rels.end())
{
if (0 == i->target.find(L"_xmlsignatures/"))
{
sReplace = U_TO_UTF8(i->target);
break;
}
int nTemp = std::stoi(rid);
std::wstring rid = i->rid;
rid = rid.substr(3);
if (nTemp > rId)
rId = nTemp;
int nTemp = std::stoi(rid);
i++;
}
if (nTemp > rId)
rId = nTemp;
if (!sReplace.empty())
{
if (sReplace == "_xmlsignatures/origin.sigs")
return;
i++;
}
std::string sXmlA = m_pFolder->readXml(file);
NSStringUtils::string_replaceA(sXmlA, sReplace, "_xmlsignatures/origin.sigs");
m_pFolder->writeXmlA(file, sXmlA);
return;
}
if (!sReplace.empty())
{
if (sReplace == "_xmlsignatures/origin.sigs")
return;
std::string sXmlA = m_pFolder->readXml(file);
std::string sXmlA = m_pFileInfo->m_pFolder->readXml(file);
NSStringUtils::string_replaceA(sXmlA, sReplace, "_xmlsignatures/origin.sigs");
m_pFileInfo->m_pFolder->writeXmlA(file, sXmlA);
return;
}
std::string::size_type pos = sXmlA.rfind("</Relationships>");
if (pos == std::string::npos)
return;
std::string sXmlA = m_pFileInfo->m_pFolder->readXml(file);
rId++;
std::string sRet = sXmlA.substr(0, pos);
sRet += ("<Relationship Id=\"rId" + std::to_string(rId) + "\" \
std::string::size_type pos = sXmlA.rfind("</Relationships>");
if (pos == std::string::npos)
return;
rId++;
std::string sRet = sXmlA.substr(0, pos);
sRet += ("<Relationship Id=\"rId" + std::to_string(rId) + "\" \
Type=\"http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/origin\" Target=\"_xmlsignatures/origin.sigs\"/>\
</Relationships>");
m_pFolder->writeXmlA(file, sRet);
}
m_pFileInfo->m_pFolder->writeXmlA(file, sRet);
}
};
#endif //_XML_RELS_H_

View File

@ -1,21 +1,21 @@
#include "./XmlTransform.h"
IXmlTransform* IXmlTransform::GetFromType(const std::string& alg)
IXmlTransform* IXmlTransform::GetFromType(const std::string& alg, CManifestFileInfo* pManifestFileInfo)
{
if (true)
{
CXmlTransformRelationship* transform = new CXmlTransformRelationship();
if (transform->m_algorithm == alg)
return transform;
RELEASEOBJECT(transform);
}
if (true)
{
CXmlTransformC14N* transform = new CXmlTransformC14N();
if (transform->CheckC14NTransform(alg))
return transform;
RELEASEOBJECT(transform);
}
if (true)
{
CXmlTransformRelationship* transform = new CXmlTransformRelationship(pManifestFileInfo);
if (transform->m_algorithm == alg)
return transform;
RELEASEOBJECT(transform);
}
if (true)
{
CXmlTransformC14N* transform = new CXmlTransformC14N();
if (transform->CheckC14NTransform(alg))
return transform;
RELEASEOBJECT(transform);
}
return NULL;
return NULL;
}

View File

@ -6,184 +6,185 @@
class IXmlTransform
{
protected:
std::string m_algorithm;
std::string m_algorithm;
public:
IXmlTransform()
{
m_algorithm = "";
}
virtual ~IXmlTransform()
{
}
IXmlTransform()
{
m_algorithm = "";
}
virtual ~IXmlTransform()
{
}
public:
virtual std::string Transform(const std::string& sXml) = 0;
virtual void LoadFromXml(XmlUtils::CXmlNode& node) = 0;
virtual std::string Transform(const std::string& sXml) = 0;
virtual void LoadFromXml(XmlUtils::CXmlNode& node) = 0;
static IXmlTransform* GetFromType(const std::string& alg);
static IXmlTransform* GetFromType(const std::string& alg, CManifestFileInfo* pManifestFileInfo);
};
class CXmlTransformRelationship : public IXmlTransform
{
protected:
std::map<std::wstring, bool> m_arIds;
CManifestFileInfo* m_pManifestFileInfo;
std::set<std::wstring> m_arIds;
public:
CXmlTransformRelationship() : IXmlTransform()
{
m_algorithm = "http://schemas.openxmlformats.org/package/2006/RelationshipTransform";
}
CXmlTransformRelationship(CManifestFileInfo* pManifestFileInfo) : IXmlTransform()
{
m_pManifestFileInfo = pManifestFileInfo;
m_algorithm = "http://schemas.openxmlformats.org/package/2006/RelationshipTransform";
}
virtual std::string Transform(const std::string& xml)
{
COOXMLRelationships _rels(xml, &m_arIds);
return U_TO_UTF8(_rels.GetXml());
}
virtual std::string Transform(const std::string& xml)
{
COOXMLRelationships _rels(xml, m_pManifestFileInfo, &m_arIds);
return U_TO_UTF8(_rels.GetXml());
}
virtual void LoadFromXml(XmlUtils::CXmlNode& node)
{
std::vector<XmlUtils::CXmlNode> oNodesIds;
node.GetChilds(oNodesIds);
virtual void LoadFromXml(XmlUtils::CXmlNode& node)
{
std::vector<XmlUtils::CXmlNode> oNodesIds;
node.GetChilds(oNodesIds);
size_t nCount = oNodesIds.size();
for (size_t i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode _node = oNodesIds[i];
size_t nCount = oNodesIds.size();
for (size_t i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode& _node = oNodesIds[i];
std::wstring sType = _node.GetAttribute("SourceId");
if (!sType.empty())
m_arIds.insert(std::pair<std::wstring, bool>(sType, true));
}
}
std::wstring sType = _node.GetAttribute("SourceId");
if (!sType.empty())
m_arIds.insert(sType);
}
}
};
class CXmlTransformC14N : public IXmlTransform
{
protected:
int m_mode;
bool m_comments;
int m_mode;
bool m_comments;
public:
CXmlTransformC14N() : IXmlTransform()
{
m_mode = -1;
m_comments = false;
}
CXmlTransformC14N() : IXmlTransform()
{
m_mode = -1;
m_comments = false;
}
bool CheckC14NTransform(const std::string& alg)
{
m_mode = -1;
if ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315" == alg)
{
m_mode = XmlUtils::XML_C14N_1_0;
m_comments = false;
}
else if ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments" == alg)
{
m_mode = XmlUtils::XML_C14N_1_0;
m_comments = true;
}
else if ("http://www.w3.org/2006/12/xml-c14n11" == alg)
{
m_mode = XmlUtils::XML_C14N_1_1;
m_comments = false;
}
else if ("http://www.w3.org/2006/12/xml-c14n11#WithComments" == alg)
{
m_mode = XmlUtils::XML_C14N_1_1;
m_comments = true;
}
else if ("http://www.w3.org/2001/10/xml-exc-c14n#" == alg)
{
m_mode = XmlUtils::XML_C14N_EXCLUSIVE_1_0;
m_comments = false;
}
else if ("http://www.w3.org/2001/10/xml-exc-c14n#WithComments" == alg)
{
m_mode = XmlUtils::XML_C14N_EXCLUSIVE_1_0;
m_comments = true;
}
return (-1 != m_mode) ? true : false;
}
bool CheckC14NTransform(const std::string& alg)
{
m_mode = -1;
if ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315" == alg)
{
m_mode = XmlUtils::XML_C14N_1_0;
m_comments = false;
}
else if ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments" == alg)
{
m_mode = XmlUtils::XML_C14N_1_0;
m_comments = true;
}
else if ("http://www.w3.org/2006/12/xml-c14n11" == alg)
{
m_mode = XmlUtils::XML_C14N_1_1;
m_comments = false;
}
else if ("http://www.w3.org/2006/12/xml-c14n11#WithComments" == alg)
{
m_mode = XmlUtils::XML_C14N_1_1;
m_comments = true;
}
else if ("http://www.w3.org/2001/10/xml-exc-c14n#" == alg)
{
m_mode = XmlUtils::XML_C14N_EXCLUSIVE_1_0;
m_comments = false;
}
else if ("http://www.w3.org/2001/10/xml-exc-c14n#WithComments" == alg)
{
m_mode = XmlUtils::XML_C14N_EXCLUSIVE_1_0;
m_comments = true;
}
return (-1 != m_mode) ? true : false;
}
virtual std::string Transform(const std::string& xml)
{
if (-1 == m_mode)
return xml;
return XmlUtils::NSXmlCanonicalizator::Execute(xml, m_mode, m_comments);
}
virtual std::string Transform(const std::string& xml)
{
if (-1 == m_mode)
return xml;
return XmlUtils::NSXmlCanonicalizator::Execute(xml, m_mode, m_comments);
}
virtual void LoadFromXml(XmlUtils::CXmlNode& node)
{
// none
XML_UNUSED(node);
}
virtual void LoadFromXml(XmlUtils::CXmlNode& node)
{
// none
XML_UNUSED(node);
}
};
class CXmlTransforms
{
protected:
std::vector<IXmlTransform*> m_transforms;
bool m_valid;
std::vector<IXmlTransform*> m_transforms;
bool m_valid;
public:
CXmlTransforms()
{
m_valid = true;
}
CXmlTransforms()
{
m_valid = true;
}
CXmlTransforms(XmlUtils::CXmlNode& node)
{
m_valid = true;
CXmlTransforms(XmlUtils::CXmlNode& node, CManifestFileInfo* pManifestInfo)
{
m_valid = true;
std::vector<XmlUtils::CXmlNode> oNodes = node.GetNodes(L"Transform");
size_t nCount = oNodes.size();
for (size_t i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode &nodeTransform = oNodes[i];
std::vector<XmlUtils::CXmlNode> oNodes = node.GetNodes(L"Transform");
size_t nCount = oNodes.size();
for (size_t i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode nodeTransform = oNodes[i];
IXmlTransform* pTransform = IXmlTransform::GetFromType(nodeTransform.GetAttributeA("Algorithm"));
if (NULL == pTransform)
{
m_valid = false;
return;
}
IXmlTransform* pTransform = IXmlTransform::GetFromType(nodeTransform.GetAttributeA("Algorithm"), pManifestInfo);
if (NULL == pTransform)
{
m_valid = false;
return;
}
pTransform->LoadFromXml(nodeTransform);
m_transforms.push_back(pTransform);
}
}
pTransform->LoadFromXml(nodeTransform);
m_transforms.push_back(pTransform);
}
}
~CXmlTransforms()
{
for (std::vector<IXmlTransform*>::iterator i = m_transforms.begin(); i != m_transforms.end(); i++)
{
IXmlTransform* t = *i;
RELEASEOBJECT(t);
}
m_transforms.clear();
}
~CXmlTransforms()
{
for (std::vector<IXmlTransform*>::iterator i = m_transforms.begin(); i != m_transforms.end(); i++)
{
IXmlTransform* t = *i;
RELEASEOBJECT(t);
}
m_transforms.clear();
}
bool GetValid()
{
return m_valid;
}
bool GetValid()
{
return m_valid;
}
std::string Transform(const std::string& xml)
{
std::string sResult = xml;
for (std::vector<IXmlTransform*>::iterator i = m_transforms.begin(); i != m_transforms.end(); i++)
{
sResult = (*i)->Transform(sResult);
}
return sResult;
}
std::string Transform(const std::string& xml)
{
std::string sResult = xml;
for (std::vector<IXmlTransform*>::iterator i = m_transforms.begin(); i != m_transforms.end(); i++)
{
sResult = (*i)->Transform(sResult);
}
return sResult;
}
void AddTransform(IXmlTransform* transform)
{
m_transforms.push_back(transform);
}
void AddTransform(IXmlTransform* transform)
{
m_transforms.push_back(transform);
}
};
#endif //_XML_TRANSFORM_H_

View File

@ -0,0 +1,92 @@
#pragma once
#include "./../include/CertificateCommon.h"
#include "../../../../OfficeUtils/src/ZipFolder.h"
#include "./XmlTransform.h"
#include <cstdio>
#include <ctime>
#include <time.h>
class CSignFolderFiles
{
public:
std::map<std::wstring, std::wstring> m_content_types;
std::vector<std::wstring> m_rels;
std::vector<std::wstring> m_files;
public:
CSignFolderFiles() {}
~CSignFolderFiles() {}
public:
static bool CheckNeedSign(const std::wstring& sCheckFile)
{
if (0 == sCheckFile.find(L"_xmlsignatures") ||
0 == sCheckFile.find(L"docProps") ||
0 == sCheckFile.find(L"[Content_Types].xml") ||
0 == sCheckFile.find(L"[trash]"))
return false;
return true;
}
void Folder_Parse(IFolder* pFolder, bool bIsAddSlash = false)
{
// 1) Parse files in directory
std::vector<std::wstring> files = pFolder->getFiles(L"", true);
// 2) Check each file
std::wstring sFolder = L"";
for (std::vector<std::wstring>::iterator i = files.begin(); i != files.end(); i++)
{
std::wstring sCheckFile = *i;
// make cool filename
sCheckFile = pFolder->getLocalFilePath(sCheckFile);
// check needed file
if (!CheckNeedSign(sCheckFile))
continue;
// check rels and add to needed array
std::wstring::size_type posExt = sCheckFile.rfind(L".");
if (std::wstring::npos == posExt)
continue;
std::wstring sExt = sCheckFile.substr(posExt + 1);
if (bIsAddSlash)
sCheckFile = L"/" + sCheckFile;
if (sExt == L"rels")
m_rels.push_back(sCheckFile);
else
m_files.push_back(sCheckFile);
}
std::sort(m_rels.begin(), m_rels.end());
std::sort(m_files.begin(), m_files.end());
}
void Folder_ParseContentTypes(IFolder* pFolder)
{
XmlUtils::CXmlNode oNode = pFolder->getNodeFromFile(L"/[Content_Types].xml");
std::vector<XmlUtils::CXmlNode> nodesDefaults = oNode.GetNodes(L"Default");
std::vector<XmlUtils::CXmlNode> nodesOverrides = oNode.GetNodes(L"Override");
size_t nCount = nodesDefaults.size();
for (size_t i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode node = nodesDefaults[i];
m_content_types.insert(std::pair<std::wstring, std::wstring>(node.GetAttribute("Extension"), node.GetAttribute("ContentType")));
}
nCount = nodesOverrides.size();
for (size_t i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode node = nodesOverrides[i];
m_content_types.insert(std::pair<std::wstring, std::wstring>(node.GetAttribute("PartName"), node.GetAttribute("ContentType")));
}
}
};