00001
00002
00003
00004
00005
00006 #include "modAccessControl.h"
00007 #include "specColl.h"
00008 #include "reGlobalsExtern.h"
00009 #include "icatHighLevelRoutines.h"
00010
00011 int
00012 rsModAccessControl (rsComm_t *rsComm, modAccessControlInp_t *modAccessControlInp )
00013 {
00014 rodsServerHost_t *rodsServerHost;
00015 int status;
00016 specCollCache_t *specCollCache = NULL;
00017 char newPath[MAX_NAME_LEN];
00018
00019 rstrcpy (newPath, modAccessControlInp->path, MAX_NAME_LEN);
00020 resolveLinkedPath (rsComm, newPath, &specCollCache, NULL);
00021 if (strcmp (newPath, modAccessControlInp->path) != 0) {
00022 free (modAccessControlInp->path);
00023 modAccessControlInp->path = strdup (newPath);
00024 }
00025
00026 status = getAndConnRcatHost(rsComm, MASTER_RCAT,
00027 modAccessControlInp->path, &rodsServerHost);
00028 if (status < 0) {
00029 return(status);
00030 }
00031
00032 if (rodsServerHost->localFlag == LOCAL_HOST) {
00033 #ifdef RODS_CAT
00034 status = _rsModAccessControl (rsComm, modAccessControlInp);
00035 #else
00036 status = SYS_NO_RCAT_SERVER_ERR;
00037 #endif
00038 }
00039 else {
00040 status = rcModAccessControl(rodsServerHost->conn,
00041 modAccessControlInp);
00042 }
00043
00044 if (status < 0) {
00045 rodsLog (LOG_NOTICE,
00046 "rsModAccessControl: rcModAccessControl failed");
00047 }
00048 return (status);
00049 }
00050
00051 #ifdef RODS_CAT
00052 int
00053 _rsModAccessControl (rsComm_t *rsComm,
00054 modAccessControlInp_t *modAccessControlInp )
00055 {
00056 int status;
00057
00058 char *args[MAX_NUM_OF_ARGS_IN_ACTION];
00059 int i, argc;
00060 ruleExecInfo_t rei2;
00061 char rFlag[15];
00062 memset ((char*)&rei2, 0, sizeof (ruleExecInfo_t));
00063 rei2.rsComm = rsComm;
00064 if (rsComm != NULL) {
00065 rei2.uoic = &rsComm->clientUser;
00066 rei2.uoip = &rsComm->proxyUser;
00067 }
00068
00069
00070
00071 sprintf(rFlag,"%d",modAccessControlInp->recursiveFlag);
00072 args[0] = rFlag;
00073 args[1] = modAccessControlInp->accessLevel;
00074 args[2] = modAccessControlInp->userName;
00075 args[3] = modAccessControlInp->zone;
00076 args[4] = modAccessControlInp->path;
00077 argc = 5;
00078 i = applyRuleArg("acPreProcForModifyAccessControl",args,argc, &rei2, NO_SAVE_REI);
00079 if (i < 0) {
00080 if (rei2.status < 0) {
00081 i = rei2.status;
00082 }
00083 rodsLog (LOG_ERROR,
00084 "rsModAVUMetadata:acPreProcForModifyAccessControl error for %s.%s of level %s for %s,stat=%d",
00085 modAccessControlInp->zone, modAccessControlInp->userName, modAccessControlInp->accessLevel, modAccessControlInp->path, i);
00086 return i;
00087 }
00088
00089
00090
00091 status = chlModAccessControl(rsComm,
00092 modAccessControlInp->recursiveFlag,
00093 modAccessControlInp->accessLevel,
00094 modAccessControlInp->userName,
00095 modAccessControlInp->zone,
00096 modAccessControlInp->path );
00097
00098
00099 i = applyRuleArg("acPostProcForModifyAccessControl",args,argc, &rei2, NO_SAVE_REI);
00100 if (i < 0) {
00101 if (rei2.status < 0) {
00102 i = rei2.status;
00103 }
00104 rodsLog (LOG_ERROR,
00105 "rsModAVUMetadata:acPostProcForModifyAccessControl error for %s.%s of level %s for %s,stat=%d",
00106 modAccessControlInp->zone, modAccessControlInp->userName, modAccessControlInp->accessLevel, modAccessControlInp->path, i);
00107 return i;
00108 }
00109
00110
00111 return(status);
00112 }
00113 #endif