diff options
Diffstat (limited to 'src/fbgui/fbgui.cpp')
-rw-r--r-- | src/fbgui/fbgui.cpp | 426 |
1 files changed, 151 insertions, 275 deletions
diff --git a/src/fbgui/fbgui.cpp b/src/fbgui/fbgui.cpp index 5ef9a9c..3a9f686 100644 --- a/src/fbgui/fbgui.cpp +++ b/src/fbgui/fbgui.cpp @@ -1,8 +1,7 @@ #include "fbgui.h" #include "sysinfo.h" #include "downloadmanager.h" -#include "javascriptinterface.h" - +#include "javascriptinterfacefbgui.h" #include <log4cxx/logger.h> #include "qlog4cxx.h" @@ -15,19 +14,6 @@ LoggerPtr coreLogger(Logger::getLogger("fbgui.core")); #include <QThread> #include <QtWebKit> -QThread dmThread; -QString ipConfigFilePath(""); -QString binPath(""); -QUrl baseURL(""); -QString downloadPath(""); -int updateInterval = -1; -QString fileToTriggerURL(""); -QString serialLocation(""); -QString sessionID(""); -bool sslSupport; -//int debugMode=-1; -//QString logFilePath(""); - //------------------------------------------------------------------------------------------- /** * A constructor. @@ -40,10 +26,10 @@ bool sslSupport; * @see DownloadManager */ fbgui::fbgui() : - agui(){ + agui() { } -fbgui::~fbgui(){ - dmThread.quit(); +fbgui::~fbgui() { + dmThread.quit(); } /** @@ -52,13 +38,14 @@ fbgui::~fbgui(){ void fbgui::init() { // start fbgui LOG4CXX_DEBUG(coreLogger, "Initializing fbgui..."); + setWindowTitle("fbgui"); - if(sslSupport) + if (sslSupport) LOG4CXX_DEBUG(coreLogger, "SSL enabled."); // initialize javascript interface - JavascriptInterface* jsi = new JavascriptInterface( - _webView->page()->mainFrame()); + JavascriptInterfaceFBGUI* jsi = new JavascriptInterfaceFBGUI( + this->_webView->page()->mainFrame()); QObject::connect(jsi, SIGNAL(quitFbgui()), this, SLOT(close())); QObject::connect(jsi, SIGNAL(shutDownClient()), this, SLOT(shutdownSystem())); @@ -73,10 +60,8 @@ void fbgui::init() { SLOT(notify(const QString&))); QObject::connect(jsi, SIGNAL(requestFile(const QString&)), dm, SLOT(downloadFile(const QString&))); - QObject::connect( - dm, - SIGNAL(updateProgress(const int&, const double&, const QString&)), - jsi, + QObject::connect(dm, + SIGNAL(updateProgress(const int&, const double&, const QString&)), jsi, SLOT(updateProgressBar(const int&, const double&, const QString&))); QObject::connect(dm, SIGNAL(downloadQueueEmpty()), jsi, SLOT( callbackOnFinished())); @@ -88,9 +73,8 @@ void fbgui::init() { loadURL(); - // set properties - setWindowTitle("fbgui"); showFullScreen(); + } //------------------------------------------------------------------------------------------- // Preparations for URL load @@ -102,15 +86,16 @@ void fbgui::init() { * The host is from the URL given through the configuration. */ bool fbgui::checkHost() const { - QHostInfo hostInfo = QHostInfo::fromName(baseURL.host()); - if (hostInfo.error() != QHostInfo::NoError) { - LOG4CXX_DEBUG(coreLogger, "Lookup of " << baseURL.host() << "failed."); - LOG4CXX_DEBUG(coreLogger, "Host can not be reached."); - return false; - } else { - LOG4CXX_DEBUG(coreLogger, "Lookup of " << baseURL.host() << " succeeded."); - return true; - } + QHostInfo hostInfo = QHostInfo::fromName(baseURL.host()); + if (hostInfo.error() != QHostInfo::NoError) { + LOG4CXX_DEBUG(coreLogger, "Lookup of " << baseURL.host() << "failed."); + LOG4CXX_DEBUG(coreLogger, "Host can not be reached."); + return false; + } else { + LOG4CXX_DEBUG(coreLogger, + "Lookup of " << baseURL.host() << " succeeded."); + return true; + } } //------------------------------------------------------------------------------------------- /** @@ -124,155 +109,38 @@ bool fbgui::checkHost() const { * @see fbgui::generatePOSTData() */ void fbgui::loadURL() { - if (checkHost()) { - LOG4CXX_DEBUG(coreLogger, "Loading URL: " << baseURL.toString() << " ..."); - - // Generate POST identification data needed by PBS. - QByteArray postData = generatePOSTData(); - // Generate a Network Request Object - _qnr = new QNetworkRequest(baseURL); - - //Add OpenSLX Certificate to SSLConfiguration - QList<QSslCertificate> certList = QSslCertificate::fromPath(QLatin1String("/usr/lib/ssl/openslx/CA/certs/openslx-cert.pem")); - certList.append(QSslCertificate::fromPath(QLatin1String("/usr/lib/ssl/openslx/CA/certs/pbsfr-cert.pem"))); - setCACertificates(certList); - - //Ignore the SelfSignedCertificateInChain-error for the OpenSLX-Certificate - QSslError error(QSslError::SelfSignedCertificateInChain, certList.at(0)); - _expectedSslErrors.append(error); - - //Add User Certificate to SSLConfiguration - QList<QSslCertificate> userCertList = QSslCertificate::fromPath(QLatin1String("/usr/lib/ssl/openslx/CA/certs/guest-cert.pem")); - setLocalCertificate(userCertList.at(0)); - - //Add User PrivateKey to SSLConfiguration - QFile keyFile("/usr/lib/ssl/openslx/CA/private/guest.pem"); - Q_ASSERT(keyFile.open(QIODevice::ReadOnly)); - QByteArray keyContent = keyFile.readAll(); - setPrivateKey(QSslKey(keyContent, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey, QByteArray("guest"))); - - - - //Connect webViews NetworkAccessManager to SSLErrorHandler SLOT - QObject::connect(_webView->page()->networkAccessManager(), - SIGNAL(finished(QNetworkReply*)), - this, - SLOT(httpErrorHandler(QNetworkReply*))); + if (checkHost()) { + LOG4CXX_DEBUG(coreLogger, + "Loading URL: " << baseURL.toString() << " ..."); + + // Generate POST identification data needed by PBS. + QByteArray postData = generatePOSTData(); + // Generate a Network Request Object + QNetworkRequest req(baseURL); + + // show cursor again since user is about to interact. + req.setHeader(QNetworkRequest::ContentTypeHeader, + "application/x-www-form-urlencoded"); + QObject::connect(_webView, SIGNAL(loadFinished(bool)), this, + SLOT(loadURLDone(bool))); + _webView->load(req, QNetworkAccessManager::PostOperation, postData); - //Connect webViews NetworkAccessManager to ErrorHandler SLOT - QObject::connect(_webView->page()->networkAccessManager(), - SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError> & )), - this, - SLOT(sslErrorHandler(QNetworkReply*, const QList<QSslError> & ))); - - // show cursor again since user is about to interact. - //QWSServer::instance()->setCursorVisible(true); //TODO: ?enabled in original - _qnr->setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - QObject::connect(_webView, SIGNAL(loadFinished(bool)), this, SLOT(loadURLDone(bool))); - _webView->load(*_qnr, QNetworkAccessManager::PostOperation, postData); - -// ////////////////////TEST/////////////////////// -// QSslSocket qssReg = new QSslSocket(this); -// qssReg.setSslConfiguration(_qnr->sslConfiguration()); -// -// QHttp http = new QHttp(QLatin1String("pbs2.mp.openslx.org"), QHttp::ConnectionModeHttps, 443, this); -// http.setSocket(&qssReg); -// -// //QObject::connect(http, SIGNAL(done(bool)), this, SLOT(done(bool))); -// QObject::connect(&http, SIGNAL(sslErrors(const QList<QSslError> &)), this, -// SLOT(sslErrorHandler(const QList<QSslError> & ))); - - } - // TODO: error page if no host. -} - -void fbgui::loadURLDone(bool success) { - // done contains the success of the loading: false / true - if (!success) { - LOG4CXX_DEBUG(coreLogger, "Loading failed. URL: " << _webView->url().toString()); - LOG4CXX_DEBUG(coreLogger, "You can quit with CTRL + X ..."); - // TODO handle failure properly... - } else { - LOG4CXX_DEBUG(coreLogger, "Loaded URL: " << _webView->url().toString()); - } -} - - -//Handles QNetworkReply SSL Errors -void fbgui::sslErrorHandler(QNetworkReply* reply, const QList<QSslError> & errlist) { - - foreach (QSslError err, errlist) - LOG4CXX_DEBUG(coreLogger, "SSL Error: " << err.error()); - -// QSslConfiguration replySslConf = reply->sslConfiguration(); -// foreach (QSslCertificate cert, replySslConf.peerCertificateChain()) -// LOG4CXX_DEBUG(coreLogger,"Cert info: \n" << cert.toPem()); - - reply->ignoreSslErrors(_expectedSslErrors); -} - -//Handles QNetworkReply Errors -void fbgui::httpErrorHandler(QNetworkReply* reply) { - if(reply->error() != QNetworkReply::NoError ) - LOG4CXX_DEBUG(coreLogger, "HTTP Error: " << reply->errorString()); -} - -//Dump all Certificates in SSLConfiguration -void fbgui::dumpSSLConfiguration(){ - QSslConfiguration sslConfig = _qnr->sslConfiguration(); - - LOG4CXX_DEBUG(coreLogger,"****************SSLConfiguration************************** \n"); - LOG4CXX_DEBUG(coreLogger,"CACertificates: \n"); - foreach (QSslCertificate cert, sslConfig.caCertificates()){ - LOG4CXX_DEBUG(coreLogger,cert.toPem() << "\n"); } - LOG4CXX_DEBUG(coreLogger,"----------------------------------------------------- \n"); - LOG4CXX_DEBUG(coreLogger,"LocalCertificate: \n"); - LOG4CXX_DEBUG(coreLogger,sslConfig.localCertificate().toPem() << "\n"); - LOG4CXX_DEBUG(coreLogger,"----------------------------------------------------- \n"); - LOG4CXX_DEBUG(coreLogger,"Private Key: \n"); - LOG4CXX_DEBUG(coreLogger,sslConfig.privateKey().toPem() << "\n"); - LOG4CXX_DEBUG(coreLogger,"********************************************************** \n"); + // TODO: error page if no host. } -//Saves CACertificates to SslConfiguration -void fbgui::setCACertificates(const QList<QSslCertificate> & certificates){ - - foreach (QSslCertificate cert, certificates){ - LOG4CXX_DEBUG(coreLogger,"Is cert valid: " << cert.isValid()); - LOG4CXX_DEBUG(coreLogger,"Cert Issuer: " << cert.issuerInfo(QSslCertificate::CommonName)); - LOG4CXX_DEBUG(coreLogger,"Cert Subject: " << cert.subjectInfo(QSslCertificate::CommonName)); +void fbgui::loadURLDone(bool success) { + // done contains the success of the loading: false / true + if (!success) { + LOG4CXX_DEBUG(coreLogger, + "Loading failed. URL: " << _webView->url().toString()); + LOG4CXX_DEBUG(coreLogger, "You can quit with CTRL + X ..."); + // TODO handle failure properly... + } else { + LOG4CXX_DEBUG(coreLogger, "Loaded URL: " << _webView->url().toString()); } - - QSslConfiguration sslConfig = _qnr->sslConfiguration(); - - QList<QSslCertificate> caCerts = sslConfig.caCertificates(); - caCerts.append(certificates); - sslConfig.setCaCertificates(caCerts); - _qnr->setSslConfiguration(sslConfig); - -} - -//Saves User Certificate to SslConfiguration -void fbgui::setLocalCertificate(const QSslCertificate& cert){ - LOG4CXX_DEBUG(coreLogger,"Is cert valid: " << cert.isValid()); - LOG4CXX_DEBUG(coreLogger,"Cert Issuer: " << cert.issuerInfo(QSslCertificate::CommonName)); - LOG4CXX_DEBUG(coreLogger,"Cert Subject: " << cert.subjectInfo(QSslCertificate::CommonName)); - - QSslConfiguration sslConfig = _qnr->sslConfiguration(); - sslConfig.setLocalCertificate(cert); - _qnr->setSslConfiguration(sslConfig); -} - -//Saves PrivateKey to SslConfiguration -void fbgui::setPrivateKey(const QSslKey & key){ - LOG4CXX_DEBUG(coreLogger,"Key length: " << key.length()); - QSslConfiguration sslConfig = _qnr->sslConfiguration(); - sslConfig.setPrivateKey(key); - _qnr->setSslConfiguration(sslConfig); } - //------------------------------------------------------------------------------------------- /** * This method generates the POST data body. @@ -289,51 +157,57 @@ void fbgui::setPrivateKey(const QSslKey & key){ * @see SysInfo::getMainboardSerial() */ QByteArray fbgui::generatePOSTData() { - LOG4CXX_DEBUG(coreLogger, "Generating POST data..."); - // use MAC address as base data - SysInfo si; - QByteArray data(si.getInfo("mac").toUtf8()); - // append mainboard serial to the mac address for more unique hardwarehash - QByteArray mbserial(si.getInfo("mbserial").toUtf8()); - if (!mbserial.isEmpty()) - data.append(mbserial); - else { - LOG4CXX_DEBUG(coreLogger, "Mainboard serial was empty. Not appending to base hash data."); - } - LOG4CXX_DEBUG(coreLogger, "[post] Hashing: " << data); - // generate MD5 hash of data - QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Md5); - LOG4CXX_DEBUG(coreLogger, "[post] MD5 Hash: " << hash.toHex()); - - // fetch serial number from usb - QByteArray serial; - QFile file(serialLocation); - if (!file.open(QIODevice::ReadOnly)) { - LOG4CXX_DEBUG(coreLogger, "[post] No such file: " << file.fileName()); - } - // everything ok, read data - serial = file.readAll(); - file.close(); - serial.chop(1); // chop EOF - LOG4CXX_DEBUG(coreLogger, "[post] Serial number is: " << serial); - - // construct final byte array - QByteArray postData("mac="); - postData.append(si.getInfo("mac")); - postData.append("&hardwarehash=" + hash.toHex()); - postData.append("&serialnumber=" + serial); - LOG4CXX_DEBUG(coreLogger, "[post] POST data: " << postData); - return postData; + LOG4CXX_DEBUG(coreLogger, "Generating POST data..."); + // use MAC address as base data + SysInfo si; + QByteArray data; + QByteArray macAdress(si.getInfo("mac").toUtf8()); + if (!macAdress.isEmpty()) + data.append(macAdress); + else { + LOG4CXX_DEBUG(coreLogger, "No readable MAC Address."); + } + // append mainboard serial to the mac address for more unique hardwarehash + QByteArray mbserial(si.getInfo("mbserial").toUtf8()); + if (!mbserial.isEmpty()) + data.append(mbserial); + else { + LOG4CXX_DEBUG(coreLogger, + "Mainboard serial was empty. Not appending to base hash data."); + }LOG4CXX_DEBUG(coreLogger, "[post] Hashing: " << data); + // generate MD5 hash of data + QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Md5); + LOG4CXX_DEBUG(coreLogger, "[post] MD5 Hash: " << hash.toHex()); + + // fetch serial number from usb + QByteArray serial; + QFile file(serialLocation); + if (!file.open(QIODevice::ReadOnly)) { + LOG4CXX_DEBUG(coreLogger, "[post] No such file: " << file.fileName()); + } + // everything ok, read data + serial = file.readAll(); + file.close(); + serial.chop(1); // chop EOF + LOG4CXX_DEBUG(coreLogger, "[post] Serial number is: " << serial); + + // construct final byte array + QByteArray postData("mac="); + postData.append(si.getInfo("mac")); + postData.append("&hardwarehash=" + hash.toHex()); + postData.append("&serialnumber=" + serial); + LOG4CXX_DEBUG(coreLogger, "[post] POST data: " << postData); + return postData; } //------------------------------------------------------------------------------------------- // Preparing Kernel Switch per kexec (initiating Stage 3) //------------------------------------------------------------------------------------------- void fbgui::loadSystem() { - //show loading system page. - //_webView->disconnect(this); - //QObject::connect(_webView, SIGNAL(loadFinished(bool)), this, SLOT(prepareKexec())); - _webView->load(QUrl("qrc:/html/loadsystem.html")); - QTimer::singleShot(1000, this, SLOT(prepareKexec())); + //show loading system page. + //_webView->disconnect(this); + //QObject::connect(_webView, SIGNAL(loadFinished(bool)), this, SLOT(prepareKexec())); + _webView->load(QUrl("qrc:/html/loadsystem.html")); + QTimer::singleShot(1000, this, SLOT(prepareKexec())); } //------------------------------------------------------------------------------------------- /** @@ -352,55 +226,57 @@ void fbgui::loadSystem() { */ void fbgui::prepareKexec() { - LOG4CXX_DEBUG(coreLogger, "Preparing kexec ..."); - // try to read KCL file that was downloaded. - QFile file(downloadPath + "/kcl"); - if (!file.open(QIODevice::ReadOnly)) { - LOG4CXX_DEBUG(coreLogger, "No such file: " << file.fileName()); - } - // everything ok, read data. - QString kcl = file.readAll(); - file.close(); - LOG4CXX_DEBUG(coreLogger, "KCL from PBS: " << kcl); - - // try to read ipconfig file generated by udhcpc. - file.setFileName("/tmp/ip_config_fbgui"); - if (!file.open(QIODevice::ReadOnly)) { - LOG4CXX_DEBUG(coreLogger, "No such file: " << file.fileName()); - } - // everything ok, read data. - QString ipConfig = file.readAll(); - file.close(); - LOG4CXX_DEBUG(coreLogger, "IP config: " << ipConfig); - - // append ipConfig - kcl.append(" ip="); - kcl.append(ipConfig); - LOG4CXX_DEBUG(coreLogger, "Complete KCL: " << kcl); - - // load the kernel + initramfs + append of kcl into kexec. - QProcess *process = new QProcess(this); - QString cmdline = "kexec -l " + downloadPath.toUtf8() + "/kernel --initrd=" - + downloadPath.toUtf8() + "/initramfs --append=\"" + kcl.toUtf8() - + "\""; - LOG4CXX_DEBUG(coreLogger, "kexec cmdline: " << cmdline); - process->start(cmdline); - bool ret = process->waitForFinished(); - if (!ret) { - LOG4CXX_DEBUG(coreLogger, "Failed to execute: " << cmdline); - LOG4CXX_DEBUG(coreLogger, "Exiting in 5 seconds..."); - QTimer::singleShot(5000, this, SLOT(close())); - } else { - LOG4CXX_DEBUG(coreLogger, "Kexec load was successfull."); - if (debugMode < 0) { - // if process successfully finished, try to run kexec -e - runKexec(); - } else { - LOG4CXX_DEBUG(coreLogger, "Skipping execution of kexec - open debug shell."); - LOG4CXX_DEBUG(coreLogger, "To start the system execute \"kexec -e\" in your shell."); - close(); - } - } + LOG4CXX_DEBUG(coreLogger, "Preparing kexec ..."); + // try to read KCL file that was downloaded. + QFile file(downloadPath + "/kcl"); + if (!file.open(QIODevice::ReadOnly)) { + LOG4CXX_DEBUG(coreLogger, "No such file: " << file.fileName()); + } + // everything ok, read data. + QString kcl = file.readAll(); + file.close(); + LOG4CXX_DEBUG(coreLogger, "KCL from PBS: " << kcl); + + // try to read ipconfig file generated by udhcpc. + file.setFileName("/tmp/ip_config_fbgui"); + if (!file.open(QIODevice::ReadOnly)) { + LOG4CXX_DEBUG(coreLogger, "No such file: " << file.fileName()); + } + // everything ok, read data. + QString ipConfig = file.readAll(); + file.close(); + LOG4CXX_DEBUG(coreLogger, "IP config: " << ipConfig); + + // append ipConfig + kcl.append(" ip="); + kcl.append(ipConfig); + LOG4CXX_DEBUG(coreLogger, "Complete KCL: " << kcl); + + // load the kernel + initramfs + append of kcl into kexec. + QProcess *process = new QProcess(this); + QString cmdline = "kexec -l " + downloadPath.toUtf8() + "/kernel --initrd=" + + downloadPath.toUtf8() + "/initramfs --append=\"" + kcl.toUtf8() + + "\""; + LOG4CXX_DEBUG(coreLogger, "kexec cmdline: " << cmdline); + process->start(cmdline); + bool ret = process->waitForFinished(); + if (!ret) { + LOG4CXX_DEBUG(coreLogger, "Failed to execute: " << cmdline); + LOG4CXX_DEBUG(coreLogger, "Exiting in 5 seconds..."); + QTimer::singleShot(5000, this, SLOT(close())); + } else { + LOG4CXX_DEBUG(coreLogger, "Kexec load was successfull."); + if (debugMode < 0) { + // if process successfully finished, try to run kexec -e + runKexec(); + } else { + LOG4CXX_DEBUG(coreLogger, + "Skipping execution of kexec - open debug shell."); + LOG4CXX_DEBUG(coreLogger, + "To start the system execute \"kexec -e\" in your shell."); + close(); + } + } } //------------------------------------------------------------------------------------------- /** @@ -410,12 +286,12 @@ void fbgui::prepareKexec() { * */ void fbgui::runKexec() { - QProcess *process = new QProcess(this); - process->start("kexec -e"); - if (!process->waitForStarted()) { - LOG4CXX_DEBUG(coreLogger, "Failed to execute: kexec -e"); - LOG4CXX_DEBUG(coreLogger, "Exiting in 5 seconds..."); - QTimer::singleShot(5000, this, SLOT(close())); - //TODO: Handle failure properly... - } + QProcess *process = new QProcess(this); + process->start("kexec -e"); + if (!process->waitForStarted()) { + LOG4CXX_DEBUG(coreLogger, "Failed to execute: kexec -e"); + LOG4CXX_DEBUG(coreLogger, "Exiting in 5 seconds..."); + QTimer::singleShot(5000, this, SLOT(close())); + //TODO: Handle failure properly... + } } |