1 #include "otsdaq-core/WebUsersUtilities/RemoteWebUsers.h"
3 #include "otsdaq-core/SOAPUtilities/SOAPParameters.h"
4 #include "otsdaq-core/SOAPUtilities/SOAPUtilities.h"
5 #include "otsdaq-core/SOAPUtilities/SOAPCommand.h"
6 #include "otsdaq-core/XmlUtilities/HttpXmlDocument.h"
7 #include "otsdaq-core/MessageFacility/MessageFacility.h"
8 #include "otsdaq-core/CgiDataUtilities/CgiDataUtilities.h"
9 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
14 #include "otsdaq-core/SupervisorInfo/AllSupervisorInfo.h"
20 #define __MF_SUBJECT__ "RemoteWebUsers"
88 const std::string RemoteWebUsers::REQ_NO_LOGIN_RESPONSE =
"NoLogin";
89 const std::string RemoteWebUsers::REQ_NO_PERMISSION_RESPONSE =
"NoPermission";
90 const std::string RemoteWebUsers::REQ_USER_LOCKOUT_RESPONSE =
"UserLockout";
91 const std::string RemoteWebUsers::REQ_LOCK_REQUIRED_RESPONSE =
"LockRequired";
92 const std::string RemoteWebUsers::REQ_ALLOW_NO_USER =
"AllowNoUser";
94 RemoteWebUsers::RemoteWebUsers(xdaq::Application* application)
97 ActiveUserLastUpdateTime_ = 0;
104 bool RemoteWebUsers::xmlLoginGateway(
106 std::ostringstream* out,
109 uint8_t* userPermissions,
111 const uint8_t permissionsThreshold,
112 const bool checkLock,
113 const bool lockRequired,
114 std::string* userWithLock,
115 std::string* userName,
116 std::string* displayName,
117 uint64_t* activeSessionIndex,
118 const bool allowNoUser
122 if(userPermissions) *userPermissions = 0;
123 if(userWithLock) *userWithLock =
"";
124 if(userName) *userName =
"";
125 if(displayName) *displayName =
"";
126 if(activeSessionIndex) *activeSessionIndex = -1;
128 const std::string ip = cgi.getEnvironment().getRemoteAddr();
136 XDAQ_CONST_CALL xdaq::ApplicationDescriptor* gatewaySupervisor;
139 xoap::MessageReference retMsg;
144 std::string cookieCode = CgiDataUtilities::getOrPostData(cgi,
"CookieCode");
152 if(allSupervisorInfo.isWizardMode())
155 std::string sequence = CgiDataUtilities::getOrPostData(cgi,
"sequence");
157 if(!sequence.length())
159 __COUT__ <<
"Invalid attempt." << std::endl;
160 *out << RemoteWebUsers::REQ_NO_LOGIN_RESPONSE;
166 gatewaySupervisor = allSupervisorInfo.getWizardInfo().getDescriptor();
167 if(!gatewaySupervisor)
169 *out << RemoteWebUsers::REQ_NO_LOGIN_RESPONSE;
173 parameters.addParameter(
"sequence",sequence);
174 retMsg = SOAPMessenger::sendWithSOAPReply(gatewaySupervisor,
175 "SupervisorSequenceCheck", parameters);
177 parameters.addParameter(
"Permissions");
178 receive(retMsg, parameters);
180 uint8_t tmpUserPermissions_;
181 sscanf(parameters.getValue(
"Permissions").c_str(),
"%hhu",&tmpUserPermissions_);
183 if(userPermissions) *userPermissions = tmpUserPermissions_;
185 if(tmpUserPermissions_ < permissionsThreshold)
187 *out << RemoteWebUsers::REQ_NO_LOGIN_RESPONSE;
188 __COUT__ <<
"User has insufficient permissions: " << tmpUserPermissions_ <<
"<" <<
189 permissionsThreshold << std::endl;
193 if(userWithLock) *userWithLock =
"admin";
194 if(userName) *userName =
"admin";
195 if(displayName) *displayName =
"Admin";
196 if(activeSessionIndex) *activeSessionIndex = 0;
202 gatewaySupervisor = allSupervisorInfo.getGatewayInfo().getDescriptor();
207 parameters.addParameter(
"CookieCode",cookieCode);
208 parameters.addParameter(
"RefreshOption",refresh?
"1":
"0");
210 retMsg = SOAPMessenger::sendWithSOAPReply(gatewaySupervisor,
211 "SupervisorCookieCheck", parameters);
214 parameters.addParameter(
"CookieCode");
215 parameters.addParameter(
"Permissions");
216 parameters.addParameter(
"UserWithLock");
217 receive(retMsg, parameters);
218 tmpUserWithLock_ = parameters.getValue(
"UserWithLock");
219 sscanf(parameters.getValue(
"Permissions").c_str(),
"%hhu",&tmpUserPermissions_);
220 if(userWithLock) *userWithLock = tmpUserWithLock_;
221 if(userPermissions) *userPermissions = tmpUserPermissions_;
223 cookieCode = parameters.getValue(
"CookieCode");
227 if(!allowNoUser && cookieCode.length() != COOKIE_CODE_LENGTH)
229 *out << RemoteWebUsers::REQ_NO_LOGIN_RESPONSE;
233 if(!allowNoUser && tmpUserPermissions_ < permissionsThreshold)
235 *out << RemoteWebUsers::REQ_NO_PERMISSION_RESPONSE;
236 __COUT__ <<
"User has insufficient permissions: " << tmpUserPermissions_ <<
"<" <<
237 permissionsThreshold << std::endl;
244 xmldoc->setHeader(cookieCode);
246 xmldoc->setHeader(RemoteWebUsers::REQ_ALLOW_NO_USER);
249 if(!userName && !displayName && !activeSessionIndex && !checkLock && !lockRequired)
258 parameters.addParameter(
"CookieCode",cookieCode);
259 retMsg = SOAPMessenger::sendWithSOAPReply(gatewaySupervisor,
260 "SupervisorGetUserInfo", parameters);
263 parameters.addParameter(
"Username");
264 parameters.addParameter(
"DisplayName");
265 parameters.addParameter(
"ActiveSessionIndex");
266 receive(retMsg, parameters);
267 std::string tmpUserName = parameters.getValue(
"Username");
268 if(userName) *userName = tmpUserName;
269 if(displayName) *displayName = parameters.getValue(
"DisplayName");
270 if(activeSessionIndex) *activeSessionIndex = strtoul(parameters.getValue(
"ActiveSessionIndex").c_str(),0,0);
272 if(checkLock && tmpUserWithLock_ !=
"" && tmpUserWithLock_ != tmpUserName)
274 *out << RemoteWebUsers::REQ_USER_LOCKOUT_RESPONSE;
275 __COUT__ <<
"User " << tmpUserName <<
" is locked out. " << tmpUserWithLock_ <<
" has lock." << std::endl;
279 if(lockRequired && tmpUserWithLock_ != tmpUserName)
281 *out << RemoteWebUsers::REQ_LOCK_REQUIRED_RESPONSE;
282 __COUT__ <<
"User " << tmpUserName <<
" must have lock to proceed. (" << tmpUserWithLock_ <<
" has lock.)" << std::endl;
293 std::string RemoteWebUsers::getActiveUserList(XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor)
296 if(1 || time(0) - ActiveUserLastUpdateTime_ > ACTIVE_USERS_UPDATE_THRESHOLD)
299 __COUT__ <<
"Need to update " << std::endl;
301 xoap::MessageReference retMsg = ots::SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorGetActiveUsers");
305 receive(retMsg, retParameters);
307 ActiveUserLastUpdateTime_ = time(0);
308 return (ActiveUserList_ = retParameters.getValue(
"UserList"));
311 return ActiveUserList_;
320 XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
321 const std::string &actionOfLastGroup,
322 std::string &actionTimeString)
324 actionTimeString =
"";
325 xoap::MessageReference retMsg = ots::SOAPMessenger::sendWithSOAPReply(
326 supervisorDescriptor,
"SupervisorLastConfigGroupRequest",
331 retParameters.addParameter(
"GroupName");
332 retParameters.addParameter(
"GroupKey");
333 retParameters.addParameter(
"GroupAction");
334 retParameters.addParameter(
"GroupActionTime");
335 receive(retMsg, retParameters);
338 if(retParameters.getValue(
"GroupAction") != actionOfLastGroup)
340 __COUT_WARN__ <<
"Returned group action '" << retParameters.getValue(
"GroupAction") <<
341 "' does not match requested group action '" << actionOfLastGroup <<
".'" << std::endl;
346 theGroup.first = retParameters.getValue(
"GroupName");
347 theGroup.second = strtol(retParameters.getValue(
"GroupKey").c_str(),0,0);
348 actionTimeString = retParameters.getValue(
"GroupActionTime");
357 bool RemoteWebUsers::getUserInfoForCookie(XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
358 std::string &cookieCode, std::string *userName, std::string *displayName, uint64_t *activeSessionIndex)
360 __COUT__ << std::endl;
361 if(cookieCode.length() != COOKIE_CODE_LENGTH)
return false;
365 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorGetUserInfo",
SOAPParameters(
"CookieCode",cookieCode));
368 retParameters.addParameter(
"Username");
369 retParameters.addParameter(
"DisplayName");
370 retParameters.addParameter(
"ActiveSessionIndex");
371 receive(retMsg, retParameters);
372 if(userName) *userName = retParameters.getValue(
"Username");
373 if(displayName) *displayName = retParameters.getValue(
"DisplayName");
374 if(activeSessionIndex) *activeSessionIndex = strtoul(retParameters.getValue(
"ActiveSessionIndex").c_str(),0,0);
376 __COUT__ <<
"userName " << *userName << std::endl;
384 bool RemoteWebUsers::cookieCodeIsActiveForRequest(XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
385 std::string &cookieCode, uint8_t *userPermissions, std::string ip,
bool refresh, std::string *userWithLock)
388 if(cookieCode.length() != COOKIE_CODE_LENGTH)
return false;
393 parameters.addParameter(
"CookieCode",cookieCode);
394 parameters.addParameter(
"RefreshOption",refresh?
"1":
"0");
397 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorCookieCheck", parameters);
401 retParameters.addParameter(
"CookieCode");
402 retParameters.addParameter(
"Permissions");
403 retParameters.addParameter(
"UserWithLock");
404 receive(retMsg, retParameters);
408 if(userWithLock) *userWithLock = retParameters.getValue(
"UserWithLock");
409 if(userPermissions) sscanf(retParameters.getValue(
"Permissions").c_str(),
"%hhu",userPermissions);
411 cookieCode = retParameters.getValue(
"CookieCode");
413 return cookieCode.length() == COOKIE_CODE_LENGTH;
419 void RemoteWebUsers::sendSystemMessage(XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
const std::string& toUser,
const std::string& msg)
422 parameters.addParameter(
"ToUser" , toUser);
423 parameters.addParameter(
"Message", msg);
425 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorSystemMessage",parameters);
432 void RemoteWebUsers::makeSystemLogbookEntry(XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
const std::string& entryText)
435 parameters.addParameter(
"EntryText", entryText);
437 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorSystemLogbookEntry",parameters);