in xsec/tools/txfmout/txfmout.cpp [356:577]
int main(int argc, char **argv) {
char * filename = NULL;
bool signedInfo = true;
bool references = true;
outputter theOutputter;
int refNum = -1;
if (argc < 2) {
printUsage();
exit (2);
}
// Run through parameters
int paramCount = 1;
while (paramCount < argc - 1) {
if (_stricmp(argv[paramCount], "--signedinfo") == 0 || _stricmp(argv[paramCount], "-s") == 0) {
paramCount++;
references = false;
}
else if (_stricmp(argv[paramCount], "--out") == 0 || _stricmp(argv[paramCount], "-o") == 0) {
paramCount++;
theOutputter.setFilename(argv[paramCount++]);
}
else if (_stricmp(argv[paramCount], "--references") == 0 || _stricmp(argv[paramCount], "-r") == 0) {
paramCount++;
signedInfo = false;
if (argv[paramCount][0] >= '0' && argv[paramCount][0] <= '9')
refNum = atoi(argv[paramCount++]);
}
else if (_stricmp(argv[paramCount], "--newfiles") == 0 || _stricmp(argv[paramCount], "-n") == 0) {
paramCount++;
theOutputter.setNewFilePerOpen();
}
else {
printUsage();
exit(2);
}
}
if (paramCount >= argc) {
printUsage();
exit (2);
}
filename = argv[paramCount];
// Initialise the XML system
try {
XMLPlatformUtils::Initialize();
#ifdef XSEC_HAVE_XALAN
XPathEvaluator::initialize();
XalanTransformer::initialize();
#endif
XSECPlatformUtils::Initialise();
}
catch (const XMLException &e) {
cerr << "Error during initialisation of Xerces" << endl;
cerr << "Error Message = : "
<< e.getMessage() << endl;
}
// Create and set up the parser
XercesDOMParser * parser = new XercesDOMParser;
parser->setDoNamespaces(true);
parser->setCreateEntityReferenceNodes(true);
// Now parse out file
bool errorsOccured = false;
XMLSize_t errorCount = 0;
try
{
parser->parse(filename);
errorCount = parser->getErrorCount();
if (errorCount > 0)
errorsOccured = true;
}
catch (const XMLException& e)
{
cerr << "An error occurred during parsing\n Message: "
<< e.getMessage() << endl;
errorsOccured = true;
}
catch (const DOMException& e)
{
cerr << "A DOM error occurred during parsing\n DOMException code: "
<< e.code << endl;
errorsOccured = true;
}
if (errorsOccured) {
cout << "Errors during parse" << endl;
exit (2);
}
/*
Now that we have the parsed file, get the DOM document and start looking at it
*/
DOMNode *doc; // The document that we parsed
doc = parser->getDocument();
DOMDocument *theDOM = parser->getDocument();
// Find the signature node
DOMNode *sigNode = findDSIGNode(doc, "Signature");
// Create the signature checker
if (sigNode == 0) {
cerr << "Could not find <Signature> node in " << argv[argc-1] << endl;
exit(2);
}
XSECProvider prov;
DSIGSignature * sig = prov.newSignatureFromDOM(theDOM, sigNode);
sig->registerIdAttributeName(MAKE_UNICODE_STRING("ID"));
// Map out base path of the file
#if XSEC_HAVE_GETCWD_DYN
char *path = getcwd(NULL, 0);
char *baseURI = (char*)malloc(strlen(path) + 8 + 1 + strlen(filename) + 1);
#else
char path[PATH_MAX];
char baseURI[(PATH_MAX * 2) + 10];
getcwd(path, PATH_MAX);
#endif
strcpy(baseURI, "file:///");
strcat(baseURI, path);
strcat(baseURI, "/");
strcat(baseURI, filename);
// Find any ':' and "\" characters
int lastSlash = 0;
for (unsigned int i = 8; i < strlen(baseURI); ++i) {
if (baseURI[i] == '\\') {
lastSlash = i;
baseURI[i] = '/';
}
else if (baseURI[i] == '/')
lastSlash = i;
}
// The last "\\" must prefix the filename
baseURI[lastSlash + 1] = '\0';
sig->getURIResolver()->setBaseURI(MAKE_UNICODE_STRING(baseURI));
#if XSEC_HAVE_GETCWD_DYN
free(path);
free(baseURI);
#endif
try {
XSECBinTXFMInputStream * is;
XMLByte buf[1024];
unsigned int sz;
sig->load();
if (references) {
outputReferenceList(sig->getReferenceList(), theOutputter, refNum);
}
if (signedInfo) {
is = sig->makeBinInputStream();
if (is != NULL) {
theOutputter.openSection();
sz = (unsigned int) is->readBytes(buf, 1023);
while (sz != 0) {
buf[sz] = '\0';
theOutputter.output(buf, sz);
sz = (unsigned int) is->readBytes(buf, 1023);
}
theOutputter.closeSection();
delete is;
}
}
}
catch (const XSECException &e) {
char * m = XMLString::transcode(e.getMsg());
cerr << "An error occurred during signature processing\n Message: "
<< m << endl;
XSEC_RELEASE_XMLCH(m);
errorsOccured = true;
exit (2);
}
theOutputter.closeAll();
prov.releaseSignature(sig);
return 0;
}