1 #include "otsdaq/WebUsersUtilities/RemoteWebUsers.h"
3 #include "otsdaq/CgiDataUtilities/CgiDataUtilities.h"
4 #include "otsdaq/SOAPUtilities/SOAPCommand.h"
5 #include "otsdaq/SOAPUtilities/SOAPParameters.h"
6 #include "otsdaq/SOAPUtilities/SOAPUtilities.h"
7 #include "otsdaq/XmlUtilities/HttpXmlDocument.h"
13 #include "otsdaq/SupervisorInfo/AllSupervisorInfo.h"
18 #define __MF_SUBJECT__ "RemoteWebUsers"
94 RemoteWebUsers::RemoteWebUsers(xdaq::Application* application)
97 ActiveUserLastUpdateTime_ = 0;
105 bool RemoteWebUsers::xmlRequestToGateway(cgicc::Cgicc& cgi,
106 std::ostringstream* out,
113 WebUsers::initializeRequestUserInfo(cgi, userInfo);
120 XDAQ_CONST_CALL xdaq::ApplicationDescriptor* gatewaySupervisor;
123 xoap::MessageReference retMsg;
137 if(allSupervisorInfo.isWizardMode())
140 std::string sequence =
141 CgiDataUtilities::getOrPostData(cgi,
"sequence");
143 if(!sequence.length())
145 __COUT_ERR__ <<
"Invalid access attempt (@" << userInfo.ip_ <<
")."
147 *out << WebUsers::REQ_NO_LOGIN_RESPONSE;
149 goto HANDLE_ACCESS_FAILURE;
154 gatewaySupervisor = allSupervisorInfo.getWizardInfo().getDescriptor();
155 if(!gatewaySupervisor)
157 __COUT_ERR__ <<
"Missing wizard supervisor." << std::endl;
158 *out << WebUsers::REQ_NO_LOGIN_RESPONSE;
160 goto HANDLE_ACCESS_FAILURE;
163 parameters.addParameter(
"sequence", sequence);
164 parameters.addParameter(
"IPAddress", userInfo.ip_);
165 retMsg = SOAPMessenger::sendWithSOAPReply(
166 gatewaySupervisor,
"SupervisorSequenceCheck", parameters);
168 parameters.addParameter(
"Permissions");
169 SOAPUtilities::receive(retMsg, parameters);
171 userInfo.setGroupPermissionLevels(parameters.getValue(
"Permissions"));
173 if(WebUsers::checkRequestAccess(
174 cgi, out, xmldoc, userInfo,
true , sequence))
177 goto HANDLE_ACCESS_FAILURE;
200 gatewaySupervisor = allSupervisorInfo.getGatewayInfo().getDescriptor();
202 if(!gatewaySupervisor)
204 __COUT_ERR__ <<
"Missing gateway supervisor." << std::endl;
205 *out << WebUsers::REQ_NO_LOGIN_RESPONSE;
206 goto HANDLE_ACCESS_FAILURE;
212 parameters.addParameter(
"CookieCode", userInfo.cookieCode_);
213 parameters.addParameter(
"RefreshOption", userInfo.automatedCommand_ ?
"0" :
"1");
214 parameters.addParameter(
"IPAddress", userInfo.ip_);
216 retMsg = SOAPMessenger::sendWithSOAPReply(
217 gatewaySupervisor,
"SupervisorCookieCheck", parameters);
220 parameters.addParameter(
"CookieCode");
221 parameters.addParameter(
"Permissions");
222 parameters.addParameter(
"UserGroups");
223 parameters.addParameter(
"UserWithLock");
224 parameters.addParameter(
"Username");
225 parameters.addParameter(
"DisplayName");
226 parameters.addParameter(
"ActiveSessionIndex");
227 SOAPUtilities::receive(retMsg, parameters);
233 userInfo.setGroupPermissionLevels(parameters.getValue(
"Permissions"));
234 userInfo.cookieCode_ = parameters.getValue(
"CookieCode");
235 userInfo.username_ = parameters.getValue(
"Username");
236 userInfo.displayName_ = parameters.getValue(
"DisplayName");
237 userInfo.usernameWithLock_ = parameters.getValue(
"UserWithLock");
238 userInfo.activeUserSessionIndex_ =
239 strtoul(parameters.getValue(
"ActiveSessionIndex").c_str(), 0, 0);
241 if(!WebUsers::checkRequestAccess(cgi, out, xmldoc, userInfo))
242 goto HANDLE_ACCESS_FAILURE;
249 HANDLE_ACCESS_FAILURE:
252 if(!userInfo.automatedCommand_)
253 __COUT_ERR__ <<
"Failed request (requestType = " << userInfo.requestType_
254 <<
"): " << out->str() << __E__;
262 std::string RemoteWebUsers::getActiveUserList(
263 XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor)
265 if(1 || time(0) - ActiveUserLastUpdateTime_ >
266 ACTIVE_USERS_UPDATE_THRESHOLD)
268 __COUT__ <<
"Need to update " << std::endl;
270 xoap::MessageReference retMsg = ots::SOAPMessenger::sendWithSOAPReply(
271 supervisorDescriptor,
"SupervisorGetActiveUsers");
274 SOAPUtilities::receive(retMsg, retParameters);
276 ActiveUserLastUpdateTime_ = time(0);
277 return (ActiveUserList_ = retParameters.getValue(
"UserList"));
280 return ActiveUserList_;
289 std::pair<std::string ,
TableGroupKey> RemoteWebUsers::getLastConfigGroup(
290 XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
291 const std::string& actionOfLastGroup,
292 std::string& actionTimeString)
294 actionTimeString =
"";
295 xoap::MessageReference retMsg = ots::SOAPMessenger::sendWithSOAPReply(
296 supervisorDescriptor,
297 "SupervisorLastConfigGroupRequest",
301 retParameters.addParameter(
"GroupName");
302 retParameters.addParameter(
"GroupKey");
303 retParameters.addParameter(
"GroupAction");
304 retParameters.addParameter(
"GroupActionTime");
305 SOAPUtilities::receive(retMsg, retParameters);
308 if(retParameters.getValue(
"GroupAction") !=
311 __COUT_WARN__ <<
"Returned group action '"
312 << retParameters.getValue(
"GroupAction")
313 <<
"' does not match requested group action '" << actionOfLastGroup
314 <<
".'" << std::endl;
319 theGroup.first = retParameters.getValue(
"GroupName");
320 theGroup.second = strtol(retParameters.getValue(
"GroupKey").c_str(), 0, 0);
321 actionTimeString = retParameters.getValue(
"GroupActionTime");
330 bool RemoteWebUsers::getUserInfoForCookie(
331 XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
332 std::string& cookieCode,
333 std::string* userName,
334 std::string* displayName,
335 uint64_t* activeSessionIndex)
337 __COUT__ << std::endl;
338 if(cookieCode.length() != WebUsers::COOKIE_CODE_LENGTH)
343 xoap::MessageReference retMsg =
344 SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
345 "SupervisorGetUserInfo",
349 retParameters.addParameter(
"Username");
350 retParameters.addParameter(
"DisplayName");
351 retParameters.addParameter(
"ActiveSessionIndex");
352 SOAPUtilities::receive(retMsg, retParameters);
354 *userName = retParameters.getValue(
"Username");
356 *displayName = retParameters.getValue(
"DisplayName");
357 if(activeSessionIndex)
358 *activeSessionIndex =
359 strtoul(retParameters.getValue(
"ActiveSessionIndex").c_str(), 0, 0);
361 __COUT__ <<
"userName " << *userName << std::endl;
369 bool RemoteWebUsers::cookieCodeIsActiveForRequest(
370 XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
371 std::string& cookieCode,
372 uint8_t* userPermissions,
375 std::string* userWithLock)
378 if(cookieCode.length() != WebUsers::COOKIE_CODE_LENGTH)
384 parameters.addParameter(
"CookieCode", cookieCode);
385 parameters.addParameter(
"RefreshOption", refreshCookie ?
"1" :
"0");
388 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(
389 supervisorDescriptor,
"SupervisorCookieCheck", parameters);
392 retParameters.addParameter(
"CookieCode");
393 retParameters.addParameter(
"Permissions");
394 retParameters.addParameter(
"UserWithLock");
395 SOAPUtilities::receive(retMsg, retParameters);
398 *userWithLock = retParameters.getValue(
"UserWithLock");
400 sscanf(retParameters.getValue(
"Permissions").c_str(),
404 cookieCode = retParameters.getValue(
"CookieCode");
406 return cookieCode.length() ==
407 WebUsers::COOKIE_CODE_LENGTH;
414 void RemoteWebUsers::sendSystemMessage(
415 XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
416 const std::string& toUser,
417 const std::string& msg)
420 parameters.addParameter(
"ToUser", toUser);
421 parameters.addParameter(
"Message", msg);
423 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(
424 supervisorDescriptor,
"SupervisorSystemMessage", parameters);
430 void RemoteWebUsers::makeSystemLogbookEntry(
431 XDAQ_CONST_CALL xdaq::ApplicationDescriptor* supervisorDescriptor,
432 const std::string& entryText)
435 parameters.addParameter(
"EntryText", entryText);
437 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(
438 supervisorDescriptor,
"SupervisorSystemLogbookEntry", parameters);