PageRenderTime 72ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/Information_request_server/server.cpp

https://gitlab.com/Baggins800/VCCMS
C++ | 166 lines | 140 code | 14 blank | 12 comment | 19 complexity | 7761dad522f90cefe342895a19d6210d MD5 | raw file
  1. #include "server.h"
  2. #include <QtCore/QCoreApplication>
  3. #include <QtNetwork/QTcpServer>
  4. #include <QtNetwork/QTcpSocket>
  5. #include <QDebug>
  6. Server::Server() : db(QSqlDatabase::addDatabase("QMYSQL")),m_host(""),m_dbname(""),m_user(""),m_pass("")
  7. {
  8. blocksize = 0;
  9. m_clientconnection = new QList<TcpSocket*>();
  10. bool connected = ConnectDB("localhost","vccms","root","ascent");
  11. qDebug()<< "Connecting to database"<<m_dbname<<" from "<<m_user<<"@"<<m_host; // display connecting status
  12. if(connected)
  13. qDebug()<< "Connected to database"<<m_dbname;
  14. else
  15. qDebug()<< "Could not connect to database";
  16. QNetworkConfigurationManager manager;
  17. if (manager.capabilities() && QNetworkConfigurationManager::NetworkSessionRequired) {
  18. // Get saved network configuration
  19. QSettings settings(QSettings::UserScope, QLatin1String("QtProject"));
  20. settings.beginGroup(QLatin1String("QtNetwork"));
  21. const QString id = settings.value(QLatin1String("DefaultNetworkConfiguration")).toString();
  22. settings.endGroup();
  23. // If the saved network configuration is not currently discovered use the system default
  24. QNetworkConfiguration config = manager.configurationFromIdentifier(id);
  25. if ((config.state() & QNetworkConfiguration::Discovered) !=
  26. QNetworkConfiguration::Discovered) {
  27. config = manager.defaultConfiguration();
  28. }
  29. m_networksession = new QNetworkSession(config, this);
  30. connect(m_networksession, SIGNAL(opened()), this, SLOT(sessionOpened()));
  31. m_networksession->open();
  32. }
  33. else { sessionOpened();}
  34. connect(m_tcpserver, SIGNAL(newConnection()), this, SLOT(reply()));
  35. }
  36. bool Server::ConnectDB(QString Host,QString DatabaseName,QString Username,QString Password)
  37. {
  38. /* setup variables for db */
  39. m_host = Host;
  40. m_dbname =DatabaseName;
  41. m_user = Username;
  42. m_pass = Password;
  43. /* This sets up the connection to the database */
  44. // hostname, localhost not a remote connection
  45. db.setHostName(Host);
  46. // specify the db name
  47. db.setDatabaseName(DatabaseName);
  48. //the db username usually "root" for local host
  49. db.setUserName(Username);
  50. // usually "ascent" for localhost
  51. db.setPassword(Password);
  52. // returns the state of connection, connected = true, not connected = false
  53. return db.open();
  54. }
  55. void Server::sessionOpened()
  56. {
  57. // Save the used configuration
  58. if (m_networksession) {
  59. QNetworkConfiguration config = m_networksession->configuration();
  60. QString id;
  61. if (config.type() == QNetworkConfiguration::UserChoice)
  62. id = m_networksession->sessionProperty(QLatin1String("UserChoiceConfiguration")).toString();
  63. else
  64. id = config.identifier();
  65. QSettings settings(QSettings::UserScope, QLatin1String("QtProject"));
  66. settings.beginGroup(QLatin1String("QtNetwork"));
  67. settings.setValue(QLatin1String("DefaultNetworkConfiguration"), id);
  68. settings.endGroup();
  69. }
  70. m_tcpserver = new QTcpServer(this);
  71. if (!m_tcpserver->listen(QHostAddress::Any, 23)) {
  72. qDebug()<<m_tcpserver->errorString();
  73. }
  74. else{qDebug()<<"Listening for reply.";}
  75. QString ipAddress;
  76. QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
  77. // use the first non-localhost IPv4 address
  78. for (int i = 0; i < ipAddressesList.size(); ++i) {
  79. if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
  80. ipAddressesList.at(i).toIPv4Address()) {
  81. ipAddress = ipAddressesList.at(i).toString();
  82. break;
  83. }
  84. }
  85. // if we did not find one, use IPv4 localhost
  86. if (ipAddress.isEmpty())
  87. ipAddress = QHostAddress(QHostAddress::LocalHost).toString();
  88. qDebug()<<"The server is running on port:"<<m_tcpserver->serverPort();
  89. }
  90. void Server::reply()
  91. {
  92. m_clientconnection->append(new TcpSocket(m_tcpserver->nextPendingConnection()));
  93. qDebug()<<m_clientconnection->value(m_clientconnection->count()-1)->Address()<<" connected";
  94. connect(m_clientconnection->value(m_clientconnection->count()-1), SIGNAL(dataReady(TcpSocket*)), this, SLOT(read(TcpSocket*)));
  95. connect(m_clientconnection->value(m_clientconnection->count()-1), SIGNAL(disconnected(TcpSocket*)),m_clientconnection->value(m_clientconnection->count()-1), SLOT(deleteLater()));
  96. connect(m_clientconnection->value(m_clientconnection->count()-1),SIGNAL(disconnected(TcpSocket*)),this,SLOT(disconnected(TcpSocket*)));
  97. m_clientconnection->value(m_clientconnection->count()-1)->write(QString("connection_accepted").toLocal8Bit());
  98. }
  99. void Server::read(TcpSocket* sock)
  100. {
  101. QByteArray array = sock->readAll();
  102. QList<QByteArray> data = array.split(',');
  103. if((data.count()>2)&&(QString::compare(QString::fromUtf8(data.value(0).constData()),"log"),Qt::CaseInsensitive)==0)
  104. login(data.value(1),data.value(2),sock);
  105. }
  106. void Server::disconnected(TcpSocket* sock)
  107. {
  108. qDebug()<<sock->Address()<<" disconnected";
  109. }
  110. bool Server::login(QByteArray username,QByteArray password,TcpSocket* sock)
  111. {
  112. QString query_=QString("SELECT login, password FROM logon WHERE (login = \"%1\")").arg(QString::fromUtf8(username.constData()));
  113. QSqlQuery query(query_);
  114. query.exec();
  115. bool requested_login = false;
  116. QByteArray sessiongen = generateSessionID(username);
  117. QString userdata="";
  118. while (query.next()) {
  119. QString name = query.value(0).toString();
  120. QString pass = query.value(1).toString();
  121. qDebug() << name <<" requested to logon server.";
  122. if(QString::compare(pass,password,Qt::CaseInsensitive)==0)
  123. requested_login=true;
  124. else
  125. requested_login=false;
  126. }
  127. if(requested_login)
  128. {
  129. QString _stat=QString("UPDATE logon SET session = \"%1\" WHERE (login = \"%2\")")
  130. .arg(QString::fromUtf8(sessiongen.constData()))
  131. .arg(QString::fromUtf8(username.constData()));
  132. QSqlQuery stat(_stat);
  133. stat.exec();
  134. userdata = QString("logged,true,%1").arg(QString::fromUtf8(sessiongen.constData()));
  135. qDebug()<<username<<" logged on to server.";
  136. } else {userdata= "logged,false,invalid";qDebug()<<username<<" failed to logon.";}
  137. sock->write(userdata.toLocal8Bit());
  138. return requested_login;
  139. }
  140. QByteArray Server::generateSessionID(QByteArray username)
  141. {
  142. qint64 timestamp = QDateTime::currentMSecsSinceEpoch();
  143. QByteArray sessionvalue = username.constData();
  144. sessionvalue.append(QString::number(timestamp));
  145. QByteArray session = QCryptographicHash::hash(sessionvalue,QCryptographicHash::Sha1);
  146. return session;
  147. }
  148. Server::~Server()
  149. {
  150. for(int k = 0; k < m_clientconnection->count(); k++)
  151. m_clientconnection->value(k)->disconnectFromHost();
  152. }