소스 검색

HPCC-19784 Improve access to user and resource name value pairs

Expose iterators to ISecUser's properties and ISecResource's
parameters. Without these iterators, the data can only be
accessed within the concrete implementation class or by code
that knows exactly what names to look for. With the iterators,
the data may be manipulated by generic code that only knows
that some arbitrary data may be present.

Fix HPCC-19784

Signed-off-by: Tim Klemm <Tim.Klemm@lexisnexisrisk.com>
Tim Klemm 7 년 전
부모
커밋
9edc6025a1

+ 5 - 0
system/security/LdapSecurity/ldapsecurity.cpp

@@ -318,6 +318,11 @@ const char * CLdapSecResource::getParameter(const char * name)
 
 }
 
+IPropertyIterator * CLdapSecResource::getParameterIterator() const
+{
+    return (m_parameters.get() ? m_parameters->getIterator() : nullptr);
+}
+
 void CLdapSecResource::setDescription(const char* description)
 {
     m_description.clear().append(description);

+ 2 - 0
system/security/LdapSecurity/ldapsecurity.ipp

@@ -149,6 +149,7 @@ public:
 
     virtual void setPropertyInt(const char* name, int value){}
     virtual int getPropertyInt(const char* name){ return 0;}
+    IPropertyIterator * getPropertyIterator() const override { return nullptr;}
 
 
 //interface ISecCredentials
@@ -270,6 +271,7 @@ public:
     virtual SecAccessFlags getAccessFlags();
     virtual int addParameter(const char* name, const char* value);
     virtual const char * getParameter(const char * name);
+    virtual IPropertyIterator * getParameterIterator() const override;
     virtual void setDescription(const char* description);
     virtual const char* getDescription();
 

+ 6 - 1
system/security/shared/SecureUser.hpp

@@ -200,7 +200,12 @@ public:
         return 0;
     }
 
-    
+    IPropertyIterator * getPropertyIterator() const override
+    {
+        return (m_parameters.get() ? m_parameters->getIterator() : nullptr);
+    }
+
+
 
 //interface ISecCredentials
     bool setPassword(const char * pw)

+ 12 - 10
system/security/shared/SecurityResource.hpp

@@ -79,6 +79,12 @@ public:
         return NULL;
 
     }
+
+    virtual IPropertyIterator * getParameterIterator() const override
+    {
+        return (m_parameters.get() ? m_parameters->getIterator() : nullptr);
+    }
+
     virtual void setRequiredAccessFlags(SecAccessFlags flags)
     {
         m_required_access = flags;
@@ -139,22 +145,18 @@ public:
     {
         if(!from)
             return;
-        CSecurityResource* _res = (CSecurityResource*)(from);
-        if(!_res)
-            return;
 
-        setDescription(_res->m_description.str());
-        setValue(_res->m_value.str());
-        setAccessFlags(_res->getAccessFlags());
+        setDescription(from->getDescription());
+        setValue(from->getValue());
+        setAccessFlags(from->getAccessFlags());
 
-        if(!_res->m_parameters)
+        Owned<IPropertyIterator> Itr = from->getParameterIterator();
+        if(!Itr.get())
             return;
-
-        Owned<IPropertyIterator> Itr = _res->m_parameters->getIterator();
         Itr->first();
         while(Itr->isValid())
         {
-            addParameter(Itr->getPropKey(), _res->m_parameters->queryProp(Itr->getPropKey()));
+            addParameter(Itr->getPropKey(), from->getParameter(Itr->getPropKey()));
             Itr->next();
         }
         return;

+ 3 - 0
system/security/shared/seclib.hpp

@@ -163,6 +163,7 @@ enum authStatus : int
 };
 
 class CDateTime;
+interface IPropertyIterator;
 interface ISecUser : extends IInterface
 {
     virtual const char * getName() = 0;
@@ -197,6 +198,7 @@ interface ISecUser : extends IInterface
     virtual const char * getProperty(const char * name) = 0;
     virtual void setPropertyInt(const char * name, int value) = 0;
     virtual int getPropertyInt(const char * name) = 0;
+    virtual IPropertyIterator * getPropertyIterator() const = 0;
     virtual ISecUser * clone() = 0;
 };
 
@@ -231,6 +233,7 @@ interface ISecResource : extends ISecProperty
     virtual SecAccessFlags getRequiredAccessFlags() = 0;
     virtual int addParameter(const char * name, const char * value) = 0;
     virtual const char * getParameter(const char * name) = 0;
+    virtual IPropertyIterator * getParameterIterator() const = 0;
     virtual void setDescription(const char * description) = 0;
     virtual const char * getDescription() = 0;
     virtual ISecResource * clone() = 0;