$treeview $search $mathjax $extrastylesheet
otsdaq
v2_03_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #include "otsdaq-core/CoreSupervisors/CorePropertySupervisorBase.h" 00002 00003 using namespace ots; 00004 00005 const CorePropertySupervisorBase::SupervisorProperties 00006 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES = 00007 CorePropertySupervisorBase::SupervisorProperties(); 00008 00009 //======================================================================================================================== 00010 CorePropertySupervisorBase::CorePropertySupervisorBase(xdaq::Application* application) 00011 : theConfigurationManager_(new ConfigurationManager) 00012 , supervisorClass_(application->getApplicationDescriptor()->getClassName()) 00013 , supervisorClassNoNamespace_(supervisorClass_.substr( 00014 supervisorClass_.find_last_of(":") + 1, 00015 supervisorClass_.length() - supervisorClass_.find_last_of(":"))) 00016 , supervisorContextUID_( 00017 "UNINITIALIZED_supervisorContextUID") // MUST BE INITIALIZED 00018 // INSIDE THE CONTRUCTOR 00019 // TO THROW EXCEPTIONS 00020 // on bad conditions 00021 , supervisorApplicationUID_( 00022 "UNINITIALIZED_supervisorApplicationUID") // MUST BE INITIALIZED INSIDE THE 00023 // CONTRUCTOR TO THROW EXCEPTIONS on 00024 // bad conditions 00025 , supervisorConfigurationPath_( 00026 "UNINITIALIZED_supervisorConfigurationPath") // MUST BE INITIALIZED INSIDE THE 00027 // CONTRUCTOR TO THROW EXCEPTIONS 00028 // on bad conditions 00029 , propertiesAreSetup_(false) 00030 { 00031 INIT_MF("CorePropertySupervisorBase"); 00032 00033 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL()); 00034 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId()); 00035 __SUP_COUTV__(supervisorClass_); 00036 __SUP_COUTV__(supervisorClassNoNamespace_); 00037 00038 // get all supervisor info, and wiz mode or not 00039 allSupervisorInfo_.init(application->getApplicationContext()); 00040 00041 if(allSupervisorInfo_.isWizardMode()) 00042 { 00043 __SUP_COUT__ << "Wiz mode detected. So skipping configuration location work for " 00044 "supervisor of class '" 00045 << supervisorClass_ << "'" << __E__; 00046 supervisorContextUID_ = "NO CONTEXT ID IN WIZ MODE"; 00047 supervisorApplicationUID_ = 00048 std::to_string(application->getApplicationDescriptor()->getLocalId()); 00049 supervisorConfigurationPath_ = "NO APP PATH IN WIZ MODE"; 00050 return; 00051 } 00052 00053 __SUP_COUT__ << "Getting configuration specific info for supervisor '" 00054 << (allSupervisorInfo_.getSupervisorInfo(application).getName()) 00055 << "' of class " << supervisorClass_ << "." << __E__; 00056 00057 // get configuration specific info for the application supervisor 00058 00059 try 00060 { 00061 CorePropertySupervisorBase::supervisorContextUID_ = 00062 theConfigurationManager_->__GET_CONFIG__(XDAQContextTable) 00063 ->getContextUID(application->getApplicationContext() 00064 ->getContextDescriptor() 00065 ->getURL()); 00066 } 00067 catch(...) 00068 { 00069 __SUP_COUT_ERR__ 00070 << "XDAQ Supervisor could not access it's configuration through " 00071 "the Configuration Manager." 00072 << ". The getApplicationContext()->getContextDescriptor()->getURL() = " 00073 << application->getApplicationContext()->getContextDescriptor()->getURL() 00074 << __E__; 00075 throw; 00076 } 00077 00078 try 00079 { 00080 CorePropertySupervisorBase::supervisorApplicationUID_ = 00081 theConfigurationManager_->__GET_CONFIG__(XDAQContextTable) 00082 ->getApplicationUID( 00083 application->getApplicationContext() 00084 ->getContextDescriptor() 00085 ->getURL(), 00086 application->getApplicationDescriptor()->getLocalId()); 00087 } 00088 catch(...) 00089 { 00090 __SUP_COUT_ERR__ << "XDAQ Supervisor could not access it's configuration through " 00091 "the Configuration Manager." 00092 << " The supervisorContextUID_ = " << supervisorContextUID_ 00093 << ". The supervisorApplicationUID = " 00094 << supervisorApplicationUID_ << __E__; 00095 throw; 00096 } 00097 00098 CorePropertySupervisorBase::supervisorConfigurationPath_ = 00099 "/" + CorePropertySupervisorBase::supervisorContextUID_ + 00100 "/LinkToApplicationTable/" + 00101 CorePropertySupervisorBase::supervisorApplicationUID_ + "/LinkToSupervisorTable"; 00102 00103 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_); 00104 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_); 00105 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_); 00106 00107 CorePropertySupervisorBase::indicateOtsAlive(this); 00108 00109 } // end constructor 00110 00111 //======================================================================================================================== 00112 CorePropertySupervisorBase::~CorePropertySupervisorBase(void) 00113 { 00114 if(theConfigurationManager_) 00115 delete theConfigurationManager_; 00116 } // end destructor 00117 00118 //======================================================================================================================== 00119 void CorePropertySupervisorBase::indicateOtsAlive( 00120 const CorePropertySupervisorBase* properties) 00121 { 00122 char portStr[100] = "0"; 00123 std::string hostname = "wiz"; 00124 00125 // Note: the environment variable getenv("HOSTNAME") fails in multinode ots systems 00126 // started through ssh 00127 00128 if(properties) 00129 { 00130 unsigned int port = properties->getContextTreeNode() 00131 .getNode(properties->supervisorContextUID_) 00132 .getNode("Port") 00133 .getValue<unsigned int>(); 00134 sprintf(portStr, "%u", port); 00135 00136 hostname = properties->getContextTreeNode() 00137 .getNode(properties->supervisorContextUID_) 00138 .getNode("Address") 00139 .getValue<std::string>(); 00140 00141 size_t i = hostname.find("//"); 00142 if(i != std::string::npos) 00143 hostname = hostname.substr(i + 2); 00144 00145 __COUTV__(hostname); 00146 } 00147 00148 // indicate ots is alive (for StartOTS.sh to verify launch was successful) 00149 std::string filename = std::string(getenv("OTSDAQ_LOG_DIR")) + "/otsdaq_is_alive-" + 00150 hostname + "-" + portStr + ".dat"; 00151 FILE* fp = fopen(filename.c_str(), "w"); 00152 if(!fp) 00153 { 00154 __SS__ << "Failed to open the ots-is-alive file: " << filename << __E__; 00155 __SS_THROW__; 00156 } 00157 fprintf(fp, "%s %s %ld\n", hostname.c_str(), portStr, time(0)); 00158 fclose(fp); 00159 00160 __COUT__ << "Marked alive: " << filename << __E__; 00161 } 00162 00163 //======================================================================================================================== 00164 // When overriding, setup default property values here 00165 // called by CorePropertySupervisorBase constructor before loading user defined property 00166 // values 00167 void CorePropertySupervisorBase::setSupervisorPropertyDefaults(void) 00168 { 00169 // This can be done in the constructor because when you start xdaq it loads the 00170 // configuration that can't be changed while running! 00171 00172 //__SUP_COUT__ << "Setting up Core Supervisor Base property defaults for supervisor" 00173 //<< 00174 // "..." << __E__; 00175 00176 // set core Supervisor base class defaults 00177 CorePropertySupervisorBase::setSupervisorProperty( 00178 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold, 00179 "*=1"); 00180 CorePropertySupervisorBase::setSupervisorProperty( 00181 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed, ""); 00182 CorePropertySupervisorBase::setSupervisorProperty( 00183 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed, ""); 00184 00185 CorePropertySupervisorBase::setSupervisorProperty( 00186 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes, ""); 00187 CorePropertySupervisorBase::setSupervisorProperty( 00188 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes, 00189 ""); 00190 CorePropertySupervisorBase::setSupervisorProperty( 00191 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes, ""); 00192 CorePropertySupervisorBase::setSupervisorProperty( 00193 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes, ""); 00194 00195 CorePropertySupervisorBase::setSupervisorProperty( 00196 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes, 00197 ""); 00198 CorePropertySupervisorBase::setSupervisorProperty( 00199 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes, ""); 00200 00201 // __SUP_COUT__ << "Done setting up Core Supervisor Base property defaults for 00202 // supervisor" << 00203 // "..." << __E__; 00204 } 00205 00206 //======================================================================================================================== 00207 // extractPermissionsMapFromString 00208 // Static function that extract map function to standardize approach 00209 // in case needed by supervisors for special permissions handling. 00210 // For example, used to serve Desktop Icons. 00211 // 00212 // permissionsString format is as follows: 00213 // <groupName>:<permissionsThreshold> pairs separated by ',' '&' or '|' 00214 // for example, to give access admins and pixel team but not calorimeter team: 00215 // allUsers:255 | pixelTeam:1 | calorimeterTeam:0 00216 // 00217 // Use with CorePropertySupervisorBase::doPermissionsGrantAccess to determine 00218 // if access is allowed. 00219 void CorePropertySupervisorBase::extractPermissionsMapFromString( 00220 const std::string& permissionsString, 00221 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap) 00222 { 00223 permissionsMap.clear(); 00224 StringMacros::getMapFromString(permissionsString, permissionsMap); 00225 } 00226 00227 //======================================================================================================================== 00228 // doPermissionsGrantAccess 00229 // Static function that checks permissionLevelsMap against permissionThresholdsMap and 00230 // returns true if access requirements are met. 00231 // 00232 // This is useful in standardizing approach for supervisors in case of 00233 // of special permissions handling. 00234 // For example, used to serve Desktop Icons. 00235 // 00236 // permissionLevelsString format is as follows: 00237 // <groupName>:<permissionsLevel> pairs separated by ',' '&' or '|' 00238 // for example, to be a standard user and an admin on the pixel team and no access to 00239 // calorimeter team: allUsers:1 | pixelTeam:255 | calorimeterTeam:0 00240 // 00241 // permissionThresoldsString format is as follows: 00242 // <groupName>:<permissionsThreshold> pairs separated by ',' '&' or '|' 00243 // for example, to give access admins and pixel team but not calorimeter team: 00244 // allUsers:255 | pixelTeam:1 | calorimeterTeam:0 00245 bool CorePropertySupervisorBase::doPermissionsGrantAccess( 00246 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap, 00247 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap) 00248 { 00249 // return true if a permission level group name is found with a permission level 00250 // greater than or equal to the permission level at a matching group name entry in 00251 // the thresholds map. 00252 00253 //__COUTV__(StringMacros::mapToString(permissionLevelsMap)); 00254 //__COUTV__(StringMacros::mapToString(permissionThresholdsMap)); 00255 00256 for(const auto& permissionLevelGroupPair : permissionLevelsMap) 00257 { 00258 //__COUTV__(permissionLevelGroupPair.first); 00259 //__COUTV__(permissionLevelGroupPair.second); 00260 00261 for(const auto& permissionThresholdGroupPair : permissionThresholdsMap) 00262 { 00263 //__COUTV__(permissionThresholdGroupPair.first); 00264 //__COUTV__(permissionThresholdGroupPair.second); 00265 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first && 00266 permissionThresholdGroupPair.second && // not explicitly disallowed 00267 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second) 00268 return true; // access granted! 00269 } 00270 } 00271 //__COUT__ << "Denied." << __E__; 00272 00273 // if here, no access group match found 00274 // so denied 00275 return false; 00276 } // end doPermissionsGrantAccess 00277 00278 //======================================================================================================================== 00279 void CorePropertySupervisorBase::checkSupervisorPropertySetup() 00280 { 00281 if(propertiesAreSetup_) 00282 return; 00283 00284 // Immediately mark properties as setup, (prevent infinite loops due to 00285 // other launches from within this function, e.g. from getSupervisorProperty) 00286 // only redo if Context configuration group changes 00287 propertiesAreSetup_ = true; 00288 00289 CorePropertySupervisorBase::setSupervisorPropertyDefaults(); // calls base class 00290 // version defaults 00291 00292 //__SUP_COUT__ << "Setting up supervisor specific property DEFAULTS for supervisor..." 00293 //<< __E__; 00294 setSupervisorPropertyDefaults(); // calls override version defaults 00295 // __SUP_COUT__ << "Done setting up supervisor 00296 // specific property DEFAULTS for supervisor" << 00297 // "." << __E__; 00298 00299 if(allSupervisorInfo_.isWizardMode()) 00300 __SUP_COUT__ << "Wiz mode detected. Skipping setup of supervisor properties for " 00301 "supervisor of class '" 00302 << supervisorClass_ << "'" << __E__; 00303 else 00304 CorePropertySupervisorBase::loadUserSupervisorProperties(); // loads user 00305 // settings from 00306 // configuration 00307 00308 //__SUP_COUT__ << "Setting up supervisor specific FORCED properties for supervisor..." 00309 //<< __E__; 00310 forceSupervisorPropertyValues(); // calls override forced values 00311 // __SUP_COUT__ << "Done setting up supervisor 00312 // specific FORCED properties for supervisor" << 00313 // "." << __E__; 00314 00315 CorePropertySupervisorBase::extractPermissionsMapFromString( 00316 getSupervisorProperty( 00317 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold), 00318 propertyStruct_.UserPermissionsThreshold); 00319 00320 propertyStruct_.UserGroupsAllowed.clear(); 00321 StringMacros::getMapFromString( 00322 getSupervisorProperty( 00323 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed), 00324 propertyStruct_.UserGroupsAllowed); 00325 00326 propertyStruct_.UserGroupsDisallowed.clear(); 00327 StringMacros::getMapFromString( 00328 getSupervisorProperty( 00329 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed), 00330 propertyStruct_.UserGroupsDisallowed); 00331 00332 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin(); 00333 auto setIt = propertyStruct_.allSets_.begin(); 00334 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() && 00335 setIt != propertyStruct_.allSets_.end()) 00336 { 00337 (*setIt)->clear(); 00338 StringMacros::getSetFromString(getSupervisorProperty(*(*nameIt)), *(*setIt)); 00339 00340 ++nameIt; 00341 ++setIt; 00342 } 00343 00344 __SUP_COUT__ << "Final supervisor property settings:" << __E__; 00345 for(auto& property : propertyMap_) 00346 __SUP_COUT__ << "\t" << property.first << " = " << property.second << __E__; 00347 } 00348 00349 //======================================================================================================================== 00350 // getSupervisorTreeNode ~ 00351 // try to get this Supervisors configuration tree node 00352 ConfigurationTree CorePropertySupervisorBase::getSupervisorTreeNode(void) try 00353 { 00354 if(supervisorContextUID_ == "" || supervisorApplicationUID_ == "") 00355 { 00356 __SUP_SS__ << "Empty supervisorContextUID_ or supervisorApplicationUID_." 00357 << __E__; 00358 __SUP_SS_THROW__; 00359 } 00360 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_, 00361 supervisorApplicationUID_); 00362 } 00363 catch(...) 00364 { 00365 __SUP_COUT_ERR__ 00366 << "XDAQ Supervisor could not access it's configuration node through " 00367 "theConfigurationManager_ " 00368 << "(Did you remember to initialize using CorePropertySupervisorBase::init()?)." 00369 << " The supervisorContextUID_ = " << supervisorContextUID_ 00370 << ". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__; 00371 throw; 00372 } 00373 00374 //======================================================================================================================== 00375 // loadUserSupervisorProperties ~ 00376 // try to get user supervisor properties 00377 void CorePropertySupervisorBase::loadUserSupervisorProperties(void) 00378 { 00379 // __SUP_COUT__ << "Loading user properties for supervisor '" << 00380 // supervisorContextUID_ << "/" << supervisorApplicationUID_ << 00381 // "'..." << __E__; 00382 00383 // re-acquire the configuration supervisor node, in case the config has changed 00384 auto supervisorNode = CorePropertySupervisorBase::getSupervisorTreeNode(); 00385 00386 try 00387 { 00388 auto /*map<name,node>*/ children = 00389 supervisorNode.getNode("LinkToPropertyTable").getChildren(); 00390 00391 for(auto& child : children) 00392 { 00393 if(child.second.getNode("Status").getValue<bool>() == false) 00394 continue; // skip OFF properties 00395 00396 auto propertyName = child.second.getNode("PropertyName").getValue(); 00397 setSupervisorProperty( 00398 propertyName, 00399 child.second.getNode("PropertyValue").getValue<std::string>()); 00400 } 00401 } 00402 catch(...) 00403 { 00404 __SUP_COUT__ << "No user supervisor property settings found in the configuration " 00405 "tree, going with the defaults." 00406 << __E__; 00407 } 00408 00409 // __SUP_COUT__ << "Done loading user properties for supervisor '" << 00410 // supervisorContextUID_ << "/" << supervisorApplicationUID_ << 00411 // "'" << __E__; 00412 } 00413 00414 //======================================================================================================================== 00415 void CorePropertySupervisorBase::setSupervisorProperty(const std::string& propertyName, 00416 const std::string& propertyValue) 00417 { 00418 propertyMap_[propertyName] = propertyValue; 00419 // __SUP_COUT__ << "Set propertyMap_[" << propertyName << 00420 // "] = " << propertyMap_[propertyName] << __E__; 00421 } 00422 00423 //======================================================================================================================== 00424 void CorePropertySupervisorBase::addSupervisorProperty(const std::string& propertyName, 00425 const std::string& propertyValue) 00426 { 00427 propertyMap_[propertyName] = 00428 propertyValue + " | " + getSupervisorProperty(propertyName); 00429 // __SUP_COUT__ << "Set propertyMap_[" << propertyName << 00430 // "] = " << propertyMap_[propertyName] << __E__; 00431 } 00432 00433 //======================================================================================================================== 00434 // getSupervisorProperty 00435 // string version of template function 00436 std::string CorePropertySupervisorBase::getSupervisorProperty( 00437 const std::string& propertyName) 00438 { 00439 // check if need to setup properties 00440 checkSupervisorPropertySetup(); 00441 00442 auto it = propertyMap_.find(propertyName); 00443 if(it == propertyMap_.end()) 00444 { 00445 __SUP_SS__ << "Could not find property named " << propertyName << __E__; 00446 __SS_THROW__; //__SUP_SS_THROW__; 00447 } 00448 return StringMacros::validateValueForDefaultStringDataType(it->second); 00449 } 00450 00451 //======================================================================================================================== 00452 // getSupervisorPropertyUserPermissionsThreshold 00453 // returns the threshold based on the requestType 00454 WebUsers::permissionLevel_t 00455 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold( 00456 const std::string& requestType) 00457 { 00458 // check if need to setup properties 00459 checkSupervisorPropertySetup(); 00460 00461 return StringMacros::getWildCardMatchFromMap( 00462 requestType, propertyStruct_.UserPermissionsThreshold); 00463 00464 // auto it = propertyStruct_.UserPermissionsThreshold.find(requestType); 00465 // if(it == propertyStruct_.UserPermissionsThreshold.end()) 00466 // { 00467 // __SUP_SS__ << "Could not find requestType named " << requestType << " in 00468 // UserPermissionsThreshold map." << __E__; 00469 // __SS_THROW__; //__SUP_SS_THROW__; 00470 // } 00471 // return it->second; 00472 } 00473 00474 //======================================================================================================================== 00475 // getRequestUserInfo ~ 00476 // extract user info for request based on property configuration 00477 void CorePropertySupervisorBase::getRequestUserInfo(WebUsers::RequestUserInfo& userInfo) 00478 { 00479 checkSupervisorPropertySetup(); 00480 00481 //__SUP_COUT__ << "userInfo.requestType_ " << userInfo.requestType_ << " files: " << 00482 // cgiIn.getFiles().size() << __E__; 00483 00484 userInfo.automatedCommand_ = StringMacros::inWildCardSet( 00485 userInfo.requestType_, 00486 propertyStruct_.AutomatedRequestTypes); // automatic commands should not refresh 00487 // cookie code.. only user initiated 00488 // commands should! 00489 userInfo.NonXMLRequestType_ = StringMacros::inWildCardSet( 00490 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes); // non-xml request 00491 // types just return 00492 // the request return 00493 // string to client 00494 userInfo.NoXmlWhiteSpace_ = StringMacros::inWildCardSet( 00495 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes); 00496 00497 //**** start LOGIN GATEWAY CODE ***// 00498 // check cookieCode, sequence, userWithLock, and permissions access all in one shot! 00499 { 00500 userInfo.checkLock_ = StringMacros::inWildCardSet( 00501 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes); 00502 userInfo.requireLock_ = StringMacros::inWildCardSet( 00503 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes); 00504 userInfo.allowNoUser_ = StringMacros::inWildCardSet( 00505 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes); 00506 00507 userInfo.permissionsThreshold_ = -1; // default to max 00508 try 00509 { 00510 userInfo.permissionsThreshold_ = 00511 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold( 00512 userInfo.requestType_); 00513 } 00514 catch(std::runtime_error& e) 00515 { 00516 if(!userInfo.automatedCommand_) 00517 __SUP_COUT__ << "No explicit permissions threshold for request '" 00518 << userInfo.requestType_ 00519 << "'... Defaulting to max threshold = " 00520 << (unsigned int)userInfo.permissionsThreshold_ << __E__; 00521 } 00522 00523 // __COUTV__(userInfo.requestType_); 00524 // __COUTV__(userInfo.checkLock_); 00525 // __COUTV__(userInfo.requireLock_); 00526 // __COUTV__(userInfo.allowNoUser_); 00527 // __COUTV__((unsigned int)userInfo.permissionsThreshold_); 00528 00529 try 00530 { 00531 StringMacros::getSetFromString( 00532 StringMacros::getWildCardMatchFromMap(userInfo.requestType_, 00533 propertyStruct_.UserGroupsAllowed), 00534 userInfo.groupsAllowed_); 00535 } 00536 catch(std::runtime_error& e) 00537 { 00538 userInfo.groupsAllowed_.clear(); 00539 00540 // if(!userInfo.automatedCommand_) 00541 // __SUP_COUT__ << "No explicit groups allowed for request '" << 00542 // userInfo.requestType_ << "'... Defaulting to empty groups 00543 // allowed. " << __E__; 00544 } 00545 try 00546 { 00547 StringMacros::getSetFromString( 00548 StringMacros::getWildCardMatchFromMap( 00549 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed), 00550 userInfo.groupsDisallowed_); 00551 } 00552 catch(std::runtime_error& e) 00553 { 00554 userInfo.groupsDisallowed_.clear(); 00555 00556 // if(!userInfo.automatedCommand_) 00557 // __SUP_COUT__ << "No explicit groups disallowed for request '" 00558 //<< 00559 // userInfo.requestType_ << "'... Defaulting to empty groups 00560 // disallowed. " << __E__; 00561 } 00562 } //**** end LOGIN GATEWAY CODE ***// 00563 00564 // completed user info, for the request type, is returned to caller 00565 }