00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "rods.h"
00020 #include "rcMisc.h"
00021 #include "eirods_error.h"
00022 #include "eirods_zone_info.h"
00023 #include "eirods_sql_logger.h"
00024 #include "eirods_string_tokenize.h"
00025 #include "eirods_log.h"
00026 #include "eirods_tmp_string.h"
00027 #include "eirods_children_parser.h"
00028 #include "eirods_stacktrace.h"
00029 #include "eirods_hierarchy_parser.h"
00030
00031 #include "icatMidLevelRoutines.h"
00032 #include "icatMidLevelHelpers.h"
00033 #include "icatHighLevelRoutines.h"
00034 #include "icatLowLevel.h"
00035
00036 #include <string>
00037 #include <iostream>
00038 #include <sstream>
00039 #include <vector>
00040
00041 extern int get64RandomBytes(char *buf);
00042
00043 static char prevChalSig[200];
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 #define AP_READ "read"
00072 #define AP_WRITE "write"
00073 #define AP_OWN "own"
00074 #define AP_NULL "null"
00075
00076 #define MAX_PASSWORDS 40
00077
00078
00079
00080
00081
00082
00083
00084 #define TEMP_PASSWORD_TIME 120
00085 #define TEMP_PASSWORD_MAX_TIME 1000
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 #define IRODS_PAM_PASSWORD_LEN 20
00096
00097
00098
00099
00100 #define IRODS_PAM_PASSWORD_MIN_TIME "121"
00101 #define IRODS_PAM_PASSWORD_MAX_TIME "1209600"
00102 #ifdef PAM_AUTH_NO_EXTEND
00103 #define IRODS_PAM_PASSWORD_DEFAULT_TIME "28800"
00104 #else
00105 #define IRODS_PAM_PASSWORD_DEFAULT_TIME "1209600"
00106 #endif
00107
00108 #define PASSWORD_SCRAMBLE_PREFIX ".E_"
00109 #define PASSWORD_KEY_ENV_VAR "irodsPKey"
00110 #define PASSWORD_DEFAULT_KEY "a9_3fker"
00111
00112 #define MAX_HOST_STR 2700
00113
00114 int logSQL=0;
00115
00116 static int _delColl(rsComm_t *rsComm, collInfo_t *collInfo);
00117 static int removeAVUs();
00118
00119 icatSessionStruct icss={0};
00120 char localZone[MAX_NAME_LEN]={""};
00121
00122 int creatingUserByGroupAdmin=0;
00123
00124
00125
00126
00127
00128 int chlDebug(char *debugMode) {
00129 if (strstr(debugMode, "SQL")) {
00130 logSQL=1;
00131 chlDebugGenQuery(1);
00132 chlDebugGenUpdate(1);
00133 cmlDebug(2);
00134 }
00135 else {
00136 if (strstr(debugMode, "sql")) {
00137 logSQL=1;
00138 chlDebugGenQuery(1);
00139 chlDebugGenUpdate(1);
00140 cmlDebug(1);
00141 }
00142 else {
00143 logSQL=0;
00144 chlDebugGenQuery(0);
00145 chlDebugGenUpdate(0);
00146 cmlDebug(0);
00147 }
00148 }
00149 return(0);
00150 }
00151
00152
00153
00154
00155
00156 static int
00157 icatDescramble(char *pw) {
00158 char *cp1, *cp2, *cp3;
00159 int i,len;
00160 char pw2[MAX_PASSWORD_LEN+10];
00161 char unscrambled[MAX_PASSWORD_LEN+10];
00162
00163 len = strlen(PASSWORD_SCRAMBLE_PREFIX);
00164 cp1=pw;
00165 cp2=PASSWORD_SCRAMBLE_PREFIX;
00166 for (i=0;i<len;i++) {
00167 if (*cp1++ != *cp2++) {
00168 return 0;
00169 }
00170 }
00171 strncpy(pw2, cp1, MAX_PASSWORD_LEN);
00172 cp3 = getenv(PASSWORD_KEY_ENV_VAR);
00173 if (cp3==NULL) {
00174 cp3 = PASSWORD_DEFAULT_KEY;
00175 }
00176 obfDecodeByKey(pw2, cp3, unscrambled);
00177 strncpy(pw, unscrambled, MAX_PASSWORD_LEN);
00178
00179 return 0;
00180 }
00181
00182
00183
00184
00185
00186 static int
00187 icatScramble(char *pw) {
00188 char *cp1;
00189 char newPw[MAX_PASSWORD_LEN+10];
00190 char scrambled[MAX_PASSWORD_LEN+10];
00191
00192 cp1 = getenv(PASSWORD_KEY_ENV_VAR);
00193 if (cp1==NULL) {
00194 cp1 = PASSWORD_DEFAULT_KEY;
00195 }
00196 obfEncodeByKey(pw, cp1, scrambled);
00197 strncpy(newPw, PASSWORD_SCRAMBLE_PREFIX, MAX_PASSWORD_LEN);
00198 strncat(newPw, scrambled, MAX_PASSWORD_LEN);
00199 strncpy(pw, newPw, MAX_PASSWORD_LEN);
00200 return 0;
00201 }
00202
00203
00204
00205
00206
00207 int chlOpen(char *DBUser, char *DBpasswd) {
00208 int i;
00209 if (logSQL!=0) rodsLog(LOG_SQL, "chlOpen");
00210 strncpy(icss.databaseUsername, DBUser, DB_USERNAME_LEN);
00211 strncpy(icss.databasePassword, DBpasswd, DB_PASSWORD_LEN);
00212 i = cmlOpen(&icss);
00213 if (i != 0) {
00214 rodsLog(LOG_NOTICE, "chlOpen cmlOpen failure %d",i);
00215 }
00216 else {
00217 icss.status=1;
00218 }
00219 return(i);
00220 }
00221
00222
00223
00224
00225
00226 int chlClose() {
00227 int i;
00228
00229 i = cmlClose(&icss);
00230 if (i == 0) icss.status=0;
00231 return(i);
00232 }
00233
00234 int chlIsConnected() {
00235 if (logSQL!=0) rodsLog(LOG_SQL, "chlIsConnected");
00236 return(icss.status);
00237 }
00238
00239
00240
00241
00242
00243
00244
00245
00246 icatSessionStruct *
00247 chlGetRcs()
00248 {
00249 if (logSQL!=0) rodsLog(LOG_SQL, "chlGetRcs");
00250 if (icss.status != 1) {
00251 return(NULL);
00252 }
00253 return(&icss);
00254 }
00255
00256
00257
00258
00259 int
00260 _rollback(const char *functionName) {
00261 int status;
00262 #if ORA_ICAT
00263 status = 0;
00264 #else
00265
00266
00267 status = cmlExecuteNoAnswerSql("rollback", &icss);
00268 if (status == 0) {
00269 rodsLog(LOG_NOTICE,
00270 "%s cmlExecuteNoAnswerSql(rollback) succeeded", functionName);
00271 }
00272 else {
00273 rodsLog(LOG_NOTICE,
00274 "%s cmlExecuteNoAnswerSql(rollback) failure %d",
00275 functionName, status);
00276 }
00277 #endif
00278
00279 return(status);
00280 }
00281
00282
00283
00284
00285
00286
00287
00288 int
00289 getLocalZone()
00290 {
00291 std::string local_zone;
00292 eirods::error e = eirods::zone_info::get_instance()->get_local_zone(icss, logSQL, local_zone);
00293 strncpy(localZone, local_zone.c_str(), MAX_NAME_LEN);
00294 return e.code();
00295 }
00296
00297
00298
00299
00300
00301 char *
00302 chlGetLocalZone() {
00303 getLocalZone();
00304 return(localZone);
00305 }
00306
00307
00308
00309
00310 static int
00311 _updateRescObjCount(
00312 const std::string& _resc_name,
00313 const std::string& _zone,
00314 int _amount) {
00315
00316 int result = 0;
00317 int status;
00318 char resc_id[MAX_NAME_LEN];
00319 char myTime[50];
00320 eirods::sql_logger logger(__FUNCTION__, logSQL);
00321 eirods::hierarchy_parser hparse;
00322
00323 resc_id[0] = '\0';
00324
00325 std::stringstream ss;
00326 if((status = cmlGetStringValueFromSql("select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
00327 resc_id, MAX_NAME_LEN, _resc_name.c_str(), _zone.c_str(), 0,
00328 &icss)) != 0) {
00329 if(status == CAT_NO_ROWS_FOUND) {
00330 result = CAT_INVALID_RESOURCE;
00331 } else {
00332 _rollback(__FUNCTION__);
00333 result = status;
00334 }
00335 } else {
00336 std::stringstream ss;
00337 ss << "update R_RESC_MAIN set resc_objcount=resc_objcount+";
00338 ss << _amount;
00339 ss << ", modify_ts=? where resc_id=?";
00340 getNowStr(myTime);
00341 cllBindVarCount = 0;
00342 cllBindVars[cllBindVarCount++] = myTime;
00343 cllBindVars[cllBindVarCount++] = resc_id;
00344 if((status = cmlExecuteNoAnswerSql(ss.str().c_str(), &icss)) != 0) {
00345 std::stringstream ss;
00346 ss << __FUNCTION__ << " cmlExecuteNoAnswerSql update failure " << status;
00347 eirods::log(LOG_NOTICE, ss.str());
00348 _rollback(__FUNCTION__);
00349 result = status;
00350 }
00351 }
00352 return result;
00353 }
00354
00355
00356
00357
00358 static int
00359 _updateObjCountOfResources(
00360 const std::string _resc_hier,
00361 const std::string _zone,
00362 int _amount) {
00363 int result = 0;
00364 eirods::hierarchy_parser hparse;
00365
00366 hparse.set_string(_resc_hier);
00367 for(eirods::hierarchy_parser::const_iterator it = hparse.begin();
00368 result == 0 && it != hparse.end(); ++it) {
00369 result = _updateRescObjCount(*it, _zone, _amount);
00370 }
00371 return result;
00372 }
00373
00374
00375
00376
00377 int
00378 chlUpdateRescObjCount(
00379 const std::string& _resc,
00380 int _delta) {
00381
00382 int result = 0;
00383 int ret;
00384 if((ret = getLocalZone()) != 0) {
00385 std::stringstream msg;
00386 msg << __FUNCTION__ << " - Failed to set the local zone.";
00387 eirods::log(LOG_ERROR, msg.str());
00388 result = ret;
00389 } else if((ret = _updateRescObjCount(_resc, localZone, _delta)) != 0) {
00390 std::stringstream msg;
00391 msg << __FUNCTION__ << " - Failed to update the object count for resource \"" << _resc << "\"";
00392 eirods::log(LOG_ERROR, msg.str());
00393 result = ret;
00394 }
00395
00396 return result;
00397 }
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412 int chlModDataObjMeta(rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
00413 keyValPair_t *regParam) {
00414 int i, j, status, upCols;
00415 rodsLong_t iVal = 0;
00416 int status2;
00417
00418 int mode=0;
00419
00420 char logicalFileName[MAX_NAME_LEN];
00421 char logicalDirName[MAX_NAME_LEN];
00422 char *theVal;
00423 char replNum1[MAX_NAME_LEN];
00424
00425 char *whereColsAndConds[10];
00426 char *whereValues[10];
00427 char idVal[MAX_NAME_LEN];
00428 int numConditions;
00429 char oldCopy[NAME_LEN];
00430 char newCopy[NAME_LEN];
00431 int adminMode;
00432
00433 int maxCols=90;
00434 char *updateCols[90];
00435 char *updateVals[90];
00436
00437
00438
00439
00440 int dataTypeIndex=1;
00441
00442 char *regParamNames[]={
00443 REPL_NUM_KW, DATA_TYPE_KW, DATA_SIZE_KW,
00444 RESC_NAME_KW,FILE_PATH_KW, DATA_OWNER_KW, DATA_OWNER_ZONE_KW,
00445 REPL_STATUS_KW, CHKSUM_KW, DATA_EXPIRY_KW,
00446 DATA_COMMENTS_KW, DATA_CREATE_KW, DATA_MODIFY_KW, RESC_GROUP_NAME_KW,
00447 DATA_MODE_KW, RESC_HIER_STR_KW, "END"
00448 };
00449
00450
00451
00452 char *colNames[]={
00453 "data_repl_num", "data_type_name", "data_size",
00454 "resc_name", "data_path", "data_owner_name", "data_owner_zone",
00455 "data_is_dirty", "data_checksum", "data_expiry_ts",
00456 "r_comment", "create_ts", "modify_ts", "resc_group_name",
00457 "data_mode", "resc_hier"
00458 };
00459 int DATA_EXPIRY_TS_IX=9;
00460 int MODIFY_TS_IX=12;
00461
00462 char objIdString[MAX_NAME_LEN];
00463 char *neededAccess;
00464
00465 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta");
00466
00467 if (regParam == NULL || dataObjInfo == NULL) {
00468 return (CAT_INVALID_ARGUMENT);
00469 }
00470
00471 adminMode=0;
00472 theVal = getValByKey(regParam, IRODS_ADMIN_KW);
00473 if (theVal != NULL) {
00474 adminMode=1;
00475 }
00476
00477
00478 for (i=0, j=0; i<maxCols; i++) {
00479 if (strcmp(regParamNames[i],"END")==0) break;
00480 theVal = getValByKey(regParam, regParamNames[i]);
00481 if (theVal != NULL) {
00482 updateCols[j]=colNames[i];
00483 updateVals[j]=theVal;
00484 if (i==DATA_EXPIRY_TS_IX) {
00485
00486
00487 if (strcmp(colNames[i],"data_expiry_ts") == 0) {
00488 if (strlen(theVal) < 11) {
00489 static char theVal2[20];
00490 time_t myTimeValue;
00491 myTimeValue=atoll(theVal);
00492 snprintf(theVal2, sizeof theVal2, "%011d", (int)myTimeValue);
00493 updateVals[j]=theVal2;
00494 }
00495 }
00496 }
00497
00498 if (i==MODIFY_TS_IX) {
00499
00500
00501 if (strcmp(colNames[i],"modify_ts") == 0) {
00502 if (strlen(theVal) < 11) {
00503 static char theVal3[20];
00504 time_t myTimeValue;
00505 myTimeValue=atoll(theVal);
00506 snprintf(theVal3, sizeof theVal3, "%011d", (int)myTimeValue);
00507 updateVals[j]=theVal3;
00508 }
00509 }
00510 }
00511
00512 j++;
00513
00514
00515 if (i==dataTypeIndex) {
00516 status = cmlCheckNameToken("data_type",
00517 theVal, &icss);
00518 if (status !=0 ) {
00519 std::stringstream msg;
00520 msg << __FUNCTION__;
00521 msg << " - Invalid data type specified.";
00522 addRErrorMsg (&rsComm->rError, 0, msg.str().c_str());
00523 return(CAT_INVALID_DATA_TYPE);
00524 }
00525 }
00526 }
00527 }
00528 upCols=j;
00529
00530
00531
00532
00533
00534
00535
00536 neededAccess = ACCESS_MODIFY_METADATA;
00537 if (upCols==1 && strcmp(updateCols[0],"chksum")==0) {
00538 neededAccess = ACCESS_READ_OBJECT;
00539 }
00540
00541
00542
00543 theVal = getValByKey(regParam, DATA_EXPIRY_KW);
00544 if (theVal != NULL) {
00545 neededAccess = ACCESS_DELETE_OBJECT;
00546 }
00547
00548 if (dataObjInfo->dataId <= 0) {
00549 status = splitPathByKey(dataObjInfo->objPath,
00550 logicalDirName, logicalFileName, '/');
00551
00552 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 1 ");
00553 status = cmlGetIntegerValueFromSql(
00554 "select coll_id from R_COLL_MAIN where coll_name=?", &iVal,
00555 logicalDirName, 0, 0, 0, 0, &icss);
00556
00557 if (status != 0) {
00558 char errMsg[105];
00559 snprintf(errMsg, 100, "collection '%s' is unknown",
00560 logicalDirName);
00561 addRErrorMsg (&rsComm->rError, 0, errMsg);
00562 _rollback("chlModDataObjMeta");
00563 return(CAT_UNKNOWN_COLLECTION);
00564 }
00565 snprintf(objIdString, MAX_NAME_LEN, "%lld", iVal);
00566
00567 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 2");
00568 status = cmlGetIntegerValueFromSql(
00569 "select data_id from R_DATA_MAIN where coll_id=? and data_name=?",
00570 &iVal, objIdString, logicalFileName, 0, 0, 0, &icss);
00571 if (status != 0) {
00572 std::stringstream msg;
00573 msg << __FUNCTION__;
00574 msg << " - Failed to find file in database by its logical path.";
00575 addRErrorMsg (&rsComm->rError, 0, msg.str().c_str());
00576 _rollback("chlModDataObjMeta");
00577 return(CAT_UNKNOWN_FILE);
00578 }
00579
00580 dataObjInfo->dataId = iVal;
00581
00582 }
00583
00584 snprintf(objIdString, MAX_NAME_LEN, "%lld", dataObjInfo->dataId);
00585
00586 if (adminMode) {
00587 if (rsComm->clientUser.authInfo.authFlag != LOCAL_PRIV_USER_AUTH) {
00588 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00589 }
00590 }
00591 else {
00592 status = cmlCheckDataObjId(objIdString, rsComm->clientUser.userName,
00593 rsComm->clientUser.rodsZone, neededAccess, &icss);
00594 if (status != 0) {
00595 theVal = getValByKey(regParam, ACL_COLLECTION_KW);
00596 if (theVal != NULL && dataObjInfo->objPath != NULL &&
00597 upCols==1 && strcmp(updateCols[0],"data_path")==0) {
00598 int len, iVal = 0;
00599
00600
00601
00602
00603 len = strlen(theVal);
00604 if (strncmp(theVal, dataObjInfo->objPath, len) == 0) {
00605
00606 iVal = cmlCheckDir(theVal,
00607 rsComm->clientUser.userName,
00608 rsComm->clientUser.rodsZone,
00609 ACCESS_OWN,
00610 &icss);
00611 }
00612 if (iVal > 0) status=0;
00613
00614 }
00615 if (status) {
00616 _rollback("chlModDataObjMeta");
00617 return(CAT_NO_ACCESS_PERMISSION);
00618 }
00619 }
00620 }
00621
00622 whereColsAndConds[0]="data_id=";
00623 snprintf(idVal, MAX_NAME_LEN, "%lld", dataObjInfo->dataId);
00624 whereValues[0]=idVal;
00625 numConditions=1;
00626
00627
00628
00629
00630
00631
00632 if (getValByKey(regParam, ALL_KW) == NULL) {
00633 j = numConditions;
00634 whereColsAndConds[j]="data_repl_num=";
00635 snprintf(replNum1, MAX_NAME_LEN, "%d", dataObjInfo->replNum);
00636 whereValues[j]=replNum1;
00637 numConditions++;
00638 }
00639
00640 mode =0;
00641 if (getValByKey(regParam, ALL_REPL_STATUS_KW)) {
00642 mode=1;
00643
00644 }
00645
00646 status = getLocalZone();
00647 if( status < 0 ) {
00648 rodsLog( LOG_ERROR, "chlModObjMeta - failed in getLocalZone with status [%d]", status );
00649 return status;
00650 }
00651
00652
00653
00654 char* new_resc_hier = getValByKey(regParam, RESC_HIER_STR_KW);
00655 if(new_resc_hier != NULL) {
00656 std::stringstream id_stream;
00657 id_stream << dataObjInfo->dataId;
00658 std::stringstream repl_stream;
00659 repl_stream << dataObjInfo->replNum;
00660 char resc_hier[MAX_NAME_LEN];
00661 if((status = cmlGetStringValueFromSql("select resc_hier from R_DATA_MAIN where data_id=? and data_repl_num=?",
00662 resc_hier, MAX_NAME_LEN, id_stream.str().c_str(), repl_stream.str().c_str(),
00663 0, &icss)) != 0) {
00664 std::stringstream msg;
00665 msg << __FUNCTION__;
00666 msg << " - Failed to get the resc hierarchy from object with id: ";
00667 msg << id_stream.str();
00668 msg << " and replNum: ";
00669 msg << repl_stream.str();
00670 eirods::log(LOG_NOTICE, msg.str());
00671 return status;
00672 }
00673
00674 else if((status = _updateObjCountOfResources(resc_hier, localZone, -1)) != 0) {
00675 return status;
00676 } else if((status = _updateObjCountOfResources(new_resc_hier, localZone, +1)) != 0) {
00677 return status;
00678 }
00679 }
00680
00681 if (mode == 0) {
00682 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 4");
00683 status = cmlModifySingleTable("R_DATA_MAIN", updateCols, updateVals,
00684 whereColsAndConds, whereValues, upCols,
00685 numConditions, &icss);
00686 } else {
00687
00688 j = upCols;
00689 updateCols[j]="data_is_dirty";
00690 snprintf(newCopy, NAME_LEN, "%d", NEWLY_CREATED_COPY);
00691 updateVals[j]=newCopy;
00692 upCols++;
00693 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 5");
00694 status = cmlModifySingleTable("R_DATA_MAIN", updateCols, updateVals,
00695 whereColsAndConds, whereValues, upCols,
00696 numConditions, &icss);
00697 if (status == 0) {
00698 j = numConditions-1;
00699 whereColsAndConds[j]="data_repl_num!=";
00700 snprintf(replNum1, MAX_NAME_LEN, "%d", dataObjInfo->replNum);
00701 whereValues[j]=replNum1;
00702
00703 updateCols[0]="data_is_dirty";
00704 snprintf(oldCopy, NAME_LEN, "%d", OLD_COPY);
00705 updateVals[0]=oldCopy;
00706 if (logSQL!=0) rodsLog(LOG_SQL, "chlModDataObjMeta SQL 6");
00707 status2 = cmlModifySingleTable("R_DATA_MAIN", updateCols, updateVals,
00708 whereColsAndConds, whereValues, 1,
00709 numConditions, &icss);
00710
00711 if (status2 != 0 && status2 != CAT_SUCCESS_BUT_WITH_NO_INFO) {
00712
00713 rodsLog(LOG_NOTICE,
00714 "chlModDataObjMeta cmlModifySingleTable failure for other replicas %d",
00715 status2);
00716 _rollback("chlModDataObjMeta");
00717 return(status2);
00718 }
00719
00720 }
00721 }
00722 if (status != 0) {
00723 _rollback("chlModDataObjMeta");
00724 rodsLog(LOG_NOTICE,
00725 "chlModDataObjMeta cmlModifySingleTable failure %d",
00726 status);
00727 return(status);
00728 }
00729
00730 if ( !(dataObjInfo->flags & NO_COMMIT_FLAG) ) {
00731 status = cmlExecuteNoAnswerSql("commit", &icss);
00732 if (status != 0) {
00733 rodsLog(LOG_NOTICE,
00734 "chlModDataObjMeta cmlExecuteNoAnswerSql commit failure %d",
00735 status);
00736 return(status);
00737 }
00738 }
00739 return status;
00740 }
00741
00742
00743
00744
00745
00746
00747 int chlRegDataObj(rsComm_t *rsComm, dataObjInfo_t *dataObjInfo) {
00748 char myTime[50];
00749 char logicalFileName[MAX_NAME_LEN];
00750 char logicalDirName[MAX_NAME_LEN];
00751 rodsLong_t seqNum;
00752 rodsLong_t iVal;
00753 char dataIdNum[MAX_NAME_LEN];
00754 char collIdNum[MAX_NAME_LEN];
00755 char dataReplNum[MAX_NAME_LEN];
00756 char dataSizeNum[MAX_NAME_LEN];
00757 char dataStatusNum[MAX_NAME_LEN];
00758 int status;
00759 int inheritFlag;
00760
00761 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj");
00762 if (!icss.status) {
00763 return(CATALOG_NOT_CONNECTED);
00764 }
00765
00766 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 1 ");
00767 seqNum = cmlGetNextSeqVal(&icss);
00768 if (seqNum < 0) {
00769 rodsLog(LOG_NOTICE, "chlRegDataObj cmlGetNextSeqVal failure %d",
00770 seqNum);
00771 _rollback("chlRegDataObj");
00772 return(seqNum);
00773 }
00774 snprintf(dataIdNum, MAX_NAME_LEN, "%lld", seqNum);
00775 dataObjInfo->dataId=seqNum;
00776
00777 status = splitPathByKey(dataObjInfo->objPath,
00778 logicalDirName, logicalFileName, '/');
00779
00780
00781
00782
00783 iVal = cmlCheckDirAndGetInheritFlag(logicalDirName,
00784 rsComm->clientUser.userName,
00785 rsComm->clientUser.rodsZone,
00786 ACCESS_MODIFY_OBJECT, &inheritFlag, &icss);
00787 if (iVal < 0) {
00788 char errMsg[105];
00789 if (iVal==CAT_UNKNOWN_COLLECTION) {
00790 snprintf(errMsg, 100, "collection '%s' is unknown",
00791 logicalDirName);
00792 addRErrorMsg (&rsComm->rError, 0, errMsg);
00793 }
00794 if (iVal==CAT_NO_ACCESS_PERMISSION) {
00795 snprintf(errMsg, 100, "no permission to update collection '%s'",
00796 logicalDirName);
00797 addRErrorMsg (&rsComm->rError, 0, errMsg);
00798 }
00799 return (iVal);
00800 }
00801 snprintf(collIdNum, MAX_NAME_LEN, "%lld", iVal);
00802
00803
00804 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 4");
00805 status = cmlGetIntegerValueFromSql(
00806 "select coll_id from R_COLL_MAIN where coll_name=?",
00807 &iVal,
00808 dataObjInfo->objPath, 0, 0, 0, 0, &icss);
00809 if (status == 0) {
00810 return(CAT_NAME_EXISTS_AS_COLLECTION);
00811 }
00812
00813 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 5");
00814 status = cmlCheckNameToken("data_type",
00815 dataObjInfo->dataType, &icss);
00816 if (status !=0 ) {
00817 return(CAT_INVALID_DATA_TYPE);
00818 }
00819
00820 snprintf(dataReplNum, MAX_NAME_LEN, "%d", dataObjInfo->replNum);
00821 snprintf(dataStatusNum, MAX_NAME_LEN, "%d", dataObjInfo->replStatus);
00822 snprintf(dataSizeNum, MAX_NAME_LEN, "%lld", dataObjInfo->dataSize);
00823 getNowStr(myTime);
00824 cllBindVars[0]=dataIdNum;
00825 cllBindVars[1]=collIdNum;
00826 cllBindVars[2]=logicalFileName;
00827 cllBindVars[3]=dataReplNum;
00828 cllBindVars[4]=dataObjInfo->version;
00829 cllBindVars[5]=dataObjInfo->dataType;
00830 cllBindVars[6]=dataSizeNum;
00831 cllBindVars[7]=dataObjInfo->rescGroupName;
00832 cllBindVars[8]=dataObjInfo->rescName;
00833 cllBindVars[9]=dataObjInfo->rescHier;
00834 cllBindVars[10]=dataObjInfo->filePath;
00835 cllBindVars[11]=rsComm->clientUser.userName;
00836 cllBindVars[12]=rsComm->clientUser.rodsZone;
00837 cllBindVars[13]=dataStatusNum;
00838 cllBindVars[14]=dataObjInfo->chksum;
00839 cllBindVars[15]=dataObjInfo->dataMode;
00840 cllBindVars[16]=myTime;
00841 cllBindVars[17]=myTime;
00842 cllBindVarCount=18;
00843 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 6");
00844 status = cmlExecuteNoAnswerSql(
00845 "insert into R_DATA_MAIN (data_id, coll_id, data_name, data_repl_num, data_version, data_type_name, data_size, resc_group_name, resc_name, resc_hier, data_path, data_owner_name, data_owner_zone, data_is_dirty, data_checksum, data_mode, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
00846 &icss);
00847 if (status != 0) {
00848 rodsLog(LOG_NOTICE,
00849 "chlRegDataObj cmlExecuteNoAnswerSql failure %d",status);
00850 _rollback("chlRegDataObj");
00851 return(status);
00852 }
00853
00854 status = getLocalZone();
00855 if( status < 0 ) {
00856 rodsLog( LOG_ERROR, "chlRegDataInfo - failed in getLocalZone with status [%d]", status );
00857 return status;
00858 }
00859
00860 if((status = _updateObjCountOfResources( dataObjInfo->rescHier, localZone, 1)) != 0) {
00861 return status;
00862 }
00863
00864 if (inheritFlag) {
00865
00866
00867 cllBindVars[0]=dataIdNum;
00868 cllBindVars[1]=myTime;
00869 cllBindVars[2]=myTime;
00870 cllBindVars[3]=collIdNum;
00871 cllBindVarCount=4;
00872 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 7");
00873 status = cmlExecuteNoAnswerSql(
00874 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select ?, user_id, access_type_id, ?, ? from R_OBJT_ACCESS where object_id = ?)",
00875 &icss);
00876 if (status != 0) {
00877 rodsLog(LOG_NOTICE,
00878 "chlRegDataObj cmlExecuteNoAnswerSql insert access failure %d",
00879 status);
00880 _rollback("chlRegDataObj");
00881 return(status);
00882 }
00883 }
00884 else {
00885 cllBindVars[0]=dataIdNum;
00886 cllBindVars[1]=rsComm->clientUser.userName;
00887 cllBindVars[2]=rsComm->clientUser.rodsZone;
00888 cllBindVars[3]=ACCESS_OWN;
00889 cllBindVars[4]=myTime;
00890 cllBindVars[5]=myTime;
00891 cllBindVarCount=6;
00892 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegDataObj SQL 8");
00893 status = cmlExecuteNoAnswerSql(
00894 "insert into R_OBJT_ACCESS values (?, (select user_id from R_USER_MAIN where user_name=? and zone_name=?), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
00895 &icss);
00896 if (status != 0) {
00897 rodsLog(LOG_NOTICE,
00898 "chlRegDataObj cmlExecuteNoAnswerSql insert access failure %d",
00899 status);
00900 _rollback("chlRegDataObj");
00901 return(status);
00902 }
00903 }
00904
00905 status = cmlAudit3(AU_REGISTER_DATA_OBJ, dataIdNum,
00906 rsComm->clientUser.userName,
00907 rsComm->clientUser.rodsZone, "", &icss);
00908 if (status != 0) {
00909 rodsLog(LOG_NOTICE,
00910 "chlRegDataObj cmlAudit3 failure %d",
00911 status);
00912 _rollback("chlRegDataObj");
00913 return(status);
00914 }
00915
00916
00917 if ( !(dataObjInfo->flags & NO_COMMIT_FLAG) ) {
00918 status = cmlExecuteNoAnswerSql("commit", &icss);
00919 if (status != 0) {
00920 rodsLog(LOG_NOTICE,
00921 "chlRegDataObj cmlExecuteNoAnswerSql commit failure %d",
00922 status);
00923 return(status);
00924 }
00925 }
00926
00927 return(0);
00928 }
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938 int chlRegReplica(rsComm_t *rsComm, dataObjInfo_t *srcDataObjInfo,
00939 dataObjInfo_t *dstDataObjInfo, keyValPair_t *condInput) {
00940 char myTime[50];
00941 char logicalFileName[MAX_NAME_LEN];
00942 char logicalDirName[MAX_NAME_LEN];
00943 rodsLong_t iVal;
00944 rodsLong_t status;
00945 char tSQL[MAX_SQL_SIZE];
00946 char *cVal[30];
00947 int i;
00948 int statementNumber;
00949 int nextReplNum;
00950 char nextRepl[30];
00951 char theColls[]="data_id, coll_id, data_name, data_repl_num, data_version, data_type_name, data_size, resc_group_name, resc_name, resc_hier, data_path, data_owner_name, data_owner_zone, data_is_dirty, data_status, data_checksum, data_expiry_ts, data_map_id, data_mode, r_comment, create_ts, modify_ts";
00952 int IX_DATA_REPL_NUM=3;
00953 int IX_RESC_GROUP_NAME=7;
00954 int IX_RESC_NAME=8;
00955 int IX_RESC_HIER=9;
00956 int IX_DATA_PATH=10;
00957
00958 int IX_DATA_MODE=18;
00959 int IX_CREATE_TS=20;
00960 int IX_MODIFY_TS=21;
00961 int IX_RESC_NAME2=22;
00962 int IX_DATA_PATH2=23;
00963 int IX_DATA_ID2=24;
00964 int nColumns=25;
00965
00966 char objIdString[MAX_NAME_LEN];
00967 char replNumString[MAX_NAME_LEN];
00968 int adminMode;
00969 char *theVal;
00970
00971 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica");
00972
00973 adminMode=0;
00974 if (condInput != NULL) {
00975 theVal = getValByKey(condInput, IRODS_ADMIN_KW);
00976 if (theVal != NULL) {
00977 adminMode=1;
00978 }
00979 }
00980
00981 if (!icss.status) {
00982 return(CATALOG_NOT_CONNECTED);
00983 }
00984
00985 status = splitPathByKey(srcDataObjInfo->objPath,
00986 logicalDirName, logicalFileName, '/');
00987
00988 if (adminMode) {
00989 if (rsComm->clientUser.authInfo.authFlag != LOCAL_PRIV_USER_AUTH) {
00990 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
00991 }
00992 }
00993 else {
00994
00995 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica SQL 1 ");
00996 status = cmlCheckDataObjOnly(logicalDirName, logicalFileName,
00997 rsComm->clientUser.userName,
00998 rsComm->clientUser.rodsZone,
00999 ACCESS_READ_OBJECT, &icss);
01000 if (status < 0) {
01001 _rollback("chlRegReplica");
01002 return(status);
01003 }
01004 }
01005
01006
01007 snprintf(objIdString, MAX_NAME_LEN, "%lld", srcDataObjInfo->dataId);
01008 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica SQL 2");
01009 status = cmlGetIntegerValueFromSql(
01010 "select max(data_repl_num) from R_DATA_MAIN where data_id = ?",
01011 &iVal, objIdString, 0, 0, 0, 0, &icss);
01012
01013 if (status != 0) {
01014 _rollback("chlRegReplica");
01015 return(status);
01016 }
01017
01018 nextReplNum = iVal+1;
01019 snprintf(nextRepl, sizeof nextRepl, "%d", nextReplNum);
01020 dstDataObjInfo->replNum = nextReplNum;
01021 snprintf(replNumString, MAX_NAME_LEN, "%d", srcDataObjInfo->replNum);
01022 snprintf(tSQL, MAX_SQL_SIZE,
01023 "select %s from R_DATA_MAIN where data_id = ? and data_repl_num = ?",
01024 theColls);
01025 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica SQL 3");
01026 status = cmlGetOneRowFromSqlV2(tSQL, cVal, nColumns,
01027 objIdString, replNumString, &icss);
01028 if (status < 0) {
01029 _rollback("chlRegReplica");
01030 return(status);
01031 }
01032 statementNumber = status;
01033
01034 cVal[IX_DATA_REPL_NUM]=nextRepl;
01035 cVal[IX_RESC_NAME]=dstDataObjInfo->rescName;
01036 cVal[IX_RESC_HIER]=dstDataObjInfo->rescHier;
01037 cVal[IX_RESC_GROUP_NAME]=dstDataObjInfo->rescGroupName;
01038 cVal[IX_DATA_PATH]=dstDataObjInfo->filePath;
01039 cVal[IX_DATA_MODE]=dstDataObjInfo->dataMode;
01040
01041
01042 getNowStr(myTime);
01043 cVal[IX_MODIFY_TS]=myTime;
01044 cVal[IX_CREATE_TS]=myTime;
01045
01046 cVal[IX_RESC_NAME2]=dstDataObjInfo->rescName;
01047 cVal[IX_DATA_PATH2]=dstDataObjInfo->filePath;
01048 cVal[IX_DATA_ID2]=objIdString;
01049
01050
01051 for (i=0;i<nColumns;i++) {
01052 cllBindVars[i]=cVal[i];
01053 }
01054 cllBindVarCount = nColumns;
01055 #if (defined ORA_ICAT || defined MY_ICAT) // JMC - backport 4685
01056
01057 snprintf(tSQL, MAX_SQL_SIZE, "insert into R_DATA_MAIN ( %s ) select ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? from DUAL where not exists (select data_id from R_DATA_MAIN where resc_name=? and data_path=? and data_id=?)",
01058 theColls);
01059 #else
01060
01061 snprintf(tSQL, MAX_SQL_SIZE, "insert into R_DATA_MAIN ( %s ) select ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? where not exists (select data_id from R_DATA_MAIN where resc_name=? and data_path=? and data_id=?)",
01062 theColls);
01063
01064 #endif
01065 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegReplica SQL 4");
01066 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01067 if (status < 0) {
01068 rodsLog(LOG_NOTICE,
01069 "chlRegReplica cmlExecuteNoAnswerSql(insert) failure %d",
01070 status);
01071 _rollback("chlRegReplica");
01072 return(status);
01073 }
01074
01075 status = getLocalZone();
01076 if( status < 0 ) {
01077 rodsLog( LOG_ERROR, "chlRegReplica - failed in getLocalZone with status [%d]", status );
01078 return status;
01079 }
01080
01081 if((status = _updateObjCountOfResources(dstDataObjInfo->rescHier, localZone, +1)) != 0) {
01082 return status;
01083 }
01084
01085 cmlFreeStatement(statementNumber, &icss);
01086 if (status < 0) {
01087 rodsLog(LOG_NOTICE, "chlRegReplica cmlFreeStatement failure %d", status);
01088 return(status);
01089 }
01090
01091 status = cmlAudit3(AU_REGISTER_DATA_REPLICA, objIdString,
01092 rsComm->clientUser.userName,
01093 rsComm->clientUser.rodsZone, nextRepl, &icss);
01094 if (status != 0) {
01095 rodsLog(LOG_NOTICE,
01096 "chlRegDataReplica cmlAudit3 failure %d",
01097 status);
01098 _rollback("chlRegReplica");
01099 return(status);
01100 }
01101
01102 status = cmlExecuteNoAnswerSql("commit", &icss);
01103 if (status != 0) {
01104 rodsLog(LOG_NOTICE,
01105 "chlRegReplica cmlExecuteNoAnswerSql commit failure %d",
01106 status);
01107 return(status);
01108 }
01109
01110 return(0);
01111 }
01112
01113
01114
01115
01116
01117
01118
01119 void removeMetaMapAndAVU(char *dataObjNumber) {
01120 char tSQL[MAX_SQL_SIZE];
01121 int status;
01122 cllBindVars[0]=dataObjNumber;
01123 cllBindVarCount=1;
01124 if (logSQL!=0) rodsLog(LOG_SQL, "removeMetaMapAndAVU SQL 1 ");
01125 snprintf(tSQL, MAX_SQL_SIZE,
01126 "delete from R_OBJT_METAMAP where object_id=?");
01127 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01128
01129
01130
01131
01132
01133 if (status == 0) {
01134 #ifdef METADATA_CLEANUP
01135 removeAVUs();
01136 #endif
01137 }
01138 return;
01139 }
01140
01141
01142
01143
01144 static int removeAVUs() {
01145 char tSQL[MAX_SQL_SIZE];
01146 int status;
01147
01148 if (logSQL!=0) rodsLog(LOG_SQL, "removeAVUs SQL 1 ");
01149 cllBindVarCount=0;
01150
01151 #if ORA_ICAT
01152 snprintf(tSQL, MAX_SQL_SIZE,
01153 "delete from R_META_MAIN where meta_id in (select meta_id from R_META_MAIN minus select meta_id from R_OBJT_METAMAP)");
01154 #elif MY_ICAT
01155
01156
01157 snprintf(tSQL, MAX_SQL_SIZE,
01158 "delete from R_META_MAIN where meta_id not in (select meta_id from R_OBJT_METAMAP)");
01159 #else
01160
01161 snprintf(tSQL, MAX_SQL_SIZE,
01162 "delete from R_META_MAIN where meta_id in (select meta_id from R_META_MAIN except select meta_id from R_OBJT_METAMAP)");
01163 #endif
01164 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01165 rodsLog (LOG_NOTICE, "removeAVUs status=%d\n",status);
01166
01167 return status;
01168 }
01169
01170
01171
01172
01173 bool
01174 _dataIsLastRepl(
01175 dataObjInfo_t* _dataObjInfo) {
01176
01177 bool result = true;
01178 int status;
01179 eirods::sql_logger logger("_dataIsLastRepl", logSQL);
01180 static const unsigned int length = 30;
01181 char cVal[length];
01182
01183 logger.log();
01184 std::stringstream id_stream;
01185 id_stream << _dataObjInfo->dataId;
01186 std::string id_string = id_stream.str();
01187 std::stringstream repl_stream;
01188 repl_stream << _dataObjInfo->replNum;
01189 std::string repl_string = repl_stream.str();
01190 status = cmlGetStringValueFromSql("select data_repl_num from R_DATA_MAIN where data_id=? and data_repl_num!=?",
01191 cVal, length, id_string.c_str(), repl_string.c_str(), 0, &icss);
01192 if(status != 0) {
01193 result = false;
01194 }
01195 return result;
01196 }
01197
01198
01199
01200
01201
01202
01203
01204 int chlUnregDataObj (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
01205 keyValPair_t *condInput) {
01206 char logicalFileName[MAX_NAME_LEN];
01207 char logicalDirName[MAX_NAME_LEN];
01208 rodsLong_t status;
01209 char tSQL[MAX_SQL_SIZE];
01210 char replNumber[30];
01211 char dataObjNumber[30];
01212 char cVal[MAX_NAME_LEN];
01213 int adminMode;
01214 int trashMode;
01215 char *theVal;
01216 char checkPath[MAX_NAME_LEN];
01217
01218 dataObjNumber[0]='\0';
01219 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj");
01220
01221 if (!icss.status) {
01222 return(CATALOG_NOT_CONNECTED);
01223 }
01224
01225 adminMode=0;
01226 trashMode=0;
01227 if (condInput != NULL) {
01228 theVal = getValByKey(condInput, IRODS_ADMIN_KW);
01229 if (theVal != NULL) {
01230 adminMode=1;
01231 }
01232 theVal = getValByKey(condInput, IRODS_ADMIN_RMTRASH_KW);
01233 if (theVal != NULL) {
01234 adminMode=1;
01235 trashMode=1;
01236 }
01237 }
01238
01239 status = splitPathByKey(dataObjInfo->objPath,
01240 logicalDirName, logicalFileName, '/');
01241
01242
01243 if (adminMode==0) {
01244
01245 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 1 ");
01246 status = cmlCheckDataObjOnly(logicalDirName, logicalFileName,
01247 rsComm->clientUser.userName,
01248 rsComm->clientUser.rodsZone,
01249 ACCESS_DELETE_OBJECT, &icss);
01250 if (status < 0) {
01251 _rollback("chlUnregDataObj");
01252 return(status);
01253 }
01254 snprintf(dataObjNumber, sizeof dataObjNumber, "%lld", status);
01255 }
01256 else {
01257 if (rsComm->clientUser.authInfo.authFlag != LOCAL_PRIV_USER_AUTH) {
01258 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
01259 }
01260 if (trashMode) {
01261 int len;
01262 status = getLocalZone();
01263 if (status != 0) return(status);
01264 snprintf(checkPath, MAX_NAME_LEN, "/%s/trash", localZone);
01265 len = strlen(checkPath);
01266 if (strncmp(checkPath, logicalDirName, len) != 0) {
01267 addRErrorMsg (&rsComm->rError, 0,
01268 "TRASH_KW but not zone/trash path");
01269 return(CAT_INVALID_ARGUMENT);
01270 }
01271 if (dataObjInfo->dataId > 0) {
01272 snprintf(dataObjNumber, sizeof dataObjNumber, "%lld",
01273 dataObjInfo->dataId);
01274 }
01275 }
01276 else {
01277 if (dataObjInfo->replNum >= 0 && dataObjInfo->dataId >= 0) {
01278
01279 snprintf(dataObjNumber, sizeof dataObjNumber, "%lld",
01280 dataObjInfo->dataId);
01281 snprintf(replNumber, sizeof replNumber, "%d", dataObjInfo->replNum);
01282 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 2");
01283 status = cmlGetStringValueFromSql(
01284 "select data_repl_num from R_DATA_MAIN where data_id=? and data_repl_num!=?",
01285 cVal,
01286 sizeof cVal,
01287 dataObjNumber,
01288 replNumber,
01289 0,
01290 &icss);
01291 if (status != 0) {
01292 addRErrorMsg (&rsComm->rError, 0,
01293 "This is the last replica, removal by admin not allowed");
01294 return(CAT_LAST_REPLICA);
01295 }
01296 }
01297 else {
01298 addRErrorMsg (&rsComm->rError, 0,
01299 "dataId and replNum required");
01300 _rollback("chlUnregDataObj");
01301 return (CAT_INVALID_ARGUMENT);
01302 }
01303 }
01304 }
01305
01306
01307 std::string resc_hier;
01308 if(!dataObjInfo->rescHier || strlen(dataObjInfo->rescHier) == 0) {
01309 if(dataObjInfo->replNum >= 0) {
01310 snprintf(replNumber, sizeof replNumber, "%d", dataObjInfo->replNum);
01311 if((status = cmlGetStringValueFromSql("select resc_hier from R_DATA_MAIN where data_id=? and data_repl_num=?",
01312 cVal, sizeof cVal, dataObjNumber, replNumber, 0, &icss)) != 0) {
01313 return status;
01314 }
01315 } else {
01316 if((status = cmlGetStringValueFromSql("select resc_hier from R_DATA_MAIN where data_id=?",
01317 cVal, sizeof cVal, dataObjNumber, 0, 0, &icss)) != 0) {
01318 return status;
01319 }
01320 }
01321 resc_hier = std::string(cVal);
01322 } else {
01323 resc_hier = std::string(dataObjInfo->rescHier);
01324 }
01325
01326 cllBindVars[0]=logicalDirName;
01327 cllBindVars[1]=logicalFileName;
01328 if (dataObjInfo->replNum >= 0) {
01329 snprintf(replNumber, sizeof replNumber, "%d", dataObjInfo->replNum);
01330 cllBindVars[2]=replNumber;
01331 cllBindVarCount=3;
01332 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 4");
01333 snprintf(tSQL, MAX_SQL_SIZE,
01334 "delete from R_DATA_MAIN where coll_id=(select coll_id from R_COLL_MAIN where coll_name=?) and data_name=? and data_repl_num=?");
01335 }
01336 else {
01337 cllBindVarCount=2;
01338 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 5");
01339 snprintf(tSQL, MAX_SQL_SIZE,
01340 "delete from R_DATA_MAIN where coll_id=(select coll_id from R_COLL_MAIN where coll_name=?) and data_name=?");
01341 }
01342 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01343 if (status != 0) {
01344 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) {
01345 char errMsg[105];
01346 status = CAT_UNKNOWN_FILE;
01347 snprintf(errMsg, 100, "data object '%s' is unknown",
01348 logicalFileName);
01349 addRErrorMsg (&rsComm->rError, 0, errMsg);
01350 return(status);
01351 }
01352 _rollback("chlUnregDataObj");
01353 return(status);
01354 }
01355
01356 status = getLocalZone();
01357 if( status < 0 ) {
01358 rodsLog( LOG_ERROR, "chlUnRegDataObj - failed in getLocalZone with status [%d]", status );
01359 return status;
01360 }
01361
01362
01363 if((status = _updateObjCountOfResources(resc_hier, localZone, -1)) != 0) {
01364 return status;
01365 }
01366
01367
01368 if (dataObjNumber[0]!='\0') {
01369 cllBindVars[0]=dataObjNumber;
01370 cllBindVars[1]=dataObjNumber;
01371 cllBindVarCount=2;
01372 if (logSQL!=0) rodsLog(LOG_SQL, "chlUnregDataObj SQL 3");
01373 status = cmlExecuteNoAnswerSql(
01374 "delete from R_OBJT_ACCESS where object_id=? and not exists (select * from R_DATA_MAIN where data_id=?)", &icss);
01375 if (status == 0) {
01376 removeMetaMapAndAVU(dataObjNumber);
01377 }
01378 }
01379
01380
01381 if (dataObjNumber[0]!='\0') {
01382 status = cmlAudit3(AU_UNREGISTER_DATA_OBJ, dataObjNumber,
01383 rsComm->clientUser.userName,
01384 rsComm->clientUser.rodsZone, "", &icss);
01385 }
01386 else {
01387 status = cmlAudit3(AU_UNREGISTER_DATA_OBJ, "0",
01388 rsComm->clientUser.userName,
01389 rsComm->clientUser.rodsZone,
01390 dataObjInfo->objPath, &icss);
01391 }
01392 if (status != 0) {
01393 rodsLog(LOG_NOTICE,
01394 "chlUnregDataObj cmlAudit3 failure %d",
01395 status);
01396 _rollback("chlUnregDataObj");
01397 return(status);
01398 }
01399
01400
01401 status = cmlExecuteNoAnswerSql("commit", &icss);
01402 if (status != 0) {
01403 rodsLog(LOG_NOTICE,
01404 "chlUnregDataObj cmlExecuteNoAnswerSql commit failure %d",
01405 status);
01406 return(status);
01407 }
01408
01409 return(status);
01410
01411 }
01412
01413
01414
01415
01416
01417
01418
01419 int chlRegRuleExec(rsComm_t *rsComm,
01420 ruleExecSubmitInp_t *ruleExecSubmitInp) {
01421 char myTime[50];
01422 rodsLong_t seqNum;
01423 char ruleExecIdNum[MAX_NAME_LEN];
01424 int status;
01425
01426 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegRuleExec");
01427 if (!icss.status) {
01428 return(CATALOG_NOT_CONNECTED);
01429 }
01430
01431 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegRuleExec SQL 1 ");
01432 seqNum = cmlGetNextSeqVal(&icss);
01433 if (seqNum < 0) {
01434 rodsLog(LOG_NOTICE, "chlRegRuleExec cmlGetNextSeqVal failure %d",
01435 seqNum);
01436 _rollback("chlRegRuleExec");
01437 return(seqNum);
01438 }
01439 snprintf(ruleExecIdNum, MAX_NAME_LEN, "%lld", seqNum);
01440
01441
01442 strncpy(ruleExecSubmitInp->ruleExecId,ruleExecIdNum, NAME_LEN);
01443
01444 getNowStr(myTime);
01445
01446 cllBindVars[0]=ruleExecIdNum;
01447 cllBindVars[1]=ruleExecSubmitInp->ruleName;
01448 cllBindVars[2]=ruleExecSubmitInp->reiFilePath;
01449 cllBindVars[3]=ruleExecSubmitInp->userName;
01450 cllBindVars[4]=ruleExecSubmitInp->exeAddress;
01451 cllBindVars[5]=ruleExecSubmitInp->exeTime;
01452 cllBindVars[6]=ruleExecSubmitInp->exeFrequency;
01453 cllBindVars[7]=ruleExecSubmitInp->priority;
01454 cllBindVars[8]=ruleExecSubmitInp->estimateExeTime;
01455 cllBindVars[9]=ruleExecSubmitInp->notificationAddr;
01456 cllBindVars[10]=myTime;
01457 cllBindVars[11]=myTime;
01458
01459 cllBindVarCount=12;
01460 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegRuleExec SQL 2");
01461 status = cmlExecuteNoAnswerSql(
01462 "insert into R_RULE_EXEC (rule_exec_id, rule_name, rei_file_path, user_name, exe_address, exe_time, exe_frequency, priority, estimated_exe_time, notification_addr, create_ts, modify_ts) values (?,?,?,?,?,?,?,?,?,?,?,?)",
01463 &icss);
01464 if (status != 0) {
01465 rodsLog(LOG_NOTICE,
01466 "chlRegRuleExec cmlExecuteNoAnswerSql(insert) failure %d",status);
01467 _rollback("chlRegRuleExec");
01468 return(status);
01469
01470 }
01471
01472
01473 status = cmlAudit3(AU_REGISTER_DELAYED_RULE, ruleExecIdNum,
01474 rsComm->clientUser.userName,
01475 rsComm->clientUser.rodsZone,
01476 ruleExecSubmitInp->ruleName, &icss);
01477 if (status != 0) {
01478 rodsLog(LOG_NOTICE,
01479 "chlRegRuleExec cmlAudit3 failure %d",
01480 status);
01481 _rollback("chlRegRuleExec");
01482 return(status);
01483 }
01484
01485 status = cmlExecuteNoAnswerSql("commit", &icss);
01486 if (status != 0) {
01487 rodsLog(LOG_NOTICE,
01488 "chlRegRuleExec cmlExecuteNoAnswerSql commit failure %d",
01489 status);
01490 return(status);
01491 }
01492
01493 return(0);
01494 }
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504 int chlModRuleExec(rsComm_t *rsComm, char *ruleExecId,
01505 keyValPair_t *regParam) {
01506 int i, j, status;
01507
01508 char tSQL[MAX_SQL_SIZE];
01509 char *theVal;
01510
01511 int maxCols=90;
01512
01513
01514
01515
01516 char *regParamNames[]={
01517 RULE_NAME_KW, RULE_REI_FILE_PATH_KW, RULE_USER_NAME_KW,
01518 RULE_EXE_ADDRESS_KW, RULE_EXE_TIME_KW,
01519 RULE_EXE_FREQUENCY_KW, RULE_PRIORITY_KW, RULE_ESTIMATE_EXE_TIME_KW,
01520 RULE_NOTIFICATION_ADDR_KW, RULE_LAST_EXE_TIME_KW,
01521 RULE_EXE_STATUS_KW,
01522 "END"
01523 };
01524 char *colNames[]={
01525 "rule_name", "rei_file_path", "user_name",
01526 "exe_address", "exe_time", "exe_frequency", "priority",
01527 "estimated_exe_time", "notification_addr",
01528 "last_exe_time", "exe_status",
01529 "create_ts", "modify_ts",
01530 };
01531
01532 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRuleExec");
01533
01534 if (regParam == NULL || ruleExecId == NULL) {
01535 return (CAT_INVALID_ARGUMENT);
01536 }
01537
01538 snprintf(tSQL, MAX_SQL_SIZE, "update R_RULE_EXEC set ");
01539
01540 for (i=0, j=0; i<maxCols; i++) {
01541 if (strcmp(regParamNames[i],"END")==0) break;
01542 theVal = getValByKey(regParam, regParamNames[i]);
01543 if (theVal != NULL) {
01544 if (j>0) rstrcat(tSQL, "," , MAX_SQL_SIZE);
01545 rstrcat(tSQL, colNames[i] , MAX_SQL_SIZE);
01546 rstrcat(tSQL, "=?", MAX_SQL_SIZE);
01547 cllBindVars[j++]=theVal;
01548 }
01549 }
01550
01551 if (j == 0) {
01552 return (CAT_INVALID_ARGUMENT);
01553 }
01554
01555 rstrcat(tSQL, "where rule_exec_id=?", MAX_SQL_SIZE);
01556 cllBindVars[j++]=ruleExecId;
01557 cllBindVarCount=j;
01558
01559 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRuleExec SQL 1 ");
01560 status = cmlExecuteNoAnswerSql(tSQL, &icss);
01561
01562 if (status != 0) {
01563 _rollback("chlModRuleExec");
01564 rodsLog(LOG_NOTICE,
01565 "chlModRuleExec cmlExecuteNoAnswer(update) failure %d",
01566 status);
01567 return(status);
01568 }
01569
01570
01571 status = cmlAudit3(AU_MODIFY_DELAYED_RULE, ruleExecId,
01572 rsComm->clientUser.userName,
01573 rsComm->clientUser.rodsZone,
01574 "", &icss);
01575 if (status != 0) {
01576 rodsLog(LOG_NOTICE,
01577 "chlModRuleExec cmlAudit3 failure %d",
01578 status);
01579 _rollback("chlModRuleExec");
01580 return(status);
01581 }
01582
01583
01584 status = cmlExecuteNoAnswerSql("commit", &icss);
01585 if (status != 0) {
01586 rodsLog(LOG_NOTICE,
01587 "chlModRuleExecMeta cmlExecuteNoAnswerSql commit failure %d",
01588 status);
01589 return(status);
01590 }
01591 return status;
01592 }
01593
01594
01595 int chlDelRuleExec(rsComm_t *rsComm,
01596 char *ruleExecId) {
01597 int status;
01598 char userName[MAX_NAME_LEN+2];
01599
01600 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelRuleExec");
01601
01602 if (!icss.status) {
01603 return(CATALOG_NOT_CONNECTED);
01604 }
01605
01606 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
01607 if (rsComm->proxyUser.authInfo.authFlag == LOCAL_USER_AUTH) {
01608 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelRuleExec SQL 1 ");
01609 status = cmlGetStringValueFromSql(
01610 "select user_name from R_RULE_EXEC where rule_exec_id=?",
01611 userName, MAX_NAME_LEN, ruleExecId, 0, 0, &icss);
01612 if (strncmp(userName, rsComm->clientUser.userName, MAX_NAME_LEN)
01613 != 0) {
01614 return(CAT_NO_ACCESS_PERMISSION);
01615 }
01616 }
01617 else {
01618 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
01619 }
01620 }
01621
01622 cllBindVars[cllBindVarCount++]=ruleExecId;
01623 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelRuleExec SQL 2 ");
01624 status = cmlExecuteNoAnswerSql(
01625 "delete from R_RULE_EXEC where rule_exec_id=?",
01626 &icss);
01627 if (status != 0) {
01628 rodsLog(LOG_NOTICE,
01629 "chlDelRuleExec delete failure %d",
01630 status);
01631 _rollback("chlDelRuleExec");
01632 return(status);
01633 }
01634
01635
01636 status = cmlAudit3(AU_DELETE_DELAYED_RULE, ruleExecId,
01637 rsComm->clientUser.userName,
01638 rsComm->clientUser.rodsZone,
01639 "", &icss);
01640 if (status != 0) {
01641 rodsLog(LOG_NOTICE,
01642 "chlDelRuleExec cmlAudit3 failure %d",
01643 status);
01644 _rollback("chlDelRuleExec");
01645 return(status);
01646 }
01647
01648 status = cmlExecuteNoAnswerSql("commit", &icss);
01649 if (status != 0) {
01650 rodsLog(LOG_NOTICE,
01651 "chlDelRuleExec cmlExecuteNoAnswerSql commit failure %d",
01652 status);
01653 return(status);
01654 }
01655 return(status);
01656 }
01657
01658
01659
01660
01661
01662
01663
01664
01665
01666
01667
01668
01669
01670 int chlTest(rsComm_t *rsComm, char *name) {
01671 dataObjInfo_t dataObjInfo;
01672
01673 strcpy(dataObjInfo.objPath, name);
01674 dataObjInfo.replNum=1;
01675 strcpy(dataObjInfo.version, "12");
01676 strcpy(dataObjInfo.dataType, "URL");
01677 dataObjInfo.dataSize=42;
01678
01679 strcpy(dataObjInfo.rescName, "resc A");
01680
01681 strcpy(dataObjInfo.filePath, "/scratch/slocal/test1");
01682
01683 dataObjInfo.replStatus=5;
01684
01685 return (chlRegDataObj(rsComm, &dataObjInfo));
01686 }
01687
01688 int
01689 _canConnectToCatalog(
01690 rsComm_t* _rsComm)
01691 {
01692 int result = 0;
01693 if (!icss.status) {
01694 result = CATALOG_NOT_CONNECTED;
01695 } else if (_rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
01696 result = CAT_INSUFFICIENT_PRIVILEGE_LEVEL;
01697 } else if (_rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
01698 result = CAT_INSUFFICIENT_PRIVILEGE_LEVEL;
01699 }
01700 return result;
01701 }
01702
01703 int
01704 _resolveHostName(
01705 rsComm_t* _rsComm,
01706 rescInfo_t* _rescInfo)
01707 {
01708 int result = 0;
01709 struct hostent *myHostEnt;
01710
01711 myHostEnt = gethostbyname(_rescInfo->rescLoc);
01712 if (myHostEnt <= 0) {
01713 char errMsg[155];
01714 snprintf(errMsg, 150,
01715 "Warning, resource host address '%s' is not a valid DNS entry, gethostbyname failed.",
01716 _rescInfo->rescLoc);
01717 addRErrorMsg (&_rsComm->rError, 0, errMsg);
01718 }
01719 if (strcmp(_rescInfo->rescLoc, "localhost") == 0) {
01720 addRErrorMsg( &_rsComm->rError, 0,
01721 "Warning, resource host address 'localhost' will not work properly as it maps to the local host from each client.");
01722 }
01723
01724 return result;
01725 }
01726
01727 int
01728 _childIsValid(
01729 const std::string& _new_child) {
01730
01731
01732 int result = 0;
01733 char parent[MAX_NAME_LEN];
01734 int status;
01735
01736
01737 std::string resc_name;
01738 eirods::children_parser parser;
01739 parser.set_string(_new_child);
01740 parser.first_child(resc_name);
01741
01742
01743 eirods::sql_logger logger("_childIsValid", logSQL);
01744 logger.log();
01745 parent[0] = '\0';
01746 if((status = cmlGetStringValueFromSql("select resc_parent from R_RESC_MAIN where resc_name=? and zone_name=?",
01747 parent, MAX_NAME_LEN, resc_name.c_str(), localZone, 0, &icss)) != 0) {
01748 if(status == CAT_NO_ROWS_FOUND) {
01749 std::stringstream ss;
01750 ss << "Child resource \"" << resc_name << "\" not found";
01751 eirods::log(LOG_NOTICE, ss.str());
01752 } else {
01753 _rollback("_childIsValid");
01754 }
01755 result = status;
01756
01757 } else if(strlen(parent) != 0) {
01758
01759 std::stringstream ss;
01760 ss << "Child resource \"" << resc_name << "\" already has a parent \"" << parent << "\"";
01761 eirods::log(LOG_NOTICE, ss.str());
01762 result = EIRODS_CHILD_HAS_PARENT;
01763 }
01764 return result;
01765 }
01766
01767 int
01768 _updateRescChildren(
01769 char* _resc_id,
01770 const std::string& _new_child_string) {
01771
01772 int result = 0;
01773 int status;
01774 char children[MAX_PATH_ALLOWED];
01775 char myTime[50];
01776 eirods::sql_logger logger("_updateRescChildren", logSQL);
01777
01778 if((status = cmlGetStringValueFromSql("select resc_children from R_RESC_MAIN where resc_id=?",
01779 children, MAX_PATH_ALLOWED, _resc_id, 0, 0, &icss)) != 0) {
01780 _rollback("_updateRescChildren");
01781 result = status;
01782 } else {
01783 std::string children_string(children);
01784 std::stringstream ss;
01785 if(children_string.empty()) {
01786 ss << _new_child_string;
01787 } else {
01788 ss << children_string << ";" << _new_child_string;
01789 }
01790 std::string combined_children = ss.str();
01791
01792
01793 eirods::tmp_string ts(combined_children.c_str());
01794 getNowStr(myTime);
01795 cllBindVarCount = 0;
01796 cllBindVars[cllBindVarCount++] = ts.str();
01797 cllBindVars[cllBindVarCount++] = myTime;
01798 cllBindVars[cllBindVarCount++] = _resc_id;
01799 logger.log();
01800 if((status = cmlExecuteNoAnswerSql("update R_RESC_MAIN set resc_children=?, modify_ts=? "
01801 "where resc_id=?", &icss)) != 0) {
01802 std::stringstream ss;
01803 ss << "_updateRescChildren cmlExecuteNoAnswerSql update failure " << status;
01804 eirods::log(LOG_NOTICE, ss.str());
01805 _rollback("_updateRescChildren");
01806 result = status;
01807 }
01808 }
01809 return result;
01810 }
01811
01812 int
01813 _updateChildParent(
01814 const std::string& _new_child,
01815 const std::string& _parent) {
01816
01817 int result = 0;
01818 char resc_id[MAX_NAME_LEN];
01819 char myTime[50];
01820 eirods::sql_logger logger("_updateChildParent", logSQL);
01821 int status;
01822
01823
01824 eirods::children_parser parser;
01825 std::string child;
01826 parser.set_string(_new_child);
01827 parser.first_child(child);
01828
01829
01830 resc_id[0] = '\0';
01831 if((status = cmlGetStringValueFromSql("select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
01832 resc_id, MAX_NAME_LEN, child.c_str(), localZone, 0,
01833 &icss)) != 0) {
01834 if(status == CAT_NO_ROWS_FOUND) {
01835 result = CAT_INVALID_RESOURCE;
01836 } else {
01837 _rollback("_updateChildParent");
01838 result = status;
01839 }
01840 } else {
01841
01842
01843
01844 eirods::tmp_string ts(_parent.c_str());
01845 getNowStr(myTime);
01846 cllBindVarCount = 0;
01847 cllBindVars[cllBindVarCount++] = ts.str();
01848 cllBindVars[cllBindVarCount++] = myTime;
01849 cllBindVars[cllBindVarCount++] = resc_id;
01850 logger.log();
01851 if((status = cmlExecuteNoAnswerSql("update R_RESC_MAIN set resc_parent=?, modify_ts=? "
01852 "where resc_id=?", &icss)) != 0) {
01853 std::stringstream ss;
01854 ss << "_updateChildParent cmlExecuteNoAnswerSql update failure " << status;
01855 eirods::log(LOG_NOTICE, ss.str());
01856 _rollback("_updateChildParent");
01857 result = status;
01858 }
01859 }
01860
01861 return result;
01862 }
01863
01864 eirods::error chlRescObjCount(
01865 const std::string& _resc_name,
01866 rodsLong_t & _rtn_obj_count)
01867 {
01868 eirods::error result = SUCCESS();
01869 rodsLong_t obj_count = 0;
01870 char obj_count_string[MAX_NAME_LEN];
01871 int status;
01872
01873 if((status = cmlGetIntegerValueFromSql("select resc_objcount from R_RESC_MAIN where resc_name=?",
01874 &obj_count, _resc_name.c_str(), 0, 0, 0, 0, &icss)) != 0) {
01875 _rollback(__FUNCTION__);
01876 std::stringstream msg;
01877 msg << __FUNCTION__ << " - Failed to get object count for resource: \"" << _resc_name << "\"";
01878 result = ERROR(status, msg.str());
01879 } else {
01880 _rtn_obj_count = obj_count;
01881 }
01882
01883 return result;
01884 }
01885
01886
01887
01888
01889 bool
01890 _rescHasData(
01891 const std::string& _resc_name) {
01892
01893 bool result = false;
01894 eirods::sql_logger logger("_rescHasData", logSQL);
01895 int status;
01896 char obj_count_string[MAX_NAME_LEN];
01897 static const char* func_name = "_rescHasData";
01898 rodsLong_t obj_count;
01899
01900 logger.log();
01901 if((status = cmlGetIntegerValueFromSql("select resc_objcount from R_RESC_MAIN where resc_name=?",
01902 &obj_count, _resc_name.c_str(), 0, 0, 0, 0, &icss)) != 0) {
01903 _rollback(func_name);
01904 } else {
01905 if(obj_count > 0) {
01906 result = true;
01907 }
01908 }
01909 return result;
01910 }
01911
01912
01913
01914
01915 bool
01916 _childHasData(
01917 const std::string& _child) {
01918
01919 bool result = true;
01920 eirods::children_parser parser;
01921 parser.set_string(_child);
01922 std::string child;
01923 parser.first_child(child);
01924 result = _rescHasData(child);
01925 return result;
01926 }
01927
01928
01929
01930
01931 int
01932 chlAddChildResc(
01933 rsComm_t* rsComm,
01934 rescInfo_t* rescInfo)
01935 {
01936 int result = 0;
01937
01938 int status;
01939 static const char* func_name = "chlAddChildResc";
01940 eirods::sql_logger logger(func_name, logSQL);
01941 std::string new_child_string(rescInfo->rescChildren);
01942 char resc_id[MAX_NAME_LEN];
01943
01944 logger.log();
01945
01946 if(!(result = _canConnectToCatalog(rsComm))) {
01947
01948 if((status = getLocalZone())) {
01949 result = status;
01950
01951 } else if (rescInfo->zoneName != NULL && strlen(rescInfo->zoneName) > 0 && strcmp(rescInfo->zoneName, localZone) !=0) {
01952 addRErrorMsg (&rsComm->rError, 0,
01953 "Currently, resources must be in the local zone");
01954 result = CAT_INVALID_ZONE;
01955
01956 } else if(_childHasData(new_child_string)) {
01957 char errMsg[105];
01958 snprintf(errMsg, 100,
01959 "resource '%s' contains one or more dataObjects",
01960 rescInfo->rescName);
01961 addRErrorMsg (&rsComm->rError, 0, errMsg);
01962 result = CAT_RESOURCE_NOT_EMPTY;
01963 } else {
01964
01965 logger.log();
01966
01967 resc_id[0] = '\0';
01968 if((status = cmlGetStringValueFromSql("select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
01969 resc_id, MAX_NAME_LEN, rescInfo->rescName, localZone, 0,
01970 &icss)) != 0) {
01971 if(status == CAT_NO_ROWS_FOUND) {
01972 result = CAT_INVALID_RESOURCE;
01973 } else {
01974 _rollback(func_name);
01975 result = status;
01976 }
01977 } else if((status =_childIsValid(new_child_string)) == 0) {
01978 if((status = _updateRescChildren(resc_id, new_child_string)) != 0) {
01979 result = status;
01980 } else if((status = _updateChildParent(new_child_string, std::string(rescInfo->rescName))) != 0) {
01981 result = status;
01982 } else {
01983
01984
01985 char commentStr[1024];
01986 snprintf(commentStr, sizeof commentStr, "%s %s", rescInfo->rescName, new_child_string.c_str());
01987 if((status = cmlAudit3(AU_ADD_CHILD_RESOURCE, resc_id, rsComm->clientUser.userName, rsComm->clientUser.rodsZone,
01988 commentStr, &icss)) != 0) {
01989 std::stringstream ss;
01990 ss << func_name << " cmlAudit3 failure " << status;
01991 eirods::log(LOG_NOTICE, ss.str());
01992 _rollback(func_name);
01993 result = status;
01994 } else if((status = cmlExecuteNoAnswerSql("commit", &icss)) != 0) {
01995 std::stringstream ss;
01996 ss << func_name<< " cmlExecuteNoAnswerSql commit failure " << status;
01997 eirods::log(LOG_NOTICE, ss.str());
01998 result = status;
01999 }
02000 }
02001 } else {
02002 std::string resc_name;
02003 eirods::children_parser parser;
02004 parser.set_string(new_child_string);
02005 parser.first_child(resc_name);
02006
02007 std::stringstream msg;
02008 msg << __FUNCTION__;
02009 msg << " - Resource '" << resc_name << "' already has a parent.";
02010 addRErrorMsg(&rsComm->rError, 0, msg.str().c_str());
02011 result = status;
02012 }
02013 }
02014 }
02015 return result;
02016 }
02017
02018
02019 int chlRegResc(rsComm_t *rsComm,
02020 rescInfo_t *rescInfo) {
02021 rodsLong_t seqNum;
02022 char idNum[MAX_SQL_SIZE];
02023 int status;
02024 char myTime[50];
02025 struct hostent *myHostEnt;
02026
02027 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegResc");
02028
02029
02030
02031 if( strlen( rescInfo->rescName ) < 1 ) {
02032 addRErrorMsg( &rsComm->rError, 0, "resource name is empty" );
02033 return CAT_INVALID_RESOURCE_NAME;
02034 }
02035
02036
02037
02038 if( strlen( rescInfo->rescType ) < 1 ) {
02039 addRErrorMsg( &rsComm->rError, 0, "resource type is empty" );
02040 return CAT_INVALID_RESOURCE_TYPE;
02041 }
02042
02043 if (!icss.status) {
02044 return(CATALOG_NOT_CONNECTED);
02045 }
02046
02047 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02048 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02049 }
02050 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02051 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02052 }
02053
02054 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegResc SQL 1 ");
02055 seqNum = cmlGetNextSeqVal(&icss);
02056 if (seqNum < 0) {
02057 rodsLog(LOG_NOTICE, "chlRegResc cmlGetNextSeqVal failure %d",
02058 seqNum);
02059 _rollback("chlRegResc");
02060 return(seqNum);
02061 }
02062 snprintf(idNum, MAX_SQL_SIZE, "%lld", seqNum);
02063
02064 status = getLocalZone();
02065 if (status != 0) return(status);
02066
02067 if (rescInfo->zoneName != NULL && strlen(rescInfo->zoneName) > 0) {
02068 if (strcmp(rescInfo->zoneName, localZone) !=0) {
02069 addRErrorMsg (&rsComm->rError, 0,
02070 "Currently, resources must be in the local zone");
02071 return(CAT_INVALID_ZONE);
02072 }
02073 }
02074
02075 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegResc SQL 2");
02076
02077
02078
02079
02080
02081
02082
02083
02084
02085 if( eirods::EMPTY_RESC_HOST != rescInfo->rescLoc ) {
02086
02087
02088 myHostEnt = gethostbyname(rescInfo->rescLoc);
02089 if (myHostEnt <= 0) {
02090 char errMsg[155];
02091 snprintf(errMsg, 150,
02092 "Warning, resource host address '%s' is not a valid DNS entry, gethostbyname failed.",
02093 rescInfo->rescLoc);
02094 addRErrorMsg (&rsComm->rError, 0, errMsg);
02095 }
02096 if (strcmp(rescInfo->rescLoc, "localhost") == 0) {
02097 addRErrorMsg( &rsComm->rError, 0,
02098 "Warning, resource host address 'localhost' will not work properly as it maps to the local host from each client.");
02099 }
02100
02101 }
02102 #if 0
02103 if (false &&
02104 (strcmp(rescInfo->rescType, "database") !=0) &&
02105 (strcmp(rescInfo->rescType, "mso") !=0) ) {
02106 if (strlen(rescInfo->rescVaultPath)<1) {
02107 return(CAT_INVALID_RESOURCE_VAULT_PATH);
02108 }
02109 }
02110 #endif
02111
02112 status = getLocalZone();
02113 if (status != 0) return(status);
02114
02115 getNowStr(myTime);
02116
02117 cllBindVars[0]=idNum;
02118 cllBindVars[1]=rescInfo->rescName;
02119 cllBindVars[2]=localZone;
02120 cllBindVars[3]=rescInfo->rescType;
02121 cllBindVars[4]=rescInfo->rescClass;
02122 cllBindVars[5]=rescInfo->rescLoc;
02123 cllBindVars[6]=rescInfo->rescVaultPath;
02124 cllBindVars[7]=myTime;
02125 cllBindVars[8]=myTime;
02126 cllBindVars[9]=rescInfo->rescChildren;
02127 cllBindVars[10]=rescInfo->rescContext;
02128 cllBindVars[11]=rescInfo->rescParent;
02129 cllBindVars[12]="0";
02130 cllBindVarCount=13;
02131
02132 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegResc SQL 4");
02133 status = cmlExecuteNoAnswerSql(
02134 "insert into R_RESC_MAIN (resc_id, resc_name, zone_name, resc_type_name, resc_class_name, resc_net, resc_def_path, create_ts, modify_ts, resc_children, resc_context, resc_parent, resc_objcount) values (?,?,?,?,?,?,?,?,?,?,?,?,?)",
02135 &icss);
02136
02137 if (status != 0) {
02138 rodsLog(LOG_NOTICE,
02139 "chlRegResc cmlExectuteNoAnswerSql(insert) failure %d",
02140 status);
02141 _rollback("chlRegResc");
02142 return(status);
02143 }
02144
02145
02146 status = cmlAudit3(AU_REGISTER_RESOURCE, idNum,
02147 rsComm->clientUser.userName,
02148 rsComm->clientUser.rodsZone,
02149 rescInfo->rescName, &icss);
02150 if (status != 0) {
02151 rodsLog(LOG_NOTICE,
02152 "chlRegResc cmlAudit3 failure %d",
02153 status);
02154 _rollback("chlRegResc");
02155 return(status);
02156 }
02157
02158 status = cmlExecuteNoAnswerSql("commit", &icss);
02159 if (status != 0) {
02160 rodsLog(LOG_NOTICE,
02161 "chlRegResc cmlExecuteNoAnswerSql commit failure %d",status);
02162 return(status);
02163 }
02164 return(status);
02165 }
02166
02167 int
02168 _removeRescChild(
02169 char* _resc_id,
02170 const std::string& _child_string) {
02171
02172 int result = 0;
02173 int status;
02174 char children[MAX_PATH_ALLOWED];
02175 char myTime[50];
02176 eirods::sql_logger logger("_removeRescChild", logSQL);
02177
02178
02179 if((status = cmlGetStringValueFromSql("select resc_children from R_RESC_MAIN where resc_id=?",
02180 children, MAX_PATH_ALLOWED, _resc_id, 0, 0, &icss)) != 0) {
02181 _rollback("_updateRescChildren");
02182 result = status;
02183 } else {
02184
02185
02186 eirods::children_parser parser;
02187 eirods::error ret = parser.set_string(children);
02188 if(!ret.ok()) {
02189 std::stringstream ss;
02190 ss << "_removeChildFromResource resource has invalid children string \"" << children << "\'";
02191 ss << ret.result();
02192 eirods::log(LOG_NOTICE, ss.str());
02193 result = CAT_INVALID_CHILD;
02194 } else {
02195
02196
02197 ret = parser.remove_child(_child_string);
02198 if(!ret.ok()) {
02199 std::stringstream ss;
02200 ss << "_removeChildFromResource parent has no child \"" << _child_string << "\'";
02201 ss << ret.result();
02202 eirods::log(LOG_NOTICE, ss.str());
02203 result = CAT_INVALID_CHILD;
02204 } else {
02205
02206
02207
02208 std::string children_string;
02209 parser.str(children_string);
02210 eirods::tmp_string tmp_children(children_string.c_str());
02211 getNowStr(myTime);
02212 cllBindVarCount = 0;
02213 cllBindVars[cllBindVarCount++] = tmp_children.str();
02214 cllBindVars[cllBindVarCount++] = myTime;
02215 cllBindVars[cllBindVarCount++] = _resc_id;
02216 logger.log();
02217 if((status = cmlExecuteNoAnswerSql("update R_RESC_MAIN set resc_children=?, modify_ts=? "
02218 "where resc_id=?", &icss)) != 0) {
02219 std::stringstream ss;
02220 ss << "_removeRescChild cmlExecuteNoAnswerSql update failure " << status;
02221 eirods::log(LOG_NOTICE, ss.str());
02222 _rollback("_removeRescChild");
02223 result = status;
02224 }
02225 }
02226 }
02227 }
02228 return result;
02229 }
02230
02231
02232
02233
02234 static bool
02235 _rescHasChildren(
02236 const std::string _resc_name) {
02237
02238 bool result = false;
02239 int status;
02240 char children[MAX_NAME_LEN];
02241 eirods::sql_logger logger("_rescHasChildren", logSQL);
02242
02243 logger.log();
02244 if((status = cmlGetStringValueFromSql("select resc_children from R_RESC_MAIN where resc_name=?",
02245 children, MAX_NAME_LEN, _resc_name.c_str(), 0, 0, &icss)) !=0) {
02246 if(status != CAT_NO_ROWS_FOUND) {
02247 _rollback("_rescHasChildren");
02248 }
02249 result = false;
02250 } else if(strlen(children) != 0) {
02251 result = true;
02252 }
02253 return result;
02254 }
02255
02256
02257
02258
02259 int
02260 chlDelChildResc(
02261 rsComm_t* rsComm,
02262 rescInfo_t* rescInfo) {
02263
02264 eirods::sql_logger logger("chlDelChildResc", logSQL);
02265 int result = 0;
02266 int status;
02267 char resc_id[MAX_NAME_LEN];
02268 std::string child_string(rescInfo->rescChildren);
02269 std::string child;
02270 eirods::children_parser parser;
02271 parser.set_string(child_string);
02272 parser.first_child(child);
02273
02274 if(!(result = _canConnectToCatalog(rsComm))) {
02275 if((status = getLocalZone())) {
02276 result = status;
02277 } else if(_rescHasData(child) || _rescHasChildren(child)) {
02278 char errMsg[105];
02279 snprintf(errMsg, 100,
02280 "resource '%s' contains one or more dataObjects",
02281 child.c_str());
02282 addRErrorMsg (&rsComm->rError, 0, errMsg);
02283 result = CAT_RESOURCE_NOT_EMPTY;
02284 } else {
02285 logger.log();
02286
02287 resc_id[0] = '\0';
02288 if((status = cmlGetStringValueFromSql("select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
02289 resc_id, MAX_NAME_LEN, rescInfo->rescName, localZone, 0,
02290 &icss)) != 0) {
02291 if(status == CAT_NO_ROWS_FOUND) {
02292 result = CAT_INVALID_RESOURCE;
02293 } else {
02294 _rollback("chlDelChildResc");
02295 result = status;
02296 }
02297 } else if((status = _updateChildParent(child, std::string(""))) != 0) {
02298 result = status;
02299 } else if((status = _removeRescChild(resc_id, child)) != 0) {
02300 result = status;
02301 } else {
02302
02303
02304 char commentStr[1024];
02305 snprintf(commentStr, sizeof commentStr, "%s %s", rescInfo->rescName, child_string.c_str());
02306 if((status = cmlAudit3(AU_DEL_CHILD_RESOURCE, resc_id, rsComm->clientUser.userName, rsComm->clientUser.rodsZone,
02307 commentStr, &icss)) != 0) {
02308 std::stringstream ss;
02309 ss << "chlDelChildResc cmlAudit3 failure " << status;
02310 eirods::log(LOG_NOTICE, ss.str());
02311 _rollback("chlDelChildResc");
02312 result = status;
02313 } else if((status = cmlExecuteNoAnswerSql("commit", &icss)) != 0) {
02314 std::stringstream ss;
02315 ss << "chlDelChildResc cmlExecuteNoAnswerSql commit failure " << status;
02316 eirods::log(LOG_NOTICE, ss.str());
02317 result = status;
02318 }
02319 }
02320 }
02321 }
02322 return result;
02323 }
02324
02325 bool
02326 _rescHasParentOrChild(
02327 char* rescId) {
02328
02329 bool result = false;
02330 char parent[MAX_NAME_LEN];
02331 char children[MAX_NAME_LEN];
02332 int status;
02333 eirods::sql_logger logger("_rescHasParentOrChild", logSQL);
02334
02335 logger.log();
02336 parent[0] = '\0';
02337 children[0] = '\0';
02338 if((status = cmlGetStringValueFromSql("select resc_parent from R_RESC_MAIN where resc_id=?",
02339 parent, MAX_NAME_LEN, rescId, 0, 0, &icss)) != 0) {
02340 if(status == CAT_NO_ROWS_FOUND) {
02341 std::stringstream ss;
02342 ss << "Resource \"" << rescId << "\" not found";
02343 eirods::log(LOG_NOTICE, ss.str());
02344 } else {
02345 _rollback("_rescHasParentOrChild");
02346 }
02347 result = false;
02348 } else if(strlen(parent) != 0) {
02349 result = true;
02350 } else if((status = cmlGetStringValueFromSql("select resc_children from R_RESC_MAIN where resc_id=?",
02351 children, MAX_NAME_LEN, rescId, 0, 0, &icss)) !=0) {
02352 if(status != CAT_NO_ROWS_FOUND) {
02353 _rollback("_rescHasParentOrChild");
02354 }
02355 result = false;
02356 } else if(strlen(children) != 0) {
02357 result = true;
02358 }
02359 return result;
02360
02361 }
02362
02363
02364 int chlDelResc(rsComm_t *rsComm, rescInfo_t *rescInfo, int _dryrun ) {
02365
02366 int status;
02367 char rescId[MAX_NAME_LEN];
02368
02369 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelResc");
02370
02371 if (!icss.status) {
02372 return(CATALOG_NOT_CONNECTED);
02373 }
02374
02375 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02376 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02377 }
02378 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02379 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02380 }
02381
02382
02383
02384 if (strncmp(rescInfo->rescName, BUNDLE_RESC, strlen(BUNDLE_RESC))==0) {
02385 char errMsg[155];
02386 snprintf(errMsg, 150,
02387 "%s is a built-in resource needed for bundle operations.",
02388 BUNDLE_RESC);
02389 addRErrorMsg (&rsComm->rError, 0, errMsg);
02390 return(CAT_PSEUDO_RESC_MODIFY_DISALLOWED);
02391 }
02392
02393
02394 if (_rescHasData(rescInfo->rescName)) {
02395 char errMsg[105];
02396 snprintf(errMsg, 100,
02397 "resource '%s' contains one or more dataObjects",
02398 rescInfo->rescName);
02399 addRErrorMsg (&rsComm->rError, 0, errMsg);
02400 return(CAT_RESOURCE_NOT_EMPTY);
02401 }
02402
02403 status = getLocalZone();
02404 if (status != 0) return(status);
02405
02406
02407 rescId[0]='\0';
02408 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelResc SQL 2 ");
02409 status = cmlGetStringValueFromSql(
02410 "select resc_id from R_RESC_MAIN where resc_name=?",
02411 rescId, MAX_NAME_LEN, rescInfo->rescName, 0, 0, &icss);
02412 if (status != 0) {
02413 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) {
02414 char errMsg[105];
02415 snprintf(errMsg, 100,
02416 "resource '%s' does not exist",
02417 rescInfo->rescName);
02418 addRErrorMsg (&rsComm->rError, 0, errMsg);
02419 return(status);
02420 }
02421 _rollback("chlDelResc");
02422 return(status);
02423 }
02424
02425 if(_rescHasParentOrChild(rescId)) {
02426 char errMsg[105];
02427 snprintf(errMsg, 100,
02428 "resource '%s' has a parent or child",
02429 rescInfo->rescName);
02430 addRErrorMsg (&rsComm->rError, 0, errMsg);
02431 return(CAT_RESOURCE_NOT_EMPTY);
02432 }
02433
02434 cllBindVars[cllBindVarCount++]=rescInfo->rescName;
02435 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelResc SQL 3");
02436 status = cmlExecuteNoAnswerSql(
02437 "delete from R_RESC_MAIN where resc_name=?",
02438 &icss);
02439 if (status != 0) {
02440 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) {
02441 char errMsg[105];
02442 snprintf(errMsg, 100,
02443 "resource '%s' does not exist",
02444 rescInfo->rescName);
02445 addRErrorMsg (&rsComm->rError, 0, errMsg);
02446 return(status);
02447 }
02448 _rollback("chlDelResc");
02449 return(status);
02450 }
02451
02452
02453 cllBindVars[cllBindVarCount++]=rescId;
02454 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelResc SQL 4");
02455 status = cmlExecuteNoAnswerSql(
02456 "delete from R_RESC_GROUP where resc_id=?",
02457 &icss);
02458 if (status != 0 &&
02459 status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
02460 rodsLog(LOG_NOTICE,
02461 "chlDelResc delete from R_RESC_GROUP failure %d",
02462 status);
02463 _rollback("chlDelResc");
02464 return(status);
02465 }
02466
02467
02468
02469 removeMetaMapAndAVU(rescId);
02470
02471
02472
02473 status = cmlAudit3(AU_DELETE_RESOURCE,
02474 rescId,
02475 rsComm->clientUser.userName,
02476 rsComm->clientUser.rodsZone,
02477 rescInfo->rescName,
02478 &icss);
02479 if (status != 0) {
02480 rodsLog(LOG_NOTICE,
02481 "chlDelResc cmlAudit3 failure %d",
02482 status);
02483 _rollback("chlDelResc");
02484 return(status);
02485 }
02486
02487 if( _dryrun ) {
02488 _rollback( "chlDelResc" );
02489 return status;
02490 }
02491
02492 status = cmlExecuteNoAnswerSql("commit", &icss);
02493 if (status != 0) {
02494 rodsLog(LOG_NOTICE,
02495 "chlDelResc cmlExecuteNoAnswerSql commit failure %d",
02496 status);
02497 return(status);
02498 }
02499 return(status);
02500 }
02501
02502
02503
02504
02505
02506
02507
02508
02509
02510
02511
02512
02513
02514
02515 int chlRollback(rsComm_t *rsComm) {
02516 int status;
02517 if (logSQL!=0) rodsLog(LOG_SQL, "chlRollback - SQL 1 ");
02518 status = cmlExecuteNoAnswerSql("rollback", &icss);
02519 if (status != 0) {
02520 rodsLog(LOG_NOTICE,
02521 "chlRollback cmlExecuteNoAnswerSql failure %d",
02522 status);
02523 }
02524 return(status);
02525 }
02526
02527
02528
02529
02530
02531
02532
02533
02534 int chlCommit(rsComm_t *rsComm) {
02535 int status;
02536 if (logSQL!=0) rodsLog(LOG_SQL, "chlCommit - SQL 1 ");
02537 status = cmlExecuteNoAnswerSql("commit", &icss);
02538 if (status != 0) {
02539 rodsLog(LOG_NOTICE,
02540 "chlCommit cmlExecuteNoAnswerSql failure %d",
02541 status);
02542 }
02543 return(status);
02544 }
02545
02546
02547 int chlDelUserRE(rsComm_t *rsComm, userInfo_t *userInfo) {
02548 int status;
02549 char iValStr[200];
02550 char zoneToUse[MAX_NAME_LEN];
02551 char userStr[200];
02552 char userName2[NAME_LEN];
02553 char zoneName[NAME_LEN];
02554
02555 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE");
02556
02557 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02558 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02559 }
02560 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02561 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02562 }
02563
02564 status = getLocalZone();
02565 if (status != 0) return(status);
02566
02567 strncpy(zoneToUse, localZone, MAX_NAME_LEN);
02568 if (strlen(userInfo->rodsZone)>0) {
02569 strncpy(zoneToUse, userInfo->rodsZone, MAX_NAME_LEN);
02570 }
02571
02572 status = parseUserName(userInfo->userName, userName2, zoneName);
02573 if (zoneName[0]!='\0') {
02574 rstrcpy(zoneToUse, zoneName, NAME_LEN);
02575 }
02576
02577 if (strncmp(rsComm->clientUser.userName, userName2, sizeof(userName2))==0 &&
02578 strncmp(rsComm->clientUser.rodsZone, zoneToUse, sizeof(zoneToUse))==0) {
02579 addRErrorMsg (&rsComm->rError, 0, "Cannot remove your own admin account, probably unintended");
02580 return(CAT_INVALID_USER);
02581 }
02582
02583
02584 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 1 ");
02585 status = cmlGetStringValueFromSql(
02586 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
02587 iValStr, 200, userName2, zoneToUse, 0, &icss);
02588 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO ||
02589 status==CAT_NO_ROWS_FOUND) {
02590 addRErrorMsg (&rsComm->rError, 0, "Invalid user");
02591 return(CAT_INVALID_USER);
02592 }
02593 if (status != 0) {
02594 _rollback("chlDelUserRE");
02595 return(status);
02596 }
02597
02598 cllBindVars[cllBindVarCount++]=userName2;
02599 cllBindVars[cllBindVarCount++]=zoneToUse;
02600 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 2");
02601 status = cmlExecuteNoAnswerSql(
02602 "delete from R_USER_MAIN where user_name=? and zone_name=?",
02603 &icss);
02604 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) return(CAT_INVALID_USER);
02605 if (status != 0) {
02606 _rollback("chlDelUserRE");
02607 return(status);
02608 }
02609
02610 cllBindVars[cllBindVarCount++]=iValStr;
02611 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 3");
02612 status = cmlExecuteNoAnswerSql(
02613 "delete from R_USER_PASSWORD where user_id=?",
02614 &icss);
02615 if (status!=0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
02616 char errMsg[MAX_NAME_LEN+40];
02617 rodsLog(LOG_NOTICE,
02618 "chlDelUserRE delete password failure %d",
02619 status);
02620 snprintf(errMsg, sizeof errMsg, "Error removing password entry");
02621 addRErrorMsg (&rsComm->rError, 0, errMsg);
02622 _rollback("chlDelUserRE");
02623 return(status);
02624 }
02625
02626
02627
02628 cllBindVars[cllBindVarCount++]=iValStr;
02629 cllBindVars[cllBindVarCount++]=iValStr;
02630 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 4");
02631 status = cmlExecuteNoAnswerSql(
02632 "delete from R_USER_GROUP where user_id=? or group_user_id=?",
02633 &icss);
02634 if (status!=0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
02635 char errMsg[MAX_NAME_LEN+40];
02636 rodsLog(LOG_NOTICE,
02637 "chlDelUserRE delete user_group entry failure %d",
02638 status);
02639 snprintf(errMsg, sizeof errMsg, "Error removing user_group entry");
02640 addRErrorMsg (&rsComm->rError, 0, errMsg);
02641 _rollback("chlDelUserRE");
02642 return(status);
02643 }
02644
02645
02646 cllBindVars[cllBindVarCount++]=iValStr;
02647 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelUserRE SQL 4");
02648 status = cmlExecuteNoAnswerSql(
02649 "delete from R_USER_AUTH where user_id=?",
02650 &icss);
02651 if (status!=0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
02652 char errMsg[MAX_NAME_LEN+40];
02653 rodsLog(LOG_NOTICE,
02654 "chlDelUserRE delete user_auth entries failure %d",
02655 status);
02656 snprintf(errMsg, sizeof errMsg, "Error removing user_auth entries");
02657 addRErrorMsg (&rsComm->rError, 0, errMsg);
02658 _rollback("chlDelUserRE");
02659 return(status);
02660 }
02661
02662
02663 removeMetaMapAndAVU(iValStr);
02664
02665
02666 snprintf(userStr, sizeof userStr, "%s#%s",
02667 userName2, zoneToUse);
02668 status = cmlAudit3(AU_DELETE_USER_RE,
02669 iValStr,
02670 rsComm->clientUser.userName,
02671 rsComm->clientUser.rodsZone,
02672 userStr,
02673 &icss);
02674 if (status != 0) {
02675 rodsLog(LOG_NOTICE,
02676 "chlDelUserRE cmlAudit3 failure %d",
02677 status);
02678 _rollback("chlDelUserRE");
02679 return(status);
02680 }
02681
02682 return(0);
02683 }
02684
02685
02686
02687
02688
02689
02690
02691 int chlRegCollByAdmin(rsComm_t *rsComm, collInfo_t *collInfo)
02692 {
02693 char myTime[50];
02694 char logicalEndName[MAX_NAME_LEN];
02695 char logicalParentDirName[MAX_NAME_LEN];
02696 rodsLong_t iVal;
02697 char collIdNum[MAX_NAME_LEN];
02698 char nextStr[MAX_NAME_LEN];
02699 char currStr[MAX_NAME_LEN];
02700 char currStr2[MAX_SQL_SIZE];
02701 int status;
02702 char tSQL[MAX_SQL_SIZE];
02703 char userName2[NAME_LEN];
02704 char zoneName[NAME_LEN];
02705
02706 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin");
02707
02708 if (!icss.status) {
02709 return(CATALOG_NOT_CONNECTED);
02710 }
02711
02712
02713
02714 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH ||
02715 rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
02716 int status2;
02717 status2 = cmlCheckGroupAdminAccess(
02718 rsComm->clientUser.userName,
02719 rsComm->clientUser.rodsZone,
02720 "", &icss);
02721 if (status2 != 0) return(status2);
02722 if (creatingUserByGroupAdmin==0) {
02723 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
02724 }
02725
02726 }
02727
02728 if (collInfo==0) {
02729 return(CAT_INVALID_ARGUMENT);
02730 }
02731
02732 status = splitPathByKey(collInfo->collName,
02733 logicalParentDirName, logicalEndName, '/');
02734
02735 if (strlen(logicalParentDirName)==0) {
02736 strcpy(logicalParentDirName, "/");
02737 strcpy(logicalEndName, collInfo->collName+1);
02738 }
02739
02740
02741 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin SQL 1 ");
02742 status = cmlGetIntegerValueFromSql(
02743 "select coll_id from R_COLL_MAIN where coll_name=?",
02744 &iVal, logicalParentDirName, 0, 0, 0, 0, &icss);
02745 if (status < 0) {
02746 char errMsg[MAX_NAME_LEN+40];
02747 if (status == CAT_NO_ROWS_FOUND) {
02748 snprintf(errMsg, sizeof errMsg,
02749 "collection '%s' is unknown, cannot create %s under it",
02750 logicalParentDirName, logicalEndName);
02751 addRErrorMsg (&rsComm->rError, 0, errMsg);
02752 return(status);
02753 }
02754 _rollback("chlRegCollByAdmin");
02755 return(status);
02756 }
02757
02758 snprintf(collIdNum, MAX_NAME_LEN, "%d", status);
02759
02760
02761 cllNextValueString("R_ObjectID", nextStr, MAX_NAME_LEN);
02762
02763 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin SQL 2");
02764 snprintf(tSQL, MAX_SQL_SIZE,
02765 "insert into R_COLL_MAIN (coll_id, parent_coll_name, coll_name, coll_owner_name, coll_owner_zone, coll_type, coll_info1, coll_info2, create_ts, modify_ts) values (%s, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
02766 nextStr);
02767
02768 getNowStr(myTime);
02769
02770 status = getLocalZone();
02771 if (status != 0) return(status);
02772
02773
02774 status = parseUserName(collInfo->collOwnerName, userName2, zoneName);
02775 if (zoneName[0]=='\0') {
02776 rstrcpy(zoneName, localZone, NAME_LEN);
02777 }
02778
02779 cllBindVars[cllBindVarCount++]=logicalParentDirName;
02780 cllBindVars[cllBindVarCount++]=collInfo->collName;
02781 cllBindVars[cllBindVarCount++]=userName2;
02782 if (strlen(collInfo->collOwnerZone)>0) {
02783 cllBindVars[cllBindVarCount++]=collInfo->collOwnerZone;
02784 }
02785 else {
02786 cllBindVars[cllBindVarCount++]=zoneName;
02787 }
02788 if (collInfo->collType != NULL) {
02789 cllBindVars[cllBindVarCount++]=collInfo->collType;
02790 }
02791 else {
02792 cllBindVars[cllBindVarCount++]="";
02793 }
02794 if (collInfo->collInfo1 != NULL) {
02795 cllBindVars[cllBindVarCount++]=collInfo->collInfo1;
02796 }
02797 else {
02798 cllBindVars[cllBindVarCount++]="";
02799 }
02800 if (collInfo->collInfo2 != NULL) {
02801 cllBindVars[cllBindVarCount++]=collInfo->collInfo2;
02802 }
02803 else {
02804 cllBindVars[cllBindVarCount++]="";
02805 }
02806 cllBindVars[cllBindVarCount++]=myTime;
02807 cllBindVars[cllBindVarCount++]=myTime;
02808 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin SQL 3");
02809 status = cmlExecuteNoAnswerSql(tSQL,
02810 &icss);
02811 if (status != 0) {
02812 char errMsg[105];
02813 if (status == CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME) {
02814 snprintf(errMsg, 100, "Error %d %s",
02815 status,
02816 "CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME"
02817 );
02818 addRErrorMsg (&rsComm->rError, 0, errMsg);
02819 }
02820
02821 rodsLog(LOG_NOTICE,
02822 "chlRegCollByAdmin cmlExecuteNoAnswerSQL(insert) failure %d"
02823 ,status);
02824 _rollback("chlRegCollByAdmin");
02825 return(status);
02826 }
02827
02828
02829 cllCurrentValueString("R_ObjectID", currStr, MAX_NAME_LEN);
02830 snprintf(currStr2, MAX_SQL_SIZE, " %s ", currStr);
02831
02832 cllBindVars[cllBindVarCount++]=userName2;
02833 cllBindVars[cllBindVarCount++]=zoneName;
02834 cllBindVars[cllBindVarCount++]=ACCESS_OWN;
02835 cllBindVars[cllBindVarCount++]=myTime;
02836 cllBindVars[cllBindVarCount++]=myTime;
02837
02838 snprintf(tSQL, MAX_SQL_SIZE,
02839 "insert into R_OBJT_ACCESS values (%s, (select user_id from R_USER_MAIN where user_name=? and zone_name=?), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
02840 currStr2);
02841 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegCollByAdmin SQL 4");
02842 status = cmlExecuteNoAnswerSql(tSQL, &icss);
02843 if (status != 0) {
02844 rodsLog(LOG_NOTICE,
02845 "chlRegCollByAdmin cmlExecuteNoAnswerSql(insert access) failure %d",
02846 status);
02847 _rollback("chlRegCollByAdmin");
02848 return(status);
02849 }
02850
02851
02852 status = cmlAudit4(AU_REGISTER_COLL_BY_ADMIN,
02853 currStr2,
02854 "",
02855 userName2,
02856 zoneName,
02857 rsComm->clientUser.userName,
02858 &icss);
02859 if (status != 0) {
02860 rodsLog(LOG_NOTICE,
02861 "chlRegCollByAdmin cmlAudit4 failure %d",
02862 status);
02863 _rollback("chlRegCollByAdmin");
02864 return(status);
02865 }
02866
02867 return(0);
02868 }
02869
02870
02871
02872
02873
02874
02875
02876
02877
02878
02879 int chlRegColl(rsComm_t *rsComm, collInfo_t *collInfo) {
02880 char myTime[50];
02881 char logicalEndName[MAX_NAME_LEN];
02882 char logicalParentDirName[MAX_NAME_LEN];
02883 rodsLong_t iVal;
02884 char collIdNum[MAX_NAME_LEN];
02885 char nextStr[MAX_NAME_LEN];
02886 char currStr[MAX_NAME_LEN];
02887 char currStr2[MAX_SQL_SIZE];
02888 rodsLong_t status;
02889 char tSQL[MAX_SQL_SIZE];
02890 int inheritFlag;
02891
02892 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl");
02893
02894 if (!icss.status) {
02895 return(CATALOG_NOT_CONNECTED);
02896 }
02897
02898 status = splitPathByKey(collInfo->collName,
02899 logicalParentDirName, logicalEndName, '/');
02900
02901 if (strlen(logicalParentDirName)==0) {
02902 strcpy(logicalParentDirName, "/");
02903 strcpy(logicalEndName, collInfo->collName+1);
02904 }
02905
02906
02907
02908 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 1 ");
02909 status = cmlCheckDirAndGetInheritFlag(logicalParentDirName,
02910 rsComm->clientUser.userName,
02911 rsComm->clientUser.rodsZone,
02912 ACCESS_MODIFY_OBJECT, &inheritFlag, &icss);
02913 if (status < 0) {
02914 char errMsg[105];
02915 if (status == CAT_UNKNOWN_COLLECTION) {
02916 snprintf(errMsg, 100, "collection '%s' is unknown",
02917 logicalParentDirName);
02918 addRErrorMsg (&rsComm->rError, 0, errMsg);
02919 return(status);
02920 }
02921 _rollback("chlRegColl");
02922 return(status);
02923 }
02924 snprintf(collIdNum, MAX_NAME_LEN, "%lld", status);
02925
02926
02927 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 2");
02928 status = cmlGetIntegerValueFromSql(
02929 "select data_id from R_DATA_MAIN where data_name=? and coll_id=?",
02930 &iVal, logicalEndName, collIdNum, 0, 0, 0, &icss);
02931
02932 if (status == 0) {
02933 return(CAT_NAME_EXISTS_AS_DATAOBJ);
02934 }
02935
02936
02937
02938 cllNextValueString("R_ObjectID", nextStr, MAX_NAME_LEN);
02939
02940 getNowStr(myTime);
02941
02942 cllBindVars[cllBindVarCount++]=logicalParentDirName;
02943 cllBindVars[cllBindVarCount++]=collInfo->collName;
02944 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
02945 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone;
02946 if (collInfo->collType != NULL) {
02947 cllBindVars[cllBindVarCount++]=collInfo->collType;
02948 }
02949 else {
02950 cllBindVars[cllBindVarCount++]="";
02951 }
02952 if (collInfo->collInfo1 != NULL) {
02953 cllBindVars[cllBindVarCount++]=collInfo->collInfo1;
02954 }
02955 else {
02956 cllBindVars[cllBindVarCount++]="";
02957 }
02958 if (collInfo->collInfo2 != NULL) {
02959 cllBindVars[cllBindVarCount++]=collInfo->collInfo2;
02960 }
02961 else {
02962 cllBindVars[cllBindVarCount++]="";
02963 }
02964 cllBindVars[cllBindVarCount++]=myTime;
02965 cllBindVars[cllBindVarCount++]=myTime;
02966 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 3");
02967 snprintf(tSQL, MAX_SQL_SIZE,
02968 "insert into R_COLL_MAIN (coll_id, parent_coll_name, coll_name, coll_owner_name, coll_owner_zone, coll_type, coll_info1, coll_info2, create_ts, modify_ts) values (%s, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
02969 nextStr);
02970 status = cmlExecuteNoAnswerSql(tSQL,
02971 &icss);
02972 if (status != 0) {
02973 rodsLog(LOG_NOTICE,
02974 "chlRegColl cmlExecuteNoAnswerSql(insert) failure %d",status);
02975 _rollback("chlRegColl");
02976 return(status);
02977 }
02978
02979
02980 cllCurrentValueString("R_ObjectID", currStr, MAX_NAME_LEN);
02981 snprintf(currStr2, MAX_SQL_SIZE, " %s ", currStr);
02982
02983 if (inheritFlag) {
02984
02985
02986 cllBindVars[0]=myTime;
02987 cllBindVars[1]=myTime;
02988 cllBindVars[2]=collIdNum;
02989 cllBindVarCount=3;
02990 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 4");
02991 snprintf(tSQL, MAX_SQL_SIZE,
02992 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select %s, user_id, access_type_id, ?, ? from R_OBJT_ACCESS where object_id = ?)",
02993 currStr2);
02994 status = cmlExecuteNoAnswerSql(tSQL, &icss);
02995
02996 if (status == 0) {
02997 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 5");
02998 #if ORA_ICAT
02999 char newCollectionID[MAX_NAME_LEN];
03000
03001
03002
03003
03004 status = cmlGetCurrentSeqVal(&icss);
03005
03006 if (status > 0) {
03007
03008 snprintf(newCollectionID, MAX_SQL_SIZE, "%lld", status);
03009 cllBindVars[cllBindVarCount++]="1";
03010 cllBindVars[cllBindVarCount++]=myTime;
03011 cllBindVars[cllBindVarCount++]=newCollectionID;
03012 status = cmlExecuteNoAnswerSql(
03013 "update R_COLL_MAIN set coll_inheritance=?, modify_ts=? where coll_id=?",
03014 &icss);
03015 }
03016 #else
03017
03018
03019
03020
03021 cllBindVars[cllBindVarCount++]="1";
03022 cllBindVars[cllBindVarCount++]=myTime;
03023 snprintf(tSQL, MAX_SQL_SIZE,
03024 "update R_COLL_MAIN set coll_inheritance=?, modify_ts=? where coll_id=%s",
03025 currStr2);
03026 status = cmlExecuteNoAnswerSql(tSQL, &icss);
03027 #endif
03028 }
03029 }
03030 else {
03031 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
03032 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone;
03033 cllBindVars[cllBindVarCount++]=ACCESS_OWN;
03034 cllBindVars[cllBindVarCount++]=myTime;
03035 cllBindVars[cllBindVarCount++]=myTime;
03036 snprintf(tSQL, MAX_SQL_SIZE,
03037 "insert into R_OBJT_ACCESS values (%s, (select user_id from R_USER_MAIN where user_name=? and zone_name=?), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
03038 currStr2);
03039 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegColl SQL 6");
03040 status = cmlExecuteNoAnswerSql(tSQL, &icss);
03041 }
03042 if (status != 0) {
03043 rodsLog(LOG_NOTICE,
03044 "chlRegColl cmlExecuteNoAnswerSql(insert access) failure %d",
03045 status);
03046 _rollback("chlRegColl");
03047 return(status);
03048 }
03049
03050
03051 status = cmlAudit4(AU_REGISTER_COLL,
03052 currStr2,
03053 "",
03054 rsComm->clientUser.userName,
03055 rsComm->clientUser.rodsZone,
03056 collInfo->collName,
03057 &icss);
03058 if (status != 0) {
03059 rodsLog(LOG_NOTICE,
03060 "chlRegColl cmlAudit4 failure %d",
03061 status);
03062 _rollback("chlRegColl");
03063 return(status);
03064 }
03065
03066 status = cmlExecuteNoAnswerSql("commit", &icss);
03067 if (status != 0) {
03068 rodsLog(LOG_NOTICE,
03069 "chlRegColl cmlExecuteNoAnswerSql commit failure %d",
03070 status);
03071 return(status);
03072 }
03073
03074 return(status);
03075 }
03076
03077
03078
03079
03080
03081
03082
03083
03084
03085
03086 int chlModColl(rsComm_t *rsComm, collInfo_t *collInfo) {
03087 char myTime[50];
03088 rodsLong_t status;
03089 char tSQL[MAX_SQL_SIZE];
03090 int count;
03091 rodsLong_t iVal;
03092 char iValStr[60];
03093
03094 if (logSQL!=0) rodsLog(LOG_SQL, "chlModColl");
03095
03096 if( NULL == collInfo ) {
03097 rodsLog( LOG_ERROR, "chlModColl :: null input parameter collInfo" );
03098 return -1;
03099 }
03100
03101 if (!icss.status) {
03102 return(CATALOG_NOT_CONNECTED);
03103 }
03104
03105
03106 iVal = cmlCheckDir(collInfo->collName, rsComm->clientUser.userName,
03107 rsComm->clientUser.rodsZone,
03108 ACCESS_MODIFY_OBJECT, &icss);
03109
03110 if (iVal < 0) {
03111 char errMsg[105];
03112 if (iVal==CAT_UNKNOWN_COLLECTION) {
03113 snprintf(errMsg, 100, "collection '%s' is unknown",
03114 collInfo->collName);
03115 addRErrorMsg (&rsComm->rError, 0, errMsg);
03116 return(CAT_UNKNOWN_COLLECTION);
03117 }
03118 if (iVal==CAT_NO_ACCESS_PERMISSION) {
03119 snprintf(errMsg, 100, "no permission to update collection '%s'",
03120 collInfo->collName);
03121 addRErrorMsg (&rsComm->rError, 0, errMsg);
03122 return (CAT_NO_ACCESS_PERMISSION);
03123 }
03124 return(iVal);
03125 }
03126
03127
03128
03129
03130
03131 strncpy(tSQL, "update R_COLL_MAIN set ", MAX_SQL_SIZE);
03132 count=0;
03133 if (collInfo->collType != NULL && strlen(collInfo->collType)>0) {
03134 if (strcmp(collInfo->collType,"NULL_SPECIAL_VALUE")==0) {
03135
03136 cllBindVars[cllBindVarCount++]="";
03137 }
03138 else {
03139 cllBindVars[cllBindVarCount++]=collInfo->collType;
03140 }
03141 strncat(tSQL, "coll_type=? ", MAX_SQL_SIZE);
03142 count++;
03143 }
03144 if (collInfo->collInfo1 != NULL && strlen(collInfo->collInfo1)>0) {
03145 if (strcmp(collInfo->collInfo1,"NULL_SPECIAL_VALUE")==0) {
03146
03147 cllBindVars[cllBindVarCount++]="";
03148 } else {
03149 cllBindVars[cllBindVarCount++]=collInfo->collInfo1;
03150 }
03151 if (count>0) strncat(tSQL, ",", MAX_SQL_SIZE);
03152 strncat(tSQL, "coll_info1=? ", MAX_SQL_SIZE);
03153 count++;
03154 }
03155 if (collInfo->collInfo2 != NULL && strlen(collInfo->collInfo2)>0) {
03156 if (strcmp(collInfo->collInfo2,"NULL_SPECIAL_VALUE")==0) {
03157
03158 cllBindVars[cllBindVarCount++]="";
03159 } else {
03160 cllBindVars[cllBindVarCount++]=collInfo->collInfo2;
03161 }
03162 if (count>0) strncat(tSQL, ",", MAX_SQL_SIZE);
03163 strncat(tSQL, "coll_info2=? ", MAX_SQL_SIZE);
03164 count++;
03165 }
03166 if (count==0) return(CAT_INVALID_ARGUMENT);
03167 getNowStr(myTime);
03168 cllBindVars[cllBindVarCount++]=myTime;
03169 cllBindVars[cllBindVarCount++]=collInfo->collName;
03170 strncat(tSQL, ", modify_ts=? where coll_name=?", MAX_SQL_SIZE);
03171
03172 if (logSQL!=0) rodsLog(LOG_SQL, "chlModColl SQL 1");
03173 status = cmlExecuteNoAnswerSql(tSQL,
03174 &icss);
03175
03176
03177 snprintf(iValStr, sizeof iValStr, "%lld", iVal);
03178 status = cmlAudit3(AU_REGISTER_COLL,
03179 iValStr,
03180 rsComm->clientUser.userName,
03181 rsComm->clientUser.rodsZone,
03182 collInfo->collName,
03183 &icss);
03184 if (status != 0) {
03185 rodsLog(LOG_NOTICE,
03186 "chlModColl cmlAudit3 failure %d",
03187 status);
03188 return(status);
03189 }
03190
03191
03192 if (status != 0) {
03193 rodsLog(LOG_NOTICE,
03194 "chlModColl cmlExecuteNoAnswerSQL(update) failure %d", status);
03195 return(status);
03196 }
03197 return(0);
03198 }
03199
03200
03201
03202 static bool allowed_zone_char( const char _c ) {
03203 return ( !std::isalnum( _c ) &&
03204 !( '_' == _c ) &&
03205 !( '-' == _c ) );
03206 }
03207
03208
03209
03210 eirods::error validate_zone_name(
03211 std::string _zone_name ) {
03212 std::string::iterator itr = std::find_if( _zone_name.begin(),
03213 _zone_name.end(),
03214 allowed_zone_char );
03215 if( itr != _zone_name.end() ) {
03216 std::stringstream msg;
03217 msg << "validate_zone_name failed for zone [";
03218 msg << _zone_name;
03219 msg << "]";
03220 return ERROR( SYS_INVALID_INPUT_PARAM, msg.str() );
03221 }
03222
03223 return SUCCESS();
03224
03225 }
03226
03227
03228 int chlRegZone(rsComm_t *rsComm,
03229 char *zoneName, char *zoneType, char *zoneConnInfo,
03230 char *zoneComment) {
03231 char nextStr[MAX_NAME_LEN];
03232 char tSQL[MAX_SQL_SIZE];
03233 int status;
03234 char myTime[50];
03235
03236 if( !rsComm || !zoneName || !zoneType || !zoneConnInfo || !zoneComment ) {
03237 return SYS_INVALID_INPUT_PARAM;
03238 }
03239
03240 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegZone");
03241
03242 if (!icss.status) {
03243 return(CATALOG_NOT_CONNECTED);
03244 }
03245
03246 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03247 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03248 }
03249 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03250 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03251 }
03252
03253 if (strncmp(zoneType, "remote", 6) != 0) {
03254 addRErrorMsg (&rsComm->rError, 0,
03255 "Currently, only zones of type 'remote' are allowed");
03256 return(CAT_INVALID_ARGUMENT);
03257 }
03258
03259
03260
03261 eirods::error ret = validate_zone_name( zoneName );
03262 if( !ret.ok() ) {
03263 eirods::log( ret );
03264 return SYS_INVALID_INPUT_PARAM;
03265 }
03266
03267
03268 cllNextValueString("R_ObjectID", nextStr, MAX_NAME_LEN);
03269
03270 getNowStr(myTime);
03271
03272 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegZone SQL 1 ");
03273 cllBindVars[cllBindVarCount++]=zoneName;
03274 cllBindVars[cllBindVarCount++]=zoneConnInfo;
03275 cllBindVars[cllBindVarCount++]=zoneComment;
03276 cllBindVars[cllBindVarCount++]=myTime;
03277 cllBindVars[cllBindVarCount++]=myTime;
03278
03279 snprintf(tSQL, MAX_SQL_SIZE,
03280 "insert into R_ZONE_MAIN (zone_id, zone_name, zone_type_name, zone_conn_string, r_comment, create_ts, modify_ts) values (%s, ?, 'remote', ?, ?, ?, ?)",
03281 nextStr);
03282 status = cmlExecuteNoAnswerSql(tSQL,
03283 &icss);
03284 if (status != 0) {
03285 rodsLog(LOG_NOTICE,
03286 "chlRegZone cmlExecuteNoAnswerSql(insert) failure %d",status);
03287 _rollback("chlRegZone");
03288 return(status);
03289 }
03290
03291
03292 status = cmlAudit3(AU_REGISTER_ZONE, "0",
03293 rsComm->clientUser.userName,
03294 rsComm->clientUser.rodsZone,
03295 "", &icss);
03296 if (status != 0) {
03297 rodsLog(LOG_NOTICE,
03298 "chlRegResc cmlAudit3 failure %d",
03299 status);
03300 return(status);
03301 }
03302
03303
03304 status = cmlExecuteNoAnswerSql("commit", &icss);
03305 if (status != 0) {
03306 rodsLog(LOG_NOTICE,
03307 "chlRegZone cmlExecuteNoAnswerSql commit failure %d",
03308 status);
03309 return(status);
03310 }
03311
03312 return(0);
03313 }
03314
03315
03316
03317 int chlModZone(rsComm_t *rsComm, char *zoneName, char *option,
03318 char *optionValue) {
03319 int status, OK;
03320 char myTime[50];
03321 char zoneId[MAX_NAME_LEN];
03322 char commentStr[200];
03323
03324 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone");
03325
03326 if (zoneName == NULL || option==NULL || optionValue==NULL) {
03327 return (CAT_INVALID_ARGUMENT);
03328 }
03329
03330 if (*zoneName == '\0' || *option == '\0' || *optionValue=='\0') {
03331 return (CAT_INVALID_ARGUMENT);
03332 }
03333
03334 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03335 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03336 }
03337 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03338 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03339 }
03340
03341 status = getLocalZone();
03342 if (status != 0) return(status);
03343
03344 zoneId[0]='\0';
03345 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone SQL 1 ");
03346 status = cmlGetStringValueFromSql(
03347 "select zone_id from R_ZONE_MAIN where zone_name=?",
03348 zoneId, MAX_NAME_LEN, zoneName, "", 0, &icss);
03349 if (status != 0) {
03350 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_ZONE);
03351 return(status);
03352 }
03353
03354 getNowStr(myTime);
03355 OK=0;
03356 if (strcmp(option, "comment")==0) {
03357 cllBindVars[cllBindVarCount++]=optionValue;
03358 cllBindVars[cllBindVarCount++]=myTime;
03359 cllBindVars[cllBindVarCount++]=zoneId;
03360 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone SQL 3");
03361 status = cmlExecuteNoAnswerSql(
03362 "update R_ZONE_MAIN set r_comment = ?, modify_ts=? where zone_id=?",
03363 &icss);
03364 if (status != 0) {
03365 rodsLog(LOG_NOTICE,
03366 "chlModZone cmlExecuteNoAnswerSql update failure %d",
03367 status);
03368 return(status);
03369 }
03370 OK=1;
03371 }
03372 if (strcmp(option, "conn")==0) {
03373 cllBindVars[cllBindVarCount++]=optionValue;
03374 cllBindVars[cllBindVarCount++]=myTime;
03375 cllBindVars[cllBindVarCount++]=zoneId;
03376 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone SQL 5");
03377 status = cmlExecuteNoAnswerSql(
03378 "update R_ZONE_MAIN set zone_conn_string = ?, modify_ts=? where zone_id=?",
03379 &icss);
03380 if (status != 0) {
03381 rodsLog(LOG_NOTICE,
03382 "chlModZone cmlExecuteNoAnswerSql update failure %d",
03383 status);
03384 return(status);
03385 }
03386 OK=1;
03387 }
03388 if (strcmp(option, "name")==0) {
03389 if (strcmp(zoneName,localZone)==0) {
03390 addRErrorMsg (&rsComm->rError, 0,
03391 "It is not valid to rename the local zone via chlModZone; iadmin should use acRenameLocalZone");
03392 return (CAT_INVALID_ARGUMENT);
03393 }
03394 cllBindVars[cllBindVarCount++]=optionValue;
03395 cllBindVars[cllBindVarCount++]=myTime;
03396 cllBindVars[cllBindVarCount++]=zoneId;
03397 if (logSQL!=0) rodsLog(LOG_SQL, "chlModZone SQL 5");
03398 status = cmlExecuteNoAnswerSql(
03399 "update R_ZONE_MAIN set zone_name = ?, modify_ts=? where zone_id=?",
03400 &icss);
03401 if (status != 0) {
03402 rodsLog(LOG_NOTICE,
03403 "chlModZone cmlExecuteNoAnswerSql update failure %d",
03404 status);
03405 return(status);
03406 }
03407 OK=1;
03408 }
03409 if (OK==0) {
03410 return (CAT_INVALID_ARGUMENT);
03411 }
03412
03413
03414 snprintf(commentStr, sizeof commentStr, "%s %s", option, optionValue);
03415 status = cmlAudit3(AU_MOD_ZONE,
03416 zoneId,
03417 rsComm->clientUser.userName,
03418 rsComm->clientUser.rodsZone,
03419 commentStr,
03420 &icss);
03421 if (status != 0) {
03422 rodsLog(LOG_NOTICE,
03423 "chlModZone cmlAudit3 failure %d",
03424 status);
03425 return(status);
03426 }
03427
03428 status = cmlExecuteNoAnswerSql("commit", &icss);
03429 if (status != 0) {
03430 rodsLog(LOG_NOTICE,
03431 "chlModZone cmlExecuteNoAnswerSql commit failure %d",
03432 status);
03433 return(status);
03434 }
03435 return(0);
03436 }
03437
03438
03439 int chlRenameColl(rsComm_t *rsComm, char *oldCollName, char *newCollName) {
03440 int status;
03441 rodsLong_t status1;
03442
03443
03444
03445 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameColl SQL 1 ");
03446
03447 status1 = cmlCheckDir(oldCollName,
03448 rsComm->clientUser.userName,
03449 rsComm->clientUser.rodsZone,
03450 ACCESS_OWN,
03451 &icss);
03452
03453 if (status1 < 0) {
03454 return(status1);
03455 }
03456
03457
03458 status = chlRenameObject(rsComm, status1, newCollName);
03459 return(status);
03460 }
03461
03462
03463
03464 int chlRenameLocalZone(rsComm_t *rsComm, char *oldZoneName, char *newZoneName) {
03465 int status;
03466 char zoneId[MAX_NAME_LEN];
03467 char myTime[50];
03468 char commentStr[200];
03469
03470 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone");
03471
03472 if (!icss.status) {
03473 return(CATALOG_NOT_CONNECTED);
03474 }
03475
03476 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03477 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03478 }
03479 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03480 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03481 }
03482
03483 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 1 ");
03484 getLocalZone();
03485
03486 if (strcmp(localZone, oldZoneName) != 0) {
03487 return(CAT_INVALID_ARGUMENT);
03488 }
03489
03490
03491 zoneId[0]='\0';
03492 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 2 ");
03493 status = cmlGetStringValueFromSql(
03494 "select zone_id from R_ZONE_MAIN where zone_name=?",
03495 zoneId, MAX_NAME_LEN, newZoneName, "", 0, &icss);
03496 if (status != CAT_NO_ROWS_FOUND) return(CAT_INVALID_ZONE);
03497
03498 getNowStr(myTime);
03499
03500
03501
03502
03503
03504 snprintf(commentStr, sizeof commentStr, "renamed local zone %s to %s",
03505 oldZoneName, newZoneName);
03506 status = cmlAudit3(AU_MOD_ZONE,
03507 "0",
03508 rsComm->clientUser.userName,
03509 rsComm->clientUser.rodsZone,
03510 commentStr,
03511 &icss);
03512 if (status != 0) {
03513 rodsLog(LOG_NOTICE,
03514 "chlRenameLocalZone cmlAudit3 failure %d",
03515 status);
03516 return(status);
03517 }
03518
03519
03520 cllBindVars[cllBindVarCount++]=newZoneName;
03521 cllBindVars[cllBindVarCount++]=myTime;
03522 cllBindVars[cllBindVarCount++]=oldZoneName;
03523 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 3 ");
03524 status = cmlExecuteNoAnswerSql(
03525 "update R_COLL_MAIN set coll_owner_zone = ?, modify_ts=? where coll_owner_zone=?",
03526 &icss);
03527 if (status != 0) {
03528 rodsLog(LOG_NOTICE,
03529 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03530 status);
03531 return(status);
03532 }
03533
03534
03535 cllBindVars[cllBindVarCount++]=newZoneName;
03536 cllBindVars[cllBindVarCount++]=myTime;
03537 cllBindVars[cllBindVarCount++]=oldZoneName;
03538 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 4 ");
03539 status = cmlExecuteNoAnswerSql(
03540 "update R_DATA_MAIN set data_owner_zone = ?, modify_ts=? where data_owner_zone=?",
03541 &icss);
03542 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
03543 rodsLog(LOG_NOTICE,
03544 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03545 status);
03546 return(status);
03547 }
03548
03549
03550 cllBindVars[cllBindVarCount++]=newZoneName;
03551 cllBindVars[cllBindVarCount++]=myTime;
03552 cllBindVars[cllBindVarCount++]=oldZoneName;
03553 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 5 ");
03554 status = cmlExecuteNoAnswerSql(
03555 "update R_RESC_MAIN set zone_name = ?, modify_ts=? where zone_name=?",
03556 &icss);
03557 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
03558 rodsLog(LOG_NOTICE,
03559 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03560 status);
03561 return(status);
03562 }
03563
03564
03565 cllBindVars[cllBindVarCount++]=newZoneName;
03566 cllBindVars[cllBindVarCount++]=myTime;
03567 cllBindVars[cllBindVarCount++]=oldZoneName;
03568 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 6 ");
03569 status = cmlExecuteNoAnswerSql(
03570 "update R_RULE_MAIN set rule_owner_zone=?, modify_ts=? where rule_owner_zone=?",
03571 &icss);
03572 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
03573 rodsLog(LOG_NOTICE,
03574 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03575 status);
03576 return(status);
03577 }
03578
03579
03580 cllBindVars[cllBindVarCount++]=newZoneName;
03581 cllBindVars[cllBindVarCount++]=myTime;
03582 cllBindVars[cllBindVarCount++]=oldZoneName;
03583 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 7 ");
03584 status = cmlExecuteNoAnswerSql(
03585 "update R_USER_MAIN set zone_name=?, modify_ts=? where zone_name=?",
03586 &icss);
03587 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
03588 rodsLog(LOG_NOTICE,
03589 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03590 status);
03591 return(status);
03592 }
03593
03594
03595 cllBindVars[cllBindVarCount++]=newZoneName;
03596 cllBindVars[cllBindVarCount++]=myTime;
03597 cllBindVars[cllBindVarCount++]=oldZoneName;
03598 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameLocalZone SQL 8 ");
03599 status = cmlExecuteNoAnswerSql(
03600 "update R_ZONE_MAIN set zone_name=?, modify_ts=? where zone_name=?",
03601 &icss);
03602 if (status != 0) {
03603 rodsLog(LOG_NOTICE,
03604 "chlRenameLocalZone cmlExecuteNoAnswerSql update failure %d",
03605 status);
03606 return(status);
03607 }
03608
03609 return(0);
03610 }
03611
03612
03613 int chlDelZone(rsComm_t *rsComm, char *zoneName) {
03614 int status;
03615 char zoneType[MAX_NAME_LEN];
03616
03617 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelZone");
03618
03619 if (!icss.status) {
03620 return(CATALOG_NOT_CONNECTED);
03621 }
03622
03623 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03624 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03625 }
03626 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03627 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03628 }
03629
03630 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelZone SQL 1 ");
03631
03632 status = cmlGetStringValueFromSql(
03633 "select zone_type_name from R_ZONE_MAIN where zone_name=?",
03634 zoneType, MAX_NAME_LEN, zoneName, 0, 0, &icss);
03635 if (status != 0) {
03636 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_ZONE);
03637 return(status);
03638 }
03639
03640 if (strcmp(zoneType, "remote") != 0) {
03641 addRErrorMsg (&rsComm->rError, 0,
03642 "It is not permitted to remove the local zone");
03643 return(CAT_INVALID_ARGUMENT);
03644 }
03645
03646 cllBindVars[cllBindVarCount++]=zoneName;
03647 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelZone 2");
03648 status = cmlExecuteNoAnswerSql(
03649 "delete from R_ZONE_MAIN where zone_name = ?",
03650 &icss);
03651 if (status != 0) {
03652 rodsLog(LOG_NOTICE,
03653 "chlDelZone cmlExecuteNoAnswerSql delete failure %d",
03654 status);
03655 return(status);
03656 }
03657
03658
03659 status = cmlAudit3(AU_DELETE_ZONE,
03660 "0",
03661 rsComm->clientUser.userName,
03662 rsComm->clientUser.rodsZone,
03663 zoneName,
03664 &icss);
03665 if (status != 0) {
03666 rodsLog(LOG_NOTICE,
03667 "chlDelZone cmlAudit3 failure %d",
03668 status);
03669 _rollback("chlDelZone");
03670 return(status);
03671 }
03672
03673 status = cmlExecuteNoAnswerSql("commit", &icss);
03674 if (status != 0) {
03675 rodsLog(LOG_NOTICE,
03676 "chlDelZone cmlExecuteNoAnswerSql commit failure %d",
03677 status);
03678 return(status);
03679 }
03680
03681 return(0);
03682 }
03683
03684
03685
03686
03687
03688
03689
03690
03691
03692
03693
03694
03695
03696
03697
03698
03699
03700
03701
03702
03703
03704
03705
03706
03707
03708 int chlSimpleQuery(rsComm_t *rsComm, char *sql,
03709 char *arg1, char *arg2, char *arg3, char *arg4,
03710 int format, int *control,
03711 char *outBuf, int maxOutBuf) {
03712 int stmtNum, status, nCols, i, needToGet, didGet;
03713 int rowSize;
03714 int rows;
03715 int OK;
03716
03717 char *allowedSQL[]={
03718 "select token_name from R_TOKN_MAIN where token_namespace = 'token_namespace'",
03719 "select token_name from R_TOKN_MAIN where token_namespace = ?",
03720 "select * from R_TOKN_MAIN where token_namespace = ? and token_name like ?",
03721 "select resc_name from R_RESC_MAIN",
03722 "select * from R_RESC_MAIN where resc_name=?",
03723 "select zone_name from R_ZONE_MAIN",
03724 "select * from R_ZONE_MAIN where zone_name=?",
03725 "select user_name from R_USER_MAIN where user_type_name='rodsgroup'",
03726 "select user_name||'#'||zone_name from R_USER_MAIN, R_USER_GROUP where R_USER_GROUP.user_id=R_USER_MAIN.user_id and R_USER_GROUP.group_user_id=(select user_id from R_USER_MAIN where user_name=?)",
03727 "select * from R_DATA_MAIN where data_id=?",
03728 "select data_name, data_id, data_repl_num from R_DATA_MAIN where coll_id =(select coll_id from R_COLL_MAIN where coll_name=?)",
03729 "select coll_name from R_COLL_MAIN where parent_coll_name=?",
03730 "select * from R_USER_MAIN where user_name=?",
03731 "select user_name||'#'||zone_name from R_USER_MAIN where user_type_name != 'rodsgroup'",
03732 "select R_RESC_GROUP.resc_group_name, R_RESC_GROUP.resc_id, resc_name, R_RESC_GROUP.create_ts, R_RESC_GROUP.modify_ts from R_RESC_MAIN, R_RESC_GROUP where R_RESC_MAIN.resc_id = R_RESC_GROUP.resc_id and resc_group_name=?",
03733 "select distinct resc_group_name from R_RESC_GROUP",
03734 "select coll_id from R_COLL_MAIN where coll_name = ?",
03735 "select * from R_USER_MAIN where user_name=? and zone_name=?",
03736 "select user_name from R_USER_MAIN where zone_name=? and user_type_name != 'rodsgroup'",
03737 "select zone_name from R_ZONE_MAIN where zone_type_name=?",
03738 "select user_name, user_auth_name from R_USER_AUTH, R_USER_MAIN where R_USER_AUTH.user_id = R_USER_MAIN.user_id and R_USER_MAIN.user_name=?",
03739 "select user_name, user_auth_name from R_USER_AUTH, R_USER_MAIN where R_USER_AUTH.user_id = R_USER_MAIN.user_id and R_USER_MAIN.user_name=? and R_USER_MAIN.zone_name=?",
03740 "select user_name, user_auth_name from R_USER_AUTH, R_USER_MAIN where R_USER_AUTH.user_id = R_USER_MAIN.user_id",
03741 "select user_name, user_auth_name from R_USER_AUTH, R_USER_MAIN where R_USER_AUTH.user_id = R_USER_MAIN.user_id and R_USER_AUTH.user_auth_name=?",
03742 "select user_name, R_USER_MAIN.zone_name, resc_name, quota_limit, quota_over, R_QUOTA_MAIN.modify_ts from R_QUOTA_MAIN, R_USER_MAIN, R_RESC_MAIN where R_USER_MAIN.user_id = R_QUOTA_MAIN.user_id and R_RESC_MAIN.resc_id = R_QUOTA_MAIN.resc_id",
03743 "select user_name, R_USER_MAIN.zone_name, resc_name, quota_limit, quota_over, R_QUOTA_MAIN.modify_ts from R_QUOTA_MAIN, R_USER_MAIN, R_RESC_MAIN where R_USER_MAIN.user_id = R_QUOTA_MAIN.user_id and R_RESC_MAIN.resc_id = R_QUOTA_MAIN.resc_id and user_name=? and R_USER_MAIN.zone_name=?",
03744 "select user_name, R_USER_MAIN.zone_name, quota_limit, quota_over, R_QUOTA_MAIN.modify_ts from R_QUOTA_MAIN, R_USER_MAIN where R_USER_MAIN.user_id = R_QUOTA_MAIN.user_id and R_QUOTA_MAIN.resc_id = 0",
03745 "select user_name, R_USER_MAIN.zone_name, quota_limit, quota_over, R_QUOTA_MAIN.modify_ts from R_QUOTA_MAIN, R_USER_MAIN where R_USER_MAIN.user_id = R_QUOTA_MAIN.user_id and R_QUOTA_MAIN.resc_id = 0 and user_name=? and R_USER_MAIN.zone_name=?",
03746 ""
03747 };
03748
03749 if (logSQL!=0) rodsLog(LOG_SQL, "chlSimpleQuery");
03750
03751 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03752 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03753 }
03754 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03755 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03756 }
03757
03758
03759 OK=0;
03760 for (i=0;;i++) {
03761 if (strlen(allowedSQL[i]) < 1) break;
03762 if (strcasecmp(allowedSQL[i], sql)==0) {
03763 OK=1;
03764 break;
03765 }
03766 }
03767
03768 if (OK == 0) {
03769 return(CAT_INVALID_ARGUMENT);
03770 }
03771
03772
03773
03774 if (i==0 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 1 ");
03775 if (i==1 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 2");
03776 if (i==2 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 3");
03777 if (i==3 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 4");
03778 if (i==4 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 5");
03779 if (i==5 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 6");
03780 if (i==6 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 7");
03781 if (i==7 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 8");
03782 if (i==8 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 9");
03783 if (i==9 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 10");
03784 if (i==10 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 11");
03785 if (i==11 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 12");
03786 if (i==12 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 13");
03787 if (i==13 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 14");
03788
03789
03790
03791 if (i==17 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 18");
03792 if (i==18 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 19");
03793 if (i==19 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 20");
03794 if (i==20 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 21");
03795 if (i==21 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 22");
03796 if (i==22 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 23");
03797 if (i==23 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 24");
03798 if (i==24 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 25");
03799 if (i==25 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 26");
03800 if (i==26 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 27");
03801 if (i==27 && logSQL) rodsLog(LOG_SQL, "chlSimpleQuery SQL 28");
03802
03803 outBuf[0]='\0';
03804 needToGet=1;
03805 didGet=0;
03806 rowSize=0;
03807 rows=0;
03808 if (*control==0) {
03809 status = cmlGetFirstRowFromSqlBV(sql, arg1, arg2, arg3, arg4,
03810 &stmtNum, &icss);
03811 if (status < 0) {
03812 if (status != CAT_NO_ROWS_FOUND) {
03813 rodsLog(LOG_NOTICE,
03814 "chlSimpleQuery cmlGetFirstRowFromSqlBV failure %d",
03815 status);
03816 }
03817 return(status);
03818 }
03819 didGet=1;
03820 needToGet=0;
03821 *control = stmtNum+1;
03822 }
03823 else {
03824 stmtNum = *control - 1;
03825 }
03826
03827 for (;;) {
03828 if (needToGet) {
03829 status = cmlGetNextRowFromStatement(stmtNum, &icss);
03830 if (status == CAT_NO_ROWS_FOUND) {
03831 *control = 0;
03832 if (didGet) {
03833 if (format == 2) {
03834 i = strlen(outBuf);
03835 outBuf[i-1]='\0';
03836 }
03837 return(0);
03838 }
03839 return(status);
03840 }
03841 if (status < 0) {
03842 rodsLog(LOG_NOTICE,
03843 "chlSimpleQuery cmlGetNextRowFromStatement failure %d",
03844 status);
03845 return(status);
03846 }
03847 *control = stmtNum+1;
03848 didGet=1;
03849 }
03850 needToGet=1;
03851 nCols = icss.stmtPtr[stmtNum]->numOfCols;
03852 if (rows==0 && format==3) {
03853 for (i = 0; i < nCols ; i++ ) {
03854 rstrcat(outBuf, icss.stmtPtr[stmtNum]->resultColName[i],maxOutBuf);
03855 rstrcat(outBuf, " ", maxOutBuf);
03856 }
03857 if (i != nCols-1) {
03858
03859 rstrcat(outBuf, " ", maxOutBuf);
03860 }
03861
03862 }
03863 rows++;
03864 for (i = 0; i < nCols ; i++ ) {
03865 if (format==1 || format==3) {
03866 if (strlen(icss.stmtPtr[stmtNum]->resultValue[i])==0) {
03867 rstrcat(outBuf, "- ", maxOutBuf);
03868 }
03869 else {
03870 rstrcat(outBuf, icss.stmtPtr[stmtNum]->resultValue[i],
03871 maxOutBuf);
03872 rstrcat(outBuf, " ", maxOutBuf);
03873 }
03874 }
03875 if (format == 2) {
03876 rstrcat(outBuf, icss.stmtPtr[stmtNum]->resultColName[i],maxOutBuf);
03877 rstrcat(outBuf, ": ", maxOutBuf);
03878 rstrcat(outBuf, icss.stmtPtr[stmtNum]->resultValue[i], maxOutBuf);
03879 rstrcat(outBuf, "\n", maxOutBuf);
03880 }
03881 }
03882 rstrcat(outBuf, "\n", maxOutBuf);
03883 if (rowSize==0) rowSize=strlen(outBuf);
03884 if ((int) strlen(outBuf)+rowSize+20 > maxOutBuf) {
03885 return(0);
03886 }
03887 }
03888 }
03889
03890
03891
03892 int chlDelCollByAdmin(rsComm_t *rsComm, collInfo_t *collInfo) {
03893 rodsLong_t iVal;
03894 char logicalEndName[MAX_NAME_LEN];
03895 char logicalParentDirName[MAX_NAME_LEN];
03896 char collIdNum[MAX_NAME_LEN];
03897 int status;
03898
03899 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelCollByAdmin");
03900
03901 if (!icss.status) {
03902 return(CATALOG_NOT_CONNECTED);
03903 }
03904
03905 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03906 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03907 }
03908 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
03909 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
03910 }
03911
03912 if (collInfo==0) {
03913 return(CAT_INVALID_ARGUMENT);
03914 }
03915
03916 status = splitPathByKey(collInfo->collName,
03917 logicalParentDirName, logicalEndName, '/');
03918
03919 if (strlen(logicalParentDirName)==0) {
03920 strcpy(logicalParentDirName, "/");
03921 strcpy(logicalEndName, collInfo->collName+1);
03922 }
03923
03924
03925 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelCollByAdmin SQL 1 ");
03926 status = cmlGetIntegerValueFromSql(
03927 "select coll_id from R_COLL_MAIN where parent_coll_name=? union select coll_id from R_DATA_MAIN where coll_id=(select coll_id from R_COLL_MAIN where coll_name=?)",
03928 &iVal, collInfo->collName, collInfo->collName, 0, 0, 0, &icss);
03929
03930 if (status != CAT_NO_ROWS_FOUND) {
03931 if (status == 0) {
03932 char errMsg[105];
03933 snprintf(errMsg, 100, "collection '%s' is not empty",
03934 collInfo->collName);
03935 addRErrorMsg (&rsComm->rError, 0, errMsg);
03936 return(CAT_COLLECTION_NOT_EMPTY);
03937 }
03938 _rollback("chlDelCollByAdmin");
03939 return(status);
03940 }
03941
03942
03943 cllBindVars[cllBindVarCount++]=collInfo->collName;
03944 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelCollByAdmin SQL 2");
03945 status = cmlExecuteNoAnswerSql(
03946 "delete from R_OBJT_ACCESS where object_id=(select coll_id from R_COLL_MAIN where coll_name=?)",
03947 &icss);
03948 if (status != 0) {
03949
03950 rodsLog(LOG_NOTICE,
03951 "chlDelCollByAdmin delete access failure %d",
03952 status);
03953 _rollback("chlDelCollByAdmin");
03954 }
03955
03956
03957 snprintf(collIdNum, MAX_NAME_LEN, "%lld", iVal);
03958 removeMetaMapAndAVU(collIdNum);
03959
03960
03961 status = cmlAudit4(AU_DELETE_COLL_BY_ADMIN,
03962 "select coll_id from R_COLL_MAIN where coll_name=?",
03963 collInfo->collName,
03964 rsComm->clientUser.userName,
03965 rsComm->clientUser.rodsZone,
03966 collInfo->collName,
03967 &icss);
03968 if (status != 0) {
03969 rodsLog(LOG_NOTICE,
03970 "chlDelCollByAdmin cmlAudit4 failure %d",
03971 status);
03972 _rollback("chlDelCollByAdmin");
03973 return(status);
03974 }
03975
03976
03977
03978 cllBindVars[cllBindVarCount++]=collInfo->collName;
03979 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelCollByAdmin SQL 3");
03980 status = cmlExecuteNoAnswerSql("delete from R_COLL_MAIN where coll_name=?",
03981 &icss);
03982
03983 if (status != 0) {
03984 char errMsg[105];
03985 snprintf(errMsg, 100, "collection '%s' is unknown",
03986 collInfo->collName);
03987 addRErrorMsg (&rsComm->rError, 0, errMsg);
03988 _rollback("chlDelCollByAdmin");
03989 return(CAT_UNKNOWN_COLLECTION);
03990 }
03991
03992 return(0);
03993 }
03994
03995
03996
03997 int chlDelColl(rsComm_t *rsComm, collInfo_t *collInfo) {
03998
03999 int status;
04000
04001 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelColl");
04002
04003 status = _delColl(rsComm, collInfo);
04004 if (status != 0) return(status);
04005
04006 status = cmlExecuteNoAnswerSql("commit", &icss);
04007 if (status != 0) {
04008 rodsLog(LOG_NOTICE,
04009 "chlDelColl cmlExecuteNoAnswerSql commit failure %d",
04010 status);
04011 _rollback("chlDelColl");
04012 return(status);
04013 }
04014 return(0);
04015 }
04016
04017
04018
04019
04020 static int _delColl(rsComm_t *rsComm, collInfo_t *collInfo) {
04021 rodsLong_t iVal;
04022 char logicalEndName[MAX_NAME_LEN];
04023 char logicalParentDirName[MAX_NAME_LEN];
04024 char collIdNum[MAX_NAME_LEN];
04025 char parentCollIdNum[MAX_NAME_LEN];
04026 rodsLong_t status;
04027
04028 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl");
04029
04030 if (!icss.status) {
04031 return(CATALOG_NOT_CONNECTED);
04032 }
04033
04034 status = splitPathByKey(collInfo->collName,
04035 logicalParentDirName, logicalEndName, '/');
04036
04037 if (strlen(logicalParentDirName)==0) {
04038 strcpy(logicalParentDirName, "/");
04039 strcpy(logicalEndName, collInfo->collName+1);
04040 }
04041
04042
04043
04044 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 1 ");
04045 status = cmlCheckDir(logicalParentDirName,
04046 rsComm->clientUser.userName,
04047 rsComm->clientUser.rodsZone,
04048 ACCESS_MODIFY_OBJECT,
04049 &icss);
04050 if (status < 0) {
04051 char errMsg[105];
04052 if (status == CAT_UNKNOWN_COLLECTION) {
04053 snprintf(errMsg, 100, "collection '%s' is unknown",
04054 logicalParentDirName);
04055 addRErrorMsg (&rsComm->rError, 0, errMsg);
04056 return(status);
04057 }
04058 _rollback("_delColl");
04059 return(status);
04060 }
04061 snprintf(parentCollIdNum, MAX_NAME_LEN, "%lld", status);
04062
04063
04064
04065 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 2");
04066 status = cmlCheckDir(collInfo->collName,
04067 rsComm->clientUser.userName,
04068 rsComm->clientUser.rodsZone,
04069 ACCESS_DELETE_OBJECT,
04070 &icss);
04071 if (status < 0) return(status);
04072 snprintf(collIdNum, MAX_NAME_LEN, "%lld", status);
04073
04074
04075 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 3");
04076 status = cmlGetIntegerValueFromSql(
04077 "select coll_id from R_COLL_MAIN where parent_coll_name=? union select coll_id from R_DATA_MAIN where coll_id=(select coll_id from R_COLL_MAIN where coll_name=?)",
04078 &iVal, collInfo->collName, collInfo->collName, 0, 0, 0, &icss);
04079 if (status != CAT_NO_ROWS_FOUND) {
04080 return(CAT_COLLECTION_NOT_EMPTY);
04081 }
04082
04083
04084
04085
04086
04087 cllBindVars[cllBindVarCount++]=collInfo->collName;
04088 cllBindVars[cllBindVarCount++]=collIdNum;
04089 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 4");
04090 status = cmlExecuteNoAnswerSql(
04091 "delete from R_COLL_MAIN where coll_name=? and coll_id=?",
04092 &icss);
04093 if (status != 0) {
04094 rodsLog(LOG_NOTICE,
04095 "_delColl cmlExecuteNoAnswerSql delete failure %d",
04096 status);
04097 _rollback("_delColl");
04098 return(status);
04099 }
04100
04101
04102 cllBindVars[cllBindVarCount++]=collIdNum;
04103 if (logSQL!=0) rodsLog(LOG_SQL, "_delColl SQL 5");
04104 status = cmlExecuteNoAnswerSql(
04105 "delete from R_OBJT_ACCESS where object_id=?",
04106 &icss);
04107 if (status != 0) {
04108 rodsLog(LOG_NOTICE,
04109 "_delColl cmlExecuteNoAnswerSql delete access failure %d",
04110 status);
04111 _rollback("_delColl");
04112 }
04113
04114
04115 removeMetaMapAndAVU(collIdNum);
04116
04117
04118 status = cmlAudit3(AU_DELETE_COLL,
04119 collIdNum,
04120 rsComm->clientUser.userName,
04121 rsComm->clientUser.rodsZone,
04122 collInfo->collName,
04123 &icss);
04124 if (status != 0) {
04125 rodsLog(LOG_NOTICE,
04126 "chlModColl cmlAudit3 failure %d",
04127 status);
04128 _rollback("_delColl");
04129 return(status);
04130 }
04131
04132 return(status);
04133 }
04134
04135
04136
04137
04138
04139
04140
04141
04142
04143
04144
04145
04146
04147 int chlCheckAuth(rsComm_t *rsComm, char *challenge, char *response,
04148 char *username,
04149 int *userPrivLevel, int *clientPrivLevel) {
04150
04151 int status;
04152 char md5Buf[CHALLENGE_LEN+MAX_PASSWORD_LEN+2];
04153 char digest[RESPONSE_LEN+2];
04154 MD5_CTX context;
04155 char *cp;
04156 int i, OK, k;
04157 char userType[MAX_NAME_LEN];
04158 static int prevFailure=0;
04159 char pwInfoArray[MAX_PASSWORD_LEN*MAX_PASSWORDS*3];
04160 char goodPw[MAX_PASSWORD_LEN+10];
04161 char lastPw[MAX_PASSWORD_LEN+10];
04162 char goodPwExpiry[MAX_PASSWORD_LEN+10];
04163 char goodPwTs[MAX_PASSWORD_LEN+10];
04164 char goodPwModTs[MAX_PASSWORD_LEN+10];
04165 rodsLong_t expireTime;
04166 char *cpw;
04167 int nPasswords;
04168 char myTime[50];
04169 time_t nowTime;
04170 time_t pwExpireMaxCreateTime;
04171 char expireStr[50];
04172 char expireStrCreate[50];
04173 char myUserZone[MAX_NAME_LEN];
04174 char userName2[NAME_LEN+2];
04175 char userZone[NAME_LEN+2];
04176 rodsLong_t pamMinTime;
04177 rodsLong_t pamMaxTime;
04178
04179 #if defined(OS_AUTH)
04180 int doOsAuthentication = 0;
04181 char *os_auth_flag;
04182 #endif
04183
04184 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth");
04185
04186 if (prevFailure > 1) {
04187
04188 if (prevFailure > 5) sleep(20);
04189 sleep(2);
04190 }
04191 *userPrivLevel = NO_USER_AUTH;
04192 *clientPrivLevel = NO_USER_AUTH;
04193
04194 memset(md5Buf, 0, sizeof(md5Buf));
04195 strncpy(md5Buf, challenge, CHALLENGE_LEN);
04196 snprintf(prevChalSig,sizeof prevChalSig,
04197 "%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
04198 (unsigned char)md5Buf[0], (unsigned char)md5Buf[1],
04199 (unsigned char)md5Buf[2], (unsigned char)md5Buf[3],
04200 (unsigned char)md5Buf[4], (unsigned char)md5Buf[5],
04201 (unsigned char)md5Buf[6], (unsigned char)md5Buf[7],
04202 (unsigned char)md5Buf[8], (unsigned char)md5Buf[9],
04203 (unsigned char)md5Buf[10],(unsigned char)md5Buf[11],
04204 (unsigned char)md5Buf[12],(unsigned char)md5Buf[13],
04205 (unsigned char)md5Buf[14],(unsigned char)md5Buf[15]);
04206 #if defined(OS_AUTH)
04207
04208
04209
04210
04211
04212 os_auth_flag = strstr(username, OS_AUTH_FLAG);
04213 if (os_auth_flag) {
04214 *os_auth_flag = 0;
04215 doOsAuthentication = 1;
04216 }
04217 #endif
04218
04219 status = parseUserName(username, userName2, userZone);
04220 if (userZone[0]=='\0') {
04221 status = getLocalZone();
04222 if (status != 0) return(status);
04223 strncpy(myUserZone, localZone, MAX_NAME_LEN);
04224 }
04225 else {
04226 strncpy(myUserZone, userZone, MAX_NAME_LEN);
04227 }
04228
04229 #if defined(OS_AUTH)
04230 if (doOsAuthentication) {
04231 if ((status = osauthVerifyResponse(challenge, userName2, response))) {
04232 return status;
04233 }
04234 goto checkLevel;
04235 }
04236 #endif
04237
04238 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 1 ");
04239
04240 status = cmlGetMultiRowStringValuesFromSql(
04241 "select rcat_password, pass_expiry_ts, R_USER_PASSWORD.create_ts, R_USER_PASSWORD.modify_ts from R_USER_PASSWORD, R_USER_MAIN where user_name=? and zone_name=? and R_USER_MAIN.user_id = R_USER_PASSWORD.user_id",
04242 pwInfoArray, MAX_PASSWORD_LEN,
04243 MAX_PASSWORDS*4,
04244 userName2, myUserZone, &icss);
04245
04246 if (status < 4) {
04247 if (status == CAT_NO_ROWS_FOUND) {
04248 status = CAT_INVALID_USER;
04249 if (strncmp(ANONYMOUS_USER, userName2, NAME_LEN)==0) {
04250
04251 goto checkLevel;
04252 }
04253 }
04254 return(status);
04255 }
04256
04257 nPasswords=status/4;
04258 goodPwExpiry[0]='\0';
04259 goodPwTs[0]='\0';
04260 goodPwModTs[0]='\0';
04261
04262 cpw=pwInfoArray;
04263 for (k=0;k<MAX_PASSWORDS && k<nPasswords;k++) {
04264 memset(md5Buf, 0, sizeof(md5Buf));
04265 strncpy(md5Buf, challenge, CHALLENGE_LEN);
04266 icatDescramble(cpw);
04267 strncpy(md5Buf+CHALLENGE_LEN, cpw, MAX_PASSWORD_LEN);
04268
04269 MD5Init (&context);
04270 MD5Update (&context, (unsigned char *) md5Buf, CHALLENGE_LEN+MAX_PASSWORD_LEN);
04271 MD5Final ((unsigned char *) digest, &context);
04272
04273 for (i=0;i<RESPONSE_LEN;i++) {
04274 if (digest[i]=='\0') digest[i]++;
04275
04276 }
04277
04278 cp = response;
04279 OK=1;
04280 for (i=0;i<RESPONSE_LEN;i++) {
04281 if (*cp++ != digest[i]) OK=0;
04282 }
04283
04284 memset(md5Buf, 0, sizeof(md5Buf));
04285 if (OK==1) {
04286 rstrcpy(goodPw, cpw, MAX_PASSWORD_LEN);
04287 cpw+=MAX_PASSWORD_LEN;
04288 rstrcpy(goodPwExpiry, cpw, MAX_PASSWORD_LEN);
04289 cpw+=MAX_PASSWORD_LEN;
04290 rstrcpy(goodPwTs, cpw, MAX_PASSWORD_LEN);
04291 cpw+=MAX_PASSWORD_LEN;
04292 rstrcpy(goodPwModTs, cpw, MAX_PASSWORD_LEN);
04293 break;
04294 }
04295 cpw+=MAX_PASSWORD_LEN*4;
04296 }
04297 memset(pwInfoArray, 0, sizeof(pwInfoArray));
04298
04299 if (OK==0) {
04300 prevFailure++;
04301 return(CAT_INVALID_AUTHENTICATION);
04302 }
04303
04304 expireTime=atoll(goodPwExpiry);
04305 getNowStr(myTime);
04306 nowTime=atoll(myTime);
04307
04308
04309 pamMaxTime=atoll(IRODS_PAM_PASSWORD_MAX_TIME);
04310 pamMinTime=atoll(IRODS_PAM_PASSWORD_MIN_TIME);
04311
04312 if( ( strncmp(goodPwExpiry, "9999",4)!=0) &&
04313 expireTime >= pamMinTime &&
04314 expireTime <= pamMaxTime) {
04315 time_t modTime;
04316
04317 getNowStr(myTime);
04318 nowTime=atoll(myTime);
04319 modTime=atoll(goodPwModTs);
04320
04321 if (modTime+expireTime < nowTime) {
04322
04323 cllBindVars[cllBindVarCount++]=lastPw;
04324 cllBindVars[cllBindVarCount++]=goodPwTs;
04325 cllBindVars[cllBindVarCount++]=userName2;
04326 cllBindVars[cllBindVarCount++]=myUserZone;
04327 if (logSQL!=0)
04328 rodsLog(LOG_SQL, "chlCheckAuth SQL 2");
04329 status = cmlExecuteNoAnswerSql("delete from R_USER_PASSWORD where rcat_password=? and create_ts=? and user_id = (select user_id from R_USER_MAIN where user_name=? and zone_name=?)", &icss);
04330 memset(goodPw, 0, sizeof(goodPw));
04331 memset(lastPw, 0, sizeof(lastPw));
04332 if (status != 0) {
04333 rodsLog(LOG_NOTICE,
04334 "chlCheckAuth cmlExecuteNoAnswerSql delete expired password failure %d",
04335 status);
04336 return(status);
04337 }
04338 status = cmlExecuteNoAnswerSql("commit", &icss);
04339 if (status != 0) {
04340 rodsLog(LOG_NOTICE,
04341 "chlCheckAuth cmlExecuteNoAnswerSql commit failure %d",
04342 status);
04343 return(status);
04344 }
04345 return(CAT_PASSWORD_EXPIRED);
04346 }
04347 }
04348
04349
04350 if (expireTime < TEMP_PASSWORD_MAX_TIME) {
04351
04352
04353
04354 time_t createTime;
04355 int returnExpired;
04356
04357
04358
04359 returnExpired=0;
04360 getNowStr(myTime);
04361 nowTime=atoll(myTime);
04362 createTime=atoll(goodPwTs);
04363 if (createTime==0 || nowTime==0 ) returnExpired=1;
04364 if (createTime+expireTime < nowTime) returnExpired=1;
04365
04366
04367
04368
04369 cllBindVars[cllBindVarCount++]=goodPw;
04370 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 2");
04371 status = cmlExecuteNoAnswerSql(
04372 "delete from R_USER_PASSWORD where rcat_password=?",
04373 &icss);
04374 if (status !=0) {
04375 rodsLog(LOG_NOTICE,
04376 "chlCheckAuth cmlExecuteNoAnswerSql delete failure %d",
04377 status);
04378 _rollback("chlCheckAuth");
04379 return(status);
04380 }
04381
04382
04383
04384 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 3");
04385 snprintf(expireStr, sizeof expireStr, "%d", TEMP_PASSWORD_TIME);
04386 cllBindVars[cllBindVarCount++]=expireStr;
04387
04388 pwExpireMaxCreateTime = nowTime-TEMP_PASSWORD_TIME;
04389
04390 snprintf(expireStrCreate, sizeof expireStrCreate, "%011d",
04391 (int)pwExpireMaxCreateTime);
04392 cllBindVars[cllBindVarCount++]=expireStrCreate;
04393
04394 status = cmlExecuteNoAnswerSql(
04395 "delete from R_USER_PASSWORD where pass_expiry_ts = ? and create_ts < ?",
04396 &icss);
04397 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
04398 rodsLog(LOG_NOTICE,
04399 "chlCheckAuth cmlExecuteNoAnswerSql delete2 failure %d",
04400 status);
04401 _rollback("chlCheckAuth");
04402 return(status);
04403 }
04404
04405 memset(goodPw, 0, MAX_PASSWORD_LEN);
04406 if (returnExpired) return(CAT_PASSWORD_EXPIRED);
04407
04408 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 4");
04409 status = cmlExecuteNoAnswerSql("commit", &icss);
04410 if (status != 0) {
04411 rodsLog(LOG_NOTICE,
04412 "chlCheckAuth cmlExecuteNoAnswerSql commit failure %d",
04413 status);
04414 return(status);
04415 }
04416 memset(goodPw, 0, MAX_PASSWORD_LEN);
04417 if (returnExpired) return(CAT_PASSWORD_EXPIRED);
04418 }
04419
04420
04421 checkLevel:
04422
04423 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 5");
04424 status = cmlGetStringValueFromSql(
04425 "select user_type_name from R_USER_MAIN where user_name=? and zone_name=?",
04426 userType, MAX_NAME_LEN, userName2, myUserZone, 0, &icss);
04427 if (status !=0) {
04428 if (status == CAT_NO_ROWS_FOUND) {
04429 status = CAT_INVALID_USER;
04430 }
04431 else {
04432 _rollback("chlCheckAuth");
04433 }
04434 return(status);
04435 }
04436 *userPrivLevel = LOCAL_USER_AUTH;
04437 if (strcmp(userType, "rodsadmin") == 0) {
04438 *userPrivLevel = LOCAL_PRIV_USER_AUTH;
04439
04440
04441 if (strcmp( rsComm->clientUser.userName, userName2)==0 &&
04442 strcmp( rsComm->clientUser.rodsZone, userZone)==0) {
04443 *clientPrivLevel = LOCAL_PRIV_USER_AUTH;
04444 }
04445 else {
04446 if (rsComm->clientUser.userName[0]=='\0') {
04447
04448
04449
04450
04451
04452
04453
04454
04455
04456
04457
04458
04459 *clientPrivLevel = REMOTE_USER_AUTH;
04460 prevFailure=0;
04461 return(0);
04462 }
04463 else {
04464 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckAuth SQL 6");
04465 status = cmlGetStringValueFromSql(
04466 "select user_type_name from R_USER_MAIN where user_name=? and zone_name=?",
04467 userType, MAX_NAME_LEN, rsComm->clientUser.userName,
04468 rsComm->clientUser.rodsZone, 0, &icss);
04469 if (status !=0) {
04470 if (status == CAT_NO_ROWS_FOUND) {
04471 status = CAT_INVALID_CLIENT_USER;
04472 }
04473 else {
04474 _rollback("chlCheckAuth");
04475 }
04476 return(status);
04477 }
04478 *clientPrivLevel = LOCAL_USER_AUTH;
04479 if (strcmp(userType, "rodsadmin") == 0) {
04480 *clientPrivLevel = LOCAL_PRIV_USER_AUTH;
04481 }
04482 }
04483 }
04484 }
04485
04486 prevFailure=0;
04487 return(0);
04488 }
04489
04490
04491
04492
04493
04494
04495
04496
04497
04498 int chlMakeTempPw(rsComm_t *rsComm, char *pwValueToHash) {
04499 int status;
04500 char md5Buf[100];
04501 unsigned char digest[RESPONSE_LEN+2];
04502 MD5_CTX context;
04503 int i;
04504 char password[MAX_PASSWORD_LEN+10];
04505 char newPw[MAX_PASSWORD_LEN+10];
04506 char myTime[50];
04507 char myTimeExp[50];
04508 char rBuf[200];
04509 char hashValue[50];
04510 int j=0;
04511 char tSQL[MAX_SQL_SIZE];
04512
04513 if (logSQL!=0) rodsLog(LOG_SQL, "chlMakeTempPw");
04514
04515 if (logSQL!=0) rodsLog(LOG_SQL, "chlMakeTempPw SQL 1 ");
04516
04517 snprintf(tSQL, MAX_SQL_SIZE,
04518 "select rcat_password from R_USER_PASSWORD, R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=? and R_USER_MAIN.user_id = R_USER_PASSWORD.user_id and pass_expiry_ts != '%d'",
04519 TEMP_PASSWORD_TIME);
04520
04521 status = cmlGetStringValueFromSql(tSQL,
04522 password, MAX_PASSWORD_LEN,
04523 rsComm->clientUser.userName,
04524 rsComm->clientUser.rodsZone, 0, &icss);
04525 if (status !=0) {
04526 if (status == CAT_NO_ROWS_FOUND) {
04527 status = CAT_INVALID_USER;
04528 }
04529 else {
04530 _rollback("chlMakeTempPw");
04531 }
04532 return(status);
04533 }
04534
04535 icatDescramble(password);
04536
04537 j=0;
04538 get64RandomBytes(rBuf);
04539 for (i=0;i<50 && j<MAX_PASSWORD_LEN-1;i++) {
04540 char c;
04541 c = rBuf[i] &0x7f;
04542 if (c < '0') c+='0';
04543 if ( (c > 'a' && c < 'z') || (c > 'A' && c < 'Z') ||
04544 (c > '0' && c < '9') ){
04545 hashValue[j++]=c;
04546 }
04547 }
04548 hashValue[j]='\0';
04549
04550
04551
04552
04553 memset(md5Buf, 0, sizeof(md5Buf));
04554 strncpy(md5Buf, hashValue, 100);
04555 strncat(md5Buf, password, 100);
04556
04557 MD5Init (&context);
04558 MD5Update (&context, (unsigned char *) md5Buf, 100);
04559 MD5Final ((unsigned char *) digest, &context);
04560
04561 md5ToStr(digest, newPw);
04562
04563
04564 rstrcpy(pwValueToHash, hashValue, MAX_PASSWORD_LEN);
04565
04566
04567
04568
04569 getNowStr(myTime);
04570 sprintf(myTimeExp, "%d", TEMP_PASSWORD_TIME);
04571
04572 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
04573 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone,
04574 cllBindVars[cllBindVarCount++]=newPw;
04575 cllBindVars[cllBindVarCount++]=myTimeExp;
04576 cllBindVars[cllBindVarCount++]=myTime;
04577 cllBindVars[cllBindVarCount++]=myTime;
04578 if (logSQL!=0) rodsLog(LOG_SQL, "chlMakeTempPw SQL 2");
04579 status = cmlExecuteNoAnswerSql(
04580 "insert into R_USER_PASSWORD (user_id, rcat_password, pass_expiry_ts, create_ts, modify_ts) values ((select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?, ?, ?)",
04581 &icss);
04582 if (status !=0) {
04583 rodsLog(LOG_NOTICE,
04584 "chlMakeTempPw cmlExecuteNoAnswerSql insert failure %d",
04585 status);
04586 _rollback("chlMakeTempPw");
04587 return(status);
04588 }
04589
04590 status = cmlExecuteNoAnswerSql("commit", &icss);
04591 if (status != 0) {
04592 rodsLog(LOG_NOTICE,
04593 "chlMakeTempPw cmlExecuteNoAnswerSql commit failure %d",
04594 status);
04595 return(status);
04596 }
04597
04598 memset(newPw, 0, MAX_PASSWORD_LEN);
04599 return(0);
04600 }
04601
04602
04603
04604
04605
04606
04607 int decodePw(rsComm_t *rsComm, char *in, char *out) {
04608 int status;
04609 char *cp;
04610 char password[MAX_PASSWORD_LEN];
04611 char upassword[MAX_PASSWORD_LEN+10];
04612 char rand[]=
04613 "1gCBizHWbwIYyWLo";
04614 int pwLen1, pwLen2;
04615
04616 if (logSQL!=0) rodsLog(LOG_SQL, "decodePw - SQL 1 ");
04617 status = cmlGetStringValueFromSql(
04618 "select rcat_password from R_USER_PASSWORD, R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=? and R_USER_MAIN.user_id = R_USER_PASSWORD.user_id",
04619 password, MAX_PASSWORD_LEN,
04620 rsComm->clientUser.userName,
04621 rsComm->clientUser.rodsZone,
04622 0, &icss);
04623 if (status !=0) {
04624 if (status == CAT_NO_ROWS_FOUND) {
04625 status = CAT_INVALID_USER;
04626 }
04627 else {
04628 _rollback("decodePw");
04629 }
04630 return(status);
04631 }
04632
04633 icatDescramble(password);
04634
04635 obfDecodeByKeyV2(in, password, prevChalSig, upassword);
04636
04637 pwLen1=strlen(upassword);
04638
04639 memset(password, 0, MAX_PASSWORD_LEN);
04640
04641 cp = strstr(upassword, rand);
04642 if (cp !=NULL) *cp='\0';
04643
04644 pwLen2 = strlen(upassword);
04645
04646 if (pwLen2 > MAX_PASSWORD_LEN-5 && pwLen2==pwLen1) {
04647
04648 char errMsg[160];
04649 snprintf(errMsg, 150,
04650 "Error with password encoding.\nPlease try connecting directly to the ICAT host (setenv irodsHost)");
04651 addRErrorMsg (&rsComm->rError, 0, errMsg);
04652 return(CAT_PASSWORD_ENCODING_ERROR);
04653 }
04654 strcpy(out, upassword);
04655 memset(upassword, 0, MAX_PASSWORD_LEN);
04656
04657 return(0);
04658 }
04659
04660
04661
04662
04663
04664
04665
04666
04667
04668
04669 int chlUpdateIrodsPamPassword(rsComm_t *rsComm,
04670 char *username, int timeToLive,
04671 char *testTime,
04672 char **irodsPassword) {
04673 char myTime[50];
04674 char rBuf[200];
04675 int i, j;
04676 char randomPw[50];
04677 char randomPwEncoded[50];
04678 int status;
04679 char passwordInIcat[MAX_PASSWORD_LEN+2];
04680 char passwordModifyTime[50];
04681 char *cVal[3];
04682 int iVal[3];
04683 char selUserId[MAX_NAME_LEN];
04684 char expTime[50];
04685
04686 status = getLocalZone();
04687 if (status != 0) return(status);
04688
04689 getNowStr(myTime);
04690
04691
04692 if (timeToLive == 0) {
04693 rstrcpy(expTime, IRODS_PAM_PASSWORD_DEFAULT_TIME, sizeof expTime);
04694 }
04695 else {
04696
04697 rodsLong_t pamMinTime, pamMaxTime;
04698 pamMinTime=atoll(IRODS_PAM_PASSWORD_MIN_TIME);
04699 pamMaxTime=atoll(IRODS_PAM_PASSWORD_MAX_TIME);
04700 timeToLive = timeToLive * 3600;
04701 if (timeToLive < pamMinTime ||
04702 timeToLive > pamMaxTime) {
04703 return PAM_AUTH_PASSWORD_INVALID_TTL;
04704 }
04705 snprintf(expTime, sizeof expTime, "%d", timeToLive);
04706 }
04707
04708
04709 if (logSQL!=0) rodsLog(LOG_SQL, "chlUpdateIrodsPamPassword SQL 1");
04710 status = cmlGetStringValueFromSql(
04711 "select user_id from R_USER_MAIN where user_name=? and zone_name=? and user_type_name!='rodsgroup'",
04712 selUserId, MAX_NAME_LEN, username, localZone, 0, &icss);
04713 if (status==CAT_NO_ROWS_FOUND) return (CAT_INVALID_USER);
04714 if (status) return(status);
04715
04716
04717 if (logSQL!=0) rodsLog(LOG_SQL, "chlUpdateIrodsPamPassword SQL 2");
04718 cllBindVars[cllBindVarCount++]=IRODS_PAM_PASSWORD_MIN_TIME;
04719 cllBindVars[cllBindVarCount++]=IRODS_PAM_PASSWORD_MAX_TIME;
04720 cllBindVars[cllBindVarCount++]=myTime;
04721 #if MY_ICAT
04722 status = cmlExecuteNoAnswerSql("delete from R_USER_PASSWORD where pass_expiry_ts not like '9999%' and cast(pass_expiry_ts as signed integer)>=? and cast(pass_expiry_ts as signed integer)<=? and (cast(pass_expiry_ts as signed integer) + cast(modify_ts as signed integer) < ?)",
04723 #else
04724 status = cmlExecuteNoAnswerSql("delete from R_USER_PASSWORD where pass_expiry_ts not like '9999%' and cast(pass_expiry_ts as integer)>=? and cast(pass_expiry_ts as integer)<=? and (cast(pass_expiry_ts as integer) + cast(modify_ts as integer) < ?)",
04725 #endif
04726 &icss);
04727 if (logSQL!=0) rodsLog(LOG_SQL, "chlUpdateIrodsPamPassword SQL 3");
04728 cVal[0]=passwordInIcat;
04729 iVal[0]=MAX_PASSWORD_LEN;
04730 cVal[1]=passwordModifyTime;
04731 iVal[1]=sizeof(passwordModifyTime);
04732 status = cmlGetStringValuesFromSql(
04733 #if MY_ICAT
04734 "select rcat_password, modify_ts from R_USER_PASSWORD where user_id=? and pass_expiry_ts not like '9999%' and cast(pass_expiry_ts as signed integer) >= ? and cast (pass_expiry_ts as signed integer) <= ?",
04735 #else
04736 "select rcat_password, modify_ts from R_USER_PASSWORD where user_id=? and pass_expiry_ts not like '9999%' and cast(pass_expiry_ts as integer) >= ? and cast (pass_expiry_ts as integer) <= ?",
04737 #endif
04738 cVal, iVal, 2,
04739 selUserId,
04740 IRODS_PAM_PASSWORD_MIN_TIME,
04741 IRODS_PAM_PASSWORD_MAX_TIME, &icss);
04742
04743 if (status==0) {
04744 #ifndef PAM_AUTH_NO_EXTEND
04745 if (logSQL!=0) rodsLog(LOG_SQL, "chlUpdateIrodsPamPassword SQL 4");
04746 cllBindVars[cllBindVarCount++]=myTime;
04747 cllBindVars[cllBindVarCount++]=expTime;
04748 cllBindVars[cllBindVarCount++]=selUserId;
04749 cllBindVars[cllBindVarCount++]=passwordInIcat;
04750 status = cmlExecuteNoAnswerSql("update R_USER_PASSWORD set modify_ts=?, pass_expiry_ts=? where user_id = ? and rcat_password = ?",
04751 &icss);
04752 if (status) return(status);
04753
04754 status = cmlExecuteNoAnswerSql("commit", &icss);
04755 if (status != 0) {
04756 rodsLog(LOG_NOTICE,
04757 "chlUpdateIrodsPamPassword cmlExecuteNoAnswerSql commit failure %d",
04758 status);
04759 return(status);
04760 }
04761 #endif
04762 icatDescramble(passwordInIcat);
04763 strncpy(*irodsPassword, passwordInIcat, IRODS_PAM_PASSWORD_LEN);
04764 return(0);
04765 }
04766
04767
04768
04769
04770
04771
04772
04773 bool pw_good = false;
04774 while( !pw_good ) {
04775
04776 j=0;
04777 get64RandomBytes(rBuf);
04778 for (i=0;i<50 && j<IRODS_PAM_PASSWORD_LEN-1;i++) {
04779 char c;
04780 c = rBuf[i] & 0x7f;
04781 if (c < '0') c+='0';
04782 if ( (c > 'a' && c < 'z') || (c > 'A' && c < 'Z') ||
04783 (c > '0' && c < '9') ){
04784 randomPw[j++]=c;
04785 }
04786 }
04787 randomPw[j]='\0';
04788
04789 strncpy(randomPwEncoded, randomPw, 50);
04790 icatScramble(randomPwEncoded);
04791 if( !strstr( randomPwEncoded, "\'" ) ) {
04792 pw_good = true;
04793
04794 } else {
04795 rodsLog( LOG_STATUS, "chlUpdateIrodsPamPassword :: getting a new password [%s] has a single quote", randomPwEncoded );
04796
04797 }
04798
04799 }
04800
04801 if (testTime!=NULL && strlen(testTime)>0) {
04802 strncpy(myTime, testTime, sizeof(myTime));
04803 }
04804
04805 if (logSQL!=0) rodsLog(LOG_SQL, "chlUpdateIrodsPamPassword SQL 5");
04806 cllBindVars[cllBindVarCount++]=selUserId;
04807 cllBindVars[cllBindVarCount++]=randomPwEncoded;
04808 cllBindVars[cllBindVarCount++]=expTime;
04809 cllBindVars[cllBindVarCount++]=myTime;
04810 cllBindVars[cllBindVarCount++]=myTime;
04811 status = cmlExecuteNoAnswerSql("insert into R_USER_PASSWORD (user_id, rcat_password, pass_expiry_ts, create_ts, modify_ts) values (?, ?, ?, ?, ?)",
04812 &icss);
04813 if (status) return(status);
04814
04815 status = cmlExecuteNoAnswerSql("commit", &icss);
04816 if (status != 0) {
04817 rodsLog(LOG_NOTICE,
04818 "chlUpdateIrodsPamPassword cmlExecuteNoAnswerSql commit failure %d",
04819 status);
04820 return(status);
04821 }
04822
04823 strncpy(*irodsPassword, randomPw, IRODS_PAM_PASSWORD_LEN);
04824 return(0);
04825 }
04826
04827
04828
04829
04830 int chlModUser(rsComm_t *rsComm, char *userName, char *option,
04831 char *newValue) {
04832 int status;
04833 int opType;
04834 char decoded[MAX_PASSWORD_LEN+20];
04835 char tSQL[MAX_SQL_SIZE];
04836 char form1[]="update R_USER_MAIN set %s=?, modify_ts=? where user_name=? and zone_name=?";
04837 char form2[]="update R_USER_MAIN set %s=%s, modify_ts=? where user_name=? and zone_name=?";
04838 char form3[]="update R_USER_PASSWORD set rcat_password=?, modify_ts=? where user_id=?";
04839 char form4[]="insert into R_USER_PASSWORD (user_id, rcat_password, pass_expiry_ts, create_ts, modify_ts) values ((select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?, ?, ?)";
04840 char form5[]="insert into R_USER_AUTH (user_id, user_auth_name, create_ts) values ((select user_id from R_USER_MAIN where user_name=? and zone_name=?), ?, ?)";
04841 char form6[]="delete from R_USER_AUTH where user_id = (select user_id from R_USER_MAIN where user_name=? and zone_name=?) and user_auth_name = ?";
04842 #if MY_ICAT
04843 char form7[]="delete from R_USER_PASSWORD where pass_expiry_ts not like '9999%' and cast(pass_expiry_ts as signed integer)>=? and cast(pass_expiry_ts as signed integer)<=? and user_id = (select user_id from R_USER_MAIN where user_name=? and zone_name=?)";
04844 #else
04845 char form7[]="delete from R_USER_PASSWORD where pass_expiry_ts not like '9999%' and cast(pass_expiry_ts as integer)>=? and cast(pass_expiry_ts as integer)<=? and user_id = (select user_id from R_USER_MAIN where user_name=? and zone_name=?)";
04846 #endif
04847
04848 char myTime[50];
04849 rodsLong_t iVal;
04850
04851 int auditId;
04852 char auditComment[110];
04853 char auditUserName[110];
04854 int userSettingOwnPassword;
04855 int groupAdminSettingPassword;
04856
04857 char userName2[NAME_LEN];
04858 char zoneName[NAME_LEN];
04859
04860 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser");
04861
04862 if (userName == NULL || option == NULL || newValue==NULL) {
04863 return (CAT_INVALID_ARGUMENT);
04864 }
04865
04866 if (*userName == '\0' || *option == '\0' || newValue=='\0') {
04867 return (CAT_INVALID_ARGUMENT);
04868 }
04869
04870 userSettingOwnPassword=0;
04871
04872
04873 groupAdminSettingPassword=0;
04874 if (rsComm->clientUser.authInfo.authFlag >= LOCAL_PRIV_USER_AUTH &&
04875 rsComm->proxyUser.authInfo.authFlag >= LOCAL_PRIV_USER_AUTH) {
04876
04877 }
04878 else {
04879
04880 if ( strcmp(option,"password")!=0) {
04881
04882 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
04883 }
04884 if ( strcmp(userName, rsComm->clientUser.userName)==0) {
04885 userSettingOwnPassword=1;
04886 }
04887 else {
04888 int status2;
04889 status2 = cmlCheckGroupAdminAccess(
04890 rsComm->clientUser.userName,
04891 rsComm->clientUser.rodsZone,
04892 "", &icss);
04893 if (status2 != 0) return(status2);
04894 groupAdminSettingPassword=1;
04895 }
04896
04897 if (userSettingOwnPassword==0 && groupAdminSettingPassword==0) {
04898 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
04899 }
04900 }
04901
04902 status = getLocalZone();
04903 if (status != 0) return(status);
04904
04905 tSQL[0]='\0';
04906 opType=0;
04907
04908 getNowStr(myTime);
04909
04910 auditComment[0]='\0';
04911 strncpy(auditUserName,userName,100);
04912
04913 status = parseUserName(userName, userName2, zoneName);
04914 if (zoneName[0]=='\0') {
04915 rstrcpy(zoneName, localZone, NAME_LEN);
04916 }
04917 if (status != 0) {
04918 return (CAT_INVALID_ARGUMENT);
04919 }
04920
04921 #if 0
04922
04923
04924 if (strcmp(option,"name" )==0 ||
04925 strcmp(option,"user_name" )==0) {
04926 snprintf(tSQL, MAX_SQL_SIZE, form1,
04927 "user_name");
04928 cllBindVars[cllBindVarCount++]=newValue;
04929 cllBindVars[cllBindVarCount++]=myTime;
04930 cllBindVars[cllBindVarCount++]=userName2;
04931 cllBindVars[cllBindVarCount++]=zoneName;
04932 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUserSQLxx1x");
04933 auditId = AU_MOD_USER_NAME;
04934 strncpy(auditComment, userName, 100);
04935 strncpy(auditUserName,newValue,100);
04936 }
04937 #endif
04938 if (strcmp(option,"type")==0 ||
04939 strcmp(option,"user_type_name")==0) {
04940 char tsubSQL[MAX_SQL_SIZE];
04941 snprintf(tsubSQL, MAX_SQL_SIZE, "(select token_name from R_TOKN_MAIN where token_namespace='user_type' and token_name=?)");
04942 cllBindVars[cllBindVarCount++]=newValue;
04943 snprintf(tSQL, MAX_SQL_SIZE, form2,
04944 "user_type_name", tsubSQL);
04945 cllBindVars[cllBindVarCount++]=myTime;
04946 cllBindVars[cllBindVarCount++]=userName2;
04947 cllBindVars[cllBindVarCount++]=zoneName;
04948 opType=1;
04949 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 2");
04950 auditId = AU_MOD_USER_TYPE;
04951 strncpy(auditComment, newValue, 100);
04952 }
04953 if (strcmp(option,"zone")==0 ||
04954 strcmp(option,"zone_name")==0) {
04955 snprintf(tSQL, MAX_SQL_SIZE, form1, "zone_name");
04956 cllBindVars[cllBindVarCount++]=newValue;
04957 cllBindVars[cllBindVarCount++]=myTime;
04958 cllBindVars[cllBindVarCount++]=userName2;
04959 cllBindVars[cllBindVarCount++]=zoneName;
04960 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 3");
04961 auditId = AU_MOD_USER_ZONE;
04962 strncpy(auditComment, newValue, 100);
04963 strncpy(auditUserName,userName,100);
04964 }
04965 if (strcmp(option,"addAuth")==0) {
04966 opType=4;
04967 rstrcpy(tSQL, form5, MAX_SQL_SIZE);
04968 cllBindVars[cllBindVarCount++]=userName2;
04969 cllBindVars[cllBindVarCount++]=zoneName;
04970 cllBindVars[cllBindVarCount++]=newValue;
04971 cllBindVars[cllBindVarCount++]=myTime;
04972 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 4");
04973 auditId = AU_ADD_USER_AUTH_NAME;
04974 strncpy(auditComment, newValue, 100);
04975 }
04976 if (strcmp(option,"rmAuth")==0) {
04977 rstrcpy(tSQL, form6, MAX_SQL_SIZE);
04978 cllBindVars[cllBindVarCount++]=userName2;
04979 cllBindVars[cllBindVarCount++]=zoneName;
04980 cllBindVars[cllBindVarCount++]=newValue;
04981 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 5");
04982 auditId = AU_DELETE_USER_AUTH_NAME;
04983 strncpy(auditComment, newValue, 100);
04984
04985 }
04986
04987 if (strncmp(option, "rmPamPw", 9)==0) {
04988 rstrcpy(tSQL, form7, MAX_SQL_SIZE);
04989 cllBindVars[cllBindVarCount++]=IRODS_PAM_PASSWORD_MIN_TIME;
04990 cllBindVars[cllBindVarCount++]=IRODS_PAM_PASSWORD_MAX_TIME;
04991 cllBindVars[cllBindVarCount++]=userName2;
04992 cllBindVars[cllBindVarCount++]=zoneName;
04993 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 6");
04994 auditId = AU_MOD_USER_PASSWORD;
04995 strncpy(auditComment, "Deleted user iRODS-PAM password (if any)", 100);
04996 }
04997
04998 if (strcmp(option,"info")==0 ||
04999 strcmp(option,"user_info")==0) {
05000 snprintf(tSQL, MAX_SQL_SIZE, form1,
05001 "user_info");
05002 cllBindVars[cllBindVarCount++]=newValue;
05003 cllBindVars[cllBindVarCount++]=myTime;
05004 cllBindVars[cllBindVarCount++]=userName2;
05005 cllBindVars[cllBindVarCount++]=zoneName;
05006 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 6");
05007 auditId = AU_MOD_USER_INFO;
05008 strncpy(auditComment, newValue, 100);
05009 }
05010 if (strcmp(option,"comment")==0 ||
05011 strcmp(option,"r_comment")==0) {
05012 snprintf(tSQL, MAX_SQL_SIZE, form1,
05013 "r_comment");
05014 cllBindVars[cllBindVarCount++]=newValue;
05015 cllBindVars[cllBindVarCount++]=myTime;
05016 cllBindVars[cllBindVarCount++]=userName2;
05017 cllBindVars[cllBindVarCount++]=zoneName;
05018 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 7");
05019 auditId = AU_MOD_USER_COMMENT;
05020 strncpy(auditComment, newValue, 100);
05021 }
05022 if (strcmp(option,"password")==0) {
05023 int i;
05024 char userIdStr[MAX_NAME_LEN];
05025 i = decodePw(rsComm, newValue, decoded);
05026
05027 icatScramble(decoded);
05028
05029 if (i) return(i);
05030 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 8");
05031 i = cmlGetStringValueFromSql(
05032 "select R_USER_PASSWORD.user_id from R_USER_PASSWORD, R_USER_MAIN where R_USER_MAIN.user_name=? and R_USER_MAIN.zone_name=? and R_USER_MAIN.user_id = R_USER_PASSWORD.user_id",
05033 userIdStr, MAX_NAME_LEN, userName2, zoneName, 0, &icss);
05034 if (i != 0 && i !=CAT_NO_ROWS_FOUND) return(i);
05035 if (i == 0) {
05036 if (groupAdminSettingPassword == 1) {
05037
05038 return( CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05039 }
05040 rstrcpy(tSQL, form3, MAX_SQL_SIZE);
05041 cllBindVars[cllBindVarCount++]=decoded;
05042 cllBindVars[cllBindVarCount++]=myTime;
05043 cllBindVars[cllBindVarCount++]=userIdStr;
05044 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 9");
05045 }
05046 else {
05047 opType=4;
05048 rstrcpy(tSQL, form4, MAX_SQL_SIZE);
05049 cllBindVars[cllBindVarCount++]=userName2;
05050 cllBindVars[cllBindVarCount++]=zoneName;
05051 cllBindVars[cllBindVarCount++]=decoded;
05052 cllBindVars[cllBindVarCount++]="9999-12-31-23.59.01";
05053 cllBindVars[cllBindVarCount++]=myTime;
05054 cllBindVars[cllBindVarCount++]=myTime;
05055 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 10");
05056 }
05057 auditId = AU_MOD_USER_PASSWORD;
05058 }
05059
05060 if (tSQL[0]=='\0') {
05061 return (CAT_INVALID_ARGUMENT);
05062 }
05063
05064 status = cmlExecuteNoAnswerSql(tSQL, &icss);
05065 memset(decoded, 0, MAX_PASSWORD_LEN);
05066
05067 if (status != 0 ) {
05068 if (opType==1) {
05069 int status2;
05070 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 11");
05071 status2 = cmlGetIntegerValueFromSql(
05072 "select token_name from R_TOKN_MAIN where token_namespace='user_type' and token_name=?",
05073 &iVal, newValue, 0, 0, 0, 0, &icss);
05074 if (status2 != 0) {
05075 char errMsg[105];
05076 snprintf(errMsg, 100, "user_type '%s' is not valid",
05077 newValue);
05078 addRErrorMsg (&rsComm->rError, 0, errMsg);
05079
05080 rodsLog(LOG_NOTICE,
05081 "chlModUser invalid user_type");
05082 return(CAT_INVALID_USER_TYPE);
05083 }
05084 }
05085 if (opType==4) {
05086
05087 int status2;
05088 _rollback("chlModUser");
05089 if (logSQL!=0) rodsLog(LOG_SQL, "chlModUser SQL 12");
05090 status2 = cmlGetIntegerValueFromSql(
05091 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
05092 &iVal, userName2, zoneName, 0, 0, 0, &icss);
05093 if (status2 != 0) {
05094 rodsLog(LOG_NOTICE,
05095 "chlModUser invalid user %s zone %s", userName2, zoneName);
05096 return(CAT_INVALID_USER);
05097 }
05098 }
05099 rodsLog(LOG_NOTICE,
05100 "chlModUser cmlExecuteNoAnswerSql failure %d",
05101 status);
05102 return(status);
05103 }
05104
05105 status = cmlAudit1(auditId, rsComm->clientUser.userName,
05106 localZone, auditUserName, auditComment, &icss);
05107 if (status != 0) {
05108 rodsLog(LOG_NOTICE,
05109 "chlModUser cmlAudit1 failure %d",
05110 status);
05111 _rollback("chlModUser");
05112 return(status);
05113 }
05114
05115 status = cmlExecuteNoAnswerSql("commit", &icss);
05116 if (status != 0) {
05117 rodsLog(LOG_NOTICE,
05118 "chlModUser cmlExecuteNoAnswerSql commit failure %d",
05119 status);
05120 return(status);
05121 }
05122 return(0);
05123 }
05124
05125
05126
05127
05128 int chlModGroup(rsComm_t *rsComm, char *groupName, char *option,
05129 char *userName, char *userZone) {
05130 int status, OK;
05131 char myTime[50];
05132 char userId[MAX_NAME_LEN];
05133 char groupId[MAX_NAME_LEN];
05134 char commentStr[100];
05135 char zoneToUse[MAX_NAME_LEN];
05136
05137 char userName2[NAME_LEN];
05138 char zoneName[NAME_LEN];
05139
05140
05141 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup");
05142
05143 if (groupName == NULL || option == NULL || userName==NULL) {
05144 return (CAT_INVALID_ARGUMENT);
05145 }
05146
05147 if (*groupName == '\0' || *option == '\0' || userName=='\0') {
05148 return (CAT_INVALID_ARGUMENT);
05149 }
05150
05151 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH ||
05152 rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05153 int status2;
05154 status2 = cmlCheckGroupAdminAccess(
05155 rsComm->clientUser.userName,
05156 rsComm->clientUser.rodsZone, groupName, &icss);
05157 if (status2 != 0) return(status2);
05158 }
05159
05160 status = getLocalZone();
05161 if (status != 0) return(status);
05162
05163 strncpy(zoneToUse, localZone, MAX_NAME_LEN);
05164 if (userZone != NULL && *userZone != '\0') {
05165 strncpy(zoneToUse, userZone, MAX_NAME_LEN);
05166 }
05167
05168 status = parseUserName(userName, userName2, zoneName);
05169 if (zoneName[0]!='\0') {
05170 rstrcpy(zoneToUse, zoneName, NAME_LEN);
05171 }
05172
05173 userId[0]='\0';
05174 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup SQL 1 ");
05175 status = cmlGetStringValueFromSql(
05176 "select user_id from R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=? and user_type_name !='rodsgroup'",
05177 userId, MAX_NAME_LEN, userName2, zoneToUse, 0, &icss);
05178 if (status != 0) {
05179 if (status==CAT_NO_ROWS_FOUND) {
05180 return(CAT_INVALID_USER);
05181 }
05182 _rollback("chlModGroup");
05183 return(status);
05184 }
05185
05186 groupId[0]='\0';
05187 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup SQL 2");
05188 status = cmlGetStringValueFromSql(
05189 "select user_id from R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=? and user_type_name='rodsgroup'",
05190 groupId, MAX_NAME_LEN, groupName, localZone, 0, &icss);
05191 if (status != 0) {
05192 if (status==CAT_NO_ROWS_FOUND) {
05193 return(CAT_INVALID_GROUP);
05194 }
05195 _rollback("chlModGroup");
05196 return(status);
05197 }
05198 OK=0;
05199 if (strcmp(option, "remove")==0) {
05200 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup SQL 3");
05201 cllBindVars[cllBindVarCount++]=groupId;
05202 cllBindVars[cllBindVarCount++]=userId;
05203 status = cmlExecuteNoAnswerSql(
05204 "delete from R_USER_GROUP where group_user_id = ? and user_id = ?",
05205 &icss);
05206 if (status != 0) {
05207 rodsLog(LOG_NOTICE,
05208 "chlModGroup cmlExecuteNoAnswerSql delete failure %d",
05209 status);
05210 _rollback("chlModGroup");
05211 return(status);
05212 }
05213 OK=1;
05214 }
05215
05216 if (strcmp(option, "add")==0) {
05217 getNowStr(myTime);
05218 cllBindVars[cllBindVarCount++]=groupId;
05219 cllBindVars[cllBindVarCount++]=userId;
05220 cllBindVars[cllBindVarCount++]=myTime;
05221 cllBindVars[cllBindVarCount++]=myTime;
05222 if (logSQL!=0) rodsLog(LOG_SQL, "chlModGroup SQL 4");
05223 status = cmlExecuteNoAnswerSql(
05224 "insert into R_USER_GROUP (group_user_id, user_id , create_ts, modify_ts) values (?, ?, ?, ?)",
05225 &icss);
05226 if (status != 0) {
05227 rodsLog(LOG_NOTICE,
05228 "chlModGroup cmlExecuteNoAnswerSql delete failure %d",
05229 status);
05230 _rollback("chlModGroup");
05231 return(status);
05232 }
05233 OK=1;
05234 }
05235
05236 if (OK==0) {
05237 return (CAT_INVALID_ARGUMENT);
05238 }
05239
05240
05241 snprintf(commentStr, sizeof commentStr, "%s %s", option, userId);
05242 status = cmlAudit3(AU_MOD_GROUP,
05243 groupId,
05244 rsComm->clientUser.userName,
05245 rsComm->clientUser.rodsZone,
05246 commentStr,
05247 &icss);
05248 if (status != 0) {
05249 rodsLog(LOG_NOTICE,
05250 "chlModGroup cmlAudit3 failure %d",
05251 status);
05252 _rollback("chlModGroup");
05253 return(status);
05254 }
05255
05256 status = cmlExecuteNoAnswerSql("commit", &icss);
05257 if (status != 0) {
05258 rodsLog(LOG_NOTICE,
05259 "chlModGroup cmlExecuteNoAnswerSql commit failure %d",
05260 status);
05261 return(status);
05262 }
05263 return(0);
05264 }
05265
05266
05267 int chlModResc(rsComm_t *rsComm, char *rescName, char *option,
05268 char *optionValue) {
05269
05270 int status, OK;
05271 char myTime[50];
05272 char rescId[MAX_NAME_LEN];
05273 char rescPath[MAX_NAME_LEN]="";
05274 char rescPathMsg[MAX_NAME_LEN+100];
05275 char commentStr[200];
05276 struct hostent *myHostEnt;
05277
05278 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc");
05279
05280 if (rescName == NULL || option==NULL || optionValue==NULL) {
05281 return (CAT_INVALID_ARGUMENT);
05282 }
05283
05284 if (*rescName == '\0' || *option == '\0' || *optionValue=='\0') {
05285 return (CAT_INVALID_ARGUMENT);
05286 }
05287
05288 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05289 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05290 }
05291 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05292 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05293 }
05294
05295
05296
05297 if (strncmp(rescName, BUNDLE_RESC, strlen(BUNDLE_RESC))==0) {
05298 char errMsg[155];
05299 snprintf(errMsg, 150,
05300 "%s is a built-in resource needed for bundle operations.",
05301 BUNDLE_RESC);
05302 addRErrorMsg (&rsComm->rError, 0, errMsg);
05303 return(CAT_PSEUDO_RESC_MODIFY_DISALLOWED);
05304 }
05305
05306 status = getLocalZone();
05307 if (status != 0) return(status);
05308
05309 rescId[0]='\0';
05310 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 1 ");
05311 status = cmlGetStringValueFromSql(
05312 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
05313 rescId, MAX_NAME_LEN, rescName, localZone, 0, &icss);
05314 if (status != 0) {
05315 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
05316 _rollback("chlModResc");
05317 return(status);
05318 }
05319
05320 getNowStr(myTime);
05321 OK=0;
05322 if (strcmp(option, "info")==0) {
05323 cllBindVars[cllBindVarCount++]=optionValue;
05324 cllBindVars[cllBindVarCount++]=myTime;
05325 cllBindVars[cllBindVarCount++]=rescId;
05326 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 2");
05327 status = cmlExecuteNoAnswerSql(
05328 "update R_RESC_MAIN set resc_info=?, modify_ts=? where resc_id=?",
05329 &icss);
05330 if (status != 0) {
05331 rodsLog(LOG_NOTICE,
05332 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05333 status);
05334 _rollback("chlModResc");
05335 return(status);
05336 }
05337 OK=1;
05338 }
05339 if (strcmp(option, "comment")==0) {
05340 cllBindVars[cllBindVarCount++]=optionValue;
05341 cllBindVars[cllBindVarCount++]=myTime;
05342 cllBindVars[cllBindVarCount++]=rescId;
05343 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 3");
05344 status = cmlExecuteNoAnswerSql(
05345 "update R_RESC_MAIN set r_comment = ?, modify_ts=? where resc_id=?",
05346 &icss);
05347 if (status != 0) {
05348 rodsLog(LOG_NOTICE,
05349 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05350 status);
05351 _rollback("chlModResc");
05352 return(status);
05353 }
05354 OK=1;
05355 }
05356 if (strcmp(option, "freespace")==0) {
05357 int inType=0;
05358 if (*optionValue=='+') {
05359 inType=1;
05360 optionValue++;
05361 }
05362 if (*optionValue=='-') {
05363 inType=2;
05364 optionValue++;
05365 }
05366 cllBindVars[cllBindVarCount++]=optionValue;
05367 cllBindVars[cllBindVarCount++]=myTime;
05368 cllBindVars[cllBindVarCount++]=myTime;
05369 cllBindVars[cllBindVarCount++]=rescId;
05370 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 4");
05371 if (inType==0) {
05372 status = cmlExecuteNoAnswerSql(
05373 "update R_RESC_MAIN set free_space = ?, free_space_ts = ?, modify_ts=? where resc_id=?",
05374 &icss);
05375 }
05376 if (inType==1) {
05377 #if ORA_ICAT
05378
05379 status = cmlExecuteNoAnswerSql(
05380 "update R_RESC_MAIN set free_space = cast(free_space as integer) + cast(? as integer), free_space_ts = ?, modify_ts=? where resc_id=?",
05381 &icss);
05382 #elif MY_ICAT
05383 status = cmlExecuteNoAnswerSql(
05384 "update R_RESC_MAIN set free_space = free_space + ?, free_space_ts = ?, modify_ts=? where resc_id=?",
05385 &icss);
05386 #else
05387 status = cmlExecuteNoAnswerSql(
05388 "update R_RESC_MAIN set free_space = cast(free_space as bigint) + cast(? as bigint), free_space_ts = ?, modify_ts=? where resc_id=?",
05389 &icss);
05390 #endif
05391 }
05392 if (inType==2) {
05393 #if ORA_ICAT
05394
05395 status = cmlExecuteNoAnswerSql(
05396 "update R_RESC_MAIN set free_space = cast(free_space as integer) - cast(? as integer), free_space_ts = ?, modify_ts=? where resc_id=?",
05397 &icss);
05398 #elif MY_ICAT
05399 status = cmlExecuteNoAnswerSql(
05400 "update R_RESC_MAIN set free_space = free_space - ?, free_space_ts = ?, modify_ts=? where resc_id=?",
05401 &icss);
05402 #else
05403 status = cmlExecuteNoAnswerSql(
05404 "update R_RESC_MAIN set free_space = cast(free_space as bigint) - cast(? as bigint), free_space_ts = ?, modify_ts=? where resc_id=?",
05405 &icss);
05406 #endif
05407 }
05408 if (status != 0) {
05409 rodsLog(LOG_NOTICE,
05410 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05411 status);
05412 _rollback("chlModResc");
05413 return(status);
05414 }
05415 OK=1;
05416 }
05417 if (strcmp(option, "host")==0) {
05418
05419
05420 myHostEnt = gethostbyname(optionValue);
05421 if (myHostEnt <= 0) {
05422 char errMsg[155];
05423 snprintf(errMsg, 150,
05424 "Warning, resource host address '%s' is not a valid DNS entry, gethostbyname failed.",
05425 optionValue);
05426 addRErrorMsg (&rsComm->rError, 0, errMsg);
05427 }
05428 if (strcmp(optionValue, "localhost") == 0) {
05429 addRErrorMsg (&rsComm->rError, 0,
05430 "Warning, resource host address 'localhost' will not work properly as it maps to the local host from each client.");
05431 }
05432
05433
05434 cllBindVars[cllBindVarCount++]=optionValue;
05435 cllBindVars[cllBindVarCount++]=myTime;
05436 cllBindVars[cllBindVarCount++]=rescId;
05437 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 5");
05438 status = cmlExecuteNoAnswerSql(
05439 "update R_RESC_MAIN set resc_net = ?, modify_ts=? where resc_id=?",
05440 &icss);
05441 if (status != 0) {
05442 rodsLog(LOG_NOTICE,
05443 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05444 status);
05445 _rollback("chlModResc");
05446 return(status);
05447 }
05448 OK=1;
05449 }
05450 if (strcmp(option, "type")==0) {
05451 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 6");
05452 #if 0 // JMC :: resource type is now dynamic
05453 status = cmlCheckNameToken("resc_type", optionValue, &icss);
05454 if (status !=0 ) {
05455 char errMsg[105];
05456 snprintf(errMsg, 100, "resource_type '%s' is not valid",
05457 optionValue);
05458 addRErrorMsg (&rsComm->rError, 0, errMsg);
05459 return(CAT_INVALID_RESOURCE_TYPE);
05460 }
05461 #endif
05462 cllBindVars[cllBindVarCount++]=optionValue;
05463 cllBindVars[cllBindVarCount++]=myTime;
05464 cllBindVars[cllBindVarCount++]=rescId;
05465 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 7");
05466 status = cmlExecuteNoAnswerSql(
05467 "update R_RESC_MAIN set resc_type_name = ?, modify_ts=? where resc_id=?",
05468 &icss);
05469 if (status != 0) {
05470 rodsLog(LOG_NOTICE,
05471 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05472 status);
05473 _rollback("chlModResc");
05474 return(status);
05475 }
05476 OK=1;
05477 }
05478
05479 #if 0 // JMC - no longer support resource classes
05480 if (strcmp(option, "class")==0) {
05481 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc S---Q---L 8");
05482 status = cmlCheckNameToken("resc_class", optionValue, &icss);
05483 if (status !=0 ) {
05484 char errMsg[105];
05485 snprintf(errMsg, 100, "resource_class '%s' is not valid",
05486 optionValue);
05487 addRErrorMsg (&rsComm->rError, 0, errMsg);
05488 return(CAT_INVALID_RESOURCE_CLASS);
05489 }
05490
05491 cllBindVars[cllBindVarCount++]=optionValue;
05492 cllBindVars[cllBindVarCount++]=myTime;
05493 cllBindVars[cllBindVarCount++]=rescId;
05494 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc S---Q---L 9");
05495 status = cmlExecuteNoAnswerSql(
05496 "update R_RESC_MAIN set resc_class_name = ?, modify_ts=? where resc_id=?",
05497 &icss);
05498 if (status != 0) {
05499 rodsLog(LOG_NOTICE,
05500 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05501 status);
05502 _rollback("chlModResc");
05503 return(status);
05504 }
05505 OK=1;
05506 }
05507 #endif
05508 if (strcmp(option, "path")==0) {
05509 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 10");
05510 status = cmlGetStringValueFromSql(
05511 "select resc_def_path from R_RESC_MAIN where resc_id=?",
05512 rescPath, MAX_NAME_LEN, rescId, 0, 0, &icss);
05513 if (status != 0) {
05514 rodsLog(LOG_NOTICE,
05515 "chlModResc cmlGetStringValueFromSql query failure %d",
05516 status);
05517 _rollback("chlModResc");
05518 return(status);
05519 }
05520
05521 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 11");
05522
05523 cllBindVars[cllBindVarCount++]=optionValue;
05524 cllBindVars[cllBindVarCount++]=myTime;
05525 cllBindVars[cllBindVarCount++]=rescId;
05526 status = cmlExecuteNoAnswerSql(
05527 "update R_RESC_MAIN set resc_def_path=?, modify_ts=? where resc_id=?",
05528 &icss);
05529 if (status != 0) {
05530 rodsLog(LOG_NOTICE,
05531 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05532 status);
05533 _rollback("chlModResc");
05534 return(status);
05535 }
05536 OK=1;
05537 }
05538
05539 if (strcmp(option, "status")==0) {
05540 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 12");
05541 cllBindVars[cllBindVarCount++]=optionValue;
05542 cllBindVars[cllBindVarCount++]=myTime;
05543 cllBindVars[cllBindVarCount++]=rescId;
05544 status = cmlExecuteNoAnswerSql(
05545 "update R_RESC_MAIN set resc_status=?, modify_ts=? where resc_id=?",
05546 &icss);
05547 if (status != 0) {
05548 rodsLog(LOG_NOTICE,
05549 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05550 status);
05551 _rollback("chlModResc");
05552 return(status);
05553 }
05554 OK=1;
05555 }
05556
05557 if (strcmp(option, "name")==0) {
05558 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 13");
05559 cllBindVars[cllBindVarCount++]=optionValue;
05560 cllBindVars[cllBindVarCount++]=myTime;
05561 cllBindVars[cllBindVarCount++]=rescId;
05562
05563 status = cmlExecuteNoAnswerSql(
05564 "update R_RESC_MAIN set resc_name=?, modify_ts=? where resc_id=?",
05565 &icss);
05566 if (status != 0) {
05567 rodsLog(LOG_NOTICE,
05568 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05569 status);
05570 _rollback("chlModResc");
05571 return(status);
05572 }
05573
05574 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 14");
05575 cllBindVars[cllBindVarCount++]=optionValue;
05576 cllBindVars[cllBindVarCount++]=rescName;
05577 status = cmlExecuteNoAnswerSql(
05578 "update R_DATA_MAIN set resc_name=? where resc_name=?",
05579 &icss);
05580 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
05581 if (status != 0) {
05582 rodsLog(LOG_NOTICE,
05583 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05584 status);
05585 _rollback("chlModResc");
05586 return(status);
05587 }
05588
05589 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 15");
05590 cllBindVars[cllBindVarCount++]=optionValue;
05591 cllBindVars[cllBindVarCount++]=rescName;
05592 status = cmlExecuteNoAnswerSql(
05593 "update R_SERVER_LOAD set resc_name=? where resc_name=?",
05594 &icss);
05595 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
05596 if (status != 0) {
05597 rodsLog(LOG_NOTICE,
05598 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05599 status);
05600 _rollback("chlModResc");
05601 return(status);
05602 }
05603
05604 if (logSQL!=0) rodsLog(LOG_SQL, "chlModResc SQL 16");
05605 cllBindVars[cllBindVarCount++]=optionValue;
05606 cllBindVars[cllBindVarCount++]=rescName;
05607 status = cmlExecuteNoAnswerSql(
05608 "update R_SERVER_LOAD_DIGEST set resc_name=? where resc_name=?",
05609 &icss);
05610 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
05611 if (status != 0) {
05612 rodsLog(LOG_NOTICE,
05613 "chlModResc cmlExecuteNoAnswerSql update failure %d",
05614 status);
05615 _rollback("chlModResc");
05616 return(status);
05617 }
05618
05619 OK=1;
05620 }
05621
05622 if (strcmp(option, "context")==0) {
05623 cllBindVars[cllBindVarCount++]=optionValue;
05624 cllBindVars[cllBindVarCount++]=myTime;
05625 cllBindVars[cllBindVarCount++]=rescId;
05626 status = cmlExecuteNoAnswerSql(
05627 "update R_RESC_MAIN set resc_context=?, modify_ts=? where resc_id=?",
05628 &icss);
05629 if (status != 0) {
05630 rodsLog(LOG_NOTICE,
05631 "chlModResc cmlExecuteNoAnswerSql update failure for resc context %d",
05632 status);
05633 _rollback("chlModResc");
05634 return(status);
05635 }
05636 OK=1;
05637 }
05638
05639 if (OK==0) {
05640 return (CAT_INVALID_ARGUMENT);
05641 }
05642
05643
05644 snprintf(commentStr, sizeof commentStr, "%s %s", option, optionValue);
05645 status = cmlAudit3(AU_MOD_RESC,
05646 rescId,
05647 rsComm->clientUser.userName,
05648 rsComm->clientUser.rodsZone,
05649 commentStr,
05650 &icss);
05651 if (status != 0) {
05652 rodsLog(LOG_NOTICE,
05653 "chlModResc cmlAudit3 failure %d",
05654 status);
05655 _rollback("chlModResc");
05656 return(status);
05657 }
05658
05659 status = cmlExecuteNoAnswerSql("commit", &icss);
05660 if (status != 0) {
05661 rodsLog(LOG_NOTICE,
05662 "chlModResc cmlExecuteNoAnswerSql commit failure %d",
05663 status);
05664 return(status);
05665 }
05666
05667 if (rescPath[0]!='\0') {
05668
05669
05670 snprintf(rescPathMsg, sizeof(rescPathMsg), "Previous resource path: %s",
05671 rescPath);
05672 addRErrorMsg (&rsComm->rError, 0, rescPathMsg);
05673 }
05674
05675 return(0);
05676 }
05677
05678
05679 int chlModRescDataPaths(rsComm_t *rsComm, char *rescName, char *oldPath,
05680 char *newPath, char *userName) {
05681 char rescId[MAX_NAME_LEN];
05682 int status, len, rows;
05683 char *cptr;
05684
05685 char userZone[NAME_LEN];
05686 char zoneToUse[NAME_LEN];
05687 char userName2[NAME_LEN];
05688
05689 char oldPath2[MAX_NAME_LEN];
05690
05691 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescDataPaths");
05692
05693 if (rescName == NULL || oldPath==NULL || newPath==NULL) {
05694 return (CAT_INVALID_ARGUMENT);
05695 }
05696
05697 if (*rescName == '\0' || *oldPath == '\0' || *newPath=='\0') {
05698 return (CAT_INVALID_ARGUMENT);
05699 }
05700
05701
05702 if (*oldPath != '/' or *newPath != '/') {
05703 return (CAT_INVALID_ARGUMENT);
05704 }
05705 len = strlen(oldPath);
05706 cptr = oldPath+len-1;
05707 if (*cptr != '/') return (CAT_INVALID_ARGUMENT);
05708 len = strlen(newPath);
05709 cptr = newPath+len-1;
05710 if (*cptr != '/') return (CAT_INVALID_ARGUMENT);
05711
05712 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05713 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05714 }
05715 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05716 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05717 }
05718
05719 status = getLocalZone();
05720 if (status != 0) return(status);
05721
05722 rescId[0]='\0';
05723 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescDataPaths SQL 1 ");
05724 status = cmlGetStringValueFromSql(
05725 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
05726 rescId, MAX_NAME_LEN, rescName, localZone, 0, &icss);
05727 if (status != 0) {
05728 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
05729 _rollback("chlModRescDataPaths");
05730 return(status);
05731 }
05732
05733
05734
05735
05736 strncpy(oldPath2, oldPath, sizeof(oldPath2));
05737 strncat(oldPath2, "%", sizeof(oldPath2));
05738
05739 if (userName != NULL && *userName != '\0') {
05740 strncpy(zoneToUse, localZone, NAME_LEN);
05741 status = parseUserName(userName, userName2, userZone);
05742 if (userZone[0]!='\0') {
05743 rstrcpy(zoneToUse, userZone, NAME_LEN);
05744 }
05745
05746 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescDataPaths SQL 2");
05747 cllBindVars[cllBindVarCount++]=oldPath;
05748 cllBindVars[cllBindVarCount++]=newPath;
05749 cllBindVars[cllBindVarCount++]=rescName;
05750 cllBindVars[cllBindVarCount++]=oldPath2;
05751 cllBindVars[cllBindVarCount++]=userName2;
05752 cllBindVars[cllBindVarCount++]=zoneToUse;
05753 status = cmlExecuteNoAnswerSql(
05754 "update R_DATA_MAIN set data_path = replace (R_DATA_MAIN.data_path, ?, ?) where resc_name=? and data_path like ? and data_owner_name=? and data_owner_zone=?",
05755 &icss);
05756 }
05757 else {
05758 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescDataPaths SQL 3");
05759 cllBindVars[cllBindVarCount++]=oldPath;
05760 cllBindVars[cllBindVarCount++]=newPath;
05761 cllBindVars[cllBindVarCount++]=rescName;
05762 cllBindVars[cllBindVarCount++]=oldPath2;
05763 status = cmlExecuteNoAnswerSql(
05764 "update R_DATA_MAIN set data_path = replace (R_DATA_MAIN.data_path, ?, ?) where resc_name=? and data_path like ?",
05765 &icss);
05766 }
05767 if (status != 0) {
05768 rodsLog(LOG_NOTICE,
05769 "chlModRescDataPaths cmlExecuteNoAnswerSql update failure %d",
05770 status);
05771 _rollback("chlModResc");
05772 return(status);
05773 }
05774
05775 rows = cllGetRowCount(&icss,-1);
05776
05777 status = cmlExecuteNoAnswerSql("commit", &icss);
05778 if (status != 0) {
05779 rodsLog(LOG_NOTICE,
05780 "chlModResc cmlExecuteNoAnswerSql commit failure %d",
05781 status);
05782 return(status);
05783 }
05784
05785 if (rows > 0) {
05786 char rowsMsg[100];
05787 snprintf(rowsMsg, 100, "%d rows updated",
05788 rows);
05789 status = addRErrorMsg (&rsComm->rError, 0, rowsMsg);
05790 }
05791
05792 return(0);
05793 }
05794
05795
05796
05797
05798
05799
05800 int chlModRescFreeSpace(rsComm_t *rsComm, char *rescName, int updateValue) {
05801 int status;
05802 char myTime[50];
05803 char updateValueStr[MAX_NAME_LEN];
05804
05805 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescFreeSpace");
05806
05807 if (rescName == NULL) {
05808 return (CAT_INVALID_ARGUMENT);
05809 }
05810
05811 if (*rescName == '\0') {
05812 return (CAT_INVALID_ARGUMENT);
05813 }
05814
05815
05816
05817
05818
05819 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05820 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05821 }
05822 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05823 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05824 }
05825
05826 status = getLocalZone();
05827 if (status != 0) return(status);
05828
05829 getNowStr(myTime);
05830
05831 snprintf(updateValueStr,MAX_NAME_LEN, "%d", updateValue);
05832
05833 cllBindVars[cllBindVarCount++]=updateValueStr;
05834 cllBindVars[cllBindVarCount++]=myTime;
05835 cllBindVars[cllBindVarCount++]=rescName;
05836
05837 if (logSQL!=0) rodsLog(LOG_SQL, "chlModRescFreeSpace SQL 1 ");
05838 status = cmlExecuteNoAnswerSql(
05839 "update R_RESC_MAIN set free_space = ?, free_space_ts=? where resc_name=?",
05840 &icss);
05841 if (status != 0) {
05842 rodsLog(LOG_NOTICE,
05843 "chlModRescFreeSpace cmlExecuteNoAnswerSql update failure %d",
05844 status);
05845 _rollback("chlModRescFreeSpace");
05846 return(status);
05847 }
05848
05849
05850 status = cmlAudit4(AU_MOD_RESC_FREE_SPACE,
05851 "select resc_id from R_RESC_MAIN where resc_name=?",
05852 rescName,
05853 rsComm->clientUser.userName,
05854 rsComm->clientUser.rodsZone,
05855 updateValueStr,
05856 &icss);
05857 if (status != 0) {
05858 rodsLog(LOG_NOTICE,
05859 "chlModRescFreeSpace cmlAudit4 failure %d",
05860 status);
05861 _rollback("chlModRescFreeSpace");
05862 return(status);
05863 }
05864
05865 return(0);
05866 }
05867
05868
05869 int chlModRescGroup(rsComm_t *rsComm, char *rescGroupName, char *option,
05870 char *rescName) {
05871 int status, OK;
05872 char myTime[50];
05873 char rescId[MAX_NAME_LEN];
05874 rodsLong_t seqNum;
05875 char rescGroupId[MAX_NAME_LEN];
05876 char dataObjNumber[MAX_NAME_LEN];
05877 char commentStr[200];
05878
05879 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group");
05880
05881 if (rescGroupName == NULL || option==NULL || rescName==NULL) {
05882 return (CAT_INVALID_ARGUMENT);
05883 }
05884
05885 if (*rescGroupName == '\0' || *option == '\0' || *rescName=='\0') {
05886 return (CAT_INVALID_ARGUMENT);
05887 }
05888
05889 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05890 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05891 }
05892 if (rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
05893 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
05894 }
05895
05896 status = getLocalZone();
05897 if (status != 0) return(status);
05898
05899 rescId[0]='\0';
05900 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 1 ");
05901 status = cmlGetStringValueFromSql(
05902 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
05903 rescId, MAX_NAME_LEN, rescName, localZone, 0, &icss);
05904 if (status != 0) {
05905 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
05906 _rollback("chlModRescGroup");
05907 return(status);
05908 }
05909
05910 getNowStr(myTime);
05911 OK=0;
05912 if (strcmp(option, "add")==0) {
05913
05914 rescGroupId[0]='\0';
05915 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 2a ");
05916 status = cmlGetStringValueFromSql(
05917 "select distinct resc_group_id from R_RESC_GROUP where resc_group_name=?",
05918 rescGroupId, MAX_NAME_LEN, rescGroupName, 0, 0, &icss);
05919 if (status != 0) {
05920 if (status==CAT_NO_ROWS_FOUND) {
05921
05922 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 2b ");
05923 seqNum = cmlGetNextSeqVal(&icss);
05924 if (seqNum < 0) {
05925 rodsLog(LOG_NOTICE, "chlModRescGroup cmlGetNextSeqVal failure %d",
05926 seqNum);
05927 _rollback("chlModRescGroup");
05928 return(seqNum);
05929 }
05930 snprintf(rescGroupId, MAX_NAME_LEN, "%lld", seqNum);
05931 } else {
05932 _rollback("chlModRescGroup");
05933 return(status);
05934 }
05935 }
05936
05937 cllBindVars[cllBindVarCount++]=rescGroupName;
05938 cllBindVars[cllBindVarCount++]=rescGroupId;
05939 cllBindVars[cllBindVarCount++]=rescId;
05940 cllBindVars[cllBindVarCount++]=myTime;
05941 cllBindVars[cllBindVarCount++]=myTime;
05942 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 2");
05943 status = cmlExecuteNoAnswerSql(
05944 "insert into R_RESC_GROUP (resc_group_name, resc_group_id, resc_id , create_ts, modify_ts) values (?, ?, ?, ?, ?)",
05945 &icss);
05946 if (status != 0) {
05947 rodsLog(LOG_NOTICE,
05948 "chlModRescGroup cmlExecuteNoAnswerSql insert failure %d",
05949 status);
05950 _rollback("chlModRescGroup");
05951 return(status);
05952 }
05953 OK=1;
05954 }
05955
05956 if (strcmp(option, "remove")==0) {
05957
05958 dataObjNumber[0]='\0';
05959 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 3a ");
05960 status = cmlGetStringValueFromSql(
05961 "select distinct resc_group_id from R_RESC_GROUP where resc_id=? and resc_group_name=?",
05962 dataObjNumber, MAX_NAME_LEN, rescId, rescGroupName, 0, &icss);
05963 if (status != 0) {
05964 _rollback("chlModRescGroup");
05965 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
05966 return(status);
05967 }
05968
05969
05970 cllBindVars[cllBindVarCount++]=rescGroupName;
05971 cllBindVars[cllBindVarCount++]=rescId;
05972 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 3b");
05973 status = cmlExecuteNoAnswerSql(
05974 "delete from R_RESC_GROUP where resc_group_name=? and resc_id=?",
05975 &icss);
05976 if (status != 0) {
05977 rodsLog(LOG_NOTICE,
05978 "chlModRescGroup cmlExecuteNoAnswerSql delete failure %d",
05979 status);
05980 _rollback("chlModRescGroup");
05981 return(status);
05982 }
05983
05984
05985 rescGroupId[0]='\0';
05986 if (logSQL!=0) rodsLog(LOG_SQL, "chl-Mod-Resc-Group S Q L 3c ");
05987 status = cmlGetStringValueFromSql(
05988 "select distinct resc_group_id from R_RESC_GROUP where resc_group_name=?",
05989 rescGroupId, MAX_NAME_LEN, rescGroupName, 0, 0, &icss);
05990 if (status != 0) {
05991 if (status==CAT_NO_ROWS_FOUND) {
05992
05993 removeMetaMapAndAVU(dataObjNumber);
05994 }
05995 }
05996 OK=1;
05997 }
05998
05999 if (OK==0) {
06000 return (CAT_INVALID_ARGUMENT);
06001 }
06002
06003
06004 snprintf(commentStr, sizeof commentStr, "%s %s", option, rescGroupName);
06005 status = cmlAudit3(AU_MOD_RESC_GROUP,
06006 rescId,
06007 rsComm->clientUser.userName,
06008 rsComm->clientUser.rodsZone,
06009 commentStr,
06010 &icss);
06011 if (status != 0) {
06012 rodsLog(LOG_NOTICE,
06013 "chlModRescGroup cmlAudit3 failure %d",
06014 status);
06015 _rollback("chlModRescGroup");
06016 return(status);
06017 }
06018
06019 status = cmlExecuteNoAnswerSql("commit", &icss);
06020 if (status != 0) {
06021 rodsLog(LOG_NOTICE,
06022 "chlModRescGroup cmlExecuteNoAnswerSql commit failure %d",
06023 status);
06024 return(status);
06025 }
06026 return(0);
06027 }
06028
06029
06030
06031
06032 int chlRegUserRE(rsComm_t *rsComm, userInfo_t *userInfo) {
06033 char myTime[50];
06034 int status;
06035 char seqStr[MAX_NAME_LEN];
06036 char auditSQL[MAX_SQL_SIZE];
06037 char userZone[MAX_NAME_LEN];
06038 char zoneId[MAX_NAME_LEN];
06039
06040 int zoneForm;
06041 char userName2[NAME_LEN];
06042 char zoneName[NAME_LEN];
06043
06044 static char lastValidUserType[MAX_NAME_LEN]="";
06045 static char userTypeTokenName[MAX_NAME_LEN]="";
06046
06047 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE");
06048
06049 if (!icss.status) {
06050 return(CATALOG_NOT_CONNECTED);
06051 }
06052
06053 if (userInfo==0) {
06054 return(CAT_INVALID_ARGUMENT);
06055 }
06056
06057 if (userInfo->userType==0) {
06058 return(CAT_INVALID_ARGUMENT);
06059 }
06060
06061
06062 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH ||
06063 rsComm->proxyUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06064 int status2;
06065 status2 = cmlCheckGroupAdminAccess(
06066 rsComm->clientUser.userName,
06067 rsComm->clientUser.rodsZone,
06068 "",
06069 &icss);
06070 if (status2 != 0) return(status2);
06071 creatingUserByGroupAdmin=1;
06072 }
06073
06074
06075
06076
06077
06078
06079 if ( *userInfo->userType=='\0' ||
06080 strcmp(userInfo->userType, lastValidUserType)!=0 ) {
06081 char errMsg[105];
06082 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 1 ");
06083 status = cmlGetStringValueFromSql(
06084 "select token_name from R_TOKN_MAIN where token_namespace='user_type' and token_name=?",
06085 userTypeTokenName, MAX_NAME_LEN, userInfo->userType, 0, 0, &icss);
06086 if (status==0) {
06087 strncpy(lastValidUserType, userInfo->userType, MAX_NAME_LEN);
06088 }
06089 else {
06090 snprintf(errMsg, 100, "user_type '%s' is not valid",
06091 userInfo->userType);
06092 addRErrorMsg (&rsComm->rError, 0, errMsg);
06093 return(CAT_INVALID_USER_TYPE);
06094 }
06095 }
06096
06097 status = getLocalZone();
06098 if (status != 0) return(status);
06099
06100 if (strlen(userInfo->rodsZone)>0) {
06101 zoneForm=1;
06102 strncpy(userZone, userInfo->rodsZone, MAX_NAME_LEN);
06103 }
06104 else {
06105 zoneForm=0;
06106 strncpy(userZone, localZone, MAX_NAME_LEN);
06107 }
06108
06109 status = parseUserName(userInfo->userName, userName2, zoneName);
06110 if (zoneName[0]!='\0') {
06111 rstrcpy(userZone, zoneName, NAME_LEN);
06112 zoneForm=2;
06113 }
06114 if (status != 0) {
06115 return (CAT_INVALID_ARGUMENT);
06116 }
06117
06118 if (zoneForm) {
06119
06120 zoneId[0]='\0';
06121 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 5 ");
06122 status = cmlGetStringValueFromSql(
06123 "select zone_id from R_ZONE_MAIN where zone_name=?",
06124 zoneId, MAX_NAME_LEN, userZone, "", 0, &icss);
06125 if (status != 0) {
06126 if (status==CAT_NO_ROWS_FOUND) {
06127 char errMsg[105];
06128 snprintf(errMsg, 100,
06129 "zone '%s' does not exist",
06130 userZone);
06131 addRErrorMsg (&rsComm->rError, 0, errMsg);
06132 return(CAT_INVALID_ZONE);
06133 }
06134 return(status);
06135 }
06136 }
06137
06138 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 2");
06139 status = cmlGetNextSeqStr(seqStr, MAX_NAME_LEN, &icss);
06140 if (status != 0) {
06141 rodsLog(LOG_NOTICE, "chlRegUserRE cmlGetNextSeqStr failure %d",
06142 status);
06143 return(status);
06144 }
06145
06146 getNowStr(myTime);
06147
06148 cllBindVars[cllBindVarCount++]=seqStr;
06149 cllBindVars[cllBindVarCount++]=userName2;
06150 cllBindVars[cllBindVarCount++]=userTypeTokenName;
06151 cllBindVars[cllBindVarCount++]=userZone;
06152 cllBindVars[cllBindVarCount++]=myTime;
06153 cllBindVars[cllBindVarCount++]=myTime;
06154
06155 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 3");
06156 status = cmlExecuteNoAnswerSql(
06157 "insert into R_USER_MAIN (user_id, user_name, user_type_name, zone_name, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?)",
06158 &icss);
06159
06160 if (status != 0) {
06161 if (status == CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME) {
06162 char errMsg[105];
06163 snprintf(errMsg, 100, "Error %d %s",
06164 status,
06165 "CATALOG_ALREADY_HAS_ITEM_BY_THAT_NAME"
06166 );
06167 addRErrorMsg (&rsComm->rError, 0, errMsg);
06168 }
06169 _rollback("chlRegUserRE");
06170 rodsLog(LOG_NOTICE,
06171 "chlRegUserRE insert failure %d",status);
06172 return(status);
06173 }
06174
06175
06176 cllBindVars[cllBindVarCount++]=seqStr;
06177 cllBindVars[cllBindVarCount++]=seqStr;
06178 cllBindVars[cllBindVarCount++]=myTime;
06179 cllBindVars[cllBindVarCount++]=myTime;
06180
06181 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegUserRE SQL 4");
06182 status = cmlExecuteNoAnswerSql(
06183 "insert into R_USER_GROUP (group_user_id, user_id, create_ts, modify_ts) values (?, ?, ?, ?)",
06184 &icss);
06185 if (status != 0) {
06186 rodsLog(LOG_NOTICE,
06187 "chlRegUserRE insert into R_USER_GROUP failure %d",status);
06188 _rollback("chlRegUserRE");
06189 return(status);
06190 }
06191
06192
06193
06194
06195
06196
06197
06198 if (strlen(userInfo->authInfo.authStr) > 0) {
06199 status = chlModUser(rsComm, userInfo->userName, "addAuth",
06200 userInfo->authInfo.authStr);
06201 if (status != 0) {
06202 rodsLog(LOG_NOTICE,
06203 "chlRegUserRE chlModUser insert auth failure %d",status);
06204 _rollback("chlRegUserRE");
06205 return(status);
06206 }
06207 }
06208
06209
06210 snprintf(auditSQL, MAX_SQL_SIZE-1,
06211 "select user_id from R_USER_MAIN where user_name=? and zone_name='%s'",
06212 userZone);
06213 status = cmlAudit4(AU_REGISTER_USER_RE,
06214 auditSQL,
06215 userName2,
06216 rsComm->clientUser.userName,
06217 rsComm->clientUser.rodsZone,
06218 userZone,
06219 &icss);
06220 if (status != 0) {
06221 rodsLog(LOG_NOTICE,
06222 "chlRegUserRE cmlAudit4 failure %d",
06223 status);
06224 _rollback("chlRegUserRE");
06225 return(status);
06226 }
06227
06228
06229 return(status);
06230 }
06231
06232 int
06233 convertTypeOption(char *typeStr) {
06234 if (strcmp(typeStr, "-d") == 0) return(1);
06235 if (strcmp(typeStr, "-D") == 0) return(1);
06236 if (strcmp(typeStr, "-c") == 0) return(2);
06237 if (strcmp(typeStr, "-C") == 0) return(2);
06238 if (strcmp(typeStr, "-r") == 0) return(3);
06239 if (strcmp(typeStr, "-R") == 0) return(3);
06240 if (strcmp(typeStr, "-u") == 0) return(4);
06241 if (strcmp(typeStr, "-U") == 0) return(4);
06242 if (strcmp(typeStr, "-g") == 0) return(5);
06243 if (strcmp(typeStr, "-G") == 0) return(5);
06244 return (0);
06245 }
06246
06247
06248
06249
06250
06251 rodsLong_t checkAndGetObjectId(rsComm_t *rsComm, char *type,
06252 char *name, char *access) {
06253 int itype;
06254 char logicalEndName[MAX_NAME_LEN];
06255 char logicalParentDirName[MAX_NAME_LEN];
06256 rodsLong_t status;
06257 rodsLong_t objId;
06258 char userName[NAME_LEN];
06259 char userZone[NAME_LEN];
06260
06261
06262 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId");
06263
06264 if (!icss.status) {
06265 return(CATALOG_NOT_CONNECTED);
06266 }
06267
06268 if (type == NULL || *type=='\0') {
06269 return (CAT_INVALID_ARGUMENT);
06270 }
06271
06272 if (name == NULL || *name=='\0') {
06273 return (CAT_INVALID_ARGUMENT);
06274 }
06275
06276 itype = convertTypeOption(type);
06277 if (itype==0) return(CAT_INVALID_ARGUMENT);
06278
06279 if (itype==1) {
06280 status = splitPathByKey(name,
06281 logicalParentDirName, logicalEndName, '/');
06282 if (strlen(logicalParentDirName)==0) {
06283 strcpy(logicalParentDirName, "/");
06284 strcpy(logicalEndName, name);
06285 }
06286 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId SQL 1 ");
06287 status = cmlCheckDataObjOnly(logicalParentDirName, logicalEndName,
06288 rsComm->clientUser.userName,
06289 rsComm->clientUser.rodsZone,
06290 access, &icss);
06291 if (status < 0) {
06292 _rollback("checkAndGetObjectId");
06293 return(status);
06294 }
06295 objId=status;
06296 }
06297
06298 if (itype==2) {
06299
06300
06301 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId SQL 2");
06302 status = cmlCheckDir(name,
06303 rsComm->clientUser.userName,
06304 rsComm->clientUser.rodsZone,
06305 access, &icss);
06306 if (status < 0) {
06307 char errMsg[105];
06308 if (status == CAT_UNKNOWN_COLLECTION) {
06309 snprintf(errMsg, 100, "collection '%s' is unknown",
06310 name);
06311 addRErrorMsg (&rsComm->rError, 0, errMsg);
06312 }
06313 return(status);
06314 }
06315 objId=status;
06316 }
06317
06318 if (itype==3) {
06319 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06320 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06321 }
06322
06323 status = getLocalZone();
06324 if (status != 0) return(status);
06325
06326 objId=0;
06327 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId SQL 3");
06328 status = cmlGetIntegerValueFromSql(
06329 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
06330 &objId, name, localZone, 0, 0, 0, &icss);
06331 if (status != 0) {
06332 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
06333 _rollback("checkAndGetObjectId");
06334 return(status);
06335 }
06336 }
06337
06338 if (itype==4) {
06339 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06340 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06341 }
06342
06343 status = parseUserName(name, userName, userZone);
06344 if (userZone[0]=='\0') {
06345 status = getLocalZone();
06346 if (status != 0) return(status);
06347 strncpy(userZone, localZone, NAME_LEN);
06348 }
06349
06350 objId=0;
06351 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId SQL 4");
06352 status = cmlGetIntegerValueFromSql(
06353 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
06354 &objId, userName, userZone, 0, 0, 0, &icss);
06355 if (status != 0) {
06356 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
06357 _rollback("checkAndGetObjectId");
06358 return(status);
06359 }
06360 }
06361
06362 if (itype==5) {
06363 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06364 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06365 }
06366
06367 status = getLocalZone();
06368 if (status != 0) return(status);
06369
06370 objId=0;
06371 if (logSQL!=0) rodsLog(LOG_SQL, "checkAndGetObjectId S Q L 5");
06372 status = cmlGetIntegerValueFromSql(
06373 "select distinct resc_group_id from R_RESC_GROUP where resc_group_name=?",
06374 &objId, name, 0, 0, 0, 0, &icss);
06375 if (status != 0) {
06376 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
06377 _rollback("checkAndGetObjectId");
06378 return(status);
06379 }
06380 }
06381
06382 return(objId);
06383 }
06384
06385
06386
06387
06388
06389
06390 rodsLong_t
06391 findAVU(char *attribute, char *value, char *units) {
06392 rodsLong_t status;
06393
06394
06395 rodsLong_t iVal;
06396 iVal=0;
06397 if (*units!='\0') {
06398 if (logSQL!=0) rodsLog(LOG_SQL, "findAVU SQL 1");
06399 status = cmlGetIntegerValueFromSql(
06400 "select meta_id from R_META_MAIN where meta_attr_name=? and meta_attr_value=? and meta_attr_unit=?",
06401 &iVal, attribute, value, units, 0, 0, &icss);
06402 }
06403 else {
06404 if (logSQL!=0) rodsLog(LOG_SQL, "findAVU SQL 2");
06405 status = cmlGetIntegerValueFromSql(
06406 "select meta_id from R_META_MAIN where meta_attr_name=? and meta_attr_value=? and (meta_attr_unit='' or meta_attr_unit IS NULL)",
06407 &iVal, attribute, value, 0, 0, 0, &icss);
06408 }
06409 if (status == 0) {
06410 status = iVal;
06411 return(status);
06412 }
06413
06414
06415 return(status);
06416 }
06417
06418
06419
06420
06421
06422 int
06423 findOrInsertAVU(char *attribute, char *value, char *units) {
06424 char nextStr[MAX_NAME_LEN];
06425 char myTime[50];
06426 rodsLong_t status, seqNum;
06427 rodsLong_t iVal;
06428 iVal = findAVU(attribute, value, units);
06429 if (iVal > 0) {
06430 return iVal;
06431 }
06432 if (logSQL!=0) rodsLog(LOG_SQL, "findOrInsertAVU SQL 1");
06433
06434 status = cmlGetNextSeqVal(&icss);
06435 if (status < 0) {
06436 rodsLog(LOG_NOTICE, "findAVU cmlGetNextSeqVal failure %d",
06437 status);
06438 return(status);
06439 }
06440 seqNum = status;
06441
06442 snprintf(nextStr, sizeof nextStr, "%lld", seqNum);
06443
06444 getNowStr(myTime);
06445
06446 cllBindVars[cllBindVarCount++]=nextStr;
06447 cllBindVars[cllBindVarCount++]=attribute;
06448 cllBindVars[cllBindVarCount++]=value;
06449 cllBindVars[cllBindVarCount++]=units;
06450 cllBindVars[cllBindVarCount++]=myTime;
06451 cllBindVars[cllBindVarCount++]=myTime;
06452
06453 if (logSQL!=0) rodsLog(LOG_SQL, "findOrInsertAVU SQL 2");
06454 status = cmlExecuteNoAnswerSql(
06455 "insert into R_META_MAIN (meta_id, meta_attr_name, meta_attr_value, meta_attr_unit, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?)",
06456 &icss);
06457 if (status < 0) {
06458 rodsLog(LOG_NOTICE, "findOrInsertAVU insert failure %d", status);
06459 return(status);
06460 }
06461 return(seqNum);
06462 }
06463
06464
06465
06466
06467 int chlSetAVUMetadata(rsComm_t *rsComm, char *type,
06468 char *name, char *attribute, char *newValue,
06469 char *newUnit) {
06470 int status;
06471 char myTime[50];
06472 rodsLong_t objId;
06473 char metaIdStr[MAX_NAME_LEN*2];
06474 char objIdStr[MAX_NAME_LEN];
06475
06476 memset(metaIdStr, 0, sizeof(metaIdStr));
06477 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata");
06478
06479 if (!icss.status) {
06480 return(CATALOG_NOT_CONNECTED);
06481 }
06482
06483 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 1 ");
06484 objId = checkAndGetObjectId(rsComm, type, name, ACCESS_CREATE_METADATA);
06485 if (objId < 0) return objId;
06486 snprintf(objIdStr, MAX_NAME_LEN, "%lld", objId);
06487
06488 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 2");
06489
06490 status = cmlGetMultiRowStringValuesFromSql("select meta_id from R_OBJT_METAMAP where meta_id in (select meta_id from R_META_MAIN where meta_attr_name=? AND meta_id in (select meta_id from R_OBJT_METAMAP where object_id=?))",
06491 metaIdStr, MAX_NAME_LEN, 2, attribute, objIdStr, &icss);
06492
06493 if (status <= 0) {
06494 if (status == CAT_NO_ROWS_FOUND) {
06495
06496 status = chlAddAVUMetadata(rsComm, 0, type, name, attribute,
06497 newValue, newUnit);
06498 } else {
06499 rodsLog(LOG_NOTICE,
06500 "chlSetAVUMetadata cmlGetMultiRowStringValuesFromSql failure %d",
06501 status);
06502 }
06503 return status;
06504 }
06505
06506 if (status > 1) {
06507
06508 status = chlDeleteAVUMetadata(rsComm, 1, type, name, attribute, "%",
06509 "%", 1);
06510 if (status != 0) {
06511 _rollback("chlSetAVUMetadata");
06512 return(status);
06513 }
06514 status = chlAddAVUMetadata(rsComm, 0, type, name, attribute,
06515 newValue, newUnit);
06516 return status;
06517 }
06518
06519
06520
06521 rodsLog(LOG_NOTICE, "chlSetAVUMetadata found metaId %s", metaIdStr);
06522
06523 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 4");
06524 status = cmlGetMultiRowStringValuesFromSql("select meta_id from R_META_MAIN where meta_attr_name=?",
06525 metaIdStr, MAX_NAME_LEN, 2, attribute, objIdStr, &icss);
06526 if (status <= 0) {
06527 rodsLog(LOG_NOTICE,
06528 "chlSetAVUMetadata cmlGetMultiRowStringValueFromSql failure %d",
06529 status);
06530 return(status);
06531 }
06532 if (status > 1) {
06533
06534
06535
06536 status = chlDeleteAVUMetadata(rsComm, 1, type, name, attribute,
06537 "%", "%", 1);
06538 if (status != 0) {
06539 _rollback("chlSetAVUMetadata");
06540 return(status);
06541 }
06542 status = chlAddAVUMetadata(rsComm, 0, type, name, attribute,
06543 newValue, newUnit);
06544 }
06545 else {
06546 getNowStr(myTime);
06547 cllBindVarCount = 0;
06548 cllBindVars[cllBindVarCount++] = newValue;
06549 if (newUnit != NULL && *newUnit!='\0') {
06550 cllBindVars[cllBindVarCount++] = newUnit;
06551 }
06552 cllBindVars[cllBindVarCount++] = myTime;
06553 cllBindVars[cllBindVarCount++] = attribute;
06554 cllBindVars[cllBindVarCount++] = metaIdStr;
06555 if (newUnit != NULL && *newUnit!='\0') {
06556 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 5");
06557 status = cmlExecuteNoAnswerSql(
06558 "update R_META_MAIN set meta_attr_value=?,meta_attr_unit=?,modify_ts=? where meta_attr_name=? and meta_id=?",
06559 &icss);
06560 }
06561 else {
06562 if (logSQL != 0) rodsLog(LOG_SQL, "chlSetAVUMetadata SQL 6");
06563 status = cmlExecuteNoAnswerSql(
06564 "update R_META_MAIN set meta_attr_value=?,modify_ts=? where meta_attr_name=? and meta_id=?",
06565 &icss);
06566 }
06567 if (status != 0) {
06568 rodsLog(LOG_NOTICE,
06569 "chlSetAVUMetadata cmlExecuteNoAnswerSql update failure %d",
06570 status);
06571 _rollback("chlSetAVUMetadata");
06572 return(status);
06573 }
06574 }
06575
06576
06577 status = cmlAudit3(AU_ADD_AVU_METADATA,
06578 objIdStr,
06579 rsComm->clientUser.userName,
06580 rsComm->clientUser.rodsZone,
06581 type,
06582 &icss);
06583 if (status != 0) {
06584 rodsLog(LOG_NOTICE,
06585 "chlSetAVUMetadata cmlAudit3 failure %d",
06586 status);
06587 _rollback("chlSetAVUMetadata");
06588 return(status);
06589 }
06590
06591 status = cmlExecuteNoAnswerSql("commit", &icss);
06592 if (status != 0) {
06593 rodsLog(LOG_NOTICE,
06594 "chlSetAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
06595 status);
06596 return(status);
06597 }
06598
06599 return(status);
06600 }
06601
06602
06603
06604
06605
06606
06607
06608
06609
06610 #define ACCESS_MAX 999999
06611
06612
06613 int
06614 chlAddAVUMetadataWild(rsComm_t *rsComm, int adminMode, char *type,
06615 char *name, char *attribute, char *value, char *units) {
06616 rodsLong_t status, status2;
06617 rodsLong_t seqNum;
06618 int numObjects;
06619 int nAccess=0;
06620 static int accessNeeded=ACCESS_MAX;
06621 rodsLong_t iVal;
06622 char collection[MAX_NAME_LEN];
06623 char objectName[MAX_NAME_LEN];
06624 char myTime[50];
06625 char seqNumStr[MAX_NAME_LEN];
06626 int itype;
06627
06628 itype = convertTypeOption(type);
06629 if (itype!=1) return(CAT_INVALID_ARGUMENT);
06630
06631 status = splitPathByKey(name, collection, objectName, '/');
06632 if (strlen(collection)==0) {
06633 strcpy(collection, "/");
06634 strcpy(objectName, name);
06635 }
06636
06637
06638
06639
06640
06641
06642
06643
06644
06645
06646 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 1");
06647 status = cmlGetIntegerValueFromSql(
06648 "select count(DISTINCT DM.data_id) from R_DATA_MAIN DM, R_COLL_MAIN CM where DM.data_name like ? and DM.coll_id=CM.coll_id and CM.coll_name like ?",
06649 &iVal, objectName, collection, 0, 0, 0, &icss);
06650 if (status != 0) {
06651 rodsLog(LOG_NOTICE,
06652 "chlAddAVUMetadataWild get count failure %d",
06653 status);
06654 _rollback("chlAddAVUMetadataWild");
06655 return(status);
06656 }
06657 numObjects = iVal;
06658 if (numObjects == 0) {
06659 return(CAT_NO_ROWS_FOUND);
06660 }
06661
06662
06663
06664
06665
06666 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 2");
06667 #if ORA_ICAT
06668
06669
06670 status = cmlExecuteNoAnswerSql("purge recyclebin",
06671 &icss);
06672 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06673 if (status != 0) {
06674 rodsLog(LOG_NOTICE,
06675 "chlAddAVUMetadata cmlExecuteNoAnswerSql (drop table ACCESS_VIEW_ONE) failure %d",
06676 status);
06677 }
06678 status = cmlExecuteNoAnswerSql("drop table ACCESS_VIEW_ONE",
06679 &icss);
06680 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06681 if (status != 0) {
06682 rodsLog(LOG_NOTICE,
06683 "chlAddAVUMetadata cmlExecuteNoAnswerSql (drop table ACCESS_VIEW_ONE) failure %d",
06684 status);
06685 }
06686
06687 status = cmlExecuteNoAnswerSql("create table ACCESS_VIEW_ONE (access_type_id integer, data_id integer)",
06688 &icss);
06689 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06690 if (status != 0) {
06691 rodsLog(LOG_NOTICE,
06692 "chlAddAVUMetadata cmlExecuteNoAnswerSql (create table ACCESS_VIEW_ONE) failure %d",
06693 status);
06694 _rollback("chlAddAVUMetadataWild");
06695 return(status);
06696 }
06697
06698 cllBindVars[cllBindVarCount++]=objectName;
06699 cllBindVars[cllBindVarCount++]=collection;
06700 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
06701 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone;
06702 status = cmlExecuteNoAnswerSql(
06703 "insert into ACCESS_VIEW_ONE (access_type_id, data_id) (select access_type_id, DM.data_id from R_DATA_MAIN DM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_COLL_MAIN CM where DM.data_name like ? and DM.coll_id=CM.coll_id and CM.coll_name like ? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = DM.data_id and UG.group_user_id = OA.user_id)",
06704 &icss);
06705 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06706 if (status==CAT_NO_ROWS_FOUND) status=CAT_NO_ACCESS_PERMISSION;
06707 if (status != 0) {
06708 rodsLog(LOG_NOTICE,
06709 "chlAddAVUMetadata cmlExecuteNoAnswerSql (create view) failure %d",
06710 status);
06711 _rollback("chlAddAVUMetadataWild");
06712 return(status);
06713 }
06714 #else
06715 cllBindVars[cllBindVarCount++]=objectName;
06716 cllBindVars[cllBindVarCount++]=collection;
06717 cllBindVars[cllBindVarCount++]=rsComm->clientUser.userName;
06718 cllBindVars[cllBindVarCount++]=rsComm->clientUser.rodsZone;
06719 status = cmlExecuteNoAnswerSql(
06720 "create view ACCESS_VIEW_ONE as select access_type_id, DM.data_id from R_DATA_MAIN DM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_COLL_MAIN CM where DM.data_name like ? and DM.coll_id=CM.coll_id and CM.coll_name like ? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = DM.data_id and UG.group_user_id = OA.user_id",
06721 &icss);
06722 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06723 if (status==CAT_NO_ROWS_FOUND) status=CAT_NO_ACCESS_PERMISSION;
06724 if (status != 0) {
06725 rodsLog(LOG_NOTICE,
06726 "chlAddAVUMetadata cmlExecuteNoAnswerSql (create view) failure %d",
06727 status);
06728 _rollback("chlAddAVUMetadataWild");
06729 return(status);
06730 }
06731 #endif
06732
06733
06734
06735
06736
06737
06738 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 3");
06739 #if (defined ORA_ICAT || defined MY_ICAT)
06740 status = cmlExecuteNoAnswerSql(
06741 "create or replace view ACCESS_VIEW_TWO as select max(access_type_id) max from ACCESS_VIEW_ONE group by data_id",
06742 &icss);
06743 #else
06744 status = cmlExecuteNoAnswerSql(
06745 "create or replace view ACCESS_VIEW_TWO as select max(access_type_id) from ACCESS_VIEW_ONE group by data_id",
06746 &icss);
06747 #endif
06748 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
06749 if (status==CAT_NO_ROWS_FOUND) status=CAT_NO_ACCESS_PERMISSION;
06750 if (status != 0) {
06751 rodsLog(LOG_NOTICE,
06752 "chlAddAVUMetadata cmlExecuteNoAnswerSql (create view) failure %d",
06753 status);
06754 _rollback("chlAddAVUMetadataWild");
06755 return(status);
06756 }
06757
06758 if (accessNeeded>=ACCESS_MAX) {
06759 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 4");
06760 status = cmlGetIntegerValueFromSql(
06761 "select token_id from R_TOKN_MAIN where token_name = 'modify metadata' and token_namespace = 'access_type'",
06762 &iVal, 0, 0, 0, 0, 0, &icss);
06763 if (status==0) accessNeeded = iVal;
06764 }
06765
06766
06767
06768 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 5");
06769 iVal=-1;
06770 status = cmlGetIntegerValueFromSql(
06771 "select min(max) from ACCESS_VIEW_TWO",
06772 &iVal, 0, 0, 0, 0, 0, &icss);
06773
06774 if (status==CAT_NO_ROWS_FOUND) status=CAT_NO_ACCESS_PERMISSION;
06775
06776 if (status==0) {
06777 if (iVal < accessNeeded) {
06778 status = CAT_NO_ACCESS_PERMISSION;
06779 }
06780 }
06781
06782
06783
06784
06785 if (status==0) {
06786 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 6");
06787 status = cmlGetIntegerValueFromSql(
06788 "select count(*) from ACCESS_VIEW_TWO",
06789 &iVal, 0, 0, 0, 0, 0, &icss);
06790 if (status==0) {
06791 nAccess = iVal;
06792
06793 if (numObjects > nAccess) {
06794 status=CAT_NO_ACCESS_PERMISSION;
06795 }
06796 }
06797 }
06798
06799 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 7");
06800 #if ORA_ICAT
06801 status2 = cmlExecuteNoAnswerSql(
06802 "drop table ACCESS_VIEW_ONE",
06803 &icss);
06804 if (status2==CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
06805 if (status2==0) {
06806 status2 = cmlExecuteNoAnswerSql(
06807 "drop view ACCESS_VIEW_TWO",
06808 &icss);
06809 if (status2==CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
06810 }
06811 #else
06812 status2 = cmlExecuteNoAnswerSql(
06813 "drop view ACCESS_VIEW_TWO, ACCESS_VIEW_ONE",
06814 &icss);
06815 if (status2==CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
06816 #endif
06817
06818 if (status2 != 0) {
06819 rodsLog(LOG_NOTICE,
06820 "chlAddAVUMetadataWild cmlExecuteNoAnswerSql (drop view (or table)) failure %d",
06821 status2);
06822 }
06823
06824 if (status != 0) return(status);
06825
06826
06827
06828
06829 status = findOrInsertAVU(attribute, value, units);
06830 if (status<0) {
06831 rodsLog(LOG_NOTICE,
06832 "chlAddAVUMetadataWild findOrInsertAVU failure %d",
06833 status);
06834 _rollback("chlAddAVUMetadata");
06835 return(status);
06836 }
06837 seqNum = status;
06838
06839 getNowStr(myTime);
06840 snprintf(seqNumStr, sizeof seqNumStr, "%lld", seqNum);
06841 cllBindVars[cllBindVarCount++]=seqNumStr;
06842 cllBindVars[cllBindVarCount++]=myTime;
06843 cllBindVars[cllBindVarCount++]=myTime;
06844 cllBindVars[cllBindVarCount++]=objectName;
06845 cllBindVars[cllBindVarCount++]=collection;
06846 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadataWild SQL 8");
06847 status = cmlExecuteNoAnswerSql(
06848 "insert into R_OBJT_METAMAP (object_id, meta_id, create_ts, modify_ts) select DM.data_id, ?, ?, ? from R_DATA_MAIN DM, R_COLL_MAIN CM where DM.data_name like ? and DM.coll_id=CM.coll_id and CM.coll_name like ? group by DM.data_id",
06849 &icss);
06850 if (status != 0) {
06851 rodsLog(LOG_NOTICE,
06852 "chlAddAVUMetadataWild cmlExecuteNoAnswerSql insert failure %d",
06853 status);
06854 _rollback("chlAddAVUMetadataWild");
06855 return(status);
06856 }
06857
06858
06859 status = cmlAudit3(AU_ADD_AVU_WILD_METADATA,
06860 seqNumStr,
06861 rsComm->clientUser.userName,
06862 rsComm->clientUser.rodsZone,
06863 name,
06864 &icss);
06865 if (status != 0) {
06866 rodsLog(LOG_NOTICE,
06867 "chlAddAVUMetadataWild cmlAudit3 failure %d",
06868 status);
06869 _rollback("chlAddAVUMetadataWild");
06870 return(status);
06871 }
06872
06873
06874
06875 status = cmlExecuteNoAnswerSql("commit", &icss);
06876 if (status != 0) {
06877 rodsLog(LOG_NOTICE,
06878 "chlAddAVUMetadataWild cmlExecuteNoAnswerSql commit failure %d",
06879 status);
06880 return(status);
06881 }
06882
06883 if (status != 0) return(status);
06884 return(numObjects);
06885 }
06886
06887
06888
06889 int chlAddAVUMetadata(rsComm_t *rsComm, int adminMode, char *type,
06890 char *name, char *attribute, char *value, char *units) {
06891 int itype;
06892 char myTime[50];
06893 char logicalEndName[MAX_NAME_LEN];
06894 char logicalParentDirName[MAX_NAME_LEN];
06895 rodsLong_t seqNum, iVal;
06896 rodsLong_t objId, status;
06897 char objIdStr[MAX_NAME_LEN];
06898 char seqNumStr[MAX_NAME_LEN];
06899 char userName[NAME_LEN];
06900 char userZone[NAME_LEN];
06901
06902 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata");
06903
06904 if (!icss.status) {
06905 return(CATALOG_NOT_CONNECTED);
06906 }
06907
06908 if (type == NULL || *type=='\0') {
06909 return (CAT_INVALID_ARGUMENT);
06910 }
06911
06912 if (name == NULL || *name=='\0') {
06913 return (CAT_INVALID_ARGUMENT);
06914 }
06915
06916 if (attribute == NULL || *attribute=='\0') {
06917 return (CAT_INVALID_ARGUMENT);
06918 }
06919
06920 if (value == NULL || *value=='\0') {
06921 return (CAT_INVALID_ARGUMENT);
06922 }
06923
06924 if (adminMode==1) {
06925 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06926 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06927 }
06928 }
06929
06930 if (units == NULL) units="";
06931
06932 itype = convertTypeOption(type);
06933 if (itype==0) return(CAT_INVALID_ARGUMENT);
06934
06935 if (itype==1) {
06936 status = splitPathByKey(name,
06937 logicalParentDirName, logicalEndName, '/');
06938 if (strlen(logicalParentDirName)==0) {
06939 strcpy(logicalParentDirName, "/");
06940 strcpy(logicalEndName, name);
06941 }
06942 if (adminMode==1) {
06943 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 1 ");
06944 status = cmlGetIntegerValueFromSql(
06945 "select data_id from R_DATA_MAIN DM, R_COLL_MAIN CM where DM.data_name=? and DM.coll_id=CM.coll_id and CM.coll_name=?",
06946 &iVal, logicalEndName, logicalParentDirName, 0, 0, 0, &icss);
06947 if (status==0) status=iVal;
06948 }
06949 else {
06950 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 2");
06951 status = cmlCheckDataObjOnly(logicalParentDirName, logicalEndName,
06952 rsComm->clientUser.userName,
06953 rsComm->clientUser.rodsZone,
06954 ACCESS_CREATE_METADATA, &icss);
06955 }
06956 if (status < 0) {
06957 _rollback("chlAddAVUMetadata");
06958 return(status);
06959 }
06960 objId=status;
06961 }
06962
06963 if (itype==2) {
06964 if (adminMode==1) {
06965 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 3");
06966 status = cmlGetIntegerValueFromSql(
06967 "select coll_id from R_COLL_MAIN where coll_name=?",
06968 &iVal, name, 0, 0, 0, 0, &icss);
06969 if (status==0) status=iVal;
06970 }
06971 else {
06972
06973
06974 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 4");
06975 status = cmlCheckDir(name,
06976 rsComm->clientUser.userName,
06977 rsComm->clientUser.rodsZone,
06978 ACCESS_CREATE_METADATA, &icss);
06979 }
06980 if (status < 0) {
06981 char errMsg[105];
06982 _rollback("chlAddAVUMetadata");
06983 if (status == CAT_UNKNOWN_COLLECTION) {
06984 snprintf(errMsg, 100, "collection '%s' is unknown",
06985 name);
06986 addRErrorMsg (&rsComm->rError, 0, errMsg);
06987 } else {
06988 _rollback("chlAddAVUMetadata");
06989 }
06990 return(status);
06991 }
06992 objId=status;
06993 }
06994
06995 if (itype==3) {
06996 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
06997 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
06998 }
06999
07000 status = getLocalZone();
07001 if (status != 0) return(status);
07002
07003 objId=0;
07004 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 5");
07005 status = cmlGetIntegerValueFromSql(
07006 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
07007 &objId, name, localZone, 0, 0, 0, &icss);
07008 if (status != 0) {
07009 _rollback("chlAddAVUMetadata");
07010 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
07011 return(status);
07012 }
07013 }
07014
07015 if (itype==4) {
07016 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
07017 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
07018 }
07019
07020 status = parseUserName(name, userName, userZone);
07021 if (userZone[0]=='\0') {
07022 status = getLocalZone();
07023 if (status != 0) return(status);
07024 strncpy(userZone, localZone, NAME_LEN);
07025 }
07026
07027 objId=0;
07028 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 6");
07029 status = cmlGetIntegerValueFromSql(
07030 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
07031 &objId, userName, userZone, 0, 0, 0, &icss);
07032 if (status != 0) {
07033 _rollback("chlAddAVUMetadata");
07034 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
07035 return(status);
07036 }
07037 }
07038
07039 if (itype==5) {
07040 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
07041 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
07042 }
07043
07044 status = getLocalZone();
07045 if (status != 0) return(status);
07046
07047 objId=0;
07048 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 7");
07049 status = cmlGetIntegerValueFromSql(
07050 "select distinct resc_group_id from R_RESC_GROUP where resc_group_name=?",
07051 &objId, name, 0, 0, 0, 0, &icss);
07052 if (status != 0) {
07053 _rollback("chlAddAVUMetadata");
07054 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
07055 return(status);
07056 }
07057 }
07058
07059 status = findOrInsertAVU(attribute, value, units);
07060 if (status<0) {
07061 rodsLog(LOG_NOTICE,
07062 "chlAddAVUMetadata findOrInsertAVU failure %d",
07063 status);
07064 _rollback("chlAddAVUMetadata");
07065 return(status);
07066 }
07067 seqNum = status;
07068
07069 getNowStr(myTime);
07070 snprintf(objIdStr, sizeof objIdStr, "%lld", objId);
07071 snprintf(seqNumStr, sizeof seqNumStr, "%lld", seqNum);
07072 cllBindVars[cllBindVarCount++]=objIdStr;
07073 cllBindVars[cllBindVarCount++]=seqNumStr;
07074 cllBindVars[cllBindVarCount++]=myTime;
07075 cllBindVars[cllBindVarCount++]=myTime;
07076 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddAVUMetadata SQL 7");
07077 status = cmlExecuteNoAnswerSql(
07078 "insert into R_OBJT_METAMAP (object_id, meta_id, create_ts, modify_ts) values (?, ?, ?, ?)",
07079 &icss);
07080 if (status != 0) {
07081 rodsLog(LOG_NOTICE,
07082 "chlAddAVUMetadata cmlExecuteNoAnswerSql insert failure %d",
07083 status);
07084 _rollback("chlAddAVUMetadata");
07085 return(status);
07086 }
07087
07088
07089 status = cmlAudit3(AU_ADD_AVU_METADATA,
07090 objIdStr,
07091 rsComm->clientUser.userName,
07092 rsComm->clientUser.rodsZone,
07093 type,
07094 &icss);
07095 if (status != 0) {
07096 rodsLog(LOG_NOTICE,
07097 "chlAddAVUMetadata cmlAudit3 failure %d",
07098 status);
07099 _rollback("chlAddAVUMetadata");
07100 return(status);
07101 }
07102
07103 status = cmlExecuteNoAnswerSql("commit", &icss);
07104 if (status != 0) {
07105 rodsLog(LOG_NOTICE,
07106 "chlAddAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
07107 status);
07108 return(status);
07109 }
07110
07111 return(status);
07112 }
07113
07114
07115
07116
07117 int
07118 checkModArgType(char *arg) {
07119 if (arg == NULL || *arg=='\0')
07120 return(CAT_INVALID_ARGUMENT);
07121 if (*(arg+1)!=':') return(0);
07122 if (*arg=='n') return(1);
07123 if (*arg=='v') return(2);
07124 if (*arg=='u') return(3);
07125 return(0);
07126 }
07127
07128
07129 int chlModAVUMetadata(rsComm_t *rsComm, char *type,
07130 char *name, char *attribute, char *value,
07131 char *unitsOrArg0, char *arg1, char *arg2, char *arg3) {
07132 int status, atype;
07133 char myUnits[MAX_NAME_LEN]="";
07134 char *addAttr="", *addValue="", *addUnits="";
07135 int newUnits=0;
07136 if (unitsOrArg0 == NULL || *unitsOrArg0=='\0')
07137 return(CAT_INVALID_ARGUMENT);
07138 atype = checkModArgType(unitsOrArg0);
07139 if (atype==0) strncpy(myUnits, unitsOrArg0, MAX_NAME_LEN);
07140
07141 status = chlDeleteAVUMetadata(rsComm, 0, type, name, attribute, value,
07142 myUnits, 1);
07143 if (status != 0) {
07144 _rollback("chlModAVUMetadata");
07145 return(status);
07146 }
07147
07148 if (atype==1) {
07149 addAttr=unitsOrArg0+2;
07150 }
07151 if (atype==2) {
07152 addValue=unitsOrArg0+2;
07153 }
07154 if (atype==3) {
07155 addUnits=unitsOrArg0+2;
07156 }
07157
07158 atype = checkModArgType(arg1);
07159 if (atype==1) {
07160 addAttr=arg1+2;
07161 }
07162 if (atype==2) {
07163 addValue=arg1+2;
07164 }
07165 if (atype==3) {
07166 addUnits=arg1+2;
07167 }
07168
07169 atype = checkModArgType(arg2);
07170 if (atype==1) {
07171 addAttr=arg2+2;
07172 }
07173 if (atype==2) {
07174 addValue=arg2+2;
07175 }
07176 if (atype==3) {
07177 addUnits=arg2+2;
07178 }
07179
07180 atype = checkModArgType(arg3);
07181 if (atype==1) {
07182 addAttr=arg3+2;
07183 }
07184 if (atype==2) {
07185 addValue=arg3+2;
07186 }
07187 if (atype==3) {
07188 addUnits=arg3+2;
07189 newUnits=1;
07190 }
07191
07192 if (*addAttr=='\0' &&
07193 *addValue=='\0' &&
07194 *addUnits=='\0') {
07195 _rollback("chlModAVUMetadata");
07196 return (CAT_INVALID_ARGUMENT);
07197 }
07198
07199 if (*addAttr=='\0') addAttr=attribute;
07200 if (*addValue=='\0') addValue=value;
07201 if (*addUnits=='\0' && newUnits==0) addUnits=myUnits;
07202
07203 status = chlAddAVUMetadata(rsComm, 0, type, name, addAttr, addValue,
07204 addUnits);
07205 return(status);
07206
07207 }
07208
07209
07210
07211
07212 int chlDeleteAVUMetadata(rsComm_t *rsComm, int option, char *type,
07213 char *name, char *attribute, char *value,
07214 char *units, int noCommit ) {
07215 int itype;
07216 char logicalEndName[MAX_NAME_LEN];
07217 char logicalParentDirName[MAX_NAME_LEN];
07218 rodsLong_t status;
07219 rodsLong_t objId;
07220 char objIdStr[MAX_NAME_LEN];
07221 int allowNullUnits;
07222 char userName[NAME_LEN];
07223 char userZone[NAME_LEN];
07224
07225 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata");
07226
07227 if (!icss.status) {
07228 return(CATALOG_NOT_CONNECTED);
07229 }
07230
07231 if (type == NULL || *type=='\0') {
07232 return (CAT_INVALID_ARGUMENT);
07233 }
07234
07235 if (name == NULL || *name=='\0') {
07236 return (CAT_INVALID_ARGUMENT);
07237 }
07238
07239 if (option != 2) {
07240 if (attribute == NULL || *attribute=='\0') {
07241 return (CAT_INVALID_ARGUMENT);
07242 }
07243
07244 if (value == NULL || *value=='\0') {
07245 return (CAT_INVALID_ARGUMENT);
07246 }
07247 }
07248
07249 if (units == NULL) units="";
07250
07251 itype = convertTypeOption(type);
07252 if (itype==0) return(CAT_INVALID_ARGUMENT);
07253
07254 if (itype==1) {
07255 status = splitPathByKey(name,
07256 logicalParentDirName, logicalEndName, '/');
07257 if (strlen(logicalParentDirName)==0) {
07258 strcpy(logicalParentDirName, "/");
07259 strcpy(logicalEndName, name);
07260 }
07261 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 1 ");
07262 status = cmlCheckDataObjOnly(logicalParentDirName, logicalEndName,
07263 rsComm->clientUser.userName,
07264 rsComm->clientUser.rodsZone,
07265 ACCESS_DELETE_METADATA, &icss);
07266 if (status < 0) {
07267 _rollback("chlDeleteAVUMetadata");
07268 return(status);
07269 }
07270 objId=status;
07271 }
07272
07273 if (itype==2) {
07274
07275
07276 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 2");
07277 status = cmlCheckDir(name,
07278 rsComm->clientUser.userName,
07279 rsComm->clientUser.rodsZone,
07280 ACCESS_DELETE_METADATA, &icss);
07281 if (status < 0) {
07282 char errMsg[105];
07283 if (status == CAT_UNKNOWN_COLLECTION) {
07284 snprintf(errMsg, 100, "collection '%s' is unknown",
07285 name);
07286 addRErrorMsg (&rsComm->rError, 0, errMsg);
07287 }
07288 return(status);
07289 }
07290 objId=status;
07291 }
07292
07293 if (itype==3) {
07294 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
07295 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
07296 }
07297
07298 status = getLocalZone();
07299 if (status != 0) return(status);
07300
07301 objId=0;
07302 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 3");
07303 status = cmlGetIntegerValueFromSql(
07304 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
07305 &objId, name, localZone, 0, 0, 0, &icss);
07306 if (status != 0) {
07307 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
07308 _rollback("chlDeleteAVUMetadata");
07309 return(status);
07310 }
07311 }
07312
07313 if (itype==4) {
07314 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
07315 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
07316 }
07317
07318 status = parseUserName(name, userName, userZone);
07319 if (userZone[0]=='\0') {
07320 status = getLocalZone();
07321 if (status != 0) return(status);
07322 strncpy(userZone, localZone, NAME_LEN);
07323 }
07324
07325 objId=0;
07326 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 4");
07327 status = cmlGetIntegerValueFromSql(
07328 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
07329 &objId, userName, userZone, 0, 0, 0, &icss);
07330 if (status != 0) {
07331 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
07332 _rollback("chlDeleteAVUMetadata");
07333 return(status);
07334 }
07335 }
07336
07337 if (itype==5) {
07338 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
07339 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
07340 }
07341
07342 status = getLocalZone();
07343 if (status != 0) return(status);
07344
07345 objId=0;
07346 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 5");
07347 status = cmlGetIntegerValueFromSql(
07348 "select resc_group_id from R_RESC_GROUP where resc_group_name=?",
07349 &objId, name, 0, 0, 0, 0, &icss);
07350 if (status != 0) {
07351 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
07352 _rollback("chlDeleteAVUMetadata");
07353 return(status);
07354 }
07355 }
07356
07357
07358 snprintf(objIdStr, MAX_NAME_LEN, "%lld", objId);
07359
07360 if (option==2) {
07361 cllBindVars[cllBindVarCount++]=objIdStr;
07362 cllBindVars[cllBindVarCount++]=attribute;
07363
07364 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 9");
07365 status = cmlExecuteNoAnswerSql(
07366 "delete from R_OBJT_METAMAP where object_id=? and meta_id =?",
07367 &icss);
07368 if (status != 0) {
07369 rodsLog(LOG_NOTICE,
07370 "chlDeleteAVUMetadata cmlExecuteNoAnswerSql delete failure %d",
07371 status);
07372 _rollback("chlDeleteAVUMetadata");
07373 return(status);
07374 }
07375
07376
07377 #ifdef METADATA_CLEANUP
07378 removeAVUs();
07379 #endif
07380
07381
07382 status = cmlAudit3(AU_DELETE_AVU_METADATA,
07383 objIdStr,
07384 rsComm->clientUser.userName,
07385 rsComm->clientUser.rodsZone,
07386 type,
07387 &icss);
07388 if (status != 0) {
07389 rodsLog(LOG_NOTICE,
07390 "chlDeleteAVUMetadata cmlAudit3 failure %d",
07391 status);
07392 _rollback("chlDeleteAVUMetadata");
07393 return(status);
07394 }
07395
07396 if (noCommit != 1) {
07397 status = cmlExecuteNoAnswerSql("commit", &icss);
07398 if (status != 0) {
07399 rodsLog(LOG_NOTICE,
07400 "chlDeleteAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
07401 status);
07402 return(status);
07403 }
07404 }
07405 return(status);
07406 }
07407
07408 cllBindVars[cllBindVarCount++]=objIdStr;
07409 cllBindVars[cllBindVarCount++]=attribute;
07410 cllBindVars[cllBindVarCount++]=value;
07411 cllBindVars[cllBindVarCount++]=units;
07412
07413 allowNullUnits=0;
07414 if (*units=='\0') {
07415 allowNullUnits=1;
07416 }
07417 if (option==1 && *units=='%' && *(units+1)=='\0') {
07418 allowNullUnits=1;
07419 }
07420
07421 if (allowNullUnits) {
07422 if (option==1) {
07423 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 5");
07424 status = cmlExecuteNoAnswerSql(
07425 "delete from R_OBJT_METAMAP where object_id=? and meta_id IN (select meta_id from R_META_MAIN where meta_attr_name like ? and meta_attr_value like ? and (meta_attr_unit like ? or meta_attr_unit IS NULL) )",
07426 &icss);
07427 }
07428 else {
07429 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 6");
07430 status = cmlExecuteNoAnswerSql(
07431 "delete from R_OBJT_METAMAP where object_id=? and meta_id IN (select meta_id from R_META_MAIN where meta_attr_name = ? and meta_attr_value = ? and (meta_attr_unit = ? or meta_attr_unit IS NULL) )",
07432 &icss);
07433 }
07434 }
07435 else {
07436 if (option==1) {
07437 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 7");
07438 status = cmlExecuteNoAnswerSql(
07439 "delete from R_OBJT_METAMAP where object_id=? and meta_id IN (select meta_id from R_META_MAIN where meta_attr_name like ? and meta_attr_value like ? and meta_attr_unit like ?)",
07440 &icss);
07441 }
07442 else {
07443 if (logSQL!=0) rodsLog(LOG_SQL, "chlDeleteAVUMetadata SQL 8");
07444 status = cmlExecuteNoAnswerSql(
07445 "delete from R_OBJT_METAMAP where object_id=? and meta_id IN (select meta_id from R_META_MAIN where meta_attr_name = ? and meta_attr_value = ? and meta_attr_unit = ?)",
07446 &icss);
07447 }
07448 }
07449 if (status != 0) {
07450 rodsLog(LOG_NOTICE,
07451 "chlDeleteAVUMetadata cmlExecuteNoAnswerSql delete failure %d",
07452 status);
07453 _rollback("chlDeleteAVUMetadata");
07454 return(status);
07455 }
07456
07457
07458 #ifdef METADATA_CLEANUP
07459 removeAVUs();
07460 #endif
07461
07462
07463 status = cmlAudit3(AU_DELETE_AVU_METADATA,
07464 objIdStr,
07465 rsComm->clientUser.userName,
07466 rsComm->clientUser.rodsZone,
07467 type,
07468 &icss);
07469 if (status != 0) {
07470 rodsLog(LOG_NOTICE,
07471 "chlDeleteAVUMetadata cmlAudit3 failure %d",
07472 status);
07473 _rollback("chlDeleteAVUMetadata");
07474 return(status);
07475 }
07476
07477 if (noCommit != 1) {
07478 status = cmlExecuteNoAnswerSql("commit", &icss);
07479 if (status != 0) {
07480 rodsLog(LOG_NOTICE,
07481 "chlDeleteAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
07482 status);
07483 return(status);
07484 }
07485 }
07486
07487 return(status);
07488 }
07489
07490
07491
07492 int chlCopyAVUMetadata(rsComm_t *rsComm, char *type1, char *type2,
07493 char *name1, char *name2) {
07494 char myTime[50];
07495 int status;
07496 rodsLong_t objId1, objId2;
07497 char objIdStr1[MAX_NAME_LEN];
07498 char objIdStr2[MAX_NAME_LEN];
07499
07500 if (logSQL!=0) rodsLog(LOG_SQL, "chlCopyAVUMetadata");
07501
07502 if (!icss.status) {
07503 return(CATALOG_NOT_CONNECTED);
07504 }
07505
07506 if (logSQL!=0) rodsLog(LOG_SQL, "chlCopyAVUMetadata SQL 1 ");
07507 objId1 = checkAndGetObjectId(rsComm, type1, name1, ACCESS_READ_METADATA);
07508 if (objId1 < 0) return(objId1);
07509
07510 if (logSQL!=0) rodsLog(LOG_SQL, "chlCopyAVUMetadata SQL 2");
07511 objId2 = checkAndGetObjectId(rsComm, type2, name2, ACCESS_CREATE_METADATA);
07512
07513 if (objId2 < 0) return(objId2);
07514
07515 snprintf(objIdStr1, MAX_NAME_LEN, "%lld", objId1);
07516 snprintf(objIdStr2, MAX_NAME_LEN, "%lld", objId2);
07517
07518 getNowStr(myTime);
07519 cllBindVars[cllBindVarCount++]=objIdStr2;
07520 cllBindVars[cllBindVarCount++]=myTime;
07521 cllBindVars[cllBindVarCount++]=myTime;
07522 cllBindVars[cllBindVarCount++]=objIdStr1;
07523 if (logSQL!=0) rodsLog(LOG_SQL, "chlCopyAVUMetadata SQL 3");
07524 status = cmlExecuteNoAnswerSql(
07525 "insert into R_OBJT_METAMAP (object_id, meta_id, create_ts, modify_ts) select ?, meta_id, ?, ? from R_OBJT_METAMAP where object_id=?",
07526 &icss);
07527 if (status != 0) {
07528 rodsLog(LOG_NOTICE,
07529 "chlCopyAVUMetadata cmlExecuteNoAnswerSql insert failure %d",
07530 status);
07531 _rollback("chlCopyAVUMetadata");
07532 return(status);
07533 }
07534
07535
07536 status = cmlAudit3(AU_COPY_AVU_METADATA,
07537 objIdStr1,
07538 rsComm->clientUser.userName,
07539 rsComm->clientUser.rodsZone,
07540 objIdStr2,
07541 &icss);
07542 if (status != 0) {
07543 rodsLog(LOG_NOTICE,
07544 "chlCopyAVUMetadata cmlAudit3 failure %d",
07545 status);
07546 _rollback("chlCopyAVUMetadata");
07547 return(status);
07548 }
07549
07550 status = cmlExecuteNoAnswerSql("commit", &icss);
07551 if (status != 0) {
07552 rodsLog(LOG_NOTICE,
07553 "chlCopyAVUMetadata cmlExecuteNoAnswerSql commit failure %d",
07554 status);
07555 return(status);
07556 }
07557
07558 return(status);
07559 }
07560
07561
07562 void
07563 makeEscapedPath(char *inPath, char *outPath, int size) {
07564 int i;
07565 for (i=0;i<size-1;i++) {
07566 if (*inPath=='%' || *inPath=='_') {
07567 *outPath++='\\';
07568 }
07569 if (*inPath=='\0') {
07570 *outPath++=*inPath++;
07571 break;
07572 }
07573 *outPath++=*inPath++;
07574 }
07575 return;
07576 }
07577
07578
07579
07580 int _modInheritance(int inheritFlag, int recursiveFlag, char *collIdStr, char *pathName) {
07581 rodsLong_t status;
07582 char myTime[50];
07583 char newValue[10];
07584 char pathStart[MAX_NAME_LEN*2];
07585 char auditStr[30];
07586
07587 if (recursiveFlag==0) {
07588 strcpy(auditStr, "inheritance non-recursive ");
07589 }
07590 else {
07591 strcpy(auditStr, "inheritance recursive ");
07592 }
07593
07594 if (inheritFlag==1) {
07595 newValue[0]='1';
07596 newValue[1]='\0';
07597 }
07598 else {
07599 newValue[0]='0';
07600 newValue[1]='\0';
07601 }
07602 strcat(auditStr, newValue);
07603
07604 getNowStr(myTime);
07605
07606
07607 if (recursiveFlag==0) {
07608
07609 if (logSQL!=0) rodsLog(LOG_SQL, "_modInheritance SQL 1");
07610
07611 cllBindVars[cllBindVarCount++]=newValue;
07612 cllBindVars[cllBindVarCount++]=myTime;
07613 cllBindVars[cllBindVarCount++]=collIdStr;
07614 status = cmlExecuteNoAnswerSql(
07615 "update R_COLL_MAIN set coll_inheritance=?, modify_ts=? where coll_id=?",
07616 &icss);
07617 }
07618 else {
07619
07620 makeEscapedPath(pathName, pathStart, sizeof(pathStart));
07621 strncat(pathStart, "/%", sizeof(pathStart));
07622
07623 cllBindVars[cllBindVarCount++]=newValue;
07624 cllBindVars[cllBindVarCount++]=myTime;
07625 cllBindVars[cllBindVarCount++]=pathName;
07626 cllBindVars[cllBindVarCount++]=pathStart;
07627 if (logSQL!=0) rodsLog(LOG_SQL, "_modInheritance SQL 2");
07628 status = cmlExecuteNoAnswerSql(
07629 "update R_COLL_MAIN set coll_inheritance=?, modify_ts=? where coll_name = ? or coll_name like ?",
07630 &icss);
07631 }
07632 if (status != 0) {
07633 _rollback("_modInheritance");
07634 return(status);
07635 }
07636
07637
07638 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL,
07639 collIdStr,
07640 "0",
07641 auditStr,
07642 &icss);
07643 if (status != 0) {
07644 rodsLog(LOG_NOTICE,
07645 "_modInheritance cmlAudit5 failure %d",
07646 status);
07647 _rollback("_modInheritance");
07648 return(status);
07649 }
07650
07651 status = cmlExecuteNoAnswerSql("commit", &icss);
07652 return(status);
07653 }
07654
07655 int chlModAccessControlResc(rsComm_t *rsComm, int recursiveFlag,
07656 char* accessLevel, char *userName, char *zone,
07657 char* rescName) {
07658 char myAccessStr[LONG_NAME_LEN];
07659 char rescIdStr[MAX_NAME_LEN];
07660 char *myAccessLev=NULL;
07661 int rmFlag=0;
07662 rodsLong_t status;
07663 char *myZone;
07664 rodsLong_t userId;
07665 char userIdStr[MAX_NAME_LEN];
07666 char myTime[50];
07667 rodsLong_t iVal;
07668 int debug=0;
07669
07670 strncpy(myAccessStr,accessLevel+strlen(MOD_RESC_PREFIX),LONG_NAME_LEN);
07671 myAccessStr[ LONG_NAME_LEN-1 ]='\0';
07672 if (debug>0) {
07673 printf("accessLevel: %s\n", accessLevel);
07674 printf("rescName: %s\n", rescName);
07675 }
07676
07677 if (strcmp(myAccessStr, AP_NULL)==0) {myAccessLev=ACCESS_NULL; rmFlag=1;}
07678 else if (strcmp(myAccessStr,AP_READ)==0) {myAccessLev=ACCESS_READ_OBJECT;}
07679 else if (strcmp(myAccessStr,AP_WRITE)==0){myAccessLev=ACCESS_MODIFY_OBJECT;}
07680 else if (strcmp(myAccessStr,AP_OWN)==0) {myAccessLev=ACCESS_OWN;}
07681 else {
07682 char errMsg[105];
07683 snprintf(errMsg, 100, "access level '%s' is invalid for a resource",
07684 myAccessStr);
07685 addRErrorMsg (&rsComm->rError, 0, errMsg);
07686 return(CAT_INVALID_ARGUMENT);
07687 }
07688
07689 if (rsComm->clientUser.authInfo.authFlag >= LOCAL_PRIV_USER_AUTH) {
07690
07691 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControlResc SQL 1");
07692 status = cmlGetIntegerValueFromSql(
07693 "select resc_id from R_RESC_MAIN where resc_name=?",
07694 &iVal, rescName, 0, 0, 0, 0, &icss);
07695 if (status==CAT_NO_ROWS_FOUND) return(CAT_UNKNOWN_RESOURCE);
07696 if (status<0) return(status);
07697 status = iVal;
07698 }
07699 else {
07700 status = cmlCheckResc(rescName,
07701 rsComm->clientUser.userName,
07702 rsComm->clientUser.rodsZone,
07703 ACCESS_OWN,
07704 &icss);
07705 if (status<0) return(status);
07706 }
07707 snprintf(rescIdStr, MAX_NAME_LEN, "%lld", status);
07708
07709
07710 status = getLocalZone();
07711 if (status != 0) return(status);
07712
07713 myZone=zone;
07714 if (zone == NULL || strlen(zone)==0) {
07715 myZone=localZone;
07716 }
07717
07718 userId=0;
07719 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControlResc SQL 2");
07720 status = cmlGetIntegerValueFromSql(
07721 "select user_id from R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=?",
07722 &userId, userName, myZone, 0, 0, 0, &icss);
07723 if (status != 0) {
07724 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
07725 return(status);
07726 }
07727
07728 snprintf(userIdStr, MAX_NAME_LEN, "%lld", userId);
07729
07730
07731 cllBindVars[cllBindVarCount++]=userIdStr;
07732 cllBindVars[cllBindVarCount++]=rescIdStr;
07733 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControlResc SQL 3");
07734 status = cmlExecuteNoAnswerSql(
07735 "delete from R_OBJT_ACCESS where user_id=? and object_id=?",
07736 &icss);
07737 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
07738 return(status);
07739 }
07740
07741
07742 if (rmFlag==0) {
07743 getNowStr(myTime);
07744 cllBindVars[cllBindVarCount++]=rescIdStr;
07745 cllBindVars[cllBindVarCount++]=userIdStr;
07746 cllBindVars[cllBindVarCount++]=myAccessLev;
07747 cllBindVars[cllBindVarCount++]=myTime;
07748 cllBindVars[cllBindVarCount++]=myTime;
07749 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControlResc SQL 4");
07750 status = cmlExecuteNoAnswerSql(
07751 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) values (?, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
07752 &icss);
07753 if (status != 0) {
07754 _rollback("chlModAccessControlResc");
07755 return(status);
07756 }
07757 }
07758
07759
07760 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_RESOURCE,
07761 rescIdStr,
07762 userIdStr,
07763 myAccessLev,
07764 &icss);
07765 if (status != 0) {
07766 rodsLog(LOG_NOTICE,
07767 "chlModAccessControlResc cmlAudit5 failure %d",
07768 status);
07769 _rollback("chlModAccessControlResc");
07770 return(status);
07771 }
07772
07773 status = cmlExecuteNoAnswerSql("commit", &icss);
07774 return(status);
07775 }
07776
07777
07778
07779
07780
07781
07782 int chlModAccessControl(rsComm_t *rsComm, int recursiveFlag,
07783 char* accessLevel, char *userName, char *zone,
07784 char* pathName) {
07785 char *myAccessLev=NULL;
07786 char logicalEndName[MAX_NAME_LEN];
07787 char logicalParentDirName[MAX_NAME_LEN];
07788 char collIdStr[MAX_NAME_LEN];
07789 rodsLong_t objId=0;
07790 rodsLong_t status, status1, status2, status3;
07791 int rmFlag=0;
07792 rodsLong_t userId;
07793 char myTime[50];
07794 char *myZone;
07795 char userIdStr[MAX_NAME_LEN];
07796 char objIdStr[MAX_NAME_LEN];
07797 char pathStart[MAX_NAME_LEN*2];
07798 int inheritFlag=0;
07799 char myAccessStr[LONG_NAME_LEN];
07800 int adminMode=0;
07801 rodsLong_t iVal;
07802
07803 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl");
07804
07805 if (strncmp(accessLevel, MOD_RESC_PREFIX, strlen(MOD_RESC_PREFIX))==0) {
07806 return(chlModAccessControlResc(rsComm, recursiveFlag,
07807 accessLevel, userName, zone, pathName));
07808 }
07809
07810 adminMode=0;
07811 if (strncmp(accessLevel, MOD_ADMIN_MODE_PREFIX,
07812 strlen(MOD_ADMIN_MODE_PREFIX))==0) {
07813 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
07814 addRErrorMsg (&rsComm->rError, 0,
07815 "You must be the admin to use the -M admin mode");
07816 return(CAT_NO_ACCESS_PERMISSION);
07817 }
07818 strncpy(myAccessStr,accessLevel+strlen(MOD_ADMIN_MODE_PREFIX),
07819 LONG_NAME_LEN);
07820 accessLevel = myAccessStr;
07821 adminMode=1;
07822 }
07823
07824 if (strcmp(accessLevel, AP_NULL)==0) {myAccessLev=ACCESS_NULL; rmFlag=1;}
07825 else if (strcmp(accessLevel,AP_READ)==0) {myAccessLev=ACCESS_READ_OBJECT;}
07826 else if (strcmp(accessLevel,AP_WRITE)==0){myAccessLev=ACCESS_MODIFY_OBJECT;}
07827 else if (strcmp(accessLevel,AP_OWN)==0) {myAccessLev=ACCESS_OWN;}
07828 else if (strcmp(accessLevel,ACCESS_INHERIT)==0) {
07829 inheritFlag=1;
07830 }
07831 else if (strcmp(accessLevel,ACCESS_NO_INHERIT)==0) {
07832 inheritFlag=2;
07833 }
07834 else {
07835 char errMsg[105];
07836 snprintf(errMsg, 100, "access level '%s' is invalid",
07837 accessLevel);
07838 addRErrorMsg (&rsComm->rError, 0, errMsg);
07839 return(CAT_INVALID_ARGUMENT);
07840 }
07841
07842 if (!icss.status) {
07843 return(CATALOG_NOT_CONNECTED);
07844 }
07845
07846 if (adminMode) {
07847
07848
07849 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 14");
07850 status1 = cmlGetIntegerValueFromSql(
07851 "select coll_id from R_COLL_MAIN where coll_name=?",
07852 &iVal, pathName, 0, 0, 0, 0, &icss);
07853 if (status1==CAT_NO_ROWS_FOUND) {
07854 status1=CAT_UNKNOWN_COLLECTION;
07855 }
07856 if (status1==0) status1=iVal;
07857 }
07858 else {
07859
07860
07861 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 1 ");
07862 status1 = cmlCheckDir(pathName,
07863 rsComm->clientUser.userName,
07864 rsComm->clientUser.rodsZone,
07865 ACCESS_OWN,
07866 &icss);
07867 }
07868 if (status1 >= 0) {
07869 snprintf(collIdStr, MAX_NAME_LEN, "%lld", status1);
07870 }
07871
07872 if (status1 < 0 && inheritFlag!=0) {
07873 char errMsg[105];
07874 snprintf(errMsg, 100, "access level '%s' is valid only for collections",
07875 accessLevel);
07876 addRErrorMsg (&rsComm->rError, 0, errMsg);
07877 return(CAT_INVALID_ARGUMENT);
07878 }
07879
07880
07881 if (status1 < 0) {
07882 status2 = splitPathByKey(pathName,
07883 logicalParentDirName, logicalEndName, '/');
07884 if (strlen(logicalParentDirName)==0) {
07885 strcpy(logicalParentDirName, "/");
07886 strcpy(logicalEndName, pathName+1);
07887 }
07888 if (adminMode) {
07889 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 15");
07890 status2 = cmlGetIntegerValueFromSql(
07891 "select data_id from R_DATA_MAIN DM, R_COLL_MAIN CM where DM.data_name=? and DM.coll_id=CM.coll_id and CM.coll_name=?",
07892 &iVal, logicalEndName, logicalParentDirName, 0, 0, 0, &icss);
07893 if (status2==CAT_NO_ROWS_FOUND) status2=CAT_UNKNOWN_FILE;
07894 if (status2==0) status2=iVal;
07895 }
07896 else {
07897
07898
07899 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 2");
07900 status2 = cmlCheckDataObjOnly(logicalParentDirName, logicalEndName,
07901 rsComm->clientUser.userName,
07902 rsComm->clientUser.rodsZone,
07903 ACCESS_OWN, &icss);
07904 }
07905 if (status2 > 0) objId=status2;
07906 }
07907
07908
07909 if (status1 < 0 && status2 < 0) {
07910 char errMsg[205];
07911
07912 if (status1 == CAT_UNKNOWN_COLLECTION && status2 == CAT_UNKNOWN_FILE) {
07913 snprintf(errMsg, 200,
07914 "Input path is not a collection and not a dataObj: %s",
07915 pathName);
07916 addRErrorMsg (&rsComm->rError, 0, errMsg);
07917 return(CAT_INVALID_ARGUMENT);
07918 }
07919 if (status1 != CAT_UNKNOWN_COLLECTION) {
07920 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 12");
07921 status3 = cmlCheckDirOwn(pathName,
07922 rsComm->clientUser.userName,
07923 rsComm->clientUser.rodsZone,
07924 &icss);
07925 if (status3 < 0) return(status1);
07926 snprintf(collIdStr, MAX_NAME_LEN, "%lld", status3);
07927 }
07928 else {
07929 if (status2 == CAT_NO_ACCESS_PERMISSION) {
07930
07931
07932 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 13");
07933 status3 = cmlCheckDataObjOwn(logicalParentDirName, logicalEndName,
07934 rsComm->clientUser.userName,
07935 rsComm->clientUser.rodsZone,
07936 &icss);
07937 if (status3 < 0) {
07938 _rollback("chlModAccessControl");
07939 return(status2);
07940 }
07941 objId = status3;
07942 } else {
07943 return(status2);
07944 }
07945 }
07946 }
07947
07948
07949 if (inheritFlag!=0) {
07950 status = _modInheritance(inheritFlag, recursiveFlag, collIdStr, pathName);
07951 return(status);
07952 }
07953
07954
07955 status = getLocalZone();
07956 if (status != 0) return(status);
07957
07958 myZone=zone;
07959 if (zone == NULL || strlen(zone)==0) {
07960 myZone=localZone;
07961 }
07962
07963 userId=0;
07964 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 3");
07965 status = cmlGetIntegerValueFromSql(
07966 "select user_id from R_USER_MAIN where user_name=? and R_USER_MAIN.zone_name=?",
07967 &userId, userName, myZone, 0, 0, 0, &icss);
07968 if (status != 0) {
07969 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
07970 return(status);
07971 }
07972
07973 snprintf(userIdStr, MAX_NAME_LEN, "%lld", userId);
07974 snprintf(objIdStr, MAX_NAME_LEN, "%lld", objId);
07975
07976 rodsLog(LOG_NOTICE, "recursiveFlag %d",recursiveFlag);
07977
07978
07979 if (recursiveFlag==0) {
07980
07981
07982 if (objId) {
07983 cllBindVars[cllBindVarCount++]=userIdStr;
07984 cllBindVars[cllBindVarCount++]=objIdStr;
07985 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 4");
07986 status = cmlExecuteNoAnswerSql(
07987 "delete from R_OBJT_ACCESS where user_id=? and object_id=?",
07988 &icss);
07989 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
07990 return(status);
07991 }
07992 if (rmFlag==0) {
07993 getNowStr(myTime);
07994 cllBindVars[cllBindVarCount++]=objIdStr;
07995 cllBindVars[cllBindVarCount++]=userIdStr;
07996 cllBindVars[cllBindVarCount++]=myAccessLev;
07997 cllBindVars[cllBindVarCount++]=myTime;
07998 cllBindVars[cllBindVarCount++]=myTime;
07999 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 5");
08000 status = cmlExecuteNoAnswerSql(
08001 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) values (?, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
08002 &icss);
08003 if (status != 0) {
08004 _rollback("chlModAccessControl");
08005 return(status);
08006 }
08007 }
08008
08009
08010 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_OBJ,
08011 objIdStr,
08012 userIdStr,
08013 myAccessLev,
08014 &icss);
08015 if (status != 0) {
08016 rodsLog(LOG_NOTICE,
08017 "chlModAccessControl cmlAudit5 failure %d",
08018 status);
08019 _rollback("chlModAccessControl");
08020 return(status);
08021 }
08022
08023 status = cmlExecuteNoAnswerSql("commit", &icss);
08024 return(status);
08025 }
08026
08027
08028 cllBindVars[cllBindVarCount++]=userIdStr;
08029 cllBindVars[cllBindVarCount++]=collIdStr;
08030 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 6");
08031 status = cmlExecuteNoAnswerSql(
08032 "delete from R_OBJT_ACCESS where user_id=? and object_id=?",
08033 &icss);
08034 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
08035 _rollback("chlModAccessControl");
08036 return(status);
08037 }
08038 if (rmFlag) {
08039
08040 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL,
08041 collIdStr,
08042 userIdStr,
08043 myAccessLev,
08044 &icss);
08045 if (status != 0) {
08046 rodsLog(LOG_NOTICE,
08047 "chlModAccessControl cmlAudit5 failure %d",
08048 status);
08049 _rollback("chlModAccessControl");
08050 return(status);
08051 }
08052 status = cmlExecuteNoAnswerSql("commit", &icss);
08053 return(status);
08054 }
08055
08056 getNowStr(myTime);
08057 cllBindVars[cllBindVarCount++]=collIdStr;
08058 cllBindVars[cllBindVarCount++]=userIdStr;
08059 cllBindVars[cllBindVarCount++]=myAccessLev;
08060 cllBindVars[cllBindVarCount++]=myTime;
08061 cllBindVars[cllBindVarCount++]=myTime;
08062 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 7");
08063 status = cmlExecuteNoAnswerSql(
08064 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) values (?, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ?)",
08065 &icss);
08066
08067 if (status != 0) {
08068 _rollback("chlModAccessControl");
08069 return(status);
08070 }
08071
08072 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL,
08073 collIdStr,
08074 userIdStr,
08075 myAccessLev,
08076 &icss);
08077 if (status != 0) {
08078 rodsLog(LOG_NOTICE,
08079 "chlModAccessControl cmlAudit5 failure %d",
08080 status);
08081 _rollback("chlModAccessControl");
08082 return(status);
08083 }
08084
08085 status = cmlExecuteNoAnswerSql("commit", &icss);
08086 return(status);
08087 }
08088
08089
08090
08091 if (objId) {
08092 char errMsg[205];
08093
08094 snprintf(errMsg, 200,
08095 "Input path is not a collection and recursion was requested: %s",
08096 pathName);
08097 addRErrorMsg (&rsComm->rError, 0, errMsg);
08098 return(CAT_INVALID_ARGUMENT);
08099 }
08100
08101
08102 makeEscapedPath(pathName, pathStart, sizeof(pathStart));
08103 strncat(pathStart, "/%", sizeof(pathStart));
08104
08105 cllBindVars[cllBindVarCount++]=userIdStr;
08106 cllBindVars[cllBindVarCount++]=pathName;
08107 cllBindVars[cllBindVarCount++]=pathStart;
08108
08109 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 8");
08110 status = cmlExecuteNoAnswerSql(
08111 "delete from R_OBJT_ACCESS where user_id=? and object_id in (select data_id from R_DATA_MAIN where coll_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?))",
08112 &icss);
08113
08114 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
08115 _rollback("chlModAccessControl");
08116 return(status);
08117 }
08118
08119 cllBindVars[cllBindVarCount++]=userIdStr;
08120 cllBindVars[cllBindVarCount++]=pathName;
08121 cllBindVars[cllBindVarCount++]=pathStart;
08122
08123 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 9");
08124 status = cmlExecuteNoAnswerSql(
08125 "delete from R_OBJT_ACCESS where user_id=? and object_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?)",
08126 &icss);
08127 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
08128 _rollback("chlModAccessControl");
08129 return(status);
08130 }
08131 if (rmFlag) {
08132
08133
08134 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL_RECURSIVE,
08135 collIdStr,
08136 userIdStr,
08137 myAccessLev,
08138 &icss);
08139 if (status != 0) {
08140 rodsLog(LOG_NOTICE,
08141 "chlModAccessControl cmlAudit5 failure %d",
08142 status);
08143 _rollback("chlModAccessControl");
08144 return(status);
08145 }
08146
08147 status = cmlExecuteNoAnswerSql("commit", &icss);
08148 return(status);
08149 }
08150
08151 getNowStr(myTime);
08152 makeEscapedPath(pathName, pathStart, sizeof(pathStart));
08153 strncat(pathStart, "/%", sizeof(pathStart));
08154 cllBindVars[cllBindVarCount++]=userIdStr;
08155 cllBindVars[cllBindVarCount++]=myAccessLev;
08156 cllBindVars[cllBindVarCount++]=myTime;
08157 cllBindVars[cllBindVarCount++]=myTime;
08158 cllBindVars[cllBindVarCount++]=pathName;
08159 cllBindVars[cllBindVarCount++]=pathStart;
08160 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 10");
08161 #if ORA_ICAT
08162
08163 status = cmlExecuteNoAnswerSql(
08164 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct data_id, cast(? as integer), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_DATA_MAIN where coll_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?))",
08165 &icss);
08166 #elif MY_ICAT
08167 status = cmlExecuteNoAnswerSql(
08168 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct data_id, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_DATA_MAIN where coll_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?))",
08169 &icss);
08170 #else
08171 status = cmlExecuteNoAnswerSql(
08172 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct data_id, cast(? as bigint), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_DATA_MAIN where coll_id in (select coll_id from R_COLL_MAIN where coll_name = ? or coll_name like ?))",
08173 &icss);
08174 #endif
08175 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
08176 if (status != 0) {
08177 _rollback("chlModAccessControl");
08178 return(status);
08179 }
08180
08181
08182
08183 cllBindVars[cllBindVarCount++]=userIdStr;
08184 cllBindVars[cllBindVarCount++]=myAccessLev;
08185 cllBindVars[cllBindVarCount++]=myTime;
08186 cllBindVars[cllBindVarCount++]=myTime;
08187 cllBindVars[cllBindVarCount++]=pathName;
08188 cllBindVars[cllBindVarCount++]=pathStart;
08189 if (logSQL!=0) rodsLog(LOG_SQL, "chlModAccessControl SQL 11");
08190 #if ORA_ICAT
08191
08192 status = cmlExecuteNoAnswerSql(
08193 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct coll_id, cast(? as integer), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_COLL_MAIN where coll_name = ? or coll_name like ?)",
08194 &icss);
08195 #elif MY_ICAT
08196 status = cmlExecuteNoAnswerSql(
08197 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct coll_id, ?, (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_COLL_MAIN where coll_name = ? or coll_name like ?)",
08198 &icss);
08199 #else
08200 status = cmlExecuteNoAnswerSql(
08201 "insert into R_OBJT_ACCESS (object_id, user_id, access_type_id, create_ts, modify_ts) (select distinct coll_id, cast(? as bigint), (select token_id from R_TOKN_MAIN where token_namespace = 'access_type' and token_name = ?), ?, ? from R_COLL_MAIN where coll_name = ? or coll_name like ?)",
08202 &icss);
08203 #endif
08204 if (status != 0) {
08205 _rollback("chlModAccessControl");
08206 return(status);
08207 }
08208
08209
08210 status = cmlAudit5(AU_MOD_ACCESS_CONTROL_COLL_RECURSIVE,
08211 collIdStr,
08212 userIdStr,
08213 myAccessLev,
08214 &icss);
08215 if (status != 0) {
08216 rodsLog(LOG_NOTICE,
08217 "chlModAccessControl cmlAudit5 failure %d",
08218 status);
08219 _rollback("chlModAccessControl");
08220 return(status);
08221 }
08222
08223 status = cmlExecuteNoAnswerSql("commit", &icss);
08224 return(status);
08225 }
08226
08227
08228
08229
08230 int chlRenameObject(rsComm_t *rsComm, rodsLong_t objId,
08231 char* newName) {
08232 int status;
08233 rodsLong_t collId;
08234 rodsLong_t otherDataId;
08235 rodsLong_t otherCollId;
08236 char myTime[50];
08237
08238 char parentCollName[MAX_NAME_LEN]="";
08239 char collName[MAX_NAME_LEN]="";
08240 char *cVal[3];
08241 int iVal[3];
08242 int pLen, cLen, len;
08243 int isRootDir=0;
08244 char objIdString[MAX_NAME_LEN];
08245 char collIdString[MAX_NAME_LEN];
08246 char collNameTmp[MAX_NAME_LEN];
08247
08248 char pLenStr[MAX_NAME_LEN];
08249 char cLenStr[MAX_NAME_LEN];
08250 char collNameSlash[MAX_NAME_LEN];
08251 char collNameSlashLen[20];
08252 char slashNewName[MAX_NAME_LEN];
08253
08254 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject");
08255
08256 if (strstr(newName, "/")) {
08257 return(CAT_INVALID_ARGUMENT);
08258 }
08259
08260
08261
08262 collId=0;
08263
08264 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
08265 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 1 ");
08266
08267 status = cmlGetIntegerValueFromSql(
08268 "select coll_id from R_DATA_MAIN DM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where DM.data_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = DM.data_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
08269 &collId, objIdString, rsComm->clientUser.userName, rsComm->clientUser.rodsZone,
08270 0, 0, &icss);
08271
08272 if (status == 0) {
08273
08274
08275 snprintf(collIdString, MAX_NAME_LEN, "%lld", collId);
08276 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 2");
08277 status = cmlGetIntegerValueFromSql(
08278 "select data_id from R_DATA_MAIN where data_name=? and coll_id=?",
08279 &otherDataId,
08280 newName, collIdString, 0, 0, 0, &icss);
08281 if (status!=CAT_NO_ROWS_FOUND) {
08282 return( CAT_NAME_EXISTS_AS_DATAOBJ);
08283 }
08284
08285
08286
08287 snprintf(collNameTmp, MAX_NAME_LEN, "/%s", newName);
08288 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 3");
08289 status = cmlGetIntegerValueFromSql(
08290 "select coll_id from R_COLL_MAIN where coll_name = ( select coll_name from R_COLL_MAIN where coll_id=? ) || ?",
08291 &otherCollId, collIdString, collNameTmp, 0, 0, 0, &icss);
08292 if (status!=CAT_NO_ROWS_FOUND) {
08293 return( CAT_NAME_EXISTS_AS_COLLECTION);
08294 }
08295
08296
08297 getNowStr(myTime);
08298 cllBindVars[cllBindVarCount++]=newName;
08299 cllBindVars[cllBindVarCount++]=objIdString;
08300 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 4");
08301 status = cmlExecuteNoAnswerSql(
08302 "update R_DATA_MAIN set data_name = ? where data_id=?",
08303 &icss);
08304 if (status != 0) {
08305 rodsLog(LOG_NOTICE,
08306 "chlRenameObject cmlExecuteNoAnswerSql update1 failure %d",
08307 status);
08308 _rollback("chlRenameObject");
08309 return(status);
08310 }
08311
08312 cllBindVars[cllBindVarCount++]=myTime;
08313 cllBindVars[cllBindVarCount++]=collIdString;
08314 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 5");
08315 status = cmlExecuteNoAnswerSql(
08316 "update R_COLL_MAIN set modify_ts=? where coll_id=?",
08317 &icss);
08318 if (status != 0) {
08319 rodsLog(LOG_NOTICE,
08320 "chlRenameObject cmlExecuteNoAnswerSql update2 failure %d",
08321 status);
08322 _rollback("chlRenameObject");
08323 return(status);
08324 }
08325
08326
08327 status = cmlAudit3(AU_RENAME_DATA_OBJ,
08328 objIdString,
08329 rsComm->clientUser.userName,
08330 rsComm->clientUser.rodsZone,
08331 newName,
08332 &icss);
08333 if (status != 0) {
08334 rodsLog(LOG_NOTICE,
08335 "chlRenameObject cmlAudit3 failure %d",
08336 status);
08337 _rollback("chlRenameObject");
08338 return(status);
08339 }
08340
08341 return(status);
08342 }
08343
08344
08345
08346
08347 cVal[0]=parentCollName;
08348 iVal[0]=MAX_NAME_LEN;
08349 cVal[1]=collName;
08350 iVal[1]=MAX_NAME_LEN;
08351
08352 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
08353 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 6");
08354
08355 status = cmlGetStringValuesFromSql(
08356 "select parent_coll_name, coll_name from R_COLL_MAIN CM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where CM.coll_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = CM.coll_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
08357 cVal, iVal, 2, objIdString,
08358 rsComm->clientUser.userName, rsComm->clientUser.rodsZone, &icss);
08359 if (status == 0) {
08360
08361
08362
08363 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 7");
08364 status = cmlGetIntegerValueFromSql(
08365 "select data_id from R_DATA_MAIN where data_name=? and coll_id= (select coll_id from R_COLL_MAIN where coll_name = ?)",
08366 &otherDataId, newName, parentCollName, 0, 0, 0, &icss);
08367 if (status!=CAT_NO_ROWS_FOUND) {
08368 return( CAT_NAME_EXISTS_AS_DATAOBJ);
08369 }
08370
08371
08372
08373 snprintf(collNameTmp, MAX_NAME_LEN, "%s/%s", parentCollName, newName);
08374 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 8");
08375 status = cmlGetIntegerValueFromSql(
08376 "select coll_id from R_COLL_MAIN where coll_name = ?",
08377 &otherCollId, collNameTmp, 0, 0, 0, 0, &icss);
08378 if (status!=CAT_NO_ROWS_FOUND) {
08379 return( CAT_NAME_EXISTS_AS_COLLECTION);
08380 }
08381
08382
08383 pLen = strlen(parentCollName);
08384 cLen=strlen(collName);
08385 if (pLen<=0 || cLen <=0) return(CAT_INVALID_ARGUMENT);
08386
08387
08388 if (pLen==1) {
08389 if (strncmp(parentCollName, "/", 20) == 0) {
08390 isRootDir=1;
08391 }
08392 }
08393
08394
08395
08396
08397
08398
08399 snprintf(pLenStr,MAX_NAME_LEN, "%d", pLen);
08400
08401
08402 snprintf(cLenStr,MAX_NAME_LEN, "%d", cLen+1);
08403 snprintf(collNameSlash, MAX_NAME_LEN, "%s/", collName);
08404 len = strlen(collNameSlash);
08405 snprintf(collNameSlashLen, 10, "%d", len);
08406 snprintf(slashNewName, MAX_NAME_LEN, "/%s", newName);
08407 if (isRootDir) {
08408 snprintf(slashNewName, MAX_NAME_LEN, "%s", newName);
08409 }
08410 cllBindVars[cllBindVarCount++]=pLenStr;
08411 cllBindVars[cllBindVarCount++]=slashNewName;
08412 cllBindVars[cllBindVarCount++]=cLenStr;
08413 cllBindVars[cllBindVarCount++]=collNameSlashLen;
08414 cllBindVars[cllBindVarCount++]=collNameSlash;
08415 cllBindVars[cllBindVarCount++]=collName;
08416 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 9");
08417 status = cmlExecuteNoAnswerSql(
08418 "update R_COLL_MAIN set coll_name = substr(coll_name,1,?) || ? || substr(coll_name, ?) where substr(parent_coll_name,1,?) = ? or parent_coll_name = ?",
08419 &icss);
08420 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
08421 rodsLog(LOG_NOTICE,
08422 "chlRenameObject cmlExecuteNoAnswerSql update failure %d",
08423 status);
08424 _rollback("chlRenameObject");
08425 return(status);
08426 }
08427
08428
08429 cllBindVars[cllBindVarCount++]=pLenStr;
08430 cllBindVars[cllBindVarCount++]=slashNewName;
08431 cllBindVars[cllBindVarCount++]=cLenStr;
08432 cllBindVars[cllBindVarCount++]=collNameSlashLen;
08433 cllBindVars[cllBindVarCount++]=collNameSlash;
08434 cllBindVars[cllBindVarCount++]=collName;
08435 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 10");
08436 status = cmlExecuteNoAnswerSql(
08437 "update R_COLL_MAIN set parent_coll_name = substr(parent_coll_name,1,?) || ? || substr(parent_coll_name, ?) where substr(parent_coll_name,1,?) = ? or parent_coll_name = ?",
08438 &icss);
08439 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
08440 rodsLog(LOG_NOTICE,
08441 "chlRenameObject cmlExecuteNoAnswerSql update failure %d",
08442 status);
08443 _rollback("chlRenameObject");
08444 return(status);
08445 }
08446
08447
08448 getNowStr(myTime);
08449 snprintf(collNameTmp, MAX_NAME_LEN, "%s/%s", parentCollName, newName);
08450 if (isRootDir) {
08451 snprintf(collNameTmp, MAX_NAME_LEN, "%s%s", parentCollName, newName);
08452 }
08453 cllBindVars[cllBindVarCount++]=collNameTmp;
08454 cllBindVars[cllBindVarCount++]=myTime;
08455 cllBindVars[cllBindVarCount++]=objIdString;
08456 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 11");
08457 status = cmlExecuteNoAnswerSql(
08458 "update R_COLL_MAIN set coll_name=?, modify_ts=? where coll_id=?",
08459 &icss);
08460 if (status != 0) {
08461 rodsLog(LOG_NOTICE,
08462 "chlRenameObject cmlExecuteNoAnswerSql update failure %d",
08463 status);
08464 _rollback("chlRenameObject");
08465 return(status);
08466 }
08467
08468
08469 status = cmlAudit3(AU_RENAME_COLLECTION,
08470 objIdString,
08471 rsComm->clientUser.userName,
08472 rsComm->clientUser.rodsZone,
08473 newName,
08474 &icss);
08475 if (status != 0) {
08476 rodsLog(LOG_NOTICE,
08477 "chlRenameObject cmlAudit3 failure %d",
08478 status);
08479 _rollback("chlRenameObject");
08480 return(status);
08481 }
08482
08483 return(status);
08484
08485 }
08486
08487
08488
08489
08490
08491 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
08492 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 12");
08493 status = cmlGetIntegerValueFromSql(
08494 "select coll_id from R_DATA_MAIN where data_id=?",
08495 &otherDataId, objIdString, 0, 0, 0, 0, &icss);
08496 if (status == 0) {
08497
08498 return (CAT_NO_ACCESS_PERMISSION);
08499 }
08500
08501 snprintf(collIdString, MAX_NAME_LEN, "%lld", objId);
08502 if (logSQL!=0) rodsLog(LOG_SQL, "chlRenameObject SQL 12");
08503 status = cmlGetIntegerValueFromSql(
08504 "select coll_id from R_COLL_MAIN where coll_id=?",
08505 &otherDataId, collIdString, 0, 0, 0, 0, &icss);
08506 if (status == 0) {
08507
08508 return (CAT_NO_ACCESS_PERMISSION);
08509 }
08510
08511 return(CAT_NOT_A_DATAOBJ_AND_NOT_A_COLLECTION);
08512 }
08513
08514
08515
08516
08517
08518 int chlMoveObject(rsComm_t *rsComm, rodsLong_t objId,
08519 rodsLong_t targetCollId) {
08520 int status;
08521 rodsLong_t collId;
08522 rodsLong_t otherDataId;
08523 rodsLong_t otherCollId;
08524 char myTime[50];
08525
08526 char dataObjName[MAX_NAME_LEN]="";
08527 char *cVal[3];
08528 int iVal[3];
08529
08530 char parentCollName[MAX_NAME_LEN]="";
08531 char oldCollName[MAX_NAME_LEN]="";
08532 char endCollName[MAX_NAME_LEN]="";
08533
08534
08535 char targetCollName[MAX_NAME_LEN]="";
08536 char parentTargetCollName[MAX_NAME_LEN]="";
08537 char newCollName[MAX_NAME_LEN]="";
08538 int pLen, ocLen;
08539 int i, OK, len;
08540 char *cp;
08541 char objIdString[MAX_NAME_LEN];
08542 char collIdString[MAX_NAME_LEN];
08543 char nameTmp[MAX_NAME_LEN];
08544 char ocLenStr[MAX_NAME_LEN];
08545 char collNameSlash[MAX_NAME_LEN];
08546 char collNameSlashLen[20];
08547
08548 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject");
08549
08550
08551
08552 cVal[0]=parentTargetCollName;
08553 iVal[0]=MAX_NAME_LEN;
08554 cVal[1]=targetCollName;
08555 iVal[1]=MAX_NAME_LEN;
08556 snprintf(objIdString, MAX_NAME_LEN, "%lld", targetCollId);
08557 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 1 ");
08558 status = cmlGetStringValuesFromSql(
08559 "select parent_coll_name, coll_name from R_COLL_MAIN CM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where CM.coll_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = CM.coll_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
08560 cVal, iVal, 2, objIdString,
08561 rsComm->clientUser.userName,
08562 rsComm->clientUser.rodsZone, &icss);
08563
08564 snprintf(collIdString, MAX_NAME_LEN, "%lld", targetCollId);
08565 if (status != 0) {
08566 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 2");
08567 status = cmlGetIntegerValueFromSql(
08568 "select coll_id from R_COLL_MAIN where coll_id=?",
08569 &collId, collIdString, 0, 0, 0, 0, &icss);
08570 if (status==0) {
08571 return (CAT_NO_ACCESS_PERMISSION);
08572
08573 }
08574 return(CAT_UNKNOWN_COLLECTION);
08575 }
08576
08577
08578
08579
08580 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
08581 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 3");
08582 status = cmlGetStringValueFromSql(
08583 "select data_name from R_DATA_MAIN DM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where DM.data_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = DM.data_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
08584 dataObjName, MAX_NAME_LEN, objIdString,
08585 rsComm->clientUser.userName,
08586 rsComm->clientUser.rodsZone, &icss);
08587 snprintf(collIdString, MAX_NAME_LEN, "%lld", targetCollId);
08588 if (status == 0) {
08589
08590
08591
08592 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 4");
08593 status = cmlGetIntegerValueFromSql(
08594 "select data_id from R_DATA_MAIN where data_name=? and coll_id=?",
08595 &otherDataId, dataObjName, collIdString, 0, 0, 0, &icss);
08596 if (status!=CAT_NO_ROWS_FOUND) {
08597 return( CAT_NAME_EXISTS_AS_DATAOBJ);
08598 }
08599
08600
08601
08602
08603 snprintf(nameTmp, MAX_NAME_LEN, "/%s", dataObjName);
08604 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 5");
08605 status = cmlGetIntegerValueFromSql(
08606 "select coll_id from R_COLL_MAIN where coll_name = ( select coll_name from R_COLL_MAIN where coll_id=? ) || ?",
08607 &otherCollId, collIdString, nameTmp, 0, 0, 0, &icss);
08608 if (status!=CAT_NO_ROWS_FOUND) {
08609 return( CAT_NAME_EXISTS_AS_COLLECTION);
08610 }
08611
08612
08613 getNowStr(myTime);
08614 cllBindVars[cllBindVarCount++]=collIdString;
08615 cllBindVars[cllBindVarCount++]=myTime;
08616 cllBindVars[cllBindVarCount++]=objIdString;
08617 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 6");
08618 status = cmlExecuteNoAnswerSql(
08619 "update R_DATA_MAIN set coll_id=?, modify_ts=? where data_id=?",
08620 &icss);
08621 if (status != 0) {
08622 rodsLog(LOG_NOTICE,
08623 "chlMoveObject cmlExecuteNoAnswerSql update1 failure %d",
08624 status);
08625 _rollback("chlMoveObject");
08626 return(status);
08627 }
08628
08629
08630 cllBindVars[cllBindVarCount++]=myTime;
08631 cllBindVars[cllBindVarCount++]=collIdString;
08632 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 7");
08633 status = cmlExecuteNoAnswerSql(
08634 "update R_COLL_MAIN set modify_ts=? where coll_id=?",
08635 &icss);
08636 if (status != 0) {
08637 rodsLog(LOG_NOTICE,
08638 "chlMoveObject cmlExecuteNoAnswerSql update2 failure %d",
08639 status);
08640 _rollback("chlMoveObject");
08641 return(status);
08642 }
08643
08644
08645 status = cmlAudit3(AU_MOVE_DATA_OBJ,
08646 objIdString,
08647 rsComm->clientUser.userName,
08648 rsComm->clientUser.rodsZone,
08649 collIdString,
08650 &icss);
08651 if (status != 0) {
08652 rodsLog(LOG_NOTICE,
08653 "chlMoveObject cmlAudit3 failure %d",
08654 status);
08655 _rollback("chlMoveObject");
08656 return(status);
08657 }
08658
08659 return(status);
08660 }
08661
08662
08663
08664 cVal[0]=parentCollName;
08665 iVal[0]=MAX_NAME_LEN;
08666 cVal[1]=oldCollName;
08667 iVal[1]=MAX_NAME_LEN;
08668
08669 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 8");
08670 status = cmlGetStringValuesFromSql(
08671 "select parent_coll_name, coll_name from R_COLL_MAIN CM, R_OBJT_ACCESS OA, R_USER_GROUP UG, R_USER_MAIN UM, R_TOKN_MAIN TM where CM.coll_id=? and UM.user_name=? and UM.zone_name=? and UM.user_type_name!='rodsgroup' and UM.user_id = UG.user_id and OA.object_id = CM.coll_id and UG.group_user_id = OA.user_id and OA.access_type_id >= TM.token_id and TM.token_namespace ='access_type' and TM.token_name = 'own'",
08672 cVal, iVal, 2, objIdString, rsComm->clientUser.userName,
08673 rsComm->clientUser.rodsZone, &icss);
08674 if (status == 0) {
08675
08676
08677 pLen = strlen(parentCollName);
08678
08679 ocLen=strlen(oldCollName);
08680 if (pLen<=0 || ocLen <=0) return(CAT_INVALID_ARGUMENT);
08681
08682
08683 OK=0;
08684 for (i=ocLen;i>0;i--) {
08685 if (oldCollName[i]=='/') {
08686 OK=1;
08687 strncpy(endCollName, (char*)&oldCollName[i+1], MAX_NAME_LEN);
08688 break;
08689 }
08690 }
08691 if (OK==0) return (CAT_INVALID_ARGUMENT);
08692
08693
08694
08695 snprintf(collIdString, MAX_NAME_LEN, "%lld", targetCollId);
08696 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 9");
08697 status = cmlGetIntegerValueFromSql(
08698 "select data_id from R_DATA_MAIN where data_name=? and coll_id=?",
08699 &otherDataId, endCollName, collIdString, 0, 0, 0, &icss);
08700 if (status!=CAT_NO_ROWS_FOUND) {
08701 return( CAT_NAME_EXISTS_AS_DATAOBJ);
08702 }
08703
08704
08705
08706 strncpy(newCollName, targetCollName, MAX_NAME_LEN);
08707 strncat(newCollName, "/", MAX_NAME_LEN);
08708 strncat(newCollName, endCollName, MAX_NAME_LEN);
08709
08710 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 10");
08711 status = cmlGetIntegerValueFromSql(
08712 "select coll_id from R_COLL_MAIN where coll_name = ?",
08713 &otherCollId, newCollName, 0, 0, 0, 0, &icss);
08714 if (status!=CAT_NO_ROWS_FOUND) {
08715 return( CAT_NAME_EXISTS_AS_COLLECTION);
08716 }
08717
08718
08719
08720
08721 cp = strstr(targetCollName, oldCollName);
08722 if (cp == targetCollName &&
08723 (targetCollName[strlen(oldCollName)] == '/' ||
08724 targetCollName[strlen(oldCollName)] == '\0')) {
08725 return(CAT_RECURSIVE_MOVE);
08726 }
08727
08728
08729
08730
08731
08732
08733 getNowStr(myTime);
08734 cllBindVars[cllBindVarCount++]=newCollName;
08735 cllBindVars[cllBindVarCount++]=targetCollName;
08736 cllBindVars[cllBindVarCount++]=myTime;
08737 cllBindVars[cllBindVarCount++]=objIdString;
08738 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 11");
08739 status = cmlExecuteNoAnswerSql(
08740 "update R_COLL_MAIN set coll_name = ?, parent_coll_name=?, modify_ts=? where coll_id = ?",
08741 &icss);
08742 if (status != 0) {
08743 rodsLog(LOG_NOTICE,
08744 "chlMoveObject cmlExecuteNoAnswerSql update failure %d",
08745 status);
08746 _rollback("chlMoveObject");
08747 return(status);
08748 }
08749
08750
08751
08752
08753
08754
08755 snprintf(ocLenStr, MAX_NAME_LEN, "%d", ocLen+1);
08756 snprintf(collNameSlash, MAX_NAME_LEN, "%s/", oldCollName);
08757 len = strlen(collNameSlash);
08758 snprintf(collNameSlashLen, 10, "%d", len);
08759 cllBindVars[cllBindVarCount++]=newCollName;
08760 cllBindVars[cllBindVarCount++]=ocLenStr;
08761 cllBindVars[cllBindVarCount++]=newCollName;
08762 cllBindVars[cllBindVarCount++]=ocLenStr;
08763 cllBindVars[cllBindVarCount++]=collNameSlashLen;
08764 cllBindVars[cllBindVarCount++]=collNameSlash;
08765 cllBindVars[cllBindVarCount++]=oldCollName;
08766 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 12");
08767 status = cmlExecuteNoAnswerSql(
08768 "update R_COLL_MAIN set parent_coll_name = ? || substr(parent_coll_name, ?), coll_name = ? || substr(coll_name, ?) where substr(parent_coll_name,1,?) = ? or parent_coll_name = ?",
08769 &icss);
08770 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) status = 0;
08771 if (status != 0) {
08772 rodsLog(LOG_NOTICE,
08773 "chlMoveObject cmlExecuteNoAnswerSql update failure %d",
08774 status);
08775 _rollback("chlMoveObject");
08776 return(status);
08777 }
08778
08779
08780 status = cmlAudit3(AU_MOVE_COLL,
08781 objIdString,
08782 rsComm->clientUser.userName,
08783 rsComm->clientUser.rodsZone,
08784 targetCollName,
08785 &icss);
08786 if (status != 0) {
08787 rodsLog(LOG_NOTICE,
08788 "chlMoveObject cmlAudit3 failure %d",
08789 status);
08790 _rollback("chlMoveObject");
08791 return(status);
08792 }
08793
08794 return(status);
08795 }
08796
08797
08798
08799
08800 snprintf(objIdString, MAX_NAME_LEN, "%lld", objId);
08801 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 13");
08802 status = cmlGetIntegerValueFromSql(
08803 "select coll_id from R_DATA_MAIN where data_id=?",
08804 &otherDataId, objIdString, 0, 0, 0, 0, &icss);
08805 if (status == 0) {
08806
08807 return (CAT_NO_ACCESS_PERMISSION);
08808 }
08809
08810 if (logSQL!=0) rodsLog(LOG_SQL, "chlMoveObject SQL 14");
08811 status = cmlGetIntegerValueFromSql(
08812 "select coll_id from R_COLL_MAIN where coll_id=?",
08813 &otherDataId, objIdString, 0, 0, 0, 0, &icss);
08814 if (status == 0) {
08815
08816 return (CAT_NO_ACCESS_PERMISSION);
08817 }
08818
08819 return(CAT_NOT_A_DATAOBJ_AND_NOT_A_COLLECTION);
08820 }
08821
08822
08823
08824
08825 int chlRegToken(rsComm_t *rsComm, char *nameSpace, char *name, char *value,
08826 char *value2, char *value3, char *comment)
08827 {
08828 int status;
08829 rodsLong_t objId;
08830 char *myValue1, *myValue2, *myValue3, *myComment;
08831 char myTime[50];
08832 rodsLong_t seqNum;
08833 char errMsg[205];
08834 char seqNumStr[MAX_NAME_LEN];
08835
08836 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken");
08837
08838 if (nameSpace==NULL || strlen(nameSpace)==0) return (CAT_INVALID_ARGUMENT);
08839 if (name==NULL || strlen(name)==0) return (CAT_INVALID_ARGUMENT);
08840
08841 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken SQL 1 ");
08842 status = cmlGetIntegerValueFromSql(
08843 "select token_id from R_TOKN_MAIN where token_namespace=? and token_name=?",
08844 &objId, "token_namespace", nameSpace, 0, 0, 0, &icss);
08845 if (status != 0) {
08846 snprintf(errMsg, 200,
08847 "Token namespace '%s' does not exist",
08848 nameSpace);
08849 addRErrorMsg (&rsComm->rError, 0, errMsg);
08850 return (CAT_INVALID_ARGUMENT);
08851 }
08852
08853 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken SQL 2");
08854 status = cmlGetIntegerValueFromSql(
08855 "select token_id from R_TOKN_MAIN where token_namespace=? and token_name=?",
08856 &objId, nameSpace, name, 0, 0, 0, &icss);
08857 if (status == 0) {
08858 snprintf(errMsg, 200,
08859 "Token '%s' already exists in namespace '%s'",
08860 name, nameSpace);
08861 addRErrorMsg (&rsComm->rError, 0, errMsg);
08862 return (CAT_INVALID_ARGUMENT);
08863 }
08864
08865 myValue1=value;
08866 if (myValue1==NULL) myValue1="";
08867 myValue2=value2;
08868 if (myValue2==NULL) myValue2="";
08869 myValue3=value3;
08870 if (myValue3==NULL) myValue3="";
08871 myComment=comment;
08872 if (myComment==NULL) myComment="";
08873
08874 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken SQL 3");
08875 seqNum = cmlGetNextSeqVal(&icss);
08876 if (seqNum < 0) {
08877 rodsLog(LOG_NOTICE, "chlRegToken cmlGetNextSeqVal failure %d",
08878 seqNum);
08879 return(seqNum);
08880 }
08881
08882 getNowStr(myTime);
08883 snprintf(seqNumStr, sizeof seqNumStr, "%lld", seqNum);
08884 cllBindVars[cllBindVarCount++]=nameSpace;
08885 cllBindVars[cllBindVarCount++]=seqNumStr;
08886 cllBindVars[cllBindVarCount++]=name;
08887 cllBindVars[cllBindVarCount++]=myValue1;
08888 cllBindVars[cllBindVarCount++]=myValue2;
08889 cllBindVars[cllBindVarCount++]=myValue3;
08890 cllBindVars[cllBindVarCount++]=myComment;
08891 cllBindVars[cllBindVarCount++]=myTime;
08892 cllBindVars[cllBindVarCount++]=myTime;
08893 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegToken SQL 4");
08894 status = cmlExecuteNoAnswerSql(
08895 "insert into R_TOKN_MAIN values (?, ?, ?, ?, ?, ?, ?, ?, ?)",
08896 &icss);
08897 if (status != 0) {
08898 _rollback("chlRegToken");
08899 return(status);
08900 }
08901
08902
08903 status = cmlAudit3(AU_REG_TOKEN,
08904 seqNumStr,
08905 rsComm->clientUser.userName,
08906 rsComm->clientUser.rodsZone,
08907 name,
08908 &icss);
08909 if (status != 0) {
08910 rodsLog(LOG_NOTICE,
08911 "chlRegToken cmlAudit3 failure %d",
08912 status);
08913 _rollback("chlRegToken");
08914 return(status);
08915 }
08916
08917 status = cmlExecuteNoAnswerSql("commit", &icss);
08918 return(status);
08919 }
08920
08921
08922
08923
08924
08925 int chlDelToken(rsComm_t *rsComm, char *nameSpace, char *name)
08926 {
08927 int status;
08928 rodsLong_t objId;
08929 char errMsg[205];
08930 char objIdStr[60];
08931
08932 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelToken");
08933
08934 if (nameSpace==NULL || strlen(nameSpace)==0) return (CAT_INVALID_ARGUMENT);
08935 if (name==NULL || strlen(name)==0) return (CAT_INVALID_ARGUMENT);
08936
08937 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelToken SQL 1 ");
08938 status = cmlGetIntegerValueFromSql(
08939 "select token_id from R_TOKN_MAIN where token_namespace=? and token_name=?",
08940 &objId, nameSpace, name, 0, 0, 0, &icss);
08941 if (status != 0) {
08942 snprintf(errMsg, 200,
08943 "Token '%s' does not exist in namespace '%s'",
08944 name, nameSpace);
08945 addRErrorMsg (&rsComm->rError, 0, errMsg);
08946 return (CAT_INVALID_ARGUMENT);
08947 }
08948
08949 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelToken SQL 2");
08950 cllBindVars[cllBindVarCount++]=nameSpace;
08951 cllBindVars[cllBindVarCount++]=name;
08952 status = cmlExecuteNoAnswerSql(
08953 "delete from R_TOKN_MAIN where token_namespace=? and token_name=?",
08954 &icss);
08955 if (status != 0) {
08956 _rollback("chlDelToken");
08957 return(status);
08958 }
08959
08960
08961 snprintf(objIdStr, sizeof objIdStr, "%lld", objId);
08962 status = cmlAudit3(AU_DEL_TOKEN,
08963 objIdStr,
08964 rsComm->clientUser.userName,
08965 rsComm->clientUser.rodsZone,
08966 name,
08967 &icss);
08968 if (status != 0) {
08969 rodsLog(LOG_NOTICE,
08970 "chlDelToken cmlAudit3 failure %d",
08971 status);
08972 _rollback("chlDelToken");
08973 return(status);
08974 }
08975
08976 status = cmlExecuteNoAnswerSql("commit", &icss);
08977 return(status);
08978 }
08979
08980
08981
08982
08983
08984
08985
08986 int chlRegServerLoad(rsComm_t *rsComm,
08987 char *hostName, char *rescName,
08988 char *cpuUsed, char *memUsed, char *swapUsed,
08989 char *runqLoad, char *diskSpace, char *netInput,
08990 char *netOutput) {
08991 char myTime[50];
08992 int status;
08993 int i;
08994
08995 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegServerLoad");
08996
08997 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
08998 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
08999 }
09000
09001 if (!icss.status) {
09002 return(CATALOG_NOT_CONNECTED);
09003 }
09004
09005 getNowStr(myTime);
09006
09007 i=0;
09008 cllBindVars[i++]=hostName;
09009 cllBindVars[i++]=rescName;
09010 cllBindVars[i++]=cpuUsed;
09011 cllBindVars[i++]=memUsed;
09012 cllBindVars[i++]=swapUsed;
09013 cllBindVars[i++]=runqLoad;
09014 cllBindVars[i++]=diskSpace;
09015 cllBindVars[i++]=netInput;
09016 cllBindVars[i++]=netOutput;
09017 cllBindVars[i++]=myTime;
09018 cllBindVarCount=i;
09019 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegServerLoad SQL 1");
09020 status = cmlExecuteNoAnswerSql(
09021 "insert into R_SERVER_LOAD (host_name, resc_name, cpu_used, mem_used, swap_used, runq_load, disk_space, net_input, net_output, create_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
09022 &icss);
09023 if (status != 0) {
09024 rodsLog(LOG_NOTICE,
09025 "chlRegServerLoad cmlExecuteNoAnswerSql failure %d",status);
09026 _rollback("chlRegServerLoad");
09027 return(status);
09028 }
09029
09030 status = cmlExecuteNoAnswerSql("commit", &icss);
09031 if (status != 0) {
09032 rodsLog(LOG_NOTICE,
09033 "chlRegServerLoad cmlExecuteNoAnswerSql commit failure %d",
09034 status);
09035 return(status);
09036 }
09037
09038 return(0);
09039 }
09040
09041
09042
09043
09044
09045
09046
09047 int chlPurgeServerLoad(rsComm_t *rsComm, char *secondsAgo) {
09048
09049
09050 int status;
09051 char nowStr[50];
09052 static char thenStr[50];
09053 time_t nowTime;
09054 time_t thenTime;
09055 time_t secondsAgoTime;
09056
09057 if (logSQL!=0) rodsLog(LOG_SQL, "chlPurgeServerLoad");
09058
09059 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09060 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09061 }
09062
09063 getNowStr(nowStr);
09064 nowTime=atoll(nowStr);
09065 secondsAgoTime=atoll(secondsAgo);
09066 thenTime = nowTime - secondsAgoTime;
09067 snprintf(thenStr, sizeof thenStr, "%011d", (uint) thenTime);
09068
09069 if (logSQL!=0) rodsLog(LOG_SQL, "chlPurgeServerLoad SQL 1");
09070
09071 cllBindVars[cllBindVarCount++]=thenStr;
09072 status = cmlExecuteNoAnswerSql(
09073 "delete from R_SERVER_LOAD where create_ts <?",
09074 &icss);
09075 if (status != 0) {
09076 _rollback("chlPurgeServerLoad");
09077 return(status);
09078 }
09079
09080 status = cmlExecuteNoAnswerSql("commit", &icss);
09081 return(status);
09082 }
09083
09084
09085
09086
09087
09088
09089 int chlRegServerLoadDigest(rsComm_t *rsComm,
09090 char *rescName, char *loadFactor) {
09091 char myTime[50];
09092 int status;
09093 int i;
09094
09095 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegServerLoadDigest");
09096
09097 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09098 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09099 }
09100
09101 if (!icss.status) {
09102 return(CATALOG_NOT_CONNECTED);
09103 }
09104
09105 getNowStr(myTime);
09106
09107 i=0;
09108 cllBindVars[i++]=rescName;
09109 cllBindVars[i++]=loadFactor;
09110 cllBindVars[i++]=myTime;
09111 cllBindVarCount=i;
09112
09113 if (logSQL!=0) rodsLog(LOG_SQL, "chlRegServerLoadDigest SQL 1");
09114 status = cmlExecuteNoAnswerSql(
09115 "insert into R_SERVER_LOAD_DIGEST (resc_name, load_factor, create_ts) values (?, ?, ?)",
09116 &icss);
09117 if (status != 0) {
09118 rodsLog(LOG_NOTICE,
09119 "chlRegServerLoadDigest cmlExecuteNoAnswerSql failure %d", status);
09120 _rollback("chlRegServerLoadDigest");
09121 return(status);
09122 }
09123
09124 status = cmlExecuteNoAnswerSql("commit", &icss);
09125 if (status != 0) {
09126 rodsLog(LOG_NOTICE,
09127 "chlRegServerLoadDigest cmlExecuteNoAnswerSql commit failure %d",
09128 status);
09129 return(status);
09130 }
09131
09132 return(0);
09133 }
09134
09135
09136
09137
09138
09139
09140
09141 int chlPurgeServerLoadDigest(rsComm_t *rsComm, char *secondsAgo) {
09142
09143 int status;
09144 char nowStr[50];
09145 static char thenStr[50];
09146 time_t nowTime;
09147 time_t thenTime;
09148 time_t secondsAgoTime;
09149
09150 if (logSQL!=0) rodsLog(LOG_SQL, "chlPurgeServerLoadDigest");
09151
09152 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09153 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09154 }
09155
09156 getNowStr(nowStr);
09157 nowTime=atoll(nowStr);
09158 secondsAgoTime=atoll(secondsAgo);
09159 thenTime = nowTime - secondsAgoTime;
09160 snprintf(thenStr, sizeof thenStr, "%011d", (uint) thenTime);
09161
09162 if (logSQL!=0) rodsLog(LOG_SQL, "chlPurgeServerLoadDigest SQL 1");
09163
09164 cllBindVars[cllBindVarCount++]=thenStr;
09165 status = cmlExecuteNoAnswerSql(
09166 "delete from R_SERVER_LOAD_DIGEST where create_ts <?",
09167 &icss);
09168 if (status != 0) {
09169 _rollback("chlPurgeServerLoadDigest");
09170 return(status);
09171 }
09172
09173 status = cmlExecuteNoAnswerSql("commit", &icss);
09174 return(status);
09175 }
09176
09177
09178
09179
09180
09181
09182
09183
09184
09185 int setOverQuota(rsComm_t *rsComm) {
09186 int status;
09187 int rowsFound;
09188 int statementNum;
09189 char myTime[50];
09190
09191
09192
09193 char mySQL1[]="select sum(quota_usage), UM1.user_id, R_QUOTA_USAGE.resc_id from R_QUOTA_USAGE, R_QUOTA_MAIN, R_USER_MAIN UM1, R_USER_GROUP, R_USER_MAIN UM2 where R_QUOTA_MAIN.user_id = UM1.user_id and UM1.user_type_name = 'rodsgroup' and R_USER_GROUP.group_user_id = UM1.user_id and UM2.user_id = R_USER_GROUP.user_id and R_QUOTA_USAGE.user_id = UM2.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id group by UM1.user_id, R_QUOTA_USAGE.resc_id";
09194
09195
09196
09197 char mySQL2a[]="select sum(quota_usage), R_QUOTA_MAIN.quota_limit, UM1.user_id from R_QUOTA_USAGE, R_QUOTA_MAIN, R_USER_MAIN UM1, R_USER_GROUP, R_USER_MAIN UM2 where R_QUOTA_MAIN.user_id = UM1.user_id and UM1.user_type_name = 'rodsgroup' and R_USER_GROUP.group_user_id = UM1.user_id and UM2.user_id = R_USER_GROUP.user_id and R_QUOTA_USAGE.user_id = UM2.user_id and R_QUOTA_USAGE.resc_id != %s and R_QUOTA_MAIN.resc_id = %s group by UM1.user_id, R_QUOTA_MAIN.quota_limit";
09198 char mySQL2b[MAX_SQL_SIZE];
09199
09200 char mySQL3a[]="update R_QUOTA_MAIN set quota_over= %s - ?, modify_ts=? where user_id=? and %s - ? > quota_over";
09201 char mySQL3b[MAX_SQL_SIZE];
09202
09203
09204
09205
09206 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 1");
09207 status = cmlExecuteNoAnswerSql(
09208 "update R_QUOTA_MAIN set quota_over = -quota_limit", &icss);
09209 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) return(0);
09210 if (status != 0) return(status);
09211
09212
09213 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 2");
09214 status = cmlExecuteNoAnswerSql(
09215 #if ORA_ICAT
09216 "update R_QUOTA_MAIN set quota_over = (select R_QUOTA_USAGE.quota_usage - R_QUOTA_MAIN.quota_limit from R_QUOTA_USAGE, R_QUOTA_MAIN where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id) where exists (select 1 from R_QUOTA_USAGE, R_QUOTA_MAIN where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id)",
09217 #elif MY_ICAT
09218 "update R_QUOTA_MAIN, R_QUOTA_USAGE set R_QUOTA_MAIN.quota_over = R_QUOTA_USAGE.quota_usage - R_QUOTA_MAIN.quota_limit where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id",
09219 #else
09220 "update R_QUOTA_MAIN set quota_over = quota_usage - quota_limit from R_QUOTA_USAGE where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = R_QUOTA_USAGE.resc_id",
09221 #endif
09222 &icss);
09223 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
09224 if (status != 0) return(status);
09225
09226
09227
09228
09229
09230 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 3");
09231 getNowStr(myTime);
09232 for (rowsFound=0;;rowsFound++) {
09233 int status2;
09234 if (rowsFound==0) {
09235 status = cmlGetFirstRowFromSql("select sum(quota_usage), R_QUOTA_MAIN.user_id from R_QUOTA_USAGE, R_QUOTA_MAIN where R_QUOTA_MAIN.user_id = R_QUOTA_USAGE.user_id and R_QUOTA_MAIN.resc_id = '0' group by R_QUOTA_MAIN.user_id",
09236 &statementNum, 0, &icss);
09237 }
09238 else {
09239 status = cmlGetNextRowFromStatement(statementNum, &icss);
09240 }
09241 if (status != 0) break;
09242 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
09243 cllBindVars[cllBindVarCount++]=myTime;
09244 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[1];
09245 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
09246 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 4");
09247 status2 = cmlExecuteNoAnswerSql("update R_QUOTA_MAIN set quota_over=?-quota_limit, modify_ts=? where user_id=? and ?-quota_limit > quota_over and resc_id='0'",
09248 &icss);
09249 if (status2 == CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
09250 if (status2 != 0) return(status2);
09251 }
09252
09253
09254 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 5");
09255 for (rowsFound=0;;rowsFound++) {
09256 int status2;
09257 if (rowsFound==0) {
09258 status = cmlGetFirstRowFromSql(mySQL1, &statementNum,
09259 0, &icss);
09260 }
09261 else {
09262 status = cmlGetNextRowFromStatement(statementNum, &icss);
09263 }
09264 if (status != 0) break;
09265 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
09266 cllBindVars[cllBindVarCount++]=myTime;
09267 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[1];
09268 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
09269 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[2];
09270 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 6");
09271 status2 = cmlExecuteNoAnswerSql("update R_QUOTA_MAIN set quota_over=?-quota_limit, modify_ts=? where user_id=? and ?-quota_limit > quota_over and R_QUOTA_MAIN.resc_id=?",
09272 &icss);
09273 if (status2 == CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
09274 if (status2 != 0) return(status2);
09275 }
09276 if (status==CAT_NO_ROWS_FOUND) status=0;
09277 if (status != 0) return(status);
09278
09279
09280 #if ORA_ICAT
09281
09282 snprintf(mySQL2b, sizeof mySQL2b, mySQL2a,
09283 "cast('0' as integer)", "cast('0' as integer)");
09284 snprintf(mySQL3b, sizeof mySQL3b, mySQL3a,
09285 "cast(? as integer)", "cast(? as integer)");
09286 #elif MY_ICAT
09287 snprintf(mySQL2b, sizeof mySQL2b, mySQL2a, "'0'", "'0'");
09288 snprintf(mySQL3b, sizeof mySQL3b, mySQL3a, "?", "?");
09289 #else
09290 snprintf(mySQL2b, sizeof mySQL2b, mySQL2a,
09291 "cast('0' as bigint)", "cast('0' as bigint)");
09292 snprintf(mySQL3b, sizeof mySQL3b, mySQL3a,
09293 "cast(? as bigint)", "cast(? as bigint)");
09294 #endif
09295 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 7");
09296 getNowStr(myTime);
09297 for (rowsFound=0;;rowsFound++) {
09298 int status2;
09299 if (rowsFound==0) {
09300 status = cmlGetFirstRowFromSql(mySQL2b, &statementNum,
09301 0, &icss);
09302 }
09303 else {
09304 status = cmlGetNextRowFromStatement(statementNum, &icss);
09305 }
09306 if (status != 0) break;
09307 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
09308 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[1];
09309 cllBindVars[cllBindVarCount++]=myTime;
09310 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[2];
09311 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[0];
09312 cllBindVars[cllBindVarCount++]=icss.stmtPtr[statementNum]->resultValue[1];
09313 if (logSQL!=0) rodsLog(LOG_SQL, "setOverQuota SQL 8");
09314 status2 = cmlExecuteNoAnswerSql(mySQL3b,
09315 &icss);
09316 if (status2 == CAT_SUCCESS_BUT_WITH_NO_INFO) status2=0;
09317 if (status2 != 0) return(status2);
09318 }
09319 if (status==CAT_NO_ROWS_FOUND) status=0;
09320 if (status != 0) return(status);
09321
09322
09323
09324
09325
09326
09327 return(status);
09328 }
09329
09330
09331 int chlCalcUsageAndQuota(rsComm_t *rsComm) {
09332 int status;
09333 char myTime[50];
09334
09335 status = 0;
09336 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09337 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09338 }
09339
09340 rodsLog(LOG_NOTICE,
09341 "chlCalcUsageAndQuota called");
09342
09343
09344 getNowStr(myTime);
09345
09346
09347 if (logSQL!=0) rodsLog(LOG_SQL, "chlCalcUsageAndQuota SQL 1");
09348 cllBindVars[cllBindVarCount++]=myTime;
09349 status = cmlExecuteNoAnswerSql(
09350 "delete from R_QUOTA_USAGE where modify_ts < ?", &icss);
09351 if (status !=0 && status !=CAT_SUCCESS_BUT_WITH_NO_INFO) {
09352 _rollback("chlCalcUsageAndQuota");
09353 return(status);
09354 }
09355
09356
09357 if (logSQL!=0) rodsLog(LOG_SQL, "chlCalcUsageAndQuota SQL 2");
09358 cllBindVars[cllBindVarCount++]=myTime;
09359 status = cmlExecuteNoAnswerSql(
09360 "insert into R_QUOTA_USAGE (quota_usage, resc_id, user_id, modify_ts) (select sum(R_DATA_MAIN.data_size), R_RESC_MAIN.resc_id, R_USER_MAIN.user_id, ? from R_DATA_MAIN, R_USER_MAIN, R_RESC_MAIN where R_USER_MAIN.user_name = R_DATA_MAIN.data_owner_name and R_USER_MAIN.zone_name = R_DATA_MAIN.data_owner_zone and R_RESC_MAIN.resc_name = R_DATA_MAIN.resc_name group by R_RESC_MAIN.resc_id, user_id)",
09361 &icss);
09362 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) status=0;
09363 if (status != 0) {
09364 _rollback("chlCalcUsageAndQuota");
09365 return(status);
09366 }
09367
09368
09369 status = setOverQuota(rsComm);
09370 if (status != 0) {
09371 _rollback("chlCalcUsageAndQuota");
09372 return(status);
09373 }
09374
09375 status = cmlExecuteNoAnswerSql("commit", &icss);
09376 return(status);
09377 }
09378
09379 int chlSetQuota(rsComm_t *rsComm, char *type, char *name,
09380 char *rescName, char* limit) {
09381 int status;
09382 rodsLong_t rescId;
09383 rodsLong_t userId;
09384 char userZone[NAME_LEN];
09385 char userName[NAME_LEN];
09386 char rescIdStr[60];
09387 char userIdStr[60];
09388 char myTime[50];
09389 int itype=0;
09390
09391 if (strncmp(type, "user",4)==0) itype=1;
09392 if (strncmp(type, "group",5)==0) itype=2;
09393 if (itype==0) return (CAT_INVALID_ARGUMENT);
09394
09395 status = getLocalZone();
09396 if (status != 0) return(status);
09397
09398
09399 rescId=0;
09400 if (strncmp(rescName,"total",5)!=0) {
09401 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 1");
09402 status = cmlGetIntegerValueFromSql(
09403 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
09404 &rescId, rescName, localZone, 0, 0, 0, &icss);
09405 if (status != 0) {
09406 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
09407 _rollback("chlSetQuota");
09408 return(status);
09409 }
09410 }
09411
09412
09413 status = parseUserName(name, userName, userZone);
09414 if (userZone[0]=='\0') {
09415 strncpy(userZone, localZone, NAME_LEN);
09416 }
09417
09418 if (itype==1) {
09419 userId=0;
09420 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 2");
09421 status = cmlGetIntegerValueFromSql(
09422 "select user_id from R_USER_MAIN where user_name=? and zone_name=?",
09423 &userId, userName, userZone, 0, 0, 0, &icss);
09424 if (status != 0) {
09425 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_USER);
09426 _rollback("chlSetQuota");
09427 return(status);
09428 }
09429 }
09430 else {
09431 userId=0;
09432 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 3");
09433 status = cmlGetIntegerValueFromSql(
09434 "select user_id from R_USER_MAIN where user_name=? and zone_name=? and user_type_name='rodsgroup'",
09435 &userId, userName, userZone, 0, 0, 0, &icss);
09436 if (status != 0) {
09437 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_GROUP);
09438 _rollback("chlSetQuota");
09439 return(status);
09440 }
09441 }
09442
09443 snprintf(userIdStr, sizeof userIdStr, "%lld", userId);
09444 snprintf(rescIdStr, sizeof rescIdStr, "%lld", rescId);
09445
09446
09447 cllBindVars[cllBindVarCount++]=userIdStr;
09448 cllBindVars[cllBindVarCount++]=rescIdStr;
09449 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 4");
09450 status = cmlExecuteNoAnswerSql(
09451 "delete from R_QUOTA_MAIN where user_id=? and resc_id=?",
09452 &icss);
09453 if (status != 0) {
09454 rodsLog(LOG_DEBUG,
09455 "chlSetQuota cmlExecuteNoAnswerSql delete failure %d",
09456 status);
09457 }
09458 if (atol(limit)>0) {
09459 getNowStr(myTime);
09460 cllBindVars[cllBindVarCount++]=userIdStr;
09461 cllBindVars[cllBindVarCount++]=rescIdStr;
09462 cllBindVars[cllBindVarCount++]=limit;
09463 cllBindVars[cllBindVarCount++]=myTime;
09464 if (logSQL!=0) rodsLog(LOG_SQL, "chlSetQuota SQL 5");
09465 status = cmlExecuteNoAnswerSql(
09466 "insert into R_QUOTA_MAIN (user_id, resc_id, quota_limit, modify_ts) values (?, ?, ?, ?)",
09467 &icss);
09468 if (status != 0) {
09469 rodsLog(LOG_NOTICE,
09470 "chlSetQuota cmlExecuteNoAnswerSql insert failure %d",
09471 status);
09472 _rollback("chlSetQuota");
09473 return(status);
09474 }
09475 }
09476
09477
09478
09479
09480 status = setOverQuota(rsComm);
09481 if (status != 0) {
09482 _rollback("chlSetQuota");
09483 return(status);
09484 }
09485
09486 status = cmlExecuteNoAnswerSql("commit", &icss);
09487 return(status);
09488 }
09489
09490
09491 int
09492 chlCheckQuota(rsComm_t *rsComm, char *userName, char *rescName,
09493 rodsLong_t *userQuota, int *quotaStatus) {
09494
09495
09496
09497
09498
09499
09500
09501
09502
09503 int status;
09504 int statementNum;
09505
09506 char mySQL[]="select distinct QM.user_id, QM.resc_id, QM.quota_limit, QM.quota_over from R_QUOTA_MAIN QM, R_USER_MAIN UM, R_RESC_MAIN RM, R_USER_GROUP UG, R_USER_MAIN UM2 where ( (QM.user_id = UM.user_id and UM.user_name = ?) or (QM.user_id = UG.group_user_id and UM2.user_name = ? and UG.user_id = UM2.user_id) ) and ((QM.resc_id = RM.resc_id and RM.resc_name = ?) or QM.resc_id = '0') order by quota_over desc";
09507
09508 *userQuota = 0;
09509 if (logSQL!=0) rodsLog(LOG_SQL, "chlCheckQuota SQL 1");
09510 cllBindVars[cllBindVarCount++]=userName;
09511 cllBindVars[cllBindVarCount++]=userName;
09512 cllBindVars[cllBindVarCount++]=rescName;
09513
09514 status = cmlGetFirstRowFromSql(mySQL, &statementNum,
09515 0, &icss);
09516
09517 if (status == CAT_SUCCESS_BUT_WITH_NO_INFO) {
09518 rodsLog(LOG_NOTICE,
09519 "chlCheckQuota - CAT_SUCCESS_BUT_WITH_NO_INFO");
09520 *quotaStatus = QUOTA_UNRESTRICTED;
09521 return(0);
09522 }
09523
09524 if (status == CAT_NO_ROWS_FOUND) {
09525 rodsLog(LOG_NOTICE,
09526 "chlCheckQuota - CAT_NO_ROWS_FOUND");
09527 *quotaStatus = QUOTA_UNRESTRICTED;
09528 return(0);
09529 }
09530
09531 if (status != 0) return(status);
09532
09533 #if 0
09534 for (i=0;i<4;i++) {
09535 rodsLog(LOG_NOTICE, "checkvalue: %s",
09536 icss.stmtPtr[statementNum]->resultValue[i]);
09537 }
09538 #endif
09539
09540
09541 rodsLog(LOG_NOTICE, "checkQuota: inUser:%s inResc:%s RescId:%s Quota:%s",
09542 userName, rescName,
09543 icss.stmtPtr[statementNum]->resultValue[1],
09544 icss.stmtPtr[statementNum]->resultValue[3]);
09545
09546 *userQuota = atoll(icss.stmtPtr[statementNum]->resultValue[3]);
09547 if (atoi(icss.stmtPtr[statementNum]->resultValue[1])==0) {
09548 *quotaStatus=QUOTA_GLOBAL;
09549 }
09550 else {
09551 *quotaStatus=QUOTA_RESOURCE;
09552 }
09553 cmlFreeStatement(statementNum, &icss);
09554
09555 return(status);
09556 }
09557
09558 int
09559 chlDelUnusedAVUs(rsComm_t *rsComm) {
09560
09561
09562
09563
09564
09565 int status;
09566 status = removeAVUs();
09567
09568 if (status == 0) {
09569 status = cmlExecuteNoAnswerSql("commit", &icss);
09570 }
09571 return(status);
09572
09573 }
09574
09575
09576
09577
09578
09579
09580
09581 int
09582 chlInsRuleTable(rsComm_t *rsComm,
09583 char *baseName, char *mapPriorityStr, char *ruleName,
09584 char *ruleHead, char *ruleCondition, char *ruleAction,
09585 char *ruleRecovery, char *ruleIdStr, char *myTime) {
09586 int status;
09587 int i;
09588 rodsLong_t seqNum = -1;
09589
09590 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsRuleTable");
09591
09592 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09593 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09594 }
09595
09596 if (!icss.status) {
09597 return(CATALOG_NOT_CONNECTED);
09598 }
09599
09600
09601 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsRuleTable SQL 1");
09602 i=0;
09603 cllBindVars[i++]=baseName;
09604 cllBindVars[i++]=ruleName;
09605 cllBindVars[i++]=ruleHead;
09606 cllBindVars[i++]=ruleCondition;
09607 cllBindVars[i++]=ruleAction;
09608 cllBindVars[i++]=ruleRecovery;
09609 cllBindVarCount=i;
09610 status = cmlGetIntegerValueFromSqlV3(
09611 "select rule_id from R_RULE_MAIN where rule_base_name = ? and rule_name = ? and rule_event = ? and rule_condition = ? and rule_body = ? and rule_recovery = ?",
09612 &seqNum,
09613 &icss);
09614 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09615 rodsLog(LOG_NOTICE,
09616 "chlInsRuleTable cmlGetIntegerValueFromSqlV3 find rule if any failure %d",status);
09617 return(status);
09618 }
09619 if (seqNum < 0) {
09620 seqNum = cmlGetNextSeqVal(&icss);
09621 if (seqNum < 0) {
09622 rodsLog(LOG_NOTICE, "chlInsRuleTable cmlGetNextSeqVal failure %d",
09623 seqNum);
09624 _rollback("chlInsRuleTable");
09625 return(seqNum);
09626 }
09627 snprintf(ruleIdStr, MAX_NAME_LEN, "%lld", seqNum);
09628
09629 i=0;
09630 cllBindVars[i++]=ruleIdStr;
09631 cllBindVars[i++]=baseName;
09632 cllBindVars[i++]=ruleName;
09633 cllBindVars[i++]=ruleHead;
09634 cllBindVars[i++]=ruleCondition;
09635 cllBindVars[i++]=ruleAction;
09636 cllBindVars[i++]=ruleRecovery;
09637 cllBindVars[i++]=rsComm->clientUser.userName;
09638 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09639 cllBindVars[i++]=myTime;
09640 cllBindVars[i++]=myTime;
09641 cllBindVarCount=i;
09642 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsRuleTable SQL 2");
09643 status = cmlExecuteNoAnswerSql(
09644 "insert into R_RULE_MAIN(rule_id, rule_base_name, rule_name, rule_event, rule_condition, rule_body, rule_recovery, rule_owner_name, rule_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
09645 &icss);
09646 if (status != 0) {
09647 rodsLog(LOG_NOTICE,
09648 "chlInsRuleTable cmlExecuteNoAnswerSql Rule Main Insert failure %d",status);
09649 return(status);
09650 }
09651 }
09652 else {
09653 snprintf(ruleIdStr, MAX_NAME_LEN, "%lld", seqNum);
09654 }
09655 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsRuleTable SQL 3");
09656 i = 0;
09657 cllBindVars[i++]=baseName;
09658 cllBindVars[i++]=mapPriorityStr;
09659 cllBindVars[i++]=ruleIdStr;
09660 cllBindVars[i++]=rsComm->clientUser.userName;
09661 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09662 cllBindVars[i++]=myTime;
09663 cllBindVars[i++]=myTime;
09664 cllBindVarCount=i;
09665 status = cmlExecuteNoAnswerSql(
09666 "insert into R_RULE_BASE_MAP (map_base_name, map_priority, rule_id, map_owner_name,map_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?)",
09667 &icss);
09668 if (status != 0) {
09669 rodsLog(LOG_NOTICE,
09670 "chlInsRuleTable cmlExecuteNoAnswerSql Rule Map insert failure %d" , status);
09671
09672 return(status);
09673 }
09674
09675 return(0);
09676 }
09677
09678
09679
09680
09681
09682
09683 int
09684 chlInsDvmTable(rsComm_t *rsComm,
09685 char *baseName, char *varName, char *action,
09686 char *var2CMap, char *myTime) {
09687 int status;
09688 int i;
09689 rodsLong_t seqNum = -1;
09690 char dvmIdStr[MAX_NAME_LEN];
09691 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsDvmTable");
09692
09693 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09694 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09695 }
09696
09697 if (!icss.status) {
09698 return(CATALOG_NOT_CONNECTED);
09699 }
09700
09701
09702 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsDvmTable SQL 1");
09703 i=0;
09704 cllBindVars[i++]=baseName;
09705 cllBindVars[i++]=varName;
09706 cllBindVars[i++]=action;
09707 cllBindVars[i++]=var2CMap;
09708 cllBindVarCount=i;
09709 status = cmlGetIntegerValueFromSqlV3(
09710 "select dvm_id from R_RULE_DVM where dvm_base_name = ? and dvm_ext_var_name = ? and dvm_condition = ? and dvm_int_map_path = ? ",
09711 &seqNum,
09712 &icss);
09713 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09714 rodsLog(LOG_NOTICE,
09715 "chlInsDvmTable cmlGetIntegerValueFromSqlV3 find DVM if any failure %d",status);
09716 return(status);
09717 }
09718 if (seqNum < 0) {
09719 seqNum = cmlGetNextSeqVal(&icss);
09720 if (seqNum < 0) {
09721 rodsLog(LOG_NOTICE, "chlInsDvmTable cmlGetNextSeqVal failure %d",
09722 seqNum);
09723 _rollback("chlInsDvmTable");
09724 return(seqNum);
09725 }
09726 snprintf(dvmIdStr, MAX_NAME_LEN, "%lld", seqNum);
09727
09728 i=0;
09729 cllBindVars[i++]=dvmIdStr;
09730 cllBindVars[i++]=baseName;
09731 cllBindVars[i++]=varName;
09732 cllBindVars[i++]=action;
09733 cllBindVars[i++]=var2CMap;
09734 cllBindVars[i++]=rsComm->clientUser.userName;
09735 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09736 cllBindVars[i++]=myTime;
09737 cllBindVars[i++]=myTime;
09738 cllBindVarCount=i;
09739 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsDvmTable SQL 2");
09740 status = cmlExecuteNoAnswerSql(
09741 "insert into R_RULE_DVM(dvm_id, dvm_base_name, dvm_ext_var_name, dvm_condition, dvm_int_map_path, dvm_owner_name, dvm_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?)",
09742 &icss);
09743 if (status != 0) {
09744 rodsLog(LOG_NOTICE,
09745 "chlInsDvmTable cmlExecuteNoAnswerSql DVM Main Insert failure %d",status);
09746 return(status);
09747 }
09748 }
09749 else {
09750 snprintf(dvmIdStr, MAX_NAME_LEN, "%lld", seqNum);
09751 }
09752 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsDvmTable SQL 3");
09753 i = 0;
09754 cllBindVars[i++]=baseName;
09755 cllBindVars[i++]=dvmIdStr;
09756 cllBindVars[i++]=rsComm->clientUser.userName;
09757 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09758 cllBindVars[i++]=myTime;
09759 cllBindVars[i++]=myTime;
09760 cllBindVarCount=i;
09761 status = cmlExecuteNoAnswerSql(
09762 "insert into R_RULE_DVM_MAP (map_dvm_base_name, dvm_id, map_owner_name,map_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?)",
09763 &icss);
09764 if (status != 0) {
09765 rodsLog(LOG_NOTICE,
09766 "chlInsDvmTable cmlExecuteNoAnswerSql DVM Map insert failure %d" , status);
09767
09768 return(status);
09769 }
09770
09771 return(0);
09772 }
09773
09774
09775
09776
09777
09778
09779
09780
09781 int
09782 chlInsFnmTable(rsComm_t *rsComm,
09783 char *baseName, char *funcName,
09784 char *func2CMap, char *myTime) {
09785 int status;
09786 int i;
09787 rodsLong_t seqNum = -1;
09788 char fnmIdStr[MAX_NAME_LEN];
09789 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsFnmTable");
09790
09791 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09792 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09793 }
09794
09795 if (!icss.status) {
09796 return(CATALOG_NOT_CONNECTED);
09797 }
09798
09799
09800 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsFnmTable SQL 1");
09801 i=0;
09802 cllBindVars[i++]=baseName;
09803 cllBindVars[i++]=funcName;
09804 cllBindVars[i++]=func2CMap;
09805 cllBindVarCount=i;
09806 status = cmlGetIntegerValueFromSqlV3(
09807 "select fnm_id from R_RULE_FNM where fnm_base_name = ? and fnm_ext_func_name = ? and fnm_int_func_name = ? ",
09808 &seqNum,
09809 &icss);
09810 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09811 rodsLog(LOG_NOTICE,
09812 "chlInsFnmTable cmlGetIntegerValueFromSqlV3 find FNM if any failure %d",status);
09813 return(status);
09814 }
09815 if (seqNum < 0) {
09816 seqNum = cmlGetNextSeqVal(&icss);
09817 if (seqNum < 0) {
09818 rodsLog(LOG_NOTICE, "chlInsFnmTable cmlGetNextSeqVal failure %d",
09819 seqNum);
09820 _rollback("chlInsFnmTable");
09821 return(seqNum);
09822 }
09823 snprintf(fnmIdStr, MAX_NAME_LEN, "%lld", seqNum);
09824
09825 i=0;
09826 cllBindVars[i++]=fnmIdStr;
09827 cllBindVars[i++]=baseName;
09828 cllBindVars[i++]=funcName;
09829 cllBindVars[i++]=func2CMap;
09830 cllBindVars[i++]=rsComm->clientUser.userName;
09831 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09832 cllBindVars[i++]=myTime;
09833 cllBindVars[i++]=myTime;
09834 cllBindVarCount=i;
09835 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsFnmTable SQL 2");
09836 status = cmlExecuteNoAnswerSql(
09837 "insert into R_RULE_FNM(fnm_id, fnm_base_name, fnm_ext_func_name, fnm_int_func_name, fnm_owner_name, fnm_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?)",
09838 &icss);
09839 if (status != 0) {
09840 rodsLog(LOG_NOTICE,
09841 "chlInsFnmTable cmlExecuteNoAnswerSql FNM Main Insert failure %d",status);
09842 return(status);
09843 }
09844 }
09845 else {
09846 snprintf(fnmIdStr, MAX_NAME_LEN, "%lld", seqNum);
09847 }
09848 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsFnmTable SQL 3");
09849 i = 0;
09850 cllBindVars[i++]=baseName;
09851 cllBindVars[i++]=fnmIdStr;
09852 cllBindVars[i++]=rsComm->clientUser.userName;
09853 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09854 cllBindVars[i++]=myTime;
09855 cllBindVars[i++]=myTime;
09856 cllBindVarCount=i;
09857 status = cmlExecuteNoAnswerSql(
09858 "insert into R_RULE_FNM_MAP (map_fnm_base_name, fnm_id, map_owner_name,map_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?)",
09859 &icss);
09860 if (status != 0) {
09861 rodsLog(LOG_NOTICE,
09862 "chlInsFnmTable cmlExecuteNoAnswerSql FNM Map insert failure %d" , status);
09863
09864 return(status);
09865 }
09866
09867 return(0);
09868 }
09869
09870
09871
09872
09873
09874
09875
09876
09877
09878
09879 int chlInsMsrvcTable(rsComm_t *rsComm,
09880 char *moduleName, char *msrvcName,
09881 char *msrvcSignature, char *msrvcVersion,
09882 char *msrvcHost, char *msrvcLocation,
09883 char *msrvcLanguage, char *msrvcTypeName, char *msrvcStatus,
09884 char *myTime)
09885 {
09886 int status;
09887 int i;
09888 rodsLong_t seqNum = -1;
09889 char msrvcIdStr[MAX_NAME_LEN];
09890 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable");
09891
09892 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
09893 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
09894 }
09895
09896 if (!icss.status) {
09897 return(CATALOG_NOT_CONNECTED);
09898 }
09899
09900
09901 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 1");
09902 i=0;
09903 cllBindVars[i++]=moduleName;
09904 cllBindVars[i++]=msrvcName;
09905 cllBindVarCount=i;
09906 status = cmlGetIntegerValueFromSqlV3(
09907 "select msrvc_id from R_MICROSRVC_MAIN where msrvc_module_name = ? and msrvc_name = ? ",
09908 &seqNum,
09909 &icss);
09910 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09911 rodsLog(LOG_NOTICE,
09912 "chlInsMsrvcTable cmlGetIntegerValueFromSqlV3 find MSRVC if any failure %d",status);
09913 return(status);
09914 }
09915 if (seqNum < 0) {
09916 seqNum = cmlGetNextSeqVal(&icss);
09917 if (seqNum < 0) {
09918 rodsLog(LOG_NOTICE, "chlInsMsrvcTable cmlGetNextSeqVal failure %d",
09919 seqNum);
09920 _rollback("chlInsMsrvcTable");
09921 return(seqNum);
09922 }
09923 snprintf(msrvcIdStr, MAX_NAME_LEN, "%lld", seqNum);
09924
09925 i=0;
09926 cllBindVars[i++]=msrvcIdStr;
09927 cllBindVars[i++]=msrvcName;
09928 cllBindVars[i++]=moduleName;
09929 cllBindVars[i++]=msrvcSignature;
09930 cllBindVars[i++]=rsComm->clientUser.userName;
09931 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09932 cllBindVars[i++]=myTime;
09933 cllBindVars[i++]=myTime;
09934 cllBindVarCount=i;
09935 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 2");
09936 status = cmlExecuteNoAnswerSql(
09937 "insert into R_MICROSRVC_MAIN(msrvc_id, msrvc_name, msrvc_module_name, msrvc_signature, msrvc_doxygen, msrvc_variations, msrvc_owner_name, msrvc_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, 'NONE', 'NONE', ?, ?, ?, ?)",
09938 &icss);
09939 if (status != 0) {
09940 rodsLog(LOG_NOTICE,
09941 "chlInsMsrvcTable cmlExecuteNoAnswerSql R_MICROSRVC_MAIN Insert failure %d",status);
09942 return(status);
09943 }
09944
09945 i=0;
09946 cllBindVars[i++]=msrvcIdStr;
09947 cllBindVars[i++]=msrvcVersion;
09948 cllBindVars[i++]=msrvcHost;
09949 cllBindVars[i++]=msrvcLocation;
09950 cllBindVars[i++]=msrvcLanguage;
09951 cllBindVars[i++]=msrvcTypeName;
09952 cllBindVars[i++]=msrvcStatus;
09953 cllBindVars[i++]=rsComm->clientUser.userName;
09954 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09955 cllBindVars[i++]=myTime;
09956 cllBindVars[i++]=myTime;
09957 cllBindVarCount=i;
09958 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 3");
09959 status = cmlExecuteNoAnswerSql(
09960 "insert into R_MICROSRVC_VER(msrvc_id, msrvc_version, msrvc_host, msrvc_location, msrvc_language, msrvc_type_name, msrvc_status, msrvc_owner_name, msrvc_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
09961 &icss);
09962 if (status != 0) {
09963 rodsLog(LOG_NOTICE,
09964 "chlInsMsrvcTable cmlExecuteNoAnswerSql R_MICROSRVC_VER Insert failure %d",status);
09965 return(status);
09966 }
09967 }
09968 else {
09969 snprintf(msrvcIdStr, MAX_NAME_LEN, "%lld", seqNum);
09970
09971 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 4");
09972 i=0;
09973 cllBindVars[i++]=msrvcIdStr;
09974 cllBindVars[i++]=msrvcHost;
09975 cllBindVars[i++]=msrvcLocation;
09976 cllBindVarCount=i;
09977 status = cmlGetIntegerValueFromSqlV3(
09978 "select msrvc_id from R_MICROSRVC_VER where msrvc_id = ? and msrvc_host = ? and msrvc_location = ? ",
09979 &seqNum, &icss);
09980 if (status != 0 && status != CAT_NO_ROWS_FOUND) {
09981 rodsLog(LOG_NOTICE,
09982 "chlInsMsrvcTable cmlGetIntegerValueFromSqlV4 find MSRVC_HOST if any failure %d",status);
09983 return(status);
09984 }
09985
09986 i=0;
09987 cllBindVars[i++]=msrvcIdStr;
09988 cllBindVars[i++]=msrvcVersion;
09989 cllBindVars[i++]=msrvcHost;
09990 cllBindVars[i++]=msrvcLocation;
09991 cllBindVars[i++]=msrvcLanguage;
09992 cllBindVars[i++]=msrvcTypeName;
09993 cllBindVars[i++]=rsComm->clientUser.userName;
09994 cllBindVars[i++]=rsComm->clientUser.rodsZone;
09995 cllBindVars[i++]=myTime;
09996 cllBindVars[i++]=myTime;
09997 cllBindVarCount=i;
09998 if (logSQL!=0) rodsLog(LOG_SQL, "chlInsMsrvcTable SQL 3");
09999 status = cmlExecuteNoAnswerSql(
10000 "insert into R_MICROSRVC_VER(msrvc_id, msrvc_version, msrvc_host, msrvc_location, msrvc_language, msrvc_type_name, msrvc_owner_name, msrvc_owner_zone, create_ts, modify_ts) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
10001 &icss);
10002 if (status != 0) {
10003 rodsLog(LOG_NOTICE,
10004 "chlInsMsrvcTable cmlExecuteNoAnswerSql R_MICROSRVC_VER Insert failure %d",status);
10005 return(status);
10006 }
10007 }
10008
10009 return(0);
10010 }
10011
10012
10013
10014
10015
10016
10017
10018 int
10019 chlVersionRuleBase(rsComm_t *rsComm,
10020 char *baseName, char *myTime) {
10021
10022 int i, status;
10023
10024 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionRuleBase");
10025
10026 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
10027 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
10028 }
10029
10030 if (!icss.status) {
10031 return(CATALOG_NOT_CONNECTED);
10032 }
10033
10034 i=0;
10035 cllBindVars[i++]=myTime;
10036 cllBindVars[i++]=myTime;
10037 cllBindVars[i++]=baseName;
10038 cllBindVarCount=i;
10039 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionRuleBase SQL 1");
10040
10041 status = cmlExecuteNoAnswerSql(
10042 "update R_RULE_BASE_MAP set map_version = ?, modify_ts = ? where map_base_name = ? and map_version = '0'",&icss);
10043 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
10044 rodsLog(LOG_NOTICE,
10045 "chlVersionRuleBase cmlExecuteNoAnswerSql Rule Map version update failure %d" , status);
10046 return(status);
10047
10048 }
10049
10050 return(0);
10051 }
10052
10053
10054
10055
10056
10057
10058
10059 int
10060 chlVersionDvmBase(rsComm_t *rsComm,
10061 char *baseName, char *myTime) {
10062 int i, status;
10063
10064 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionDvmBase");
10065
10066 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
10067 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
10068 }
10069
10070 if (!icss.status) {
10071 return(CATALOG_NOT_CONNECTED);
10072 }
10073
10074 i=0;
10075 cllBindVars[i++]=myTime;
10076 cllBindVars[i++]=myTime;
10077 cllBindVars[i++]=baseName;
10078 cllBindVarCount=i;
10079 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionDvmBase SQL 1");
10080
10081 status = cmlExecuteNoAnswerSql(
10082 "update R_RULE_DVM_MAP set map_dvm_version = ?, modify_ts = ? where map_dvm_base_name = ? and map_dvm_version = '0'",&icss);
10083 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
10084 rodsLog(LOG_NOTICE,
10085 "chlVersionDvmBase cmlExecuteNoAnswerSql DVM Map version update failure %d" , status);
10086 return(status);
10087
10088 }
10089
10090 return(0);
10091 }
10092
10093
10094
10095
10096
10097
10098
10099 int
10100 chlVersionFnmBase(rsComm_t *rsComm,
10101 char *baseName, char *myTime) {
10102
10103 int i, status;
10104
10105 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionFnmBase");
10106
10107 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
10108 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
10109 }
10110
10111 if (!icss.status) {
10112 return(CATALOG_NOT_CONNECTED);
10113 }
10114
10115 i=0;
10116 cllBindVars[i++]=myTime;
10117 cllBindVars[i++]=myTime;
10118 cllBindVars[i++]=baseName;
10119 cllBindVarCount=i;
10120 if (logSQL!=0) rodsLog(LOG_SQL, "chlVersionFnmBase SQL 1");
10121
10122 status = cmlExecuteNoAnswerSql(
10123 "update R_RULE_FNM_MAP set map_fnm_version = ?, modify_ts = ? where map_fnm_base_name = ? and map_fnm_version = '0'",&icss);
10124 if (status != 0 && status != CAT_SUCCESS_BUT_WITH_NO_INFO) {
10125 rodsLog(LOG_NOTICE,
10126 "chlVersionFnmBase cmlExecuteNoAnswerSql FNM Map version update failure %d" , status);
10127 return(status);
10128
10129 }
10130
10131 return(0);
10132 }
10133
10134
10135
10136
10137
10138
10139
10140 int
10141 icatCheckResc(char *rescName) {
10142 int status;
10143 rodsLong_t rescId;
10144 status = getLocalZone();
10145 if (status != 0) return(status);
10146
10147 rescId=0;
10148 if (logSQL!=0) rodsLog(LOG_SQL, "icatCheckResc SQxL 1");
10149 status = cmlGetIntegerValueFromSql(
10150 "select resc_id from R_RESC_MAIN where resc_name=? and zone_name=?",
10151 &rescId, rescName, localZone, 0, 0, 0, &icss);
10152 if (status != 0) {
10153 if (status==CAT_NO_ROWS_FOUND) return(CAT_INVALID_RESOURCE);
10154 _rollback("icatCheckResc");
10155 }
10156 return(status);
10157 }
10158
10159 int
10160 chlAddSpecificQuery(rsComm_t *rsComm, char *sql, char *alias) {
10161 int status, i;
10162 char myTime[50];
10163 char tsCreateTime[50];
10164 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddSpecificQuery");
10165
10166 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
10167 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
10168 }
10169
10170 if (strlen(sql) < 5) {
10171 return(CAT_INVALID_ARGUMENT);
10172 }
10173
10174 if (!icss.status) {
10175 return(CATALOG_NOT_CONNECTED);
10176 }
10177
10178 getNowStr(myTime);
10179
10180 if (alias != NULL && strlen(alias)>0) {
10181 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddSpecificQuery SQL 1");
10182 status = cmlGetStringValueFromSql(
10183 "select create_ts from R_SPECIFIC_QUERY where alias=?",
10184 tsCreateTime, 50,
10185 alias, "" , "", &icss);
10186 if (status==0) {
10187 i = addRErrorMsg (&rsComm->rError, 0, "Alias is not unique");
10188 return(CAT_INVALID_ARGUMENT);
10189 }
10190 i=0;
10191 cllBindVars[i++]=sql;
10192 cllBindVars[i++]=alias;
10193 cllBindVars[i++]=myTime;
10194 cllBindVarCount=i;
10195 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddSpecificQuery SQL 2");
10196 status = cmlExecuteNoAnswerSql(
10197 "insert into R_SPECIFIC_QUERY (sqlStr, alias, create_ts) values (?, ?, ?)",
10198 &icss);
10199 }
10200 else {
10201 i=0;
10202 cllBindVars[i++]=sql;
10203 cllBindVars[i++]=myTime;
10204 cllBindVarCount=i;
10205 if (logSQL!=0) rodsLog(LOG_SQL, "chlAddSpecificQuery SQL 3");
10206 status = cmlExecuteNoAnswerSql(
10207 "insert into R_SPECIFIC_QUERY (sqlStr, create_ts) values (?, ?)",
10208 &icss);
10209 }
10210
10211 if (status != 0) {
10212 rodsLog(LOG_NOTICE,
10213 "chlAddSpecificQuery cmlExecuteNoAnswerSql insert failure %d",
10214 status);
10215 return(status);
10216 }
10217
10218 status = cmlExecuteNoAnswerSql("commit", &icss);
10219 return(status);
10220 }
10221
10222 int
10223 chlDelSpecificQuery(rsComm_t *rsComm, char *sqlOrAlias) {
10224 int status, i;
10225 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelSpecificQuery");
10226
10227 if (rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH) {
10228 return(CAT_INSUFFICIENT_PRIVILEGE_LEVEL);
10229 }
10230
10231 if (!icss.status) {
10232 return(CATALOG_NOT_CONNECTED);
10233 }
10234
10235 i=0;
10236 cllBindVars[i++]=sqlOrAlias;
10237 cllBindVarCount=i;
10238 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelSpecificQuery SQL 1");
10239 status = cmlExecuteNoAnswerSql(
10240 "delete from R_SPECIFIC_QUERY where sqlStr = ?",
10241 &icss);
10242
10243 if (status==CAT_SUCCESS_BUT_WITH_NO_INFO) {
10244 if (logSQL!=0) rodsLog(LOG_SQL, "chlDelSpecificQuery SQL 2");
10245 i=0;
10246 cllBindVars[i++]=sqlOrAlias;
10247 cllBindVarCount=i;
10248 status = cmlExecuteNoAnswerSql(
10249 "delete from R_SPECIFIC_QUERY where alias = ?",
10250 &icss);
10251 }
10252
10253 if (status != 0) {
10254 rodsLog(LOG_NOTICE,
10255 "chlDelSpecificQuery cmlExecuteNoAnswerSql delete failure %d",
10256 status);
10257 return(status);
10258 }
10259
10260 status = cmlExecuteNoAnswerSql("commit", &icss);
10261 return(status);
10262 }
10263
10264
10265
10266
10267
10268
10269
10270
10271
10272 #define MINIMUM_COL_SIZE 50
10273
10274 int
10275 chlSpecificQuery(specificQueryInp_t specificQueryInp, genQueryOut_t *result) {
10276 int i, j, k;
10277 int needToGetNextRow;
10278
10279 char combinedSQL[MAX_SQL_SIZE];
10280
10281 int status, statementNum;
10282 int numOfCols;
10283 int attriTextLen;
10284 int totalLen;
10285 int maxColSize;
10286 int currentMaxColSize;
10287 char *tResult, *tResult2;
10288 char tsCreateTime[50];
10289
10290 int debug=0;
10291
10292 icatSessionStruct *icss;
10293
10294 if (logSQL!=0) rodsLog(LOG_SQL, "chlSpecificQuery");
10295
10296 result->attriCnt=0;
10297 result->rowCnt=0;
10298 result->totalRowCount = 0;
10299
10300 currentMaxColSize=0;
10301
10302 icss = chlGetRcs();
10303 if (icss==NULL) return(CAT_NOT_OPEN);
10304 #ifdef ADDR_64BITS
10305 if (debug) printf("icss=%ld\n",(long int)icss);
10306 #else
10307 if (debug) printf("icss=%d\n",(int)icss);
10308 #endif
10309
10310 if (specificQueryInp.continueInx == 0) {
10311 if (specificQueryInp.sql == NULL) {
10312 return(CAT_INVALID_ARGUMENT);
10313 }
10314
10315
10316
10317 if (logSQL!=0) rodsLog(LOG_SQL, "chlSpecificQuery SQL 1");
10318 status = cmlGetStringValueFromSql(
10319 "select create_ts from R_SPECIFIC_QUERY where sqlStr=?",
10320 tsCreateTime, 50,
10321 specificQueryInp.sql, "" , "", icss);
10322 if (status == CAT_NO_ROWS_FOUND) {
10323 int status2;
10324 if (logSQL!=0) rodsLog(LOG_SQL, "chlSpecificQuery SQL 2");
10325 status2 = cmlGetStringValueFromSql(
10326 "select sqlStr from R_SPECIFIC_QUERY where alias=?",
10327 combinedSQL, sizeof(combinedSQL),
10328 specificQueryInp.sql, "" , "", icss);
10329 if (status2 == CAT_NO_ROWS_FOUND) return(CAT_UNKNOWN_SPECIFIC_QUERY);
10330 if (status2 != 0) return(status2);
10331 }
10332 else {
10333 if (status != 0) return(status);
10334 strncpy(combinedSQL, specificQueryInp.sql, sizeof(combinedSQL));
10335 }
10336
10337 i=0;
10338 while (specificQueryInp.args[i]!=NULL && strlen(specificQueryInp.args[i])>0) {
10339 cllBindVars[cllBindVarCount++]=specificQueryInp.args[i++];
10340 }
10341
10342 if (logSQL!=0) rodsLog(LOG_SQL, "chlSpecificQuery SQL 3");
10343 status = cmlGetFirstRowFromSql(combinedSQL, &statementNum,
10344 specificQueryInp.rowOffset, icss);
10345 if (status < 0) {
10346 if (status != CAT_NO_ROWS_FOUND) {
10347 rodsLog(LOG_NOTICE,
10348 "chlSpecificQuery cmlGetFirstRowFromSql failure %d",
10349 status);
10350 }
10351 return(status);
10352 }
10353
10354 result->continueInx = statementNum+1;
10355 if (debug) printf("statement number =%d\n", statementNum);
10356 needToGetNextRow = 0;
10357 }
10358 else {
10359 statementNum = specificQueryInp.continueInx-1;
10360 needToGetNextRow = 1;
10361 if (specificQueryInp.maxRows<=0) {
10362 status = cmlFreeStatement(statementNum, icss);
10363 return(status);
10364 }
10365 }
10366 for (i=0;i<specificQueryInp.maxRows;i++) {
10367 if (needToGetNextRow) {
10368 status = cmlGetNextRowFromStatement(statementNum, icss);
10369 if (status == CAT_NO_ROWS_FOUND) {
10370 cmlFreeStatement(statementNum, icss);
10371 result->continueInx=0;
10372 if (result->rowCnt==0) return(status);
10373
10374 return(0);
10375 }
10376 if (status < 0) return(status);
10377 }
10378 needToGetNextRow = 1;
10379
10380 result->rowCnt++;
10381 if (debug) printf("result->rowCnt=%d\n", result->rowCnt);
10382 numOfCols = icss->stmtPtr[statementNum]->numOfCols;
10383 if (debug) printf("numOfCols=%d\n",numOfCols);
10384 result->attriCnt=numOfCols;
10385 result->continueInx = statementNum+1;
10386
10387 maxColSize=0;
10388
10389 for (k=0;k<numOfCols;k++) {
10390 j = strlen(icss->stmtPtr[statementNum]->resultValue[k]);
10391 if (maxColSize <= j) maxColSize=j;
10392 }
10393 maxColSize++;
10394 if (maxColSize < MINIMUM_COL_SIZE) {
10395 maxColSize=MINIMUM_COL_SIZE;
10396 }
10397 if (debug) printf("maxColSize=%d\n",maxColSize);
10398
10399 if (i==0) {
10400 attriTextLen= numOfCols * maxColSize;
10401 if (debug) printf("attriTextLen=%d\n",attriTextLen);
10402 totalLen = attriTextLen * specificQueryInp.maxRows;
10403 for (j=0;j<numOfCols;j++) {
10404 tResult = (char *) malloc(totalLen);
10405 if (tResult==NULL) return(SYS_MALLOC_ERR);
10406 memset(tResult, 0, totalLen);
10407 result->sqlResult[j].attriInx = 0;
10408
10409
10410 result->sqlResult[j].len = maxColSize;
10411 result->sqlResult[j].value = tResult;
10412 }
10413 currentMaxColSize = maxColSize;
10414 }
10415
10416
10417
10418
10419
10420
10421 if (maxColSize > currentMaxColSize) {
10422 maxColSize += MINIMUM_COL_SIZE;
10423
10424 if (debug) printf("Bumping %d to %d\n",
10425 currentMaxColSize, maxColSize);
10426 attriTextLen= numOfCols * maxColSize;
10427 if (debug) printf("attriTextLen=%d\n",attriTextLen);
10428 totalLen = attriTextLen * specificQueryInp.maxRows;
10429 for (j=0;j<numOfCols;j++) {
10430 char *cp1, *cp2;
10431 int k;
10432 tResult = (char *) malloc(totalLen);
10433 if (tResult==NULL) return(SYS_MALLOC_ERR);
10434 memset(tResult, 0, totalLen);
10435 cp1 = result->sqlResult[j].value;
10436 cp2 = tResult;
10437 for (k=0;k<result->rowCnt;k++) {
10438 strncpy(cp2, cp1, result->sqlResult[j].len);
10439 cp1 += result->sqlResult[j].len;
10440 cp2 += maxColSize;
10441 }
10442 free(result->sqlResult[j].value);
10443 result->sqlResult[j].len = maxColSize;
10444 result->sqlResult[j].value = tResult;
10445 }
10446 currentMaxColSize = maxColSize;
10447 }
10448
10449
10450
10451 for (j=0;j<numOfCols;j++) {
10452 tResult2 = result->sqlResult[j].value;
10453 tResult2 += currentMaxColSize*(result->rowCnt-1);
10454
10455 strncpy(tResult2, icss->stmtPtr[statementNum]->resultValue[j],
10456 currentMaxColSize);
10457 }
10458
10459 }
10460
10461 result->continueInx=statementNum+1;
10462
10463 return(0);
10464
10465 }