Free statement after direct exec.
[shibboleth/sp.git] / util / mdquery.cpp
index f0f918c..00e1e49 100644 (file)
 #include <shibsp/ServiceProvider.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
+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
+        exit(-10);\r
     }\r
-    if (!a_param)\r
-        a_param="default";\r
-    */\r
 \r
     char* path=getenv("SHIBSP_SCHEMAS");\r
     if (!path)\r
@@ -83,7 +108,19 @@ int main(int argc,char* argv[])
     SPConfig& conf=SPConfig::getConfig();\r
     conf.setFeatures(SPConfig::Metadata | SPConfig::OutOfProcess);\r
     if (!conf.init(path))\r
-        return -10;\r
+        return -1;\r
+\r
+    if (rname) {\r
+        if (!protocol) {\r
+            if (prot)\r
+                protocol = XMLString::transcode(prot);\r
+        }\r
+        if (!protocol) {\r
+            conf.term();\r
+            usage();\r
+            exit(-10);\r
+        }\r
+    }\r
 \r
     try {\r
         static const XMLCh _path[] = UNICODE_LITERAL_4(p,a,t,h);\r
@@ -99,12 +136,46 @@ int main(int argc,char* argv[])
     }\r
     catch (exception&) {\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
+    MetadataProvider::Criteria mc(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