00001 #include "otsdaq-core/CoreSupervisors/CorePropertySupervisorBase.h"
00002
00003 using namespace ots;
00004
00005 const CorePropertySupervisorBase::SupervisorProperties CorePropertySupervisorBase::SUPERVISOR_PROPERTIES = CorePropertySupervisorBase::SupervisorProperties();
00006
00007
00008 CorePropertySupervisorBase::CorePropertySupervisorBase(xdaq::Application* application)
00009 : theConfigurationManager_ (new ConfigurationManager)
00010 , supervisorClass_ (application->getApplicationDescriptor()->getClassName())
00011 , supervisorClassNoNamespace_ (supervisorClass_.substr(supervisorClass_.find_last_of(":")+1, supervisorClass_.length()-supervisorClass_.find_last_of(":")))
00012 , supervisorContextUID_ ("MUST BE INITIALIZED INSIDE THE CONTRUCTOR TO THROW EXCEPTIONS")
00013 , supervisorApplicationUID_ ("MUST BE INITIALIZED INSIDE THE CONTRUCTOR TO THROW EXCEPTIONS")
00014 , supervisorConfigurationPath_ ("MUST BE INITIALIZED INSIDE THE CONTRUCTOR TO THROW EXCEPTIONS")
00015 , propertiesAreSetup_ (false)
00016 {
00017 INIT_MF("CorePropertySupervisorBase");
00018
00019 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
00020 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
00021 __SUP_COUTV__(supervisorClass_);
00022 __SUP_COUTV__(supervisorClassNoNamespace_);
00023
00024
00025 allSupervisorInfo_.init(application->getApplicationContext());
00026
00027 if(allSupervisorInfo_.isWizardMode())
00028 {
00029 __SUP_COUT__ << "Wiz mode detected. So skipping configuration location work for supervisor of class '" <<
00030 supervisorClass_ << "'" << __E__;
00031
00032 return;
00033 }
00034
00035 __SUP_COUT__ << "Getting configuration specific info for supervisor '" <<
00036 (allSupervisorInfo_.getSupervisorInfo(application).getName()) <<
00037 "' of class " << supervisorClass_ << "." << __E__;
00038
00039
00040
00041 try
00042 {
00043 CorePropertySupervisorBase::supervisorContextUID_ =
00044 theConfigurationManager_->__GET_CONFIG__(XDAQContextConfiguration)->getContextUID(
00045 application->getApplicationContext()->getContextDescriptor()->getURL());
00046 }
00047 catch(...)
00048 {
00049 __SUP_COUT_ERR__ << "XDAQ Supervisor could not access it's configuration through the theConfigurationManager_." <<
00050
00051 ". The getApplicationContext()->getContextDescriptor()->getURL() = " <<
00052 application->getApplicationContext()->getContextDescriptor()->getURL() << std::endl;
00053 throw;
00054 }
00055
00056 try
00057 {
00058 CorePropertySupervisorBase::supervisorApplicationUID_ =
00059 theConfigurationManager_->__GET_CONFIG__(XDAQContextConfiguration)->getApplicationUID
00060 (
00061 application->getApplicationContext()->getContextDescriptor()->getURL(),
00062 application->getApplicationDescriptor()->getLocalId()
00063 );
00064 }
00065 catch(...)
00066 {
00067 __SUP_COUT_ERR__ << "XDAQ Supervisor could not access it's configuration through the theConfigurationManager_." <<
00068 " The supervisorContextUID_ = " << supervisorContextUID_ <<
00069 ". The supervisorApplicationUID = " << supervisorApplicationUID_ << std::endl;
00070 throw;
00071 }
00072
00073 CorePropertySupervisorBase::supervisorConfigurationPath_ = "/" +
00074 CorePropertySupervisorBase::supervisorContextUID_ + "/LinkToApplicationConfiguration/" +
00075 CorePropertySupervisorBase::supervisorApplicationUID_ + "/LinkToSupervisorConfiguration";
00076
00077 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
00078 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
00079 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
00080 }
00081
00082
00083
00084 CorePropertySupervisorBase::~CorePropertySupervisorBase(void)
00085 {
00086 }
00087
00088
00089
00090
00091
00092 void CorePropertySupervisorBase::setSupervisorPropertyDefaults(void)
00093 {
00094
00095
00096
00097
00098
00099
00100 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold, "*=1");
00101 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed, "");
00102 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed, "");
00103
00104 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes, "");
00105 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes, "");
00106 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes, "");
00107 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes, "");
00108
00109 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes, "");
00110 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes, "");
00111
00112
00113
00114
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 void CorePropertySupervisorBase::extractPermissionsMapFromString(const std::string& permissionsString,
00131 std::map<std::string,WebUsers::permissionLevel_t>& permissionsMap)
00132 {
00133 permissionsMap.clear();
00134 StringMacros::getMapFromString(
00135 permissionsString,
00136 permissionsMap);
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 bool CorePropertySupervisorBase::doPermissionsGrantAccess(
00158 std::map<std::string,WebUsers::permissionLevel_t>& permissionLevelsMap,
00159 std::map<std::string,WebUsers::permissionLevel_t>& permissionThresholdsMap)
00160 {
00161
00162
00163
00164
00165
00166
00167 for(const auto& permissionLevelGroupPair: permissionLevelsMap)
00168 {
00169
00170
00171 for(const auto& permissionThresholdGroupPair: permissionThresholdsMap)
00172 {
00173
00174 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
00175 permissionThresholdGroupPair.second &&
00176 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
00177 return true;
00178 }
00179 }
00180
00181
00182 return false;
00183 }
00184
00185
00186
00187 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
00188 {
00189 if(propertiesAreSetup_) return;
00190
00191
00192
00193
00194 propertiesAreSetup_ = true;
00195
00196
00197 CorePropertySupervisorBase::setSupervisorPropertyDefaults();
00198
00199
00200 setSupervisorPropertyDefaults();
00201
00202
00203
00204 if(allSupervisorInfo_.isWizardMode())
00205 __SUP_COUT__ << "Wiz mode detected. Skipping setup of supervisor properties for supervisor of class '" <<
00206 supervisorClass_ <<
00207 "'" << __E__;
00208 else
00209 CorePropertySupervisorBase::loadUserSupervisorProperties();
00210
00211
00212
00213 forceSupervisorPropertyValues();
00214
00215
00216
00217 CorePropertySupervisorBase::extractPermissionsMapFromString(
00218 getSupervisorProperty(
00219 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
00220 propertyStruct_.UserPermissionsThreshold);
00221
00222 propertyStruct_.UserGroupsAllowed.clear();
00223 StringMacros::getMapFromString(
00224 getSupervisorProperty(
00225 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
00226 propertyStruct_.UserGroupsAllowed);
00227
00228 propertyStruct_.UserGroupsDisallowed.clear();
00229 StringMacros::getMapFromString(
00230 getSupervisorProperty(
00231 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
00232 propertyStruct_.UserGroupsDisallowed);
00233
00234 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
00235 auto setIt = propertyStruct_.allSets_.begin();
00236 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
00237 setIt != propertyStruct_.allSets_.end())
00238 {
00239 (*setIt)->clear();
00240 StringMacros::getSetFromString(
00241 getSupervisorProperty(
00242 *(*nameIt)),
00243 *(*setIt));
00244
00245 ++nameIt; ++setIt;
00246 }
00247
00248
00249 __SUP_COUT__ << "Final supervisor property settings:" << std::endl;
00250 for(auto& property: propertyMap_)
00251 __SUP_COUT__ << "\t" << property.first << " = " << property.second << __E__;
00252 }
00253
00254
00255
00256
00257 ConfigurationTree CorePropertySupervisorBase::getSupervisorTreeNode(void)
00258 try
00259 {
00260 if(supervisorContextUID_ == "" || supervisorApplicationUID_ == "")
00261 {
00262 __SUP_SS__ << "Empty supervisorContextUID_ or supervisorApplicationUID_." << __E__;
00263 __SUP_SS_THROW__;
00264 }
00265 return theConfigurationManager_->getSupervisorNode(
00266 supervisorContextUID_, supervisorApplicationUID_);
00267 }
00268 catch(...)
00269 {
00270 __SUP_COUT_ERR__ << "XDAQ Supervisor could not access it's configuration node through theConfigurationManager_ " <<
00271 "(Did you remember to initialize using CorePropertySupervisorBase::init()?)." <<
00272 " The supervisorContextUID_ = " << supervisorContextUID_ <<
00273 ". The supervisorApplicationUID = " << supervisorApplicationUID_ << std::endl;
00274 throw;
00275 }
00276
00277
00278
00279
00280 void CorePropertySupervisorBase::loadUserSupervisorProperties(void)
00281 {
00282
00283
00284
00285
00286
00287 auto supervisorNode = CorePropertySupervisorBase::getSupervisorTreeNode();
00288
00289 try
00290 {
00291 auto children = supervisorNode.getNode("LinkToPropertyConfiguration").getChildren();
00292
00293 for(auto& child:children)
00294 {
00295 if(child.second.getNode("Status").getValue<bool>() == false) continue;
00296
00297 auto propertyName = child.second.getNode("PropertyName").getValue();
00298 setSupervisorProperty(propertyName, child.second.getNode("PropertyValue").getValue<std::string>());
00299 }
00300 }
00301 catch(...)
00302 {
00303 __SUP_COUT__ << "No user supervisor property settings found in the configuration tree, going with the defaults." << __E__;
00304 }
00305
00306
00307
00308
00309 }
00310
00311
00312 void CorePropertySupervisorBase::setSupervisorProperty(const std::string& propertyName, const std::string& propertyValue)
00313 {
00314 propertyMap_[propertyName] = propertyValue;
00315
00316
00317 }
00318
00319
00320 void CorePropertySupervisorBase::addSupervisorProperty(const std::string& propertyName, const std::string& propertyValue)
00321 {
00322 propertyMap_[propertyName] = propertyValue + " | " + getSupervisorProperty(propertyName);
00323
00324
00325 }
00326
00327
00328
00329
00330
00331 std::string CorePropertySupervisorBase::getSupervisorProperty(const std::string& propertyName)
00332 {
00333
00334 checkSupervisorPropertySetup ();
00335
00336 auto it = propertyMap_.find(propertyName);
00337 if(it == propertyMap_.end())
00338 {
00339 __SUP_SS__ << "Could not find property named " << propertyName << __E__;
00340 throw std::runtime_error(ss.str());
00341 }
00342 return StringMacros::validateValueForDefaultStringDataType(it->second);
00343 }
00344
00345
00346
00347
00348 WebUsers::permissionLevel_t CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
00349 const std::string& requestType)
00350 {
00351
00352 checkSupervisorPropertySetup();
00353
00354 return StringMacros::getWildCardMatchFromMap(requestType,
00355 propertyStruct_.UserPermissionsThreshold);
00356
00357
00358
00359
00360
00361
00362
00363
00364 }
00365
00366
00367
00368
00369 void CorePropertySupervisorBase::getRequestUserInfo(WebUsers::RequestUserInfo& userInfo)
00370 {
00371 checkSupervisorPropertySetup();
00372
00373
00374
00375 userInfo.automatedCommand_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.AutomatedRequestTypes);
00376 userInfo.NonXMLRequestType_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
00377 userInfo.NoXmlWhiteSpace_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
00378
00379
00380
00381 {
00382 userInfo.checkLock_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
00383 userInfo.requireLock_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
00384 userInfo.allowNoUser_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
00385
00386
00387
00388 userInfo.permissionsThreshold_ = -1;
00389 try
00390 {
00391 userInfo.permissionsThreshold_ = CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
00392 userInfo.requestType_);
00393 }
00394 catch(std::runtime_error& e)
00395 {
00396 if(!userInfo.automatedCommand_)
00397 __SUP_COUT__ << "No explicit permissions threshold for request '" <<
00398 userInfo.requestType_ << "'... Defaulting to max threshold = " <<
00399 (unsigned int)userInfo.permissionsThreshold_ << __E__;
00400 }
00401
00402
00403
00404
00405
00406
00407
00408 try
00409 {
00410 StringMacros::getSetFromString(
00411 StringMacros::getWildCardMatchFromMap(userInfo.requestType_,
00412 propertyStruct_.UserGroupsAllowed),
00413 userInfo.groupsAllowed_);
00414 }
00415 catch(std::runtime_error& e)
00416 {
00417 userInfo.groupsAllowed_.clear();
00418
00419
00420
00421
00422 }
00423 try
00424 {
00425 StringMacros::getSetFromString(
00426 StringMacros::getWildCardMatchFromMap(userInfo.requestType_,
00427 propertyStruct_.UserGroupsDisallowed),
00428 userInfo.groupsDisallowed_);
00429 }
00430 catch(std::runtime_error& e)
00431 {
00432 userInfo.groupsDisallowed_.clear();
00433
00434
00435
00436
00437 }
00438 }
00439
00440
00441 }
00442