#include "reqparser.h"
#include "antlrplugin.h"
#include "cserror.h"
#include "codesigning_dtrace.h"
#include <CoreFoundation/CoreFoundation.h>
#include <security_utilities/osxcode.h>
namespace Security {
namespace CodeSigning {
struct PluginHost {
PluginHost();
RefPointer<LoadableBundle> plugin;
AntlrPlugin *antlr;
};
ModuleNexus<PluginHost> plugin;
PluginHost::PluginHost()
{
if (CFBundleRef securityFramework = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.security")))
if (CFRef<CFURLRef> plugins = CFBundleCopyBuiltInPlugInsURL(securityFramework))
if (CFRef<CFURLRef> pluginURL = makeCFURL("csparser.bundle", true, plugins)) {
plugin = new LoadableBundle(cfString(pluginURL).c_str());
plugin->load();
CODESIGN_LOAD_ANTLR();
antlr = reinterpret_cast<FindAntlrPlugin *>(plugin->lookupSymbol(FINDANTLRPLUGIN))();
return;
}
MacOSError::throwMe(errSecCSInternalError);
}
template <class Result, class Source>
const Result *parse(Source source, const Result *(*AntlrPlugin::*func)(Source, string &))
{
string errors;
if (const Result *result = (plugin().antlr->*func)(source, errors))
return result;
else
CSError::throwMe(errSecCSReqInvalid, kSecCFErrorRequirementSyntax, CFTempString(errors));
}
template <>
const Requirement *RequirementParser<Requirement>::operator () (std::FILE *source)
{
return parse(source, &AntlrPlugin::fileRequirement);
}
template <>
const Requirement *RequirementParser<Requirement>::operator () (const std::string &source)
{
return parse(source, &AntlrPlugin::stringRequirement);
}
template <>
const Requirements *RequirementParser<Requirements>::operator () (std::FILE *source)
{
return parse(source, &AntlrPlugin::fileRequirements);
}
template <>
const Requirements *RequirementParser<Requirements>::operator () (const std::string &source)
{
return parse(source, &AntlrPlugin::stringRequirements);
}
template <>
const BlobCore *RequirementParser<BlobCore>::operator () (std::FILE *source)
{
return parse(source, &AntlrPlugin::fileGeneric);
}
template <>
const BlobCore *RequirementParser<BlobCore>::operator () (const std::string &source)
{
return parse(source, &AntlrPlugin::stringGeneric);
}
} }