Browse Source

HPCC-18689 Avoid sharing method accessmap to avoid core

- Removes sharing of method access map member var now created a smaller scope
- Merge service and method access flags and process in 1 pass

Signed-off-by: Rodrigo Pastrana <rodrigo.pastrana@lexisnexis.com>
Rodrigo Pastrana 7 years ago
parent
commit
b0f871ea4b
1 changed files with 39 additions and 28 deletions
  1. 39 28
      tools/hidl/hidlcomp.cpp

+ 39 - 28
tools/hidl/hidlcomp.cpp

@@ -5453,7 +5453,7 @@ const char * translateAuthLevel(const char * level)
         return "SecAccess_Access";
 
     //we might need to throw here...
-    outs(2, "\n//FEATURE LEVEL VALUE INVALID: DEFAULTING REQUIRED LEVEL to 'FULL'!\n//Valid values are NONE, DEFERRED, ACCESS, READ, WRITE, FULL\n");
+    outf(2, "\n//FEATURE LEVEL VALUE '%s' INVALID: DEFAULTING REQUIRED LEVEL to 'FULL'!\n//Valid values are NONE, DEFERRED, ACCESS, READ, WRITE, FULL\n", level);
     return "SecAccess_Full";
 }
 
@@ -5463,6 +5463,7 @@ void writeAccessMap(const char * rawServiceAccessList, const char * methodname,
     for (int tabindex = 0; tabindex < tabs; tabindex++)
         indent.append('\t');
 
+    outf("%sMapStringTo<SecAccessFlags> accessmap;\n", indent.str());
     if (rawServiceAccessList && *rawServiceAccessList)
     {
         int listlen = strlen(rawServiceAccessList);
@@ -5479,13 +5480,14 @@ void writeAccessMap(const char * rawServiceAccessList, const char * methodname,
                     if (strieq(currAccessName, "NONE") || strieq(currAccessName, "DEFERRED"))
                     {
                         outf("\n//WARNING: Developer has suppressed automatic feature level authorization, ensure this behavior is correct!\n");
+                        currAccessName.clear();
                         continue;
                     }
                     else
-                        outf("\nError: Access level must be declared in service definition: ESPservice [%s(\"myAccessFeature:FULL\"]\n", FEATEACCESSATTRIBUTE);
+                        outf("\nError: Access level must be declared in service definition: %s. Example: ESPservice [%s(\"myAccessFeature:FULL\"]\n", currAccessName.str(), FEATEACCESSATTRIBUTE);
                 }
 
-                outf("\n%sm_accessmap.setValue(\"%s\", %s);\n", indent.str(), currAccessName.str(), translateAuthLevel(currAccessLevel.str()));
+                outf("%saccessmap.setValue(\"%s\", %s);\n", indent.str(), currAccessName.str(), translateAuthLevel(currAccessLevel.str()));
                 currAccessName.clear();
                 currAccessLevel.clear();
                 nameComplete = false;
@@ -5513,7 +5515,7 @@ void writeAccessMap(const char * rawServiceAccessList, const char * methodname,
     }
     else
     {
-        outf("\n%sm_accessmap.setValue(\"%sAccess\", %s);\n", indent.str(), methodname, "SecAccess_Read"); //This seems to be the default per seclib
+        outf("\n%saccessmap.setValue(\"%sAccess\", %s);\n", indent.str(), methodname, "SecAccess_Read"); //This seems to be the default per seclib
     }
 }
 
@@ -5620,9 +5622,6 @@ void EspServInfo::write_esp_binding_ipp()
     else
         outs("\tvoid setXslProcessor(IInterface *xslp){}\n");
 
-    outs("private:\n");
-    outs("\tMapStringTo<SecAccessFlags> m_accessmap;\n");
-
     outs("};\n\n");
 }
 
@@ -5647,11 +5646,9 @@ void EspServInfo::write_esp_binding()
         outf("ESDL Error: %s service definition must declare default feature access. Example 'ESPservice [%s(\"MyServiceAccess:FULL\")]'", name_, FEATEACCESSATTRIBUTE);
 
     outf("\nC%sSoapBinding::C%sSoapBinding(http_soap_log_level level):CHttpSoapBinding(NULL, NULL, NULL, level)\n{\n\tinit_strings();\n\tsetWsdlVersion(%s);", name_, name_, wsdlVer.str());
-    writeAccessMap(servicefeatureurl.str(),name_, 1);
     outf("\n}\n");
 
     outf("\nC%sSoapBinding::C%sSoapBinding(IPropertyTree* cfg, const char *bindname, const char *procname, http_soap_log_level level):CHttpSoapBinding(cfg, bindname, procname, level)\n{\n\tinit_strings(); \n\tsetWsdlVersion(%s);\n", name_, name_, wsdlVer.str());
-    writeAccessMap(servicefeatureurl.str(),name_, 1);
     outf("\n}\n");
 
     outf("\nvoid C%sSoapBinding::init_strings()\n", name_);
@@ -5718,6 +5715,18 @@ void EspServInfo::write_esp_binding()
             bHandleExceptions = 0 != getMetaInt("exceptions_inline", 0);
 
         const char * methodAccess = mthi->getMetaString(FEATEACCESSATTRIBUTE, NULL);
+        StrBuffer servicefeatureurl;
+        getMetaStringValue(servicefeatureurl,FEATEACCESSATTRIBUTE);
+
+        if (methodAccess && *methodAccess)
+        {
+            if (servicefeatureurl.length() != 0)
+                servicefeatureurl.append(",");
+            servicefeatureurl.append(methodAccess);
+        }
+
+        writeAccessMap(servicefeatureurl.str(),name_, 2);
+
         //begin try block
         if (bHandleExceptions)
         {
@@ -5734,10 +5743,8 @@ void EspServInfo::write_esp_binding()
             }
             outs("\t\t\tresponse->set_status(SOAP_OK);\n");
 
-            if (methodAccess && *methodAccess)
-                writeAccessMap(methodAccess, name_, 3);
-
-            outf("\t\t\tif( m_accessmap.ordinality() > 0 )\n\t\t\t\tonFeaturesAuthorize(context, m_accessmap, \"%s\", \"%s\");\n", name_, mthi->getName());
+            if (servicefeatureurl.length() != 0)
+                outf("\t\t\tif( accessmap.ordinality() > 0 )\n\t\t\t\tonFeaturesAuthorize(context, accessmap, \"%s\", \"%s\");\n", name_, mthi->getName());
 
             outf("\t\t\tiserv->on%s(context, *esp_request, *esp_response);\n", mthi->getName());
 
@@ -5755,14 +5762,12 @@ void EspServInfo::write_esp_binding()
             if (mthi->getMetaInt("do_not_log",0))
                 outs("\t\tcontext.queryRequestParameters()->setProp(\"do_not_log\",1);\n");
 
-            if (methodAccess && *methodAccess)
-                writeAccessMap(methodAccess, name_, 3);
-            outf("\t\tif(m_accessmap.ordinality()>0)\n\t\t\tonFeaturesAuthorize(context, m_accessmap, \"%s\", \"%s\");\n", name_, mthi->getName());
+            if (servicefeatureurl.length() != 0)
+                outf("\t\tif( accessmap.ordinality() > 0 )\n\t\t\tonFeaturesAuthorize(context, accessmap, \"%s\", \"%s\");\n", name_, mthi->getName());
             outf("\t\tiserv->on%s(*rpc_call->queryContext(), *esp_request, *esp_response);\n", mthi->getName());
             outs("\t\tresponse->set_status(SOAP_OK);\n");
         }
-        
-        
+
         outf("\t\tresponse->set_name(\"%s\");\n", mthi->getResp());
         outs("\t\tesp_response->serialize(*response);\n");
         outs("\t\treturn 0;\n\t}\n\n");
@@ -6155,21 +6160,29 @@ void EspServInfo::write_esp_binding()
             outf("\t\t\tesp_response.setown(resp);\n");
             
             const char * methodAccess = mthi->getMetaString(FEATEACCESSATTRIBUTE, NULL);
+            StrBuffer servicefeatureurl;
+            getMetaStringValue(servicefeatureurl,FEATEACCESSATTRIBUTE);
+
+            if (methodAccess && *methodAccess)
+            {
+                if (servicefeatureurl.length() != 0)
+                    servicefeatureurl.append(",");
+                servicefeatureurl.append(methodAccess);
+            }
+
+            writeAccessMap(servicefeatureurl.str(),name_, 3);
 
             if (bHandleExceptions)
             {
                 outf("\t\t\tsource.setf(\"%s::%%s()\", method);\n", name_);
                 outf("\t\t\tOwned<IMultiException> me = MakeMultiException(source.str());\n");
-                
+
                 //begin try block
                 outs("\t\t\ttry\n");
                 outs("\t\t\t{\n");
 
-                if (methodAccess && *methodAccess)
-                    writeAccessMap(methodAccess, name_, 4);
-
-                outf("\t\t\t\tif(m_accessmap.ordinality()>0)\n\t\t\t\t\tonFeaturesAuthorize(context, m_accessmap, \"%s\", \"%s\");\n", name_, mthi->getName());
-
+                if (servicefeatureurl.length() != 0)
+                    outf("\t\t\t\tif(accessmap.ordinality()>0)\n\t\t\t\t\tonFeaturesAuthorize(context, accessmap, \"%s\", \"%s\");\n", name_, mthi->getName());
                 if (mthi->getMetaInt("do_not_log",0))
                     outf("\t\t\t\tcontext.queryRequestParameters()->setProp(\"do_not_log\",1);\n");
                 outf("\t\t\t\tiserv->on%s(context, *esp_request.get(), *resp);\n", mthi->getName());
@@ -6179,9 +6192,8 @@ void EspServInfo::write_esp_binding()
             }
             else
             {
-                if (methodAccess && *methodAccess)
-                    writeAccessMap(methodAccess, name_, 3);
-                outf("\t\t\tif(m_accessmap.ordinality()>0)\n\t\t\t\tonFeaturesAuthorize(context, m_accessmap, \"%s\", \"%s\");\n", name_, mthi->getName());
+                if (servicefeatureurl.length() != 0)
+                    outf("\t\t\tif(accessmap.ordinality()>0)\n\t\t\t\tonFeaturesAuthorize(context, accessmap, \"%s\", \"%s\");\n", name_, mthi->getName());
                 outf("\t\t\tiserv->on%s(*request->queryContext(), *esp_request.get(), *resp);\n", mthi->getName());
             }
 
@@ -6410,7 +6422,6 @@ void EspServInfo::write_esp_client_ipp()
     outs("\tStringBuffer m_realm;\n");
     outs("\tStringBuffer m_action;\n");
     outs("\tlong m_reqId = 0;\n");
-    outs("\tMapStringTo<SecAccessFlags> m_accessmap;\n");
 
     outs("\npublic:\n");
     outs("\tIMPLEMENT_IINTERFACE;\n\n");