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 __COUT__ <<
"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 __COUT__ <<
"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 tmpUserWithLock_ = parameters.getValue(
"UserWithLock");
210 sscanf(parameters.getValue(
"Permissions").c_str(),
"%hhu",&tmpUserPermissions_);
211 if(userWithLock) *userWithLock = tmpUserWithLock_;
212 if(userPermissions) *userPermissions = tmpUserPermissions_;
214 cookieCode = parameters.getValue(
"CookieCode");
218 if(cookieCode.length() != COOKIE_CODE_LENGTH)
220 *out << RemoteWebUsers::REQ_NO_LOGIN_RESPONSE;
224 if(tmpUserPermissions_ < permissionsThreshold)
226 *out << RemoteWebUsers::REQ_NO_PERMISSION_RESPONSE;
227 __COUT__ <<
"User has insufficient permissions: " << tmpUserPermissions_ <<
"<" <<
228 permissionsThreshold << std::endl;
233 xmldoc->setHeader(cookieCode);
235 if(!userName && !displayName && !activeSessionIndex && !checkLock && !lockRequired)
244 parameters.addParameter(
"CookieCode",cookieCode);
245 retMsg = SOAPMessenger::sendWithSOAPReply(gatewaySupervisor,
246 "SupervisorGetUserInfo", parameters);
249 parameters.addParameter(
"Username");
250 parameters.addParameter(
"DisplayName");
251 parameters.addParameter(
"ActiveSessionIndex");
252 receive(retMsg, parameters);
253 std::string tmpUserName = parameters.getValue(
"Username");
254 if(userName) *userName = tmpUserName;
255 if(displayName) *displayName = parameters.getValue(
"DisplayName");
256 if(activeSessionIndex) *activeSessionIndex = strtoul(parameters.getValue(
"ActiveSessionIndex").c_str(),0,0);
258 if(checkLock && tmpUserWithLock_ !=
"" && tmpUserWithLock_ != tmpUserName)
260 *out << RemoteWebUsers::REQ_USER_LOCKOUT_RESPONSE;
261 __COUT__ <<
"User " << tmpUserName <<
" is locked out. " << tmpUserWithLock_ <<
" has lock." << std::endl;
265 if(lockRequired && tmpUserWithLock_ != tmpUserName)
267 *out << RemoteWebUsers::REQ_LOCK_REQUIRED_RESPONSE;
268 __COUT__ <<
"User " << tmpUserName <<
" must have lock to proceed. (" << tmpUserWithLock_ <<
" has lock.)" << std::endl;
280 return theSupervisorsDescriptorInfo.getWizardDescriptor()?
true:
false;
287 std::string RemoteWebUsers::getActiveUserList(
const xdaq::ApplicationDescriptor* supervisorDescriptor)
290 if(1 || time(0) - ActiveUserLastUpdateTime_ > ACTIVE_USERS_UPDATE_THRESHOLD)
293 __COUT__ <<
"Need to update " << std::endl;
295 xoap::MessageReference retMsg = ots::SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorGetActiveUsers");
299 receive(retMsg, retParameters);
301 ActiveUserLastUpdateTime_ = time(0);
302 return (ActiveUserList_ = retParameters.getValue(
"UserList"));
305 return ActiveUserList_;
314 const xdaq::ApplicationDescriptor* supervisorDescriptor,
315 const std::string &actionOfLastGroup,
316 std::string &actionTimeString)
318 actionTimeString =
"";
319 xoap::MessageReference retMsg = ots::SOAPMessenger::sendWithSOAPReply(
320 supervisorDescriptor,
"SupervisorLastConfigGroupRequest",
325 retParameters.addParameter(
"GroupName");
326 retParameters.addParameter(
"GroupKey");
327 retParameters.addParameter(
"GroupAction");
328 retParameters.addParameter(
"GroupActionTime");
329 receive(retMsg, retParameters);
332 if(retParameters.getValue(
"GroupAction") != actionOfLastGroup)
334 __COUT_WARN__ <<
"Returned group action '" << retParameters.getValue(
"GroupAction") <<
335 "' does not match requested group action '" << actionOfLastGroup <<
".'" << std::endl;
340 theGroup.first = retParameters.getValue(
"GroupName");
341 theGroup.second = strtol(retParameters.getValue(
"GroupKey").c_str(),0,0);
342 actionTimeString = retParameters.getValue(
"GroupActionTime");
351 bool RemoteWebUsers::getUserInfoForCookie(
const xdaq::ApplicationDescriptor* supervisorDescriptor,
352 std::string &cookieCode, std::string *userName, std::string *displayName, uint64_t *activeSessionIndex)
354 __COUT__ << std::endl;
355 if(cookieCode.length() != COOKIE_CODE_LENGTH)
return false;
359 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorGetUserInfo",
SOAPParameters(
"CookieCode",cookieCode));
362 retParameters.addParameter(
"Username");
363 retParameters.addParameter(
"DisplayName");
364 retParameters.addParameter(
"ActiveSessionIndex");
365 receive(retMsg, retParameters);
366 if(userName) *userName = retParameters.getValue(
"Username");
367 if(displayName) *displayName = retParameters.getValue(
"DisplayName");
368 if(activeSessionIndex) *activeSessionIndex = strtoul(retParameters.getValue(
"ActiveSessionIndex").c_str(),0,0);
370 __COUT__ <<
"userName " << *userName << std::endl;
378 bool RemoteWebUsers::cookieCodeIsActiveForRequest(
const xdaq::ApplicationDescriptor* supervisorDescriptor,
379 std::string &cookieCode, uint8_t *userPermissions, std::string ip,
bool refresh, std::string *userWithLock)
382 if(cookieCode.length() != COOKIE_CODE_LENGTH)
return false;
387 parameters.addParameter(
"CookieCode",cookieCode);
388 parameters.addParameter(
"RefreshOption",refresh?
"1":
"0");
391 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorCookieCheck", parameters);
395 retParameters.addParameter(
"CookieCode");
396 retParameters.addParameter(
"Permissions");
397 retParameters.addParameter(
"UserWithLock");
398 receive(retMsg, retParameters);
402 if(userWithLock) *userWithLock = retParameters.getValue(
"UserWithLock");
403 if(userPermissions) sscanf(retParameters.getValue(
"Permissions").c_str(),
"%hhu",userPermissions);
405 cookieCode = retParameters.getValue(
"CookieCode");
407 return cookieCode.length() == COOKIE_CODE_LENGTH;
413 void RemoteWebUsers::sendSystemMessage(
const xdaq::ApplicationDescriptor* supervisorDescriptor,
const std::string& toUser,
const std::string& msg)
416 parameters.addParameter(
"ToUser" , toUser);
417 parameters.addParameter(
"Message", msg);
419 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorSystemMessage",parameters);
426 void RemoteWebUsers::makeSystemLogbookEntry(
const xdaq::ApplicationDescriptor* supervisorDescriptor,
const std::string& entryText)
429 parameters.addParameter(
"EntryText", entryText);
431 xoap::MessageReference retMsg = SOAPMessenger::sendWithSOAPReply(supervisorDescriptor,
"SupervisorSystemLogbookEntry",parameters);