osaf/services/saf/immsv/immnd/ImmModel.cc |  94 ++++++++++++++++++++++++++++--
 1 files changed, 86 insertions(+), 8 deletions(-)


The six validation cases described in the ticket are implemented by this
changeset:

For the object 'opensafImm=opensafImm,safApp=safImmService':

1) 0PBE reject delete of the object.
2) 0PBE reject creates using class 'OpensafImm'
(All modifications to current config attributes are allowed after #934)
(For 1PBE and 2PBE, the validation for this object is handled by the PBE-OI.


For the object 'safRdn=immManagement,safApp=safImmService':

3) Reject delete of the object.
4) Reject create using class 'SaImmMngt'
5) Validate modifications to attribute 'saImmRepositoryInit'
6) Reject use/modification of 'saImmOiTimeout'(not supported).

diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc 
b/osaf/services/saf/immsv/immnd/ImmModel.cc
--- a/osaf/services/saf/immsv/immnd/ImmModel.cc
+++ b/osaf/services/saf/immsv/immnd/ImmModel.cc
@@ -441,8 +441,10 @@ static const std::string immSyncBatchSiz
 static const std::string immPbeBSlaveName(OPENSAF_IMM_2PBE_APPL_NAME);
 static const std::string immLongDnsAllowed(OPENSAF_IMM_LONG_DNS_ALLOWED);
 
+static const std::string immMngtClass("SaImmMngt");
 static const std::string 
immManagementDn("safRdn=immManagement,safApp=safImmService");
 static const std::string saImmRepositoryInit("saImmRepositoryInit");
+static const std::string saImmOiTimeout("saImmOiTimeout");
 
 static SaImmRepositoryInitModeT immInitMode = SA_IMM_INIT_FROM_FILE;
 
@@ -7126,19 +7128,45 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im
                     object->mImplementer->mImplementerName.c_str());
                 ccb->mWaitStartTime = time(NULL);
                 osafassert(ccb->mWaitStartTime > ((time_t) 0));
+            } else if(className == immMngtClass) {
+                if(sImmNodeState == IMM_NODE_LOADING) {
+                    if(objectName != immManagementDn) {
+                        /* Backwards compatibility for loading. */
+                        LOG_WA("Imm loading encountered bogus object '%s' of 
class '%s'",
+                            objectName.c_str(), immMngtClass.c_str());
+                    }
+                } else {
+                    setCcbErrorString(ccb,
+                        "ERR_BAD_OPERATION: Imm not allowing creates of 
instances of class '%s'",
+                        immMngtClass.c_str());
+                    err = SA_AIS_ERR_BAD_OPERATION;
+                }
+            } else if(className == immClassName) {
+                if(sImmNodeState == IMM_NODE_LOADING) {
+                    if(objectName != immObjectDn) {
+                        /* Backwards compatibility for loading. */
+                        LOG_WA("Imm loading encountered bogus object '%s' of 
class '%s'",
+                            objectName.c_str(), immClassName.c_str());
+                    }
+                } else {
+                    setCcbErrorString(ccb,
+                        "ERR_BAD_OPERATION: Imm not allowing creates of 
instances of class '%s'",
+                        immClassName.c_str());
+                    err = SA_AIS_ERR_BAD_OPERATION;
+                }
             } else if(ccb->mCcbFlags & SA_IMM_CCB_REGISTERED_OI) {
                 if((object->mImplementer == NULL) && 
                    (ccb->mCcbFlags & SA_IMM_CCB_ALLOW_NULL_OI)) {
                     TRACE_7("Null implementer, SA_IMM_CCB_REGISTERED_OI set, "
                         "but SA_IMM_CCB_ALLOW_NULL_OI set => safe relaxation");
                 } else {
-                    TRACE_7("ERR_NOT_EXIST: object '%s' does not have an "
+                    TRACE_7("ERR_NOT_EXIST: class '%s' does not have an "
                         "implementer and flag SA_IMM_CCB_REGISTERED_OI is 
set", 
-                        objectName.c_str());
+                        className.c_str());
                     setCcbErrorString(ccb,
-                            "ERR_NOT_EXIST: object '%s' exist but "
-                            "no implementer (which is required)",
-                            objectName.c_str());
+                            "ERR_NOT_EXIST: class '%s' does not have an "
+                            "implementer and flag SA_IMM_CCB_REGISTERED_OI is 
set",
+                            className.c_str());
                     err = SA_AIS_ERR_NOT_EXIST;
                 }
             } else { /* SA_IMM_CCB_REGISTERED_OI NOT set */
@@ -7152,7 +7180,7 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im
                     TRACE_7("Object '%s' has NULL implementer, flag 
SA_IMM_CCB_REGISTERED_OI "
                         "is NOT set - moderately safe.", objectName.c_str());
                 }
-            } 
+            }
         }
 
     bypass_impl:
@@ -7384,6 +7412,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC
 
     ObjectNameSet afimPreOpNDRefs;  // Set of NO_DANGLING references from 
after image before CCB operation
     bool hasNoDanglingRefs = false;
+    bool modifiedImmMngt = false;  /* true => modification of the SAF 
immManagement object. */
     
     if(! (nameCheck(objectName)||nameToInternal(objectName)) ) {
         LOG_NO("ERR_INVALID_PARAM: Not a proper object name");
@@ -7445,6 +7474,8 @@ ImmModel::ccbObjectModify(const ImmsvOmC
     }
     
     object = oi->second;
+
+    modifiedImmMngt = (objectName == immManagementDn);
     
     object->getAdminOwnerName(&objAdminOwnerName);
     if(objAdminOwnerName != adminOwner->mAdminOwnerName)
@@ -7564,6 +7595,19 @@ ImmModel::ccbObjectModify(const ImmsvOmC
         sz = strnlen((char *) p->attrValue.attrName.buf,
             (size_t) p->attrValue.attrName.size);
         std::string attrName((const char *) p->attrValue.attrName.buf, sz);
+        bool modifiedRim = modifiedImmMngt && (attrName == 
saImmRepositoryInit);
+        bool modifiedOiTimeout = modifiedImmMngt && (attrName == 
saImmOiTimeout);
+
+        if(modifiedOiTimeout) {
+            /* Currently the IMM does not support this attribute. */
+            TRACE_7("ERR_BAD_OPERATION: attr '%s' in IMM object %s is not 
supported",
+                attrName.c_str(), objectName.c_str());
+            setCcbErrorString(ccb,
+                "ERR_BAD_OPERATION: attr '%s' in IMM object %s is not 
supported",
+                attrName.c_str(), objectName.c_str());
+            err = SA_AIS_ERR_BAD_OPERATION;
+            break; //out of for-loop
+        }
         
         i4 = classInfo->mAttrMap.find(attrName);
         if(i4==classInfo->mAttrMap.end()) {
@@ -7709,7 +7753,22 @@ ImmModel::ccbObjectModify(const ImmsvOmC
 
                     multiattr->setExtraValue(tmpos);
                 }
-                
+
+                if (modifiedRim) {
+                    SaImmRepositoryInitModeT newRim = 
(SaImmRepositoryInitModeT) attrValue->getValue_int();
+                    if((newRim != SA_IMM_INIT_FROM_FILE) && (newRim != 
SA_IMM_KEEP_REPOSITORY)) {
+                        TRACE_7("ERR_INVALID_PARAM: attr '%s' in IMM object %s 
can not have value %u",
+                            attrName.c_str(), objectName.c_str(), newRim);
+                        setCcbErrorString(ccb,
+                            "ERR_BAD_OPERATION: attr '%s' in IMM object %s can 
not have value %u",
+                            attrName.c_str(), objectName.c_str(), newRim);
+                        err = SA_AIS_ERR_BAD_OPERATION;
+                        break;
+                   }
+                }
+
+
+
                 if(p->attrValue.attrValuesNumber > 1) {
                     if(!(attr->mFlags & SA_IMM_ATTR_MULTI_VALUE)) {
                         LOG_NO("ERR_INVALID_PARAM: attr '%s' is not 
multivalued, yet "
@@ -7760,6 +7819,17 @@ ImmModel::ccbObjectModify(const ImmsvOmC
                     break;
                 }
                 
+                if (modifiedRim) {
+                    TRACE_7("ERR_BAD_OPERATION: attr '%s' in IMM object %s 
must not be empty",
+                        attrName.c_str(), objectName.c_str());
+                    setCcbErrorString(ccb,
+                        "ERR_BAD_OPERATION: attr '%s' in IMM object %s must 
not be empty",
+                        attrName.c_str(), objectName.c_str());
+                    err = SA_AIS_ERR_BAD_OPERATION;
+                    break;
+                }
+
+
                 if(!attrValue->empty()) {
                     eduAtValToOs(&tmpos, &(p->attrValue.attrValue),
                         (SaImmValueTypeT) p->attrValue.attrValueType);
@@ -7804,7 +7874,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC
                     p->attrModType);
                 break;
         }
-        
+
         if(err != SA_AIS_OK) {
             break; //out of for-loop
         }
@@ -8388,6 +8458,14 @@ ImmModel::deleteObject(ObjectMap::iterat
     if(!doIt &&
         !(oi->second->mImplementer && oi->second->mImplementer->mNodeId) && 
configObj) {
         /* Implementer is not present. */
+        /* Prevent delete of imm service objects, even when there is no OI for 
them */
+        if(oi->first == immManagementDn || oi->first == immObjectDn) {
+            setCcbErrorString(ccb,
+                "ERR_BAD_OPERATION: Imm not allowing delete of object '%s'",
+                oi->first.c_str());
+            return SA_AIS_ERR_BAD_OPERATION;
+        }
+
         if(ccb->mCcbFlags & SA_IMM_CCB_REGISTERED_OI){
             if((oi->second->mImplementer == NULL) &&
                (ccb->mCcbFlags & SA_IMM_CCB_ALLOW_NULL_OI)) {

------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to