Skip to content

Commit 82729b4

Browse files
committed
Keep existing filenames (#624)
* Update version number and xmlsec to 1.3.6 IB-7927, Fixes #637, IB-8260 Signed-off-by: Raul Metsma <[email protected]> * Keep existing filenames IB-8168 Signed-off-by: Raul Metsma <[email protected]> --------- Signed-off-by: Raul Metsma <[email protected]>
1 parent 82eee1c commit 82729b4

File tree

7 files changed

+55
-45
lines changed

7 files changed

+55
-45
lines changed

src/ASiC_E.cpp

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,19 @@ using namespace digidoc;
3535
using namespace digidoc::util;
3636
using namespace std;
3737

38-
const string_view ASiC_E::ASIC_TM_PROFILE = "time-mark";
39-
const string_view ASiC_E::ASIC_TS_PROFILE = "time-stamp";
40-
const string_view ASiC_E::ASIC_TSA_PROFILE = "time-stamp-archive";
41-
const string_view ASiC_E::ASIC_TMA_PROFILE = "time-mark-archive";
4238
constexpr string_view MANIFEST_NS {"urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"};
4339

4440
class ASiC_E::Private
4541
{
4642
public:
43+
string unique_name() const
44+
{
45+
string file;
46+
for(unsigned int i = 0; signatures.count(file = Log::format("META-INF/signatures%u.xml", i++)); );
47+
return file;
48+
}
4749
vector<DataFile*> metadata;
50+
map<string,Signatures*> signatures;
4851
};
4952

5053
/**
@@ -57,7 +60,7 @@ ASiC_E::ASiC_E()
5760
}
5861

5962
/**
60-
* Opens BDOC container from a file
63+
* Opens ASiC container from a file
6164
*/
6265
ASiC_E::ASiC_E(const string &path)
6366
: ASiContainer(MIMETYPE_ASIC_E)
@@ -101,24 +104,28 @@ void ASiC_E::save(const string &path)
101104
s.addFile("mimetype", mimetype, zproperty("mimetype"), false);
102105

103106
stringstream manifest;
104-
createManifest(manifest);
107+
if(!createManifest().save(manifest))
108+
THROW("Failed to create manifest XML");
105109
s.addFile("META-INF/manifest.xml", manifest, zproperty("META-INF/manifest.xml"));
106110

107111
for(const DataFile *file: dataFiles())
108112
s.addFile(file->fileName(), *(static_cast<const DataFilePrivate*>(file)->m_is), zproperty(file->fileName()));
109113

110114
std::set<Signatures*> saved;
111-
unsigned int i = 0;
112115
for(Signature *iter: signatures())
113116
{
114-
string file = Log::format("META-INF/signatures%u.xml", i++);
115-
auto *signature = static_cast<SignatureXAdES_B*>(iter);
116-
if(!saved.insert(signature->signatures.get()).second)
117+
auto *signatures = static_cast<SignatureXAdES_B*>(iter)->signatures.get();
118+
if(!saved.insert(signatures).second)
117119
continue;
120+
auto name = find_if(d->signatures.cbegin(), d->signatures.cend(), [signatures](const auto &k){
121+
return k.second == signatures;
122+
});
123+
if(name == d->signatures.cend())
124+
THROW("Unkown signature object");
118125
stringstream ofs;
119-
if(!signature->signatures->save(ofs))
126+
if(!signatures->save(ofs))
120127
THROW("Failed to create signature XML file.");
121-
s.addFile(file, ofs, zproperty(file));
128+
s.addFile(name->first, ofs, zproperty(name->first));
122129
}
123130
}
124131

@@ -142,12 +149,9 @@ void ASiC_E::addAdESSignature(istream &data)
142149
THROW("No documents in container, can not add signature.");
143150
if(mediaType() != MIMETYPE_ASIC_E)
144151
THROW("'%s' format is not supported", mediaType().c_str());
145-
146152
try
147153
{
148-
auto signatures = make_shared<Signatures>(data, this);
149-
for(auto s = signatures->signature(); s; s++)
150-
addSignature(make_unique<SignatureXAdES_LTA>(signatures, s, this));
154+
loadSignatures(data, d->unique_name());
151155
}
152156
catch(const Exception &e)
153157
{
@@ -164,14 +168,10 @@ unique_ptr<Container> ASiC_E::openInternal(const string &path)
164168
/**
165169
* Creates BDoc container manifest file and returns its path.
166170
*
167-
* Note: If non-ascii characters are present in XML data, we depend on the LANG variable to be set properly
168-
* (see iconv --list for the list of supported encoding values for libiconv).
169-
*
170-
*
171171
* @return returns created manifest file path.
172172
* @throws Exception exception is thrown if manifest file creation failed.
173173
*/
174-
void ASiC_E::createManifest(ostream &os)
174+
XMLDocument ASiC_E::createManifest() const
175175
{
176176
DEBUG("ASiC_E::createManifest()");
177177
auto doc = XMLDocument::create("manifest", MANIFEST_NS, "manifest");
@@ -184,8 +184,15 @@ void ASiC_E::createManifest(ostream &os)
184184
add("/", mediaType());
185185
for(const DataFile *file: dataFiles())
186186
add(file->fileName(), file->mediaType());
187-
if(!doc.save(os))
188-
THROW("Failed to create manifest XML");
187+
return doc;
188+
}
189+
190+
void ASiC_E::loadSignatures(istream &data, const string &file)
191+
{
192+
auto signatures = make_shared<Signatures>(data, mediaType());
193+
d->signatures.emplace(file, signatures.get());
194+
for(auto s = signatures->signature(); s; s++)
195+
addSignature(make_unique<SignatureXAdES_LTA>(signatures, s, this));
189196
}
190197

191198
/**
@@ -251,9 +258,7 @@ void ASiC_E::parseManifestAndLoadFiles(const ZipSerialize &z)
251258
try
252259
{
253260
auto data = z.extract<stringstream>(file);
254-
auto signatures = make_shared<Signatures>(data, this);
255-
for(auto s = signatures->signature(); s; s++)
256-
addSignature(make_unique<SignatureXAdES_LTA>(signatures, s, this));
261+
loadSignatures(data, file);
257262
}
258263
catch(const Exception &e)
259264
{
@@ -286,7 +291,9 @@ Signature* ASiC_E::prepareSignature(Signer *signer)
286291
THROW("No documents in container, can not sign container.");
287292
if(!signer)
288293
THROW("Null pointer in ASiC_E::sign");
289-
return addSignature(make_unique<SignatureXAdES_LTA>(newSignatureId(), this, signer));
294+
auto signatures = make_shared<Signatures>();
295+
d->signatures.emplace(d->unique_name(), signatures.get());
296+
return addSignature(make_unique<SignatureXAdES_LTA>(signatures, newSignatureId(), this, signer));
290297
}
291298

292299
Signature *ASiC_E::sign(Signer* signer)

src/ASiC_E.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
namespace digidoc
2525
{
26+
struct XMLDocument;
27+
2628
/**
2729
* Implements the BDOC specification of the signed digital document container.
2830
* Container can contain several files and all these files can be signed using
@@ -34,10 +36,10 @@ namespace digidoc
3436
class ASiC_E final : public ASiContainer
3537
{
3638
public:
37-
static const std::string_view ASIC_TM_PROFILE;
38-
static const std::string_view ASIC_TS_PROFILE;
39-
static const std::string_view ASIC_TMA_PROFILE;
40-
static const std::string_view ASIC_TSA_PROFILE;
39+
static constexpr std::string_view ASIC_TM_PROFILE = "time-mark";
40+
static constexpr std::string_view ASIC_TS_PROFILE = "time-stamp";
41+
static constexpr std::string_view ASIC_TMA_PROFILE = "time-mark-archive";
42+
static constexpr std::string_view ASIC_TSA_PROFILE = "time-stamp-archive";
4143

4244
~ASiC_E() final;
4345
void save(const std::string &path = {}) final;
@@ -54,7 +56,8 @@ namespace digidoc
5456
ASiC_E();
5557
ASiC_E(const std::string &path);
5658
DISABLE_COPY(ASiC_E);
57-
void createManifest(std::ostream &os);
59+
XMLDocument createManifest() const;
60+
void loadSignatures(std::istream &data, const std::string &file);
5861
void parseManifestAndLoadFiles(const ZipSerialize &z);
5962

6063
class Private;

src/ASiC_S.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ ASiC_S::ASiC_S(const string &path): ASiContainer(MIMETYPE_ASIC_S)
6161
if(!signatures().empty())
6262
THROW("Can not add signature to ASiC-S container which already contains a signature.");
6363
auto data = z.extract<stringstream>(file);
64-
auto signatures = make_shared<Signatures>(data, this);
64+
auto signatures = make_shared<Signatures>(data, mediaType());
6565
for(auto s = signatures->signature(); s; s++)
6666
addSignature(make_unique<SignatureXAdES_LTA>(signatures, s, this));
6767
}

src/SignatureXAdES_B.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ int initXmlSecCallback()
190190
return is;
191191
},
192192
[](void *ctx, char *buf, int len) -> int {
193-
auto *is = static_cast<std::istream*>(ctx);
193+
auto *is = static_cast<istream*>(ctx);
194194
is->read(buf, len);
195195
return int(is->gcount());
196196
},
@@ -207,7 +207,7 @@ Signatures::Signatures()
207207
addNS(XADES_NS, "xades");
208208
}
209209

210-
Signatures::Signatures(istream &data, ASiContainer *container)
210+
Signatures::Signatures(istream &data, string_view mediaType)
211211
: XMLDocument(openStream(data))
212212
{
213213
/* http://www.etsi.org/deliver/etsi_ts/102900_102999/102918/01.03.01_60/ts_102918v010301p.pdf
@@ -219,7 +219,7 @@ Signatures::Signatures(istream &data, ASiContainer *container)
219219
* Case container is ADoc 1.0 then handle document-signatures root element
220220
*/
221221
try {
222-
if(container->mediaType() == ASiC_E::MIMETYPE_ADOC && name() == "document-signatures" && ns() == OPENDOCUMENT_NS)
222+
if(mediaType == ASiC_E::MIMETYPE_ADOC && name() == "document-signatures" && ns() == OPENDOCUMENT_NS)
223223
validateSchema(File::path(Conf::instance()->xsdPath(), "OpenDocument_dsig.xsd"));
224224
else
225225
validateSchema(File::path(Conf::instance()->xsdPath(), "en_31916201v010101.xsd"));
@@ -234,8 +234,8 @@ Signatures::Signatures(istream &data, ASiContainer *container)
234234
/**
235235
* Creates an empty BDOC-BES signature with mandatory XML nodes.
236236
*/
237-
SignatureXAdES_B::SignatureXAdES_B(unsigned int id, ASiContainer *container, Signer *signer)
238-
: signatures(make_shared<Signatures>())
237+
SignatureXAdES_B::SignatureXAdES_B(const shared_ptr<Signatures> &signatures, unsigned int id, ASiContainer *container, Signer *signer)
238+
: signatures(signatures)
239239
, bdoc(container)
240240
{
241241
X509Cert c = signer->cert();
@@ -295,7 +295,7 @@ SignatureXAdES_B::SignatureXAdES_B(unsigned int id, ASiContainer *container, Sig
295295
* @param bdoc BDOC container
296296
* @throws SignatureException
297297
*/
298-
SignatureXAdES_B::SignatureXAdES_B(const std::shared_ptr<Signatures> &signatures, XMLNode s, ASiContainer *container)
298+
SignatureXAdES_B::SignatureXAdES_B(const shared_ptr<Signatures> &signatures, XMLNode s, ASiContainer *container)
299299
: signatures(signatures)
300300
, signature(s)
301301
, bdoc(container)

src/SignatureXAdES_B.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ namespace digidoc
4343
{
4444
public:
4545
explicit Signatures();
46-
Signatures(std::istream &data, ASiContainer *container);
46+
Signatures(std::istream &data, std::string_view mediaType);
4747

4848
constexpr XMLNode signature() const noexcept
4949
{
@@ -55,7 +55,7 @@ namespace digidoc
5555
{
5656

5757
public:
58-
SignatureXAdES_B(unsigned int id, ASiContainer *bdoc, Signer *signer);
58+
SignatureXAdES_B(const std::shared_ptr<Signatures> &signatures, unsigned int id, ASiContainer *bdoc, Signer *signer);
5959
SignatureXAdES_B(const std::shared_ptr<Signatures> &signatures, XMLNode s, ASiContainer *container);
6060
~SignatureXAdES_B();
6161

src/SignatureXAdES_LT.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@
3535
using namespace digidoc;
3636
using namespace std;
3737

38-
SignatureXAdES_LT::SignatureXAdES_LT(unsigned int id, ASiContainer *bdoc, Signer *signer)
39-
: SignatureXAdES_T(id, bdoc, signer)
38+
SignatureXAdES_LT::SignatureXAdES_LT(const shared_ptr<Signatures> &signatures, unsigned int id, ASiContainer *bdoc, Signer *signer)
39+
: SignatureXAdES_T(signatures, id, bdoc, signer)
4040
{}
4141

42-
SignatureXAdES_LT::SignatureXAdES_LT(const std::shared_ptr<Signatures> &signatures, XMLNode s, ASiContainer *container)
42+
SignatureXAdES_LT::SignatureXAdES_LT(const shared_ptr<Signatures> &signatures, XMLNode s, ASiContainer *container)
4343
: SignatureXAdES_T(signatures, s, container)
4444
{
4545
try {

src/SignatureXAdES_LT.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class OCSP;
2929
class SignatureXAdES_LT: public SignatureXAdES_T
3030
{
3131
public:
32-
SignatureXAdES_LT(unsigned int id, ASiContainer *bdoc, Signer *signer);
32+
SignatureXAdES_LT(const std::shared_ptr<Signatures> &signatures, unsigned int id, ASiContainer *bdoc, Signer *signer);
3333
SignatureXAdES_LT(const std::shared_ptr<Signatures> &signatures, XMLNode s, ASiContainer *container);
3434

3535
std::string trustedSigningTime() const override;

0 commit comments

Comments
 (0)