Reducing header overuse, non-inlining selected methods (CPPOST-35).
[shibboleth/cpp-sp.git] / util / mdquery.cpp
index f0f918c..053e994 100644 (file)
@@ -1,5 +1,5 @@
 /*\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