/*\r
- * Copyright 2001-2007 Internet2\r
+ * Copyright 2001-2009 Internet2\r
* \r
* Licensed under the Apache License, Version 2.0 (the "License");\r
* you may not use this file except in compliance with the License.\r
#include <shibsp/exceptions.h>\r
#include <shibsp/SPConfig.h>\r
#include <shibsp/ServiceProvider.h>\r
+#include <shibsp/metadata/MetadataProviderCriteria.h>\r
#include <shibsp/util/SPConstants.h>\r
#include <saml/saml2/metadata/Metadata.h>\r
+#include <xmltooling/logging.h>\r
\r
using namespace shibsp;\r
using namespace opensaml::saml2md;\r
using namespace opensaml;\r
+using namespace xmltooling::logging;\r
using namespace xmltooling;\r
using namespace std;\r
\r
+using xercesc::XMLString;\r
+\r
+void usage()\r
+{\r
+ cerr << "usage: mdquery -e <entityID> [-a <app id> -nostrict]" << endl;\r
+ cerr << " mdquery -e <entityID> -r <role> -p <protocol> [-a <app id> -ns <namespace> -nostrict]" << endl;\r
+}\r
+\r
int main(int argc,char* argv[])\r
{\r
- /*\r
- char* n_param=NULL;\r
- char* q_param=NULL;\r
- char* f_param=NULL;\r
- char* a_param=NULL;\r
+ char* entityID = NULL;\r
+ char* appID = "default";\r
+ bool strict = true;\r
+ char* prot = NULL;\r
+ const XMLCh* protocol = NULL;\r
+ char* rname = NULL;\r
+ char* rns = NULL;\r
\r
for (int i=1; i<argc; i++) {\r
- if (!strcmp(argv[i],"-n") && i+1<argc)\r
- n_param=argv[++i];\r
- else if (!strcmp(argv[i],"-q") && i+1<argc)\r
- q_param=argv[++i];\r
- else if (!strcmp(argv[i],"-f") && i+1<argc)\r
- f_param=argv[++i];\r
+ if (!strcmp(argv[i],"-e") && i+1<argc)\r
+ entityID=argv[++i];\r
else if (!strcmp(argv[i],"-a") && i+1<argc)\r
- a_param=argv[++i];\r
+ appID=argv[++i];\r
+ else if (!strcmp(argv[i],"-p") && i+1<argc)\r
+ prot=argv[++i];\r
+ else if (!strcmp(argv[i],"-r") && i+1<argc)\r
+ rname=argv[++i];\r
+ else if (!strcmp(argv[i],"-ns") && i+1<argc)\r
+ rns=argv[++i];\r
+ else if (!strcmp(argv[i],"-saml10"))\r
+ protocol=samlconstants::SAML10_PROTOCOL_ENUM;\r
+ else if (!strcmp(argv[i],"-saml11"))\r
+ protocol=samlconstants::SAML11_PROTOCOL_ENUM;\r
+ else if (!strcmp(argv[i],"-saml2"))\r
+ protocol=samlconstants::SAML20P_NS;\r
+ else if (!strcmp(argv[i],"-idp"))\r
+ rname="IDPSSODescriptor";\r
+ else if (!strcmp(argv[i],"-aa"))\r
+ rname="AttributeAuthorityDescriptor";\r
+ else if (!strcmp(argv[i],"-pdp"))\r
+ rname="PDPDescriptor";\r
+ else if (!strcmp(argv[i],"-sp"))\r
+ rname="SPSSODescriptor";\r
+ else if (!strcmp(argv[i],"-nostrict"))\r
+ strict = false;\r
}\r
\r
- if (!n_param || !q_param) {\r
- cerr << "usage: samlquery -n <name> -q <IdP> [-f <format URI> -a <application id>]" << endl;\r
- exit(0);\r
+ if (!entityID) {\r
+ usage();\r
+ return -10;\r
}\r
- if (!a_param)\r
- a_param="default";\r
- */\r
\r
- char* path=getenv("SHIBSP_SCHEMAS");\r
- if (!path)\r
- path=SHIBSP_SCHEMAS;\r
- char* config=getenv("SHIBSP_CONFIG");\r
- if (!config)\r
- config=SHIBSP_CONFIG;\r
-\r
- XMLToolingConfig::getConfig().log_config(getenv("SHIBSP_LOGGING") ? getenv("SHIBSP_LOGGING") : SHIBSP_LOGGING);\r
+ if (rname) {\r
+ if (!protocol) {\r
+ if (prot)\r
+ protocol = XMLString::transcode(prot);\r
+ }\r
+ if (!protocol) {\r
+ usage();\r
+ return -10;\r
+ }\r
+ }\r
\r
SPConfig& conf=SPConfig::getConfig();\r
- conf.setFeatures(SPConfig::Metadata | SPConfig::OutOfProcess);\r
- if (!conf.init(path))\r
- return -10;\r
-\r
- try {\r
- static const XMLCh _path[] = UNICODE_LITERAL_4(p,a,t,h);\r
- static const XMLCh validate[] = UNICODE_LITERAL_8(v,a,l,i,d,a,t,e);\r
- xercesc::DOMDocument* dummydoc=XMLToolingConfig::getConfig().getParser().newDocument();\r
- XercesJanitor<xercesc::DOMDocument> docjanitor(dummydoc);\r
- xercesc::DOMElement* dummy = dummydoc->createElementNS(NULL,_path);\r
- auto_ptr_XMLCh src(config);\r
- dummy->setAttributeNS(NULL,_path,src.get());\r
- dummy->setAttributeNS(NULL,validate,xmlconstants::XML_ONE);\r
- conf.setServiceProvider(conf.ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER,dummy));\r
- conf.getServiceProvider()->init();\r
- }\r
- catch (exception&) {\r
+ conf.setFeatures(SPConfig::Metadata | SPConfig::Trust | SPConfig::OutOfProcess | SPConfig::Credentials);\r
+ if (!conf.init())\r
+ return -1;\r
+ if (!conf.instantiate()) {\r
conf.term();\r
- return -20;\r
+ return -2;\r
}\r
\r
ServiceProvider* sp=conf.getServiceProvider();\r
sp->lock();\r
\r
+ Category& log = Category::getInstance(SHIBSP_LOGCAT".Utility.MDQuery");\r
+\r
+ const Application* app = sp->getApplication(appID);\r
+ if (!app) {\r
+ log.error("unknown application ID (%s)", appID);\r
+ sp->unlock();\r
+ conf.term();\r
+ return -3;\r
+ }\r
+\r
+ app->getMetadataProvider()->lock();\r
+ MetadataProviderCriteria mc(*app, entityID, NULL, NULL, strict);\r
+ if (rname) {\r
+ const XMLCh* ns = rns ? XMLString::transcode(rns) : samlconstants::SAML20MD_NS;\r
+ auto_ptr_XMLCh n(rname);\r
+ QName q(ns, n.get());\r
+ mc.role = &q;\r
+ mc.protocol = protocol;\r
+ const RoleDescriptor* role = app->getMetadataProvider()->getEntityDescriptor(mc).second;\r
+ if (role)\r
+ XMLHelper::serialize(role->marshall(), cout, true);\r
+ else\r
+ log.error("compatible role %s not found for (%s)", q.toString().c_str(), entityID);\r
+ }\r
+ else {\r
+ const EntityDescriptor* entity = app->getMetadataProvider()->getEntityDescriptor(mc).first;\r
+ if (entity)\r
+ XMLHelper::serialize(entity->marshall(), cout, true);\r
+ else\r
+ log.error("no metadata found for (%s)", entityID);\r
+ }\r
+\r
+ app->getMetadataProvider()->unlock();\r
+\r
sp->unlock();\r
conf.term();\r
return 0;\r