int matchVaultPath (rsComm_t *rsComm, char *filePath, rodsServerHost_t *rodsServerHost, char **outVaultPath) { rescGrpInfo_t *tmpRescGrpInfo; rescInfo_t *tmpRescInfo; int len; if (isValidFilePath (filePath) < 0) { /* no match */ return (0); } tmpRescGrpInfo = RescGrpInfo; while (tmpRescGrpInfo != NULL) { tmpRescInfo = tmpRescGrpInfo->rescInfo; /* match the rodsServerHost */ if (tmpRescInfo->rodsServerHost == rodsServerHost) { len = strlen (tmpRescInfo->rescVaultPath); if (len > 0 && strncmp (tmpRescInfo->rescVaultPath, filePath, len) == 0 && (filePath[len] == '/' || filePath[len] == '\0')) { *outVaultPath = tmpRescInfo->rescVaultPath; return (len); } } tmpRescGrpInfo = tmpRescGrpInfo->next; } /* no match */ return (0); }
/* chkFilePathPerm - check the FilePath permission. * If rodsServerHost */ int chkFilePathPerm( rsComm_t *rsComm, fileOpenInp_t *fileOpenInp, rodsServerHost_t *rodsServerHost, int chkType ) { // JMC - backport 4774 int status; if ( chkType == NO_CHK_PATH_PERM ) { return 0; } else if ( chkType == DISALLOW_PATH_REG ) { return PATH_REG_NOT_ALLOWED; } // =-=-=-=-=-=-=- status = isValidFilePath( fileOpenInp->fileName ); // JMC - backport 4766 if ( status < 0 ) { return status; // JMC - backport 4766 } if ( rodsServerHost == NULL ) { rodsLog( LOG_NOTICE, "chkFilePathPerm: NULL rodsServerHost" ); return SYS_INTERNAL_NULL_INPUT_ERR; } // =-=-=-=-=-=-=- // JMC - backport 4774 if ( chkType == CHK_NON_VAULT_PATH_PERM ) { status = matchCliVaultPath( rsComm, fileOpenInp->fileName, rodsServerHost ); if ( status == 1 ) { /* a match in vault */ return status; } else if ( status == -1 ) { /* in vault, but not in user's vault */ return CANT_REG_IN_VAULT_FILE; } } else if ( chkType == DO_CHK_PATH_PERM ) { std::string out_path; irods::error ret = resc_mgr.validate_vault_path( fileOpenInp->fileName, rodsServerHost, out_path ); if ( ret.ok() ) { /* a match */ return CANT_REG_IN_VAULT_FILE; } } else { return SYS_INVALID_INPUT_PARAM; // =-=-=-=-=-=-=- } status = rsChkNVPathPermByHost( rsComm, fileOpenInp, rodsServerHost ); return status; }
/* chkFilePathPerm - check the FilePath permission. * If rodsServerHost */ int chkFilePathPerm (rsComm_t *rsComm, fileOpenInp_t *fileOpenInp, rodsServerHost_t *rodsServerHost, int chkType) { int status; char *outVaultPath = NULL; if (chkType == NO_CHK_PATH_PERM) { return 0; } else if (chkType == DISALLOW_PATH_REG) { return PATH_REG_NOT_ALLOWED; } status = isValidFilePath (fileOpenInp->fileName); if (status < 0) return status; if (rodsServerHost == NULL) { rodsLog (LOG_NOTICE, "chkFilePathPerm: NULL rodsServerHost"); return (SYS_INTERNAL_NULL_INPUT_ERR); } if (chkType == CHK_NON_VAULT_PATH_PERM) { status = matchCliVaultPath (rsComm, fileOpenInp->fileName, rodsServerHost); if (status == 1) { /* a match in vault */ return (status); } else if (status == -1) { /* in vault, but not in user's vault */ return CANT_REG_IN_VAULT_FILE; } } else if (chkType == DO_CHK_PATH_PERM) { if (matchVaultPath (rsComm, fileOpenInp->fileName, rodsServerHost, &outVaultPath) > 0) { /* a match */ return CANT_REG_IN_VAULT_FILE; } } else { return SYS_INVALID_INPUT_PARAM; } status = rsChkNVPathPermByHost (rsComm, fileOpenInp, rodsServerHost); return (status); }
// =-=-=-=-=-=-=- // mk the directory recursively int mkFileDirR( rsComm_t * rsComm, size_t startDirLen, const std::string& destDir, const std::string& hier, int mode ) { std::string physical_directory_prefix; if ( destDir.empty() ) { rodsLog( LOG_ERROR, "mkFileDirR called with empty dest directory" ); return SYS_INVALID_INPUT_PARAM ; } if ( destDir.size() < startDirLen ) { rodsLog( LOG_ERROR, "mkFileDirR called with a destDir: [%s]" "shorter than its startDirLen: [%ju]", destDir.c_str(), ( uintmax_t )startDirLen ); return SYS_INVALID_INPUT_PARAM; } if ( !rsComm ) { rodsLog( LOG_ERROR, "mkFileDirR called with null rsComm" ); return SYS_INVALID_INPUT_PARAM; } if ( isValidFilePath( destDir ) ) { std::string vault_path; irods::error err = irods::get_vault_path_for_hier_string( hier, vault_path ); if ( !err.ok() ) { rodsLog( LOG_ERROR, err.result().c_str() ); return err.code(); } if ( destDir.compare( 0, vault_path.size(), vault_path ) == 0 && ( destDir[ vault_path.size() ] == '/' || destDir.size() == vault_path.size() ) ) { physical_directory_prefix = vault_path; } } std::vector< std::string > directories_to_create; std::string physical_directory = destDir; if ( physical_directory[ physical_directory.size() - 1 ] == '/' ) { physical_directory.erase( physical_directory.size() - 1 ); } while ( physical_directory.size() > startDirLen ) { irods::collection_object_ptr tmp_coll_obj( new irods::collection_object( physical_directory, hier, 0, 0 ) ); struct stat statbuf; irods::error stat_err = fileStat( rsComm, tmp_coll_obj, &statbuf ); if ( stat_err.code() >= 0 ) { if ( statbuf.st_mode & S_IFDIR ) { break; } else { rodsLog( LOG_NOTICE, "mkFileDirR: A local non-directory %s already exists \n", physical_directory.c_str() ); return stat_err.code(); } } else { directories_to_create.push_back( physical_directory.substr( physical_directory_prefix.size() ) ); } /* Go backward */ size_t index_of_last_slash = physical_directory.rfind( '/', physical_directory.size() - 1 ); if ( std::string::npos != index_of_last_slash ) { physical_directory = physical_directory.substr( 0, index_of_last_slash ); } else { break; } } // while std::string irods_directory_prefix = "/"; irods_directory_prefix += getLocalZoneName(); /* Now we go forward and make the required dir */ while ( !directories_to_create.empty() ) { physical_directory = physical_directory_prefix; physical_directory += directories_to_create.back(); std::string irods_directory = irods_directory_prefix; irods_directory += directories_to_create.back(); directories_to_create.pop_back(); irods::collection_object_ptr tmp_coll_obj( new irods::collection_object( physical_directory, hier, mode, 0 ) ); irods::error mkdir_err = fileMkdir( rsComm, tmp_coll_obj ); if ( !mkdir_err.ok() && ( getErrno( mkdir_err.code() ) != EEXIST ) ) { // JMC - backport 4834 std::stringstream msg; msg << "fileMkdir for ["; msg << physical_directory; msg << "]"; irods::error ret_err = PASSMSG( msg.str(), mkdir_err ); irods::log( ret_err ); return mkdir_err.code(); } } return 0; }
void VigenereDialog::update() { const bool enable = !keyEdit->text().isEmpty() && isValidFilePath(filePathEdit->text()) && isValidOutputPath(outputPathEdit->text()); encryptButton->setEnabled(enable); decryptButton->setEnabled(enable); }