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"
10 #include "otsdaq-core/SupervisorDescriptorInfo/SupervisorDescriptorInfo.h"
20 #define __MF_SUBJECT__ "RemoteWebUsers"
89 RemoteWebUsers::RemoteWebUsers(xdaq::Application* application)
92 ActiveUserLastUpdateTime_ = 0;
99 bool RemoteWebUsers::xmlLoginGateway(
101 std::ostringstream *out,
104 uint8_t *userPermissions,
106 const uint8_t permissionsThreshold,
107 const bool checkLock,
108 const bool lockRequired,
109 std::string *userWithLock,
110 std::string *userName,
111 std::string *displayName,
112 uint64_t *activeSessionIndex )
115 if(userPermissions) *userPermissions = 0;
116 if(userWithLock) *userWithLock =
"";
117 if(userName) *userName =
"";
118 if(displayName) *displayName =
"";
119 if(activeSessionIndex) *activeSessionIndex = -1;
121 const std::string ip = cgi.getEnvironment().getRemoteAddr();
129 const xdaq::ApplicationDescriptor* gatewaySupervisor;
132 xoap::MessageReference retMsg;
137 std::string cookieCode = CgiDataUtilities::getOrPostData(cgi,
"CookieCode");
145 gatewaySupervisor = theSupervisorsDescriptorInfo.getSupervisorDescriptor();
146 if(!gatewaySupervisor)
149 std::string sequence = CgiDataUtilities::getOrPostData(cgi,
"sequence");
151 if(!sequence.length())
153 __MOUT__ <<
"Invalid attempt." << std::endl;
154 *out << RemoteWebUsers::REQ_NO_LOGIN_RESPONSE;
160 gatewaySupervisor = theSupervisorsDescriptorInfo.getWizardDescriptor();
161 if(!gatewaySupervisor)
163 *out << RemoteWebUsers::REQ_NO_LOGIN_RESPONSE;
167 parameters.addParameter(
"sequence",sequence);
168 retMsg = SOAPMessenger::sendWithSOAPReply(gatewaySupervisor,
169 "SupervisorSequenceCheck", parameters);
171 parameters.addParameter(
"Permissions");
172 receive(retMsg, parameters);
174 uint8_t tmpUserPermissions;
175 sscanf(parameters.getValue(
"Permissions").c_str(),
"%hhu",&tmpUserPermissions);
177 if(userPermissions) *userPermissions = tmpUserPermissions;
179 if(tmpUserPermissions < permissionsThreshold)
181 *out << RemoteWebUsers::REQ_NO_LOGIN_RESPONSE;
182 __MOUT__ <<
"User has insufficient permissions: " << tmpUserPermissions <<
"<" <<
183 permissionsThreshold << std::endl;
187 if(userWithLock) *userWithLock =
"admin";
188 if(userName) *userName =
"admin";
189 if(displayName) *displayName =
"Admin";
190 if(activeSessionIndex) *activeSessionIndex = 0;
198 parameters.addParameter(
"CookieCode",cookieCode);
199 parameters.addParameter(
"RefreshOption",refresh?
"1":
"0");
201 retMsg = SOAPMessenger::sendWithSOAPReply(gatewaySupervisor,
202 "SupervisorCookieCheck", parameters);
205 parameters.addParameter(
"CookieCode");
206 parameters.addParameter(
"Permissions");
207 parameters.addParameter(
"UserWithLock");
208 receive(retMsg, parameters);
209 std::string tmpUserWithLock = parameters.getValue(
"UserWithLock");
210 uint8_t tmpUserPermissions;
211 sscanf(parameters.getValue(
"Permissions").c_str(),
"%hhu",&tmpUserPermissions);
212 if(userWithLock) *userWithLock = tmpUserWithLock;
213 if(userPermissions) *userPermissions = tmpUserPermissions;
215 cookieCode = parameters.getValue(
"CookieCode");
219 if(cookieCode.length() != COOKIE_CODE_LENGTH)
221 *out << RemoteWebUsers::REQ_NO_LOGIN_RESPONSE;
225 if(tmpUserPermissions < permissionsThreshold)
227 *out << RemoteWebUsers::REQ_NO_PERMISSION_RESPONSE;
228 __MOUT__ <<
"User has insufficient permissions: " << tmpUserPermissions <<
"<" <<
229 permissionsThreshold << std::endl;
234 xmldoc->setHeader(cookieCode);
236 if(!userName && !displayName && !activeSessionIndex && !checkLock && !lockRequired)
245 parameters.addParameter(
"CookieCode",cookieCode);
246 retMsg = SOAPMessenger::sendWithSOAPReply(gatewaySupervisor,
247 "SupervisorGetUserInfo", parameters);
250 parameters.addParameter(
"Username");
251 parameters.addParameter(
"DisplayName");
252 parameters.addParameter(
"ActiveSessionIndex");
253 receive(retMsg, parameters);
254 std::string tmpUserName = parameters.getValue(
"Username");
255 if(userName) *userName = tmpUserName;
256 if(displayName) *displayName = parameters.getValue(
"DisplayName");
257 if(activeSessionIndex) *activeSessionIndex = strtoul(parameters.getValue(
"ActiveSessionIndex").c_str(),0,0);
259 if(checkLock && tmpUserWithLock !=
"" && tmpUserWithLock != tmpUserName)
261 *out << RemoteWebUsers::REQ_USER_LOCKOUT_RESPONSE;
262 __MOUT__ <<
"User " << tmpUserName <<
" is locked out. " << tmpUserWithLock <<
" has lock." << std::endl;
266 if(lockRequired && tmpUserWithLock != tmpUserName)
268 *out << RemoteWebUsers::REQ_LOCK_REQUIRED_RESPONSE;
269 __MOUT__ <<
"User " << tmpUserName <<
" must have lock to proceed. (" << tmpUserWithLock <<
" has lock.)" << std::endl;
281 return theSupervisorsDescriptorInfo.getWizardDescriptor()?
true:
false;
288 std::string RemoteWebUsers::getActiveUserList(
const xdaq::ApplicationDescriptor* supervisorDescriptor)
291 if(1 || time(0) - ActiveUserLastUpdateTime_ > ACTIVE_USERS_UPDATE_THRESHOLD)
294 __MOUT__ <<
"Need to update " << std::endl;
296 xoap::MessageReference retMsg = ots::SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorGetActiveUsers");
300 receive(retMsg, retParameters);
302 ActiveUserLastUpdateTime_ = time(0);
303 return (ActiveUserList_ = retParameters.getValue(
"UserList"));
306 return ActiveUserList_;
315 const xdaq::ApplicationDescriptor* supervisorDescriptor,
316 const std::string &actionOfLastGroup,
317 std::string &actionTimeString)
319 actionTimeString =
"";
320 xoap::MessageReference retMsg = ots::SOAPMessenger::sendWithSOAPReply(
321 supervisorDescriptor,
"SupervisorLastConfigGroupRequest",
326 retParameters.addParameter(
"GroupName");
327 retParameters.addParameter(
"GroupKey");
328 retParameters.addParameter(
"GroupAction");
329 retParameters.addParameter(
"GroupActionTime");
330 receive(retMsg, retParameters);
333 if(retParameters.getValue(
"GroupAction") != actionOfLastGroup)
335 __MOUT_WARN__ <<
"Returned group action '" << retParameters.getValue(
"GroupAction") <<
336 "' does not match requested group action '" << actionOfLastGroup <<
".'" << std::endl;
341 theGroup.first = retParameters.getValue(
"GroupName");
342 theGroup.second = strtol(retParameters.getValue(
"GroupKey").c_str(),0,0);
343 actionTimeString = retParameters.getValue(
"GroupActionTime");
352 bool RemoteWebUsers::getUserInfoForCookie(
const xdaq::ApplicationDescriptor* supervisorDescriptor,
353 std::string &cookieCode, std::string *userName, std::string *displayName, uint64_t *activeSessionIndex)
355 __MOUT__ << std::endl;
356 if(cookieCode.length() != COOKIE_CODE_LENGTH)
return false;
360 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorGetUserInfo",
SOAPParameters(
"CookieCode",cookieCode));
363 retParameters.addParameter(
"Username");
364 retParameters.addParameter(
"DisplayName");
365 retParameters.addParameter(
"ActiveSessionIndex");
366 receive(retMsg, retParameters);
367 if(userName) *userName = retParameters.getValue(
"Username");
368 if(displayName) *displayName = retParameters.getValue(
"DisplayName");
369 if(activeSessionIndex) *activeSessionIndex = strtoul(retParameters.getValue(
"ActiveSessionIndex").c_str(),0,0);
371 __MOUT__ <<
"userName " << *userName << std::endl;
379 bool RemoteWebUsers::cookieCodeIsActiveForRequest(
const xdaq::ApplicationDescriptor* supervisorDescriptor,
380 std::string &cookieCode, uint8_t *userPermissions, std::string ip,
bool refresh, std::string *userWithLock)
383 if(cookieCode.length() != COOKIE_CODE_LENGTH)
return false;
388 parameters.addParameter(
"CookieCode",cookieCode);
389 parameters.addParameter(
"RefreshOption",refresh?
"1":
"0");
392 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorCookieCheck", parameters);
396 retParameters.addParameter(
"CookieCode");
397 retParameters.addParameter(
"Permissions");
398 retParameters.addParameter(
"UserWithLock");
399 receive(retMsg, retParameters);
403 if(userWithLock) *userWithLock = retParameters.getValue(
"UserWithLock");
404 if(userPermissions) sscanf(retParameters.getValue(
"Permissions").c_str(),
"%hhu",userPermissions);
406 cookieCode = retParameters.getValue(
"CookieCode");
408 return cookieCode.length() == COOKIE_CODE_LENGTH;
414 void RemoteWebUsers::sendSystemMessage(
const xdaq::ApplicationDescriptor* supervisorDescriptor,
const std::string& toUser,
const std::string& msg)
417 parameters.addParameter(
"ToUser" , toUser);
418 parameters.addParameter(
"Message", msg);
420 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorSystemMessage",parameters);
427 void RemoteWebUsers::makeSystemLogbookEntry(
const xdaq::ApplicationDescriptor* supervisorDescriptor,
const std::string& entryText)
430 parameters.addParameter(
"EntryText", entryText);
432 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorSystemLogbookEntry",parameters);