summaryrefslogtreecommitdiff
path: root/cpp/src/IceSSL/ConfigParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceSSL/ConfigParser.cpp')
-rw-r--r--cpp/src/IceSSL/ConfigParser.cpp478
1 files changed, 0 insertions, 478 deletions
diff --git a/cpp/src/IceSSL/ConfigParser.cpp b/cpp/src/IceSSL/ConfigParser.cpp
deleted file mode 100644
index 443bb22d9a9..00000000000
--- a/cpp/src/IceSSL/ConfigParser.cpp
+++ /dev/null
@@ -1,478 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved.
-//
-// This copy of Ice is licensed to you under the terms described in the
-// ICE_LICENSE file included in this distribution.
-//
-// **********************************************************************
-
-#include <IceSSL/ConfigParser.h>
-#include <IceSSL/OpenSSL.h>
-#include <IceSSL/Exception.h>
-
-#include <algorithm>
-
-using namespace std;
-using namespace IceSSL;
-
-#ifdef WINDOWS
- #define CURRENTDIR ".\\"
-#else
- #define CURRENTDIR "./"
-#endif
-
-//
-// Public Methods
-//
-
-IceSSL::ConfigParser::ConfigParser(const string& configFile, const TraceLevelsPtr& traceLevels,
- const Ice::LoggerPtr& logger) :
- _root(0),
- _configFile(configFile),
- _configPath(CURRENTDIR),
- _traceLevels(traceLevels),
- _logger(logger)
-{
- assert(!configFile.empty());
-}
-
-IceSSL::ConfigParser::ConfigParser(const string& configFile, const string& configPath,
- const TraceLevelsPtr& traceLevels, const Ice::LoggerPtr& logger) :
- _root(0),
- _configFile(configFile),
- _configPath(configPath),
- _traceLevels(traceLevels),
- _logger(logger)
-{
- assert(!configFile.empty());
- assert(!configPath.empty());
-}
-
-IceSSL::ConfigParser::~ConfigParser()
-{
-}
-
-void
-IceSSL::ConfigParser::process()
-{
- try
- {
- string configFile;
- if(!isAbsolutePath(_configFile))
- {
- // TODO: ML: _configPath.back();
- // ASN: There is no back() method in basic_string.
-#ifdef WINDOWS
- if(*(_configPath.rbegin()) != '\\')
- {
- _configPath += "\\";
- }
-#else
- if(*(_configPath.rbegin()) != '/')
- {
- _configPath += "/";
- }
-#endif
-
- configFile = _configPath + _configFile;
- }
- else
- {
- configFile = _configFile;
- }
-
- _root = IceXML::Parser::parse(configFile);
- }
- catch(const IceXML::ParserException& e)
- {
- ConfigParseException configEx(__FILE__, __LINE__);
-
- ostringstream s;
- s << "error while parsing " << _configFile << ":\n";
- e.ice_print(s);
-
- configEx.message = s.str();
-
- throw configEx;
- }
- catch(...)
- {
- ConfigParseException configEx(__FILE__, __LINE__);
-
- // occured during parsing". The latter is redundant, given
- // that it already says "while parsing".
- configEx.message = "while parsing " + _configFile + ":\n" + "unknown exception occured during parsing";
-
- throw configEx;
- }
-}
-
-bool
-IceSSL::ConfigParser::loadClientConfig(GeneralConfig& general,
- CertificateAuthority& certAuth,
- BaseCertificates& baseCerts)
-{
- string clientSectionString("SSLConfig:client");
- IceXML::NodePtr clientSection = find(clientSectionString);
-
- // If we actually have a client section.
- if(clientSection)
- {
- getGeneral(clientSection, general);
- getCertAuth(clientSection, certAuth);
- getBaseCerts(clientSection, baseCerts);
- return true;
- }
-
- return false;
-}
-
-bool
-IceSSL::ConfigParser::loadServerConfig(GeneralConfig& general,
- CertificateAuthority& certAuth,
- BaseCertificates& baseCerts,
- TempCertificates& tempCerts)
-{
- string serverSectionString("SSLConfig:server");
- IceXML::NodePtr serverSection = find(serverSectionString);
-
- // If we actually have a client section.
- if(serverSection)
- {
- getGeneral(serverSection, general);
- getCertAuth(serverSection, certAuth);
- getBaseCerts(serverSection, baseCerts);
- getTempCerts(serverSection, tempCerts);
- return true;
- }
-
- return false;
-}
-
-//
-// Private Methods
-//
-
-// Path is of the form "sslconfig:client:general"
-void
-IceSSL::ConfigParser::popRoot(string& path, string& root, string& tail)
-{
- string::size_type pos = path.find_first_of(':');
-
- if(pos != string::npos)
- {
- root = path.substr(0,pos);
- tail = path.substr(pos+1);
- }
- else
- {
- root = path;
- tail = "";
- }
-}
-
-IceXML::NodePtr
-IceSSL::ConfigParser::find(string& nodePath)
-{
- return find(_root, nodePath);
-}
-
-IceXML::NodePtr
-IceSSL::ConfigParser::find(const IceXML::NodePtr& rootNode, string& nodePath)
-{
- // The target node that we're looking for.
- IceXML::NodePtr tNode;
-
- if(!rootNode)
- {
- return tNode;
- }
-
- string rootNodeName;
- string tailNodes;
-
- // Pop the root off the path.
- popRoot(nodePath, rootNodeName, tailNodes);
-
- IceXML::NodeList children = rootNode->getChildren();
- for(IceXML::NodeList::iterator p = children.begin(); p != children.end(); ++p)
- {
- // Ignore any other node types - we're only interested in elements.
- IceXML::ElementPtr elem = IceXML::ElementPtr::dynamicCast(*p);
- if(elem)
- {
- string nodeName = elem->getName();
-
- if(nodeName.compare(rootNodeName) == 0)
- {
- // No further to recurse, this must be it.
- if(tailNodes.empty())
- {
- tNode = elem;
- }
- else
- {
- // Recursive call.
- tNode = find(elem, tailNodes);
- }
- }
- }
- }
-
- return tNode;
-}
-
-void
-IceSSL::ConfigParser::getGeneral(const IceXML::NodePtr& rootNode, GeneralConfig& generalConfig)
-{
- if(!rootNode)
- {
- return;
- }
-
- string generalString("general");
- IceXML::NodePtr general = find(rootNode, generalString);
-
- IceXML::Attributes attributes = general->getAttributes();
- for(IceXML::Attributes::iterator p = attributes.begin(); p != attributes.end(); ++p)
- {
- // Set the property.
- generalConfig.set(p->first, p->second);
- }
-}
-
-void
-IceSSL::ConfigParser::getCertAuth(const IceXML::NodePtr& rootNode, CertificateAuthority& certAuth)
-{
- if(!rootNode)
- {
- return;
- }
-
- string nodeName = "certauthority";
- IceXML::NodePtr certAuthNode = find(rootNode, nodeName);
-
- if(!certAuthNode)
- {
- return;
- }
-
- string file = certAuthNode->getAttribute("file");
- if(!file.empty())
- {
- // Just a filename, no path component, prepend path.
- if(!isAbsolutePath(file))
- {
- file = _configPath + file;
- }
-
- certAuth.setCAFileName(file);
- }
-
- string path = certAuthNode->getAttribute("path");
- if(!path.empty())
- {
- certAuth.setCAPath(path);
- }
-}
-
-void
-IceSSL::ConfigParser::getBaseCerts(const IceXML::NodePtr& rootNode, BaseCertificates& baseCerts)
-{
- if(!rootNode)
- {
- return;
- }
-
- string nodeName = "basecerts";
- IceXML::NodePtr baseCertsRoot = find(rootNode, nodeName);
-
- if(!baseCertsRoot)
- {
- return;
- }
-
- CertificateDesc rsaCert;
- CertificateDesc dsaCert;
- DiffieHellmanParamsFile dhParams;
-
- string rsaCertString("rsacert");
- string dsaCertString("dsacert");
- string dhParamsString("dhparams");
-
- getCert(find(baseCertsRoot, rsaCertString), rsaCert);
- getCert(find(baseCertsRoot, dsaCertString), dsaCert);
-
- getDHParams(find(baseCertsRoot, dhParamsString), dhParams);
-
- const BaseCertificates result(rsaCert, dsaCert, dhParams);
- baseCerts = result;
-}
-
-void
-IceSSL::ConfigParser::getTempCerts(const IceXML::NodePtr& rootNode, TempCertificates& tempCerts)
-{
- if(!rootNode)
- {
- return;
- }
-
- string nodeName = "tempcerts";
- IceXML::NodePtr tempCertsRoot = find(rootNode, nodeName);
-
- if(!tempCertsRoot)
- {
- return;
- }
-
- IceXML::NodeList children = tempCertsRoot->getChildren();
- for(IceXML::NodeList::iterator p = children.begin(); p != children.end(); ++p)
- {
- string name = (*p)->getName();
-
- if(name.compare("dhparams") == 0)
- {
- loadDHParams(*p, tempCerts);
- }
- else if(name.compare("rsacert") == 0)
- {
- loadRSACert(*p, tempCerts);
- }
- }
-}
-
-void
-IceSSL::ConfigParser::loadDHParams(const IceXML::NodePtr& rootNode, TempCertificates& tempCerts)
-{
- DiffieHellmanParamsFile dhParams;
-
- getDHParams(rootNode, dhParams);
-
- tempCerts.addDHParams(dhParams);
-}
-
-void
-IceSSL::ConfigParser::loadRSACert(const IceXML::NodePtr& rootNode, TempCertificates& tempCerts)
-{
- CertificateDesc rsaCert;
-
- getCert(rootNode, rsaCert);
-
- tempCerts.addRSACert(rsaCert);
-}
-
-void
-IceSSL::ConfigParser::getCert(const IceXML::NodePtr& rootNode, CertificateDesc& certDesc)
-{
- if(!rootNode)
- {
- return;
- }
-
- CertificateFile publicFile;
- CertificateFile privateFile;
- int keySize = 0;
-
- string keySizeValue = rootNode->getAttribute("keysize");
- if(!keySizeValue.empty())
- {
- keySize = atoi(keySizeValue.c_str());
- }
-
- string publicString("public");
- string privateString("private");
-
- loadCertificateFile(find(rootNode, publicString), publicFile);
- loadCertificateFile(find(rootNode, privateString), privateFile);
-
- // Initialize the certificate description.
- certDesc = CertificateDesc(keySize, publicFile, privateFile);
-}
-
-void
-IceSSL::ConfigParser::getDHParams(const IceXML::NodePtr& rootNode, DiffieHellmanParamsFile& dhParams)
-{
- if(!rootNode)
- {
- return;
- }
-
- CertificateFile certFile;
- loadCertificateFile(rootNode, certFile);
-
- int keySize = 0;
-
- string keySizeValue = rootNode->getAttribute("keysize");
- if(!keySizeValue.empty())
- {
- keySize = atoi(keySizeValue.c_str());
- }
-
- dhParams = DiffieHellmanParamsFile(keySize, certFile.getFileName(), certFile.getEncoding());
-}
-
-void
-IceSSL::ConfigParser::loadCertificateFile(const IceXML::NodePtr& rootNode, CertificateFile& certFile)
-{
- if(!rootNode)
- {
- return;
- }
-
- string filename;
- int encoding = SSL_FILETYPE_PEM; // PEM is the default type.
-
- filename = rootNode->getAttribute("filename");
- if(!filename.empty())
- {
- // Just a filename, no path component, prepend path.
- if(!isAbsolutePath(filename))
- {
- filename = _configPath + filename;
- }
- }
-
- string encodingValue = rootNode->getAttribute("encoding");
- if(!encodingValue.empty())
- {
- encoding = parseEncoding(encodingValue);
- }
-
- certFile = CertificateFile(filename, encoding);
-}
-
-bool
-IceSSL::ConfigParser::isAbsolutePath(string& pathString)
-{
-#ifdef WINDOWS
- // Is true if the pathString begins with a \ or if its second and third characters are ":\"
-
- string rootDir = ":\\";
- string pathStringInternal = pathString.substr(1);
- return ((!pathStringInternal.substr(0,rootDir.length()).compare(rootDir)) ||
- (*pathStringInternal.begin()) == '\\');
-#else
- // Is true if the pathString begins with a /
-
- string rootDir = "/";
- return !pathString.substr(0,rootDir.length()).compare(rootDir);
-#endif
-}
-
-int
-IceSSL::ConfigParser::parseEncoding(string& encodingString)
-{
- int encoding = SSL_FILETYPE_PEM;
-
- if(encodingString == "PEM")
- {
- encoding = SSL_FILETYPE_PEM;
- }
- else if(encodingString == "ASN1")
- {
- encoding = SSL_FILETYPE_ASN1;
- }
-
- return encoding;
-}