osaf/services/saf/immsv/immnd/immnd_evt.c |  26 +++++++++++++++++++++++---
 1 files changed, 23 insertions(+), 3 deletions(-)


diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c 
b/osaf/services/saf/immsv/immnd/immnd_evt.c
--- a/osaf/services/saf/immsv/immnd/immnd_evt.c
+++ b/osaf/services/saf/immsv/immnd/immnd_evt.c
@@ -38,7 +38,7 @@
 #define IMMND_SEARCH_BUNDLE_SIZE ((MDS_DIRECT_BUF_MAXSIZE / 100) * 90)   
 #define IMMND_MAX_SEARCH_RESULT (IMMND_SEARCH_BUNDLE_SIZE / 300)  
 
-static SaAisErrorT immnd_fevs_local_checks(IMMND_CB *cb, IMMSV_FEVS *fevsReq);
+static SaAisErrorT immnd_fevs_local_checks(IMMND_CB *cb, IMMSV_FEVS *fevsReq, 
const IMMSV_SEND_INFO *sinfo);
 static uint32_t immnd_evt_proc_cb_dump(IMMND_CB *cb);
 static uint32_t immnd_evt_proc_imm_init(IMMND_CB *cb, IMMND_EVT *evt, 
IMMSV_SEND_INFO *sinfo, SaBoolT isOm);
 static uint32_t immnd_evt_proc_imm_finalize(IMMND_CB *cb, IMMND_EVT *evt, 
IMMSV_SEND_INFO *sinfo, SaBoolT isOm);
@@ -2835,7 +2835,7 @@ static uint32_t immnd_evt_proc_fevs_forw
        }
 
        if(newMsg) {
-               error = immnd_fevs_local_checks(cb, &(evt->info.fevsReq));
+               error = immnd_fevs_local_checks(cb, &(evt->info.fevsReq), 
sinfo);
                if(error != SA_AIS_OK) {
                        /*Fevs request will NOT be forwarded to IMMD.
                          Return directly with error or OK for idempotent 
requests.
@@ -3048,7 +3048,8 @@ static uint32_t immnd_evt_proc_fevs_forw
   nodes and not propagated over fevs, because sync clients may not yet
   have synced the implementer setting and thus reject the idempotent case. 
 */
-static SaAisErrorT immnd_fevs_local_checks(IMMND_CB *cb, IMMSV_FEVS *fevsReq)
+static SaAisErrorT immnd_fevs_local_checks(IMMND_CB *cb, IMMSV_FEVS *fevsReq,
+               const IMMSV_SEND_INFO *sinfo)
 {
        SaAisErrorT error = SA_AIS_OK;
        osafassert(fevsReq);
@@ -3104,6 +3105,24 @@ static SaAisErrorT immnd_fevs_local_chec
        switch (frwrd_evt.info.immnd.type) {
        case IMMND_EVT_A2ND_OBJ_CREATE:
        case IMMND_EVT_A2ND_OBJ_MODIFY:
+               if ((frwrd_evt.info.immnd.type == IMMND_EVT_A2ND_OBJ_MODIFY) &&
+                               
(strcmp(frwrd_evt.info.immnd.info.objModify.objectName.buf,
+                                               OPENSAF_IMM_OBJECT_DN) == 0)) {
+                       IMMSV_ATTR_MODS_LIST *attrMod = 
frwrd_evt.info.immnd.info.objModify.attrMods;
+                       while (attrMod != NULL) {
+                               if (strcmp(attrMod->attrValue.attrName.buf, 
OPENSAF_IMM_ACCESS_CONTROL_MODE) == 0) {
+                                       if (sinfo->uid != 0) {
+                                               struct passwd *pwd = 
getpwuid(sinfo->uid);
+                                               if (pwd != NULL)
+                                                       syslog(LOG_AUTH, 
"change of access control mode denied for %s(uid=%d)",
+                                                               pwd->pw_name, 
sinfo->uid);
+                                               error = 
SA_AIS_ERR_ACCESS_DENIED;
+                                               goto done;
+                                       }
+                               }
+                               attrMod = attrMod->next;
+                       }
+               }
        case IMMND_EVT_A2ND_OBJ_DELETE:
        case IMMND_EVT_A2ND_CCB_FINALIZE:
        case IMMND_EVT_A2ND_OI_CCB_AUG_INIT:
@@ -3423,6 +3442,7 @@ static SaAisErrorT immnd_fevs_local_chec
                        frwrd_evt.info.immnd.type, error);
        }
 
+done:
        TRACE_LEAVE();
        return error;
 }

------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to