PageRenderTime 53ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/retroshare-gui/src/gui/settings/WebuiPage.cpp

https://gitlab.com/cave/RetroShare
C++ | 148 lines | 127 code | 19 blank | 2 comment | 17 complexity | 0744a17db97065e28e8a0ba386d79e92 MD5 | raw file
Possible License(s): 0BSD, GPL-2.0
  1. #include "WebuiPage.h"
  2. #include <iostream>
  3. #include <QMessageBox>
  4. #include <QDesktopServices>
  5. #include <QUrl>
  6. #include "api/ApiServer.h"
  7. #include "api/ApiServerMHD.h"
  8. #include "api/RsControlModule.h"
  9. #include "api/GetPluginInterfaces.h"
  10. #include "rsharesettings.h"
  11. resource_api::ApiServer* WebuiPage::apiServer = 0;
  12. resource_api::ApiServerMHD* WebuiPage::apiServerMHD = 0;
  13. resource_api::RsControlModule* WebuiPage::controlModule = 0;
  14. WebuiPage::WebuiPage(QWidget */*parent*/, Qt::WindowFlags /*flags*/)
  15. {
  16. ui.setupUi(this);
  17. connect(ui.enableWebUI_CB, SIGNAL(clicked(bool)), this, SLOT(onEnableCBClicked(bool)));
  18. connect(ui.applyStartBrowser_PB, SIGNAL(clicked()), this, SLOT(onApplyClicked()));
  19. }
  20. WebuiPage::~WebuiPage()
  21. {
  22. }
  23. bool WebuiPage::save(QString &errmsg)
  24. {
  25. std::cerr << "WebuiPage::save()" << std::endl;
  26. bool ok = true;
  27. bool changed = false;
  28. if(ui.enableWebUI_CB->isChecked() != Settings->getWebinterfaceEnabled())
  29. changed = true;
  30. if(ui.port_SB->value() != Settings->getWebinterfacePort())
  31. changed = true;
  32. if(ui.allIp_CB->isChecked() != Settings->getWebinterfaceAllowAllIps())
  33. changed = true;
  34. if(changed)
  35. {
  36. // store config
  37. Settings->setWebinterfaceEnabled(ui.enableWebUI_CB->isChecked());
  38. Settings->setWebinterfacePort(ui.port_SB->value());
  39. Settings->setWebinterfaceAllowAllIps(ui.allIp_CB->isChecked());
  40. // apply config
  41. checkShutdownWebui();
  42. ok = checkStartWebui();
  43. }
  44. if(!ok)
  45. errmsg = "Could not start webinterface.";
  46. return ok;
  47. }
  48. void WebuiPage::load()
  49. {
  50. std::cerr << "WebuiPage::load()" << std::endl;
  51. ui.enableWebUI_CB->setChecked(Settings->getWebinterfaceEnabled());
  52. onEnableCBClicked(Settings->getWebinterfaceEnabled());
  53. ui.port_SB->setValue(Settings->getWebinterfacePort());
  54. ui.allIp_CB->setChecked(Settings->getWebinterfaceAllowAllIps());
  55. }
  56. QString WebuiPage::helpText() const
  57. {
  58. return tr("<h1><img width=\"24\" src=\":/icons/help_64.png\">&nbsp;&nbsp;Webinterface</h1> \
  59. <p>The webinterface allows to control Retroshare from the browser. Multiple devices can share control over one Retroshare instance. So you could start a conversation on a tablet computer and later use a desktop computer to continue it.</p>\
  60. <p>Warning: don't expose the webinterface to the internet, because there is no access control and no encryption. If you want to use the webinterface over the internet, use a SSH tunnel or a proxy to secure the connection.</p>");
  61. }
  62. /*static*/ bool WebuiPage::checkStartWebui()
  63. {
  64. if(!Settings->getWebinterfaceEnabled())
  65. return true;
  66. if(apiServer || apiServerMHD || controlModule)
  67. return true;
  68. apiServer = new resource_api::ApiServer();
  69. controlModule = new resource_api::RsControlModule(0, 0, apiServer->getStateTokenServer(), apiServer, false);
  70. apiServer->addResourceHandler("control", dynamic_cast<resource_api::ResourceRouter*>(controlModule), &resource_api::RsControlModule::handleRequest);
  71. RsPlugInInterfaces ifaces;
  72. resource_api::getPluginInterfaces(ifaces);
  73. apiServer->loadMainModules(ifaces);
  74. apiServerMHD = new resource_api::ApiServerMHD(apiServer);
  75. bool ok = apiServerMHD->configure(resource_api::getDefaultDocroot(),
  76. Settings->getWebinterfacePort(),
  77. "",
  78. Settings->getWebinterfaceAllowAllIps());
  79. apiServerMHD->start();
  80. return ok;
  81. }
  82. /*static*/ void WebuiPage::checkShutdownWebui()
  83. {
  84. if(apiServer || apiServerMHD)
  85. {
  86. apiServerMHD->stop();
  87. delete apiServerMHD;
  88. apiServerMHD = 0;
  89. delete apiServer;
  90. apiServer = 0;
  91. delete controlModule;
  92. controlModule = 0;
  93. }
  94. }
  95. /*static*/ void WebuiPage::showWebui()
  96. {
  97. if(Settings->getWebinterfaceEnabled())
  98. {
  99. QDesktopServices::openUrl(QUrl(QString("http://localhost:")+QString::number(Settings->getWebinterfacePort())));
  100. }
  101. else
  102. {
  103. QMessageBox::warning(0, tr("Webinterface not enabled"), tr("The webinterface is not enabled. Enable it in Settings -> Webinterface."));
  104. }
  105. }
  106. void WebuiPage::onEnableCBClicked(bool checked)
  107. {
  108. if(checked)
  109. {
  110. ui.params_GB->setEnabled(true);
  111. ui.applyStartBrowser_PB->setEnabled(true);
  112. }
  113. else
  114. {
  115. ui.params_GB->setEnabled(false);
  116. ui.applyStartBrowser_PB->setEnabled(false);
  117. }
  118. }
  119. void WebuiPage::onApplyClicked()
  120. {
  121. QString errmsg;
  122. bool ok = save(errmsg);
  123. if(!ok)
  124. {
  125. QMessageBox::warning(0, tr("failed to start Webinterface"), "Failed to start the webinterface.");
  126. return;
  127. }
  128. QDesktopServices::openUrl(QUrl(QString("http://localhost:")+QString::number(ui.port_SB->value())));
  129. }