1 #include "otsdaq-core/WizardSupervisor/WizardSupervisor.h"
3 #include "otsdaq-core/GatewaySupervisor/GatewaySupervisor.h"
5 #include "otsdaq-core/MessageFacility/MessageFacility.h"
6 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
8 #include <xdaq/NamespaceURI.h>
9 #include "otsdaq-core/CgiDataUtilities/CgiDataUtilities.h"
10 #include "otsdaq-core/XmlUtilities/HttpXmlDocument.h"
11 #include "otsdaq-core/WebUsersUtilities/WebUsers.h"
12 #include "otsdaq-core/SOAPUtilities/SOAPUtilities.h"
13 #include "otsdaq-core/SOAPUtilities/SOAPCommand.h"
26 #define SECURITY_FILE_NAME std::string(getenv("SERVICE_DATA_PATH")) + "/OtsWizardData/security.dat"
27 #define SEQUENCE_FILE_NAME std::string(getenv("SERVICE_DATA_PATH")) + "/OtsWizardData/sequence.dat"
28 #define SEQUENCE_OUT_FILE_NAME std::string(getenv("SERVICE_DATA_PATH")) + "/OtsWizardData/sequence.out"
35 #define __MF_SUBJECT__ "Wizard"
39 WizardSupervisor::WizardSupervisor(xdaq::ApplicationStub * s)
throw (xdaq::exception::Exception):
40 xdaq::Application(s ),
43 INIT_MF(
"OtsConfigurationWizard");
47 mkdir((std::string(getenv(
"SERVICE_DATA_PATH"))).c_str(), 0755);
48 mkdir((std::string(getenv(
"SERVICE_DATA_PATH")) +
"/OtsWizardData").c_str(), 0755);
51 xgi::bind (
this, &WizardSupervisor::Default,
"Default" );
52 xgi::bind (
this, &WizardSupervisor::verification,
"Verify" );
53 xgi::bind (
this, &WizardSupervisor::requestIcons,
"requestIcons" );
54 xgi::bind (
this, &WizardSupervisor::editSecurity,
"editSecurity" );
55 xgi::bind (
this, &WizardSupervisor::tooltipRequest,
"TooltipRequest" );
56 xgi::bind (
this, &WizardSupervisor::toggleSecurityCodeGeneration,
"ToggleSecurityCodeGeneration" );
57 xoap::bind(
this, &WizardSupervisor::supervisorSequenceCheck,
"SupervisorSequenceCheck", XDAQ_NS_URI);
58 xoap::bind(
this, &WizardSupervisor::supervisorLastConfigGroupRequest,
"SupervisorLastConfigGroupRequest", XDAQ_NS_URI);
64 WizardSupervisor::~WizardSupervisor(
void)
70 void WizardSupervisor::init(
void)
72 getApplicationContext();
76 void WizardSupervisor::generateURL()
78 defaultSequence_ =
true;
80 FILE *fp = fopen((SEQUENCE_FILE_NAME).c_str(),
"r");
83 __COUT_INFO__ <<
"Sequence length file found: " << SEQUENCE_FILE_NAME << std::endl;
86 sscanf(line,
"%d",&length);
91 defaultSequence_ =
false;
96 __COUT_INFO__ <<
"(Reverting to default wiz security) Sequence length file NOT found: " << SEQUENCE_FILE_NAME << std::endl;
100 __COUT__ <<
"Sequence length = " << length << std::endl;
104 static const char alphanum[] =
106 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
107 "abcdefghijklmnopqrstuvwxyz";
110 for (
int i = 0; i < length; ++i) {
111 securityCode_ += alphanum[rand() % (
sizeof(alphanum) - 1)];
114 std::cout << __COUT_HDR_FL__ <<
115 getenv(
"OTS_CONFIGURATION_WIZARD_SUPERVISOR_SERVER") <<
":" << getenv(
"PORT") <<
116 "/urn:xdaq-application:lid="
117 << this->getApplicationDescriptor()->getLocalId() <<
"/Verify?code=" << securityCode_ << std::endl;
123 fp = fopen((SEQUENCE_OUT_FILE_NAME).c_str(),
"w");
126 fprintf(fp,
"%s",securityCode_.c_str());
130 __COUT_ERR__ <<
"Sequence output file NOT found: " << SEQUENCE_OUT_FILE_NAME << std::endl;
137 std::string securityCode)
139 INIT_MF(
"ConfigurationWizard");
144 std::this_thread::sleep_for (std::chrono::seconds(2));
145 std::cout << __COUT_HDR_FL__ <<
146 getenv(
"OTS_CONFIGURATION_WIZARD_SUPERVISOR_SERVER") <<
":" << getenv(
"PORT") <<
147 "/urn:xdaq-application:lid="
148 << ptr->getApplicationDescriptor()->getLocalId() <<
"/Verify?code=" << securityCode << std::endl;
153 void WizardSupervisor::destroy(
void)
161 void WizardSupervisor::tooltipRequest(xgi::Input * in, xgi::Output * out)
162 throw (xgi::exception::Exception)
164 cgicc::Cgicc cgi(in);
166 std::string Command = CgiDataUtilities::getData(cgi,
"RequestType");
167 __COUT__ <<
"Command = " << Command << std::endl;
169 std::string submittedSequence = CgiDataUtilities::postData(cgi,
"sequence");
172 if(securityCode_.compare(submittedSequence) != 0)
174 __COUT__ <<
"Unauthorized Request made, security sequence doesn't match!" << std::endl;
179 __COUT__ <<
"***Successfully authenticated security sequence." << std::endl;
185 if(Command ==
"check")
187 WebUsers::tooltipCheckForUsername(
188 WebUsers::DEFAULT_ADMIN_USERNAME,
190 CgiDataUtilities::getData(cgi,
"srcFile"),
191 CgiDataUtilities::getData(cgi,
"srcFunc"),
192 CgiDataUtilities::getData(cgi,
"srcId"));
194 else if(Command ==
"setNeverShow")
196 WebUsers::tooltipSetNeverShowForUsername(
197 WebUsers::DEFAULT_ADMIN_USERNAME,
199 CgiDataUtilities::getData(cgi,
"srcFile"),
200 CgiDataUtilities::getData(cgi,
"srcFunc"),
201 CgiDataUtilities::getData(cgi,
"srcId"),
202 CgiDataUtilities::getData(cgi,
"doNeverShow") ==
"1"?
true:
false,
203 CgiDataUtilities::getData(cgi,
"temporarySilence") ==
"1"?
true:
false);
207 __COUT__ <<
"Command Request, " << Command <<
", not recognized." << std::endl;
209 xmldoc.outputXmlDocument((std::ostringstream*) out,
false,
true);
213 void WizardSupervisor::toggleSecurityCodeGeneration(xgi::Input * in, xgi::Output * out)
214 throw (xgi::exception::Exception)
216 cgicc::Cgicc cgi(in);
218 std::string Command = CgiDataUtilities::getData(cgi,
"RequestType");
219 __COUT__ <<
"Got to Command = " << Command << std::endl;
221 std::string submittedSequence = CgiDataUtilities::postData(cgi,
"sequence");
224 if(securityCode_.compare(submittedSequence) != 0)
226 __COUT__ <<
"Unauthorized Request made, security sequence doesn't match!" << std::endl;
231 __COUT__ <<
"***Successfully authenticated security sequence." << std::endl;
237 if(Command ==
"TurnGenerationOn")
239 __COUT__ <<
"Turning automatic URL Generation on with a sequence depth of 16!" << std::endl;
240 std::ofstream outfile ((SEQUENCE_FILE_NAME).c_str());
241 outfile <<
"16" << std::endl;
251 {printURL(ptr,securityCode);},
this,securityCode_).detach();
253 xmldoc.addTextElementToData(
"Status",
"Generation_Success");
256 __COUT__ <<
"Command Request, " << Command <<
", not recognized." << std::endl;
258 xmldoc.outputXmlDocument((std::ostringstream*) out,
false,
true);
264 xoap::MessageReference WizardSupervisor::supervisorSequenceCheck(xoap::MessageReference message)
265 throw (xoap::exception::Exception)
269 parameters.addParameter(
"sequence");
270 receive(message, parameters);
272 std::string submittedSequence = parameters.getValue(
"sequence");
276 uint8_t userPermissions = 0;
277 std::string userWithLock =
"";
279 if(securityCode_ == submittedSequence)
280 userPermissions = 255;
282 __COUT__ <<
"Unauthorized Request made, security sequence doesn't match!" << std::endl;
287 sprintf(tmp,
"%d", userPermissions);
288 retParameters.addParameter(
"Permissions", tmp);
291 return SOAPUtilities::makeSOAPMessageReference(
"SequenceResponse",
300 xoap::MessageReference WizardSupervisor::supervisorLastConfigGroupRequest(
301 xoap::MessageReference message)
302 throw (xoap::exception::Exception)
305 parameters.addParameter(
"ActionOfLastGroup");
306 receive(message, parameters);
308 return GatewaySupervisor::lastConfigGroupRequestHandler(parameters);
312 void WizardSupervisor::Default(xgi::Input * in, xgi::Output * out )
313 throw (xgi::exception::Exception)
315 __COUT__ <<
"Unauthorized Request made, security sequence doesn't match!" << std::endl;
316 *out <<
"Unauthorized Request.";
320 void WizardSupervisor::verification(xgi::Input * in, xgi::Output * out )
321 throw (xgi::exception::Exception)
323 cgicc::Cgicc cgi(in);
324 std::string submittedSequence = CgiDataUtilities::getData(cgi,
"code");
325 __COUT__ <<
"submittedSequence=" << submittedSequence <<
326 " " << time(0) << std::endl;
328 std::string securityWarning =
"";
330 if(securityCode_.compare(submittedSequence) != 0)
332 __COUT__ <<
"Unauthorized Request made, security sequence doesn't match!" << std::endl;
333 *out <<
"Invalid code.";
339 __COUT__ <<
"***Successfully authenticated security sequence. Default Sequence: "<< defaultSequence_ <<
340 time(0) << std::endl;
342 if (defaultSequence_)
344 __COUT__ <<
" UNSECURE!!!" << std::endl;
345 securityWarning =
"&secure=False";
349 *out <<
"<!DOCTYPE HTML><html lang='en'><head><title>ots wiz</title>" <<
352 "<link rel='apple-touch-icon' sizes='57x57' href='/WebPath/images/otsdaqIcons/apple-icon-57x57.png'>\
353 <link rel='apple-touch-icon' sizes='60x60' href='/WebPath/images/otsdaqIcons/apple-icon-60x60.png'>\
354 <link rel='apple-touch-icon' sizes='72x72' href='/WebPath/images/otsdaqIcons/apple-icon-72x72.png'>\
355 <link rel='apple-touch-icon' sizes='76x76' href='/WebPath/images/otsdaqIcons/apple-icon-76x76.png'>\
356 <link rel='apple-touch-icon' sizes='114x114' href='/WebPath/images/otsdaqIcons/apple-icon-114x114.png'>\
357 <link rel='apple-touch-icon' sizes='120x120' href='/WebPath/images/otsdaqIcons/apple-icon-120x120.png'>\
358 <link rel='apple-touch-icon' sizes='144x144' href='/WebPath/images/otsdaqIcons/apple-icon-144x144.png'>\
359 <link rel='apple-touch-icon' sizes='152x152' href='/WebPath/images/otsdaqIcons/apple-icon-152x152.png'>\
360 <link rel='apple-touch-icon' sizes='180x180' href='/WebPath/images/otsdaqIcons/apple-icon-180x180.png'>\
361 <link rel='icon' type='image/png' sizes='192x192' href='/WebPath/images/otsdaqIcons/android-icon-192x192.png'>\
362 <link rel='icon' type='image/png' sizes='32x32' href='/WebPath/images/otsdaqIcons/favicon-32x32.png'>\
363 <link rel='icon' type='image/png' sizes='96x96' href='/WebPath/images/otsdaqIcons/favicon-96x96.png'>\
364 <link rel='icon' type='image/png' sizes='16x16' href='/WebPath/images/otsdaqIcons/favicon-16x16.png'>\
365 <link rel='manifest' href='/WebPath/images/otsdaqIcons/manifest.json'>\
366 <meta name='msapplication-TileColor' content='#ffffff'>\
367 <meta name='msapplication-TileImage' content='/ms-icon-144x144.png'>\
368 <meta name='theme-color' content='#ffffff'>" <<
371 "<frameset col='100%' row='100%'><frame src='/WebPath/html/Wizard.html?urn=" <<
372 this->getApplicationDescriptor()->getLocalId() << securityWarning <<
"'></frameset></html>";
377 void WizardSupervisor::requestIcons(xgi::Input * in, xgi::Output * out )
378 throw (xgi::exception::Exception)
380 cgicc::Cgicc cgi(in);
382 std::string submittedSequence = CgiDataUtilities::postData(cgi,
"sequence");
385 if(securityCode_.compare(submittedSequence) != 0)
387 __COUT__ <<
"Unauthorized Request made, security sequence doesn't match! " <<
388 time(0) << std::endl;
393 __COUT__ <<
"***Successfully authenticated security sequence. " <<
394 time(0) << std::endl;
408 *out <<
"Security Settings,SEC,1,1,icon-SecuritySettings.png,/WebPath/html/SecuritySettings.html,/" <<
409 ",Edit User Data,USER,1,1,icon-EditUserData.png,/WebPath/html/EditUserData.html,/" <<
410 ",Configure,CFG,0,1,icon-Configure.png,/urn:xdaq-application:lid=280/,/" <<
411 ",Table Editor,TBL,0,1,icon-IconEditor.png,/urn:xdaq-application:lid=280/?configWindowName=tableEditor,/" <<
416 ",Front-end Wizard,CFG,0,1,icon-Configure.png,/WebPath/html/RecordWiz_ConfigurationGUI.html?urn=280&subsetBasePath=FEInterfaceConfiguration&recordAlias=Front%2Dend,Config Wizards" <<
417 ",Producer Wizard,CFG,0,1,icon-Configure.png,/WebPath/html/RecordWiz_ConfigurationGUI.html?urn=280&subsetBasePath=FEInterfaceConfiguration&recordAlias=Producer,Config Wizards" <<
418 ",Consumer Wizard,CFG,0,1,icon-Configure.png,/WebPath/html/RecordWiz_ConfigurationGUI.html?urn=280&subsetBasePath=FEInterfaceConfiguration&recordAlias=Consumer,Config Wizards" <<
419 ",Console,C,1,1,icon-Console.png,/urn:xdaq-application:lid=260/,/" <<
426 void WizardSupervisor::editSecurity(xgi::Input * in, xgi::Output * out )
427 throw (xgi::exception::Exception)
431 cgicc::Cgicc cgi(in);
432 std::string submittedSequence = CgiDataUtilities::postData(cgi,
"sequence");
433 std::string submittedSecurity = CgiDataUtilities::postData(cgi,
"selection");
434 std::string securityFileName = SECURITY_FILE_NAME;
438 if(securityCode_.compare(submittedSequence) != 0)
440 __COUT__ <<
"Unauthorized Request made, security sequence doesn't match!" << std::endl;
445 __COUT__ <<
"***Successfully authenticated security sequence." << std::endl;
451 if(submittedSecurity !=
"")
453 __COUT__ <<
"Selection exists!" << std::endl;
454 __COUT__ << submittedSecurity << std::endl;
456 if(submittedSecurity ==
"ResetAllUserData")
458 WebUsers::deleteUserData();
459 __COUT__ <<
"Turning URL Generation back to default!" << std::endl;
462 std::ofstream newFile ((SEQUENCE_FILE_NAME).c_str());
463 newFile <<
"4" << std::endl;
468 {printURL(ptr,securityCode);},
this,securityCode_).detach();
469 *out <<
"Default_URL_Generation";
471 else if(submittedSecurity ==
"ResetAllUserTooltips")
473 WebUsers::resetAllUserTooltips();
474 *out << submittedSecurity;
477 else if(submittedSecurity ==
"DigestAccessAuthentication" ||
478 submittedSecurity ==
"NoSecurity")
480 std::ofstream writeSecurityFile;
482 writeSecurityFile.open(securityFileName.c_str());
483 if(writeSecurityFile.is_open())
484 writeSecurityFile << submittedSecurity;
486 __COUT__ <<
"Error writing file!" << std::endl;
488 writeSecurityFile.close();
492 __COUT_ERR__ <<
"Invalid submittedSecurity string: " <<
493 submittedSecurity << std::endl;
501 std::ifstream securityFile;
503 std::string security =
"";
506 securityFile.open(securityFileName.c_str());
510 __SS__ <<
"Error opening file: "<< securityFileName << std::endl;
511 __COUT_ERR__ <<
"\n" << ss.str();
514 security =
"DigestAccessAuthentication";
516 if(securityFile.is_open())
519 while(std::getline(securityFile, line))
527 securityFile.close();