Fixed connection issuess

This commit is contained in:
Liran BG 2015-02-04 10:37:28 +02:00
parent 1eec1a9d5d
commit 01243b59d1
3 changed files with 375 additions and 334 deletions

View file

@ -4,19 +4,19 @@
* @brief jceSSLClient::jceSSLClient Constructer, setting the signals * @brief jceSSLClient::jceSSLClient Constructer, setting the signals
*/ */
jceSSLClient::jceSSLClient(jceStatusBar *statusBar) : loggedIAndConnectedFlag(false), readingFlag(false), jceSSLClient::jceSSLClient(jceStatusBar *statusBar) : loggedIAndConnectedFlag(false), readingFlag(false),
reConnectionFlag(false), networkConf(), packet(""), recieveLastPacket(false), packetSizeRecieved(0) reConnectionFlag(false), networkConf(), packet(""), recieveLastPacket(false), packetSizeRecieved(0)
{ {
this->statusBar = statusBar; this->statusBar = statusBar;
//setting signals //setting signals
connect(this,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(checkErrors(QAbstractSocket::SocketError))); connect(this,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(checkErrors(QAbstractSocket::SocketError)));
connect(this,SIGNAL(connected()),this,SLOT(setConnected())); connect(this,SIGNAL(connected()),this,SLOT(setConnected()));
connect(this,SIGNAL(encrypted()),this,SLOT(setEncrypted())); connect(this,SIGNAL(encrypted()),this,SLOT(setEncrypted()));
connect(this,SIGNAL(disconnected()),this,SLOT(setDisconnected())); connect(this,SIGNAL(disconnected()),this,SLOT(setDisconnected()));
connect(&networkConf,SIGNAL(onlineStateChanged(bool)),this,SLOT(setOnlineState(bool))); connect(&networkConf,SIGNAL(onlineStateChanged(bool)),this,SLOT(setOnlineState(bool)));
//loop event will connect the server, and when it is connected, it will quit - but connection will be open //loop event will connect the server, and when it is connected, it will quit - but connection will be open
connect(this, SIGNAL(encrypted()), &loginThreadLoop, SLOT(quit())); connect(this, SIGNAL(encrypted()), &loginThreadLoop, SLOT(quit()));
connect(this, SIGNAL(error(QAbstractSocket::SocketError)),&loginThreadLoop,SLOT(quit())); connect(this, SIGNAL(error(QAbstractSocket::SocketError)),&loginThreadLoop,SLOT(quit()));
} }
/** /**
@ -27,48 +27,48 @@ jceSSLClient::jceSSLClient(jceStatusBar *statusBar) : loggedIAndConnectedFlag(fa
*/ */
bool jceSSLClient::makeConnect(QString server, int port) bool jceSSLClient::makeConnect(QString server, int port)
{ {
if (this->supportsSsl() == false) if (this->supportsSsl() == false)
{ {
qCritical() << Q_FUNC_INFO << "Couldnt load ssl package. ERROR"; qCritical() << Q_FUNC_INFO << "Couldnt load ssl package. ERROR";
return false; return false;
} }
else else
qDebug() << Q_FUNC_INFO << "ssl loaded."; qDebug() << Q_FUNC_INFO << "ssl loaded.";
if (isConnectedToNetwork() == false) if (isConnectedToNetwork() == false)
{ {
qDebug() << Q_FUNC_INFO << "return false. not online"; qDebug() << Q_FUNC_INFO << "return false. not online";
return false; return false;
} }
else else
qDebug() << Q_FUNC_INFO << "we're online"; qDebug() << Q_FUNC_INFO << "we're online";
if (reConnectionFlag) //reset reconnectiong flag if (reConnectionFlag) //reset reconnectiong flag
{ {
qDebug() << Q_FUNC_INFO << "Making Reconnection"; qDebug() << Q_FUNC_INFO << "Making Reconnection";
} }
else else
qDebug() << Q_FUNC_INFO << "Making Connection"; qDebug() << Q_FUNC_INFO << "Making Connection";
if (isConnected()) if (isConnected())
{ {
qDebug() << Q_FUNC_INFO << "flag=true, calling makeDisconnect()"; qDebug() << Q_FUNC_INFO << "flag=true, calling makeDisconnect()";
makeDiconnect(); makeDiconnect();
} }
qDebug() << Q_FUNC_INFO << "Connection to: " << server << "On Port: " << port; qDebug() << Q_FUNC_INFO << "Connection to: " << server << "On Port: " << port;
connectToHostEncrypted(server.toStdString().c_str(), port); connectToHostEncrypted(server.toStdString().c_str(), port);
loginThreadLoop.exec(); //starting connection, waiting to encryption and then it ends loginThreadLoop.exec(); //starting connection, waiting to encryption and then it ends
qDebug() << Q_FUNC_INFO << "returning the connection status: " << isConnected(); qDebug() << Q_FUNC_INFO << "returning the connection status: " << isConnected();
if (reConnectionFlag) if (reConnectionFlag)
{ {
reConnectionFlag = false; reConnectionFlag = false;
emit serverDisconnectedbyRemote(); emit serverDisconnectedbyRemote();
} }
return isConnected(); return isConnected();
} }
/** /**
@ -77,15 +77,15 @@ bool jceSSLClient::makeConnect(QString server, int port)
*/ */
bool jceSSLClient::makeDiconnect() bool jceSSLClient::makeDiconnect()
{ {
if (loginThreadLoop.isRunning()) if (loginThreadLoop.isRunning())
{ {
qWarning() << Q_FUNC_INFO << "Killing connection thread"; qWarning() << Q_FUNC_INFO << "Killing connection thread";
loginThreadLoop.exit(); loginThreadLoop.exit();
} }
qDebug() << Q_FUNC_INFO << "disconnecting from host and emitting disconnected()"; qDebug() << Q_FUNC_INFO << "disconnecting from host and emitting disconnected()";
this->disconnectFromHost(); //emits disconnected > setDisconnected this->disconnectFromHost(); //emits disconnected > setDisconnected
setSocketState(QAbstractSocket::SocketState::UnconnectedState); setSocketState(QAbstractSocket::SocketState::UnconnectedState);
return (!isConnected()); return (!isConnected());
} }
@ -95,30 +95,30 @@ bool jceSSLClient::makeDiconnect()
*/ */
bool jceSSLClient::isConnected() bool jceSSLClient::isConnected()
{ {
bool tempFlag = false; bool tempFlag = false;
//checking state before returning flag! //checking state before returning flag!
if (state() == QAbstractSocket::SocketState::UnconnectedState) if (state() == QAbstractSocket::SocketState::UnconnectedState)
{ {
tempFlag = false; tempFlag = false;
} }
else if (state() == QAbstractSocket::SocketState::ClosingState) else if (state() == QAbstractSocket::SocketState::ClosingState)
{ {
tempFlag = false; tempFlag = false;
} }
else if (state() == QAbstractSocket::SocketState::ConnectedState) else if (state() == QAbstractSocket::SocketState::ConnectedState)
{ {
if (isConnectedToNetwork()) if (isConnectedToNetwork())
tempFlag = true; tempFlag = true;
else else
{ {
this->setSocketState(QAbstractSocket::SocketState::UnconnectedState); this->setSocketState(QAbstractSocket::SocketState::UnconnectedState);
tempFlag = false; tempFlag = false;
} }
} }
if (!isConnectedToNetwork()) //no link, ethernet\wifi if (!isConnectedToNetwork()) //no link, ethernet\wifi
tempFlag = false; tempFlag = false;
return ((loggedIAndConnectedFlag) && (tempFlag)); return ((loggedIAndConnectedFlag) && (tempFlag));
} }
/** /**
* @brief jceSSLClient::sendData - given string, send it to server * @brief jceSSLClient::sendData - given string, send it to server
@ -127,23 +127,24 @@ bool jceSSLClient::isConnected()
*/ */
bool jceSSLClient::sendData(QString str) bool jceSSLClient::sendData(QString str)
{ {
bool sendDataFlag = false; bool sendDataFlag = false;
int amount = 0; int amount = 0;
if (isConnected()) //if connected if (isConnected()) //if connected
{ {
statusBar->setIconConnectionStatus(jceStatusBar::Sending); statusBar->setIconConnectionStatus(jceStatusBar::Sending);
amount = write(str.toStdString().c_str(),str.length()); qDebug() << Q_FUNC_INFO << "sent:\n" << str;
qDebug() << Q_FUNC_INFO << "lenght send: " << str.length() << "lenght recieved: " << amount; amount = write(str.toStdString().c_str(),str.length());
if (amount == -1) qDebug() << Q_FUNC_INFO << "lenght send: " << str.length() << "lenght recieved: " << amount;
if (amount == -1)
{ {
qCritical() << Q_FUNC_INFO << "SendData ended with -1"; qCritical() << Q_FUNC_INFO << "SendData ended with -1";
sendDataFlag = false; sendDataFlag = false;
} }
else if (waitForBytesWritten()) else if (waitForBytesWritten())
sendDataFlag = true; sendDataFlag = true;
} }
qDebug() << Q_FUNC_INFO << "Sending Data status is: " << sendDataFlag; qDebug() << Q_FUNC_INFO << "Sending Data status is: " << sendDataFlag;
return sendDataFlag; return sendDataFlag;
} }
/** /**
* @brief jceSSLClient::recieveData - recieving data through threaded reading and mutex * @brief jceSSLClient::recieveData - recieving data through threaded reading and mutex
@ -152,33 +153,33 @@ bool jceSSLClient::sendData(QString str)
*/ */
bool jceSSLClient::recieveData(QString *str) bool jceSSLClient::recieveData(QString *str)
{ {
statusBar->setIconConnectionStatus(jceStatusBar::Recieving); statusBar->setIconConnectionStatus(jceStatusBar::Recieving);
qDebug() << Q_FUNC_INFO << "Data receiving!"; qDebug() << Q_FUNC_INFO << "Data receiving!";
str->clear(); str->clear();
packet = ""; packet = "";
recieveLastPacket = false; recieveLastPacket = false;
packetSizeRecieved = 0; //counting packet size packetSizeRecieved = 0; //counting packet size
readingFlag = true; //to ignore timeout socket error readingFlag = true; //to ignore timeout socket error
timer.setSingleShot(true); //counting just once. timer.setSingleShot(true); //counting just once.
timer.start(milisTimeOut); //if timer is timeout -> it means the connection takes long time timer.start(milisTimeOut); //if timer is timeout -> it means the connection takes long time
connect(this, SIGNAL(readyRead()), this, SLOT(readIt())); //we have something to read connect(this, SIGNAL(readyRead()), this, SLOT(readIt())); //we have something to read
connect(&timer, SIGNAL(timeout()), &readerLoop, SLOT(quit())); //if timer timeout > exiting event connect(&timer, SIGNAL(timeout()), &readerLoop, SLOT(quit())); //if timer timeout > exiting event
readerLoop.exec(); readerLoop.exec();
disconnect(&timer, SIGNAL(timeout()), &readerLoop, SLOT(quit())); disconnect(&timer, SIGNAL(timeout()), &readerLoop, SLOT(quit()));
disconnect(this, SIGNAL(readyRead()), this, SLOT(readIt())); disconnect(this, SIGNAL(readyRead()), this, SLOT(readIt()));
str->append(packet); str->append(packet);
// qDebug() << *str; //if you want to see the whole packet, unmark me qDebug() << *str; //if you want to see the whole packet, unmark me
qDebug() << Q_FUNC_INFO << "packet size: " << packetSizeRecieved << "received data lenght: " << str->length(); qDebug() << Q_FUNC_INFO << "packet size: " << packetSizeRecieved << "received data lenght: " << str->length();
qDebug() << Q_FUNC_INFO << "return with flag: " << recieveLastPacket; qDebug() << Q_FUNC_INFO << "return with flag: " << recieveLastPacket;
readingFlag = false; //finished reading session readingFlag = false; //finished reading session
return recieveLastPacket; //we have the last packet return recieveLastPacket; //we have the last packet
} }
/** /**
@ -190,59 +191,59 @@ bool jceSSLClient::recieveData(QString *str)
*/ */
void jceSSLClient::readIt() void jceSSLClient::readIt()
{ {
int packSize = bytesAvailable(); int packSize = bytesAvailable();
int doTimes=0; int doTimes=0;
QByteArray tempPacket; QByteArray tempPacket;
do do
{ {
// qDebug() << Q_FUNC_INFO << "packet size" << packSize; // qDebug() << Q_FUNC_INFO << "packet size" << packSize;
if (doTimes++ > 0) //for debbuging, checking thread looping times if (doTimes++ > 0) //for debbuging, checking thread looping times
qDebug() << Q_FUNC_INFO << "do loop" << doTimes; qDebug() << Q_FUNC_INFO << "do loop" << doTimes;
waitForReadyRead(100); waitForReadyRead(100);
tempPacket = read(packSize); tempPacket = read(packSize);
readerAppendingLocker.lock(); readerAppendingLocker.lock();
packetSizeRecieved += packSize; packetSizeRecieved += packSize;
packet.append(tempPacket); packet.append(tempPacket);
packet.append("\0"); packet.append("\0");
readerAppendingLocker.unlock(); readerAppendingLocker.unlock();
emit statusBar->progressHasPacket(10); emit statusBar->progressHasPacket(10);
if ((tempPacket.mid(tempPacket.length()-7,7) == ".HTM-->") if ((tempPacket.mid(tempPacket.length()-7,7) == ".HTM-->")
|| (tempPacket.mid(tempPacket.length()-7,7) == ".htm-->") || (tempPacket.mid(tempPacket.length()-7,7) == ".htm-->")
|| tempPacket.contains("</html>") || tempPacket.contains("</html>")
) )
{ {
//we have the last packet. (uses only in login first step //we have the last packet. (uses only in login first step
recieveLastPacket = true; recieveLastPacket = true;
timer.setInterval(200); timer.setInterval(200);
} }
else else
{ {
//just a packet with data //just a packet with data
} }
}while ((packSize = bytesAvailable()) > 0); }while ((packSize = bytesAvailable()) > 0);
} }
void jceSSLClient::setOnlineState(bool isOnline) void jceSSLClient::setOnlineState(bool isOnline)
{ {
qWarning() << Q_FUNC_INFO << "isOnline status change: " << isOnline; qWarning() << Q_FUNC_INFO << "isOnline status change: " << isOnline;
if (isOnline) //to be added later if (isOnline) //to be added later
{ {
qDebug() << Q_FUNC_INFO << "Online Statue has been changed. we are online"; qDebug() << Q_FUNC_INFO << "Online Statue has been changed. we are online";
//we can add here auto reconnect if wifi\ethernet link has appear //we can add here auto reconnect if wifi\ethernet link has appear
//will be added next version //will be added next version
} }
else else
{ {
qWarning() << Q_FUNC_INFO << "Online State has been changed. emitting NoInternetLink"; qWarning() << Q_FUNC_INFO << "Online State has been changed. emitting NoInternetLink";
this->makeDiconnect(); this->makeDiconnect();
emit noInternetLink(); emit noInternetLink();
} }
} }
@ -251,19 +252,19 @@ void jceSSLClient::setOnlineState(bool isOnline)
*/ */
void jceSSLClient::setConnected() void jceSSLClient::setConnected()
{ {
waitForEncrypted(); waitForEncrypted();
} }
/** /**
* @brief jceSSLClient::setDisconnected closing socket, updating state and setting flag to false * @brief jceSSLClient::setDisconnected closing socket, updating state and setting flag to false
*/ */
void jceSSLClient::setDisconnected() void jceSSLClient::setDisconnected()
{ {
qDebug() << Q_FUNC_INFO << "connection has been DISCONNECTED"; qDebug() << Q_FUNC_INFO << "connection has been DISCONNECTED";
this->setSocketState(QAbstractSocket::SocketState::UnconnectedState); this->setSocketState(QAbstractSocket::SocketState::UnconnectedState);
packet.clear(); packet.clear();
loggedIAndConnectedFlag = false; loggedIAndConnectedFlag = false;
if (reConnectionFlag) if (reConnectionFlag)
makeConnect(); makeConnect();
} }
@ -272,14 +273,14 @@ void jceSSLClient::setDisconnected()
*/ */
void jceSSLClient::setEncrypted() void jceSSLClient::setEncrypted()
{ {
qDebug() << Q_FUNC_INFO << "connection has been ENCRYPTED"; qDebug() << Q_FUNC_INFO << "connection has been ENCRYPTED";
setReadBufferSize(packetSize); setReadBufferSize(packetSize);
setSocketOption(QAbstractSocket::KeepAliveOption,true); setSocketOption(QAbstractSocket::KeepAliveOption,true);
loggedIAndConnectedFlag = true; loggedIAndConnectedFlag = true;
if (!isConnected()) if (!isConnected())
{ {
qWarning() << Q_FUNC_INFO << "Connection status didnt change! reseting flag to false"; qWarning() << Q_FUNC_INFO << "Connection status didnt change! reseting flag to false";
loggedIAndConnectedFlag = false; loggedIAndConnectedFlag = false;
} }
} }
@ -290,116 +291,116 @@ void jceSSLClient::setEncrypted()
*/ */
void jceSSLClient::showIfErrorMsg() void jceSSLClient::showIfErrorMsg()
{ {
QMessageBox msgBox; QMessageBox msgBox;
SocketError enumError = error(); SocketError enumError = error();
QString errorString; QString errorString;
bool relevantError = false; bool relevantError = false;
switch (enumError) switch (enumError)
{ {
case QAbstractSocket::SocketError::ConnectionRefusedError: /**/ case QAbstractSocket::SocketError::ConnectionRefusedError: /**/
errorString = QObject::tr("ConnectionRefusedError"); errorString = QObject::tr("ConnectionRefusedError");
//The connection was refused by the peer (or timed out). //The connection was refused by the peer (or timed out).
relevantError = true; relevantError = true;
break; break;
case QAbstractSocket::SocketError::RemoteHostClosedError: /**/ case QAbstractSocket::SocketError::RemoteHostClosedError: /**/
errorString = QObject::tr("RemoteHostClosedError"); errorString = QObject::tr("RemoteHostClosedError");
//The remote host closed the connection //The remote host closed the connection
if (isConnectedToNetwork()) //we can reconnect if (isConnectedToNetwork()) //we can reconnect
{ {
reConnectionFlag = true; reConnectionFlag = true;
} }
else else
relevantError = true; relevantError = true;
break; break;
case QAbstractSocket::SocketError::HostNotFoundError: /**/ case QAbstractSocket::SocketError::HostNotFoundError: /**/
errorString = QObject::tr("HostNotFoundError"); errorString = QObject::tr("HostNotFoundError");
//The host address was not found. //The host address was not found.
relevantError = true; relevantError = true;
break; break;
case QAbstractSocket::SocketError::SocketAccessError: /**/ case QAbstractSocket::SocketError::SocketAccessError: /**/
errorString = QObject::tr("SocketAccessError"); errorString = QObject::tr("SocketAccessError");
//The socket operation failed because the application lacked the required privileges. //The socket operation failed because the application lacked the required privileges.
break; break;
case QAbstractSocket::SocketError::SocketTimeoutError: /**/ case QAbstractSocket::SocketError::SocketTimeoutError: /**/
errorString = QObject::tr("SocketTimeoutError"); errorString = QObject::tr("SocketTimeoutError");
//The socket operation timed out. //The socket operation timed out.
if (isConnected()); //ignore it if connected. if (isConnected()); //ignore it if connected.
else else
relevantError = true; relevantError = true;
break; break;
case QAbstractSocket::SocketError::NetworkError: /**/ case QAbstractSocket::SocketError::NetworkError: /**/
errorString = QObject::tr("NetworkError"); errorString = QObject::tr("NetworkError");
//An error occurred with the network (e.g., the network cable was accidentally plugged out). //An error occurred with the network (e.g., the network cable was accidentally plugged out).
if (isConnectedToNetwork()) //we can reconnect if (isConnectedToNetwork()) //we can reconnect
{ {
} }
else else
relevantError = true; relevantError = true;
break; break;
case QAbstractSocket::SocketError::SslHandshakeFailedError: /**/ case QAbstractSocket::SocketError::SslHandshakeFailedError: /**/
errorString = QObject::tr("SslHandshakeFailedError"); errorString = QObject::tr("SslHandshakeFailedError");
relevantError = true; relevantError = true;
break; break;
case QAbstractSocket::SocketError::SslInternalError: /**/ case QAbstractSocket::SocketError::SslInternalError: /**/
errorString = QObject::tr("SslInternalError"); errorString = QObject::tr("SslInternalError");
relevantError = true; relevantError = true;
break; break;
case QAbstractSocket::SocketError::SslInvalidUserDataError: /**/ case QAbstractSocket::SocketError::SslInvalidUserDataError: /**/
errorString = QObject::tr("SslInvalidUserDataError"); errorString = QObject::tr("SslInvalidUserDataError");
relevantError = true; relevantError = true;
break; break;
case QAbstractSocket::SocketError::DatagramTooLargeError: //not relevant to us case QAbstractSocket::SocketError::DatagramTooLargeError: //not relevant to us
errorString = QObject::tr("DatagramTooLargeError"); errorString = QObject::tr("DatagramTooLargeError");
break; break;
case QAbstractSocket::SocketError::SocketResourceError: //not relevant to us case QAbstractSocket::SocketError::SocketResourceError: //not relevant to us
break; break;
case QAbstractSocket::SocketError::OperationError: //not relevant, except for debug case QAbstractSocket::SocketError::OperationError: //not relevant, except for debug
errorString = QObject::tr("OperationError"); errorString = QObject::tr("OperationError");
break; break;
case QAbstractSocket::SocketError::AddressInUseError: //not relevant to us case QAbstractSocket::SocketError::AddressInUseError: //not relevant to us
errorString = QObject::tr("AddressInUseError"); errorString = QObject::tr("AddressInUseError");
break; break;
case QAbstractSocket::SocketError::SocketAddressNotAvailableError: //not relevant to us case QAbstractSocket::SocketError::SocketAddressNotAvailableError: //not relevant to us
errorString = QObject::tr("SocketAddressNotAvailableError"); errorString = QObject::tr("SocketAddressNotAvailableError");
break; break;
case QAbstractSocket::SocketError::UnsupportedSocketOperationError: //for very old computers, not relevant to us case QAbstractSocket::SocketError::UnsupportedSocketOperationError: //for very old computers, not relevant to us
errorString = QObject::tr("UnsupportedSocketOperationError"); errorString = QObject::tr("UnsupportedSocketOperationError");
break; break;
case QAbstractSocket::SocketError::ProxyAuthenticationRequiredError: //not relevant to us case QAbstractSocket::SocketError::ProxyAuthenticationRequiredError: //not relevant to us
errorString = QObject::tr("ProxyAuthenticationRequiredError"); errorString = QObject::tr("ProxyAuthenticationRequiredError");
break; break;
case QAbstractSocket::SocketError::ProxyConnectionRefusedError: //not relevant to us case QAbstractSocket::SocketError::ProxyConnectionRefusedError: //not relevant to us
errorString = QObject::tr("ProxyConnectionRefusedError"); errorString = QObject::tr("ProxyConnectionRefusedError");
break; break;
case QAbstractSocket::SocketError::UnfinishedSocketOperationError: //not relevant to us case QAbstractSocket::SocketError::UnfinishedSocketOperationError: //not relevant to us
errorString = QObject::tr("UnfinishedSocketOperationError"); errorString = QObject::tr("UnfinishedSocketOperationError");
break; break;
case QAbstractSocket::SocketError::ProxyConnectionClosedError: //not relevant to us case QAbstractSocket::SocketError::ProxyConnectionClosedError: //not relevant to us
errorString = QObject::tr("ProxyConnectionClosedError"); errorString = QObject::tr("ProxyConnectionClosedError");
break; break;
case QAbstractSocket::SocketError::ProxyConnectionTimeoutError: //not relevant to us case QAbstractSocket::SocketError::ProxyConnectionTimeoutError: //not relevant to us
errorString = QObject::tr("ProxyConnectionTimeoutError"); errorString = QObject::tr("ProxyConnectionTimeoutError");
break; break;
case QAbstractSocket::SocketError::ProxyNotFoundError: //not relevant to us case QAbstractSocket::SocketError::ProxyNotFoundError: //not relevant to us
errorString = QObject::tr("ProxyNotFoundError"); errorString = QObject::tr("ProxyNotFoundError");
break; break;
case QAbstractSocket::SocketError::ProxyProtocolError: //not relevant to us case QAbstractSocket::SocketError::ProxyProtocolError: //not relevant to us
errorString = QObject::tr("ProxyProtocolError"); errorString = QObject::tr("ProxyProtocolError");
break; break;
case QAbstractSocket::SocketError::TemporaryError: //not relevant to us case QAbstractSocket::SocketError::TemporaryError: //not relevant to us
errorString = QObject::tr("TemporaryError"); errorString = QObject::tr("TemporaryError");
break; break;
case QAbstractSocket::SocketError::UnknownSocketError: //not relevant, except for debug case QAbstractSocket::SocketError::UnknownSocketError: //not relevant, except for debug
errorString = QObject::tr("UnknownSocketError"); errorString = QObject::tr("UnknownSocketError");
relevantError = true; relevantError = true;
break; break;
} }
if (relevantError) //informative string to be shown if (relevantError) //informative string to be shown
{ {
qDebug() << Q_FUNC_INFO << "relevant error."; qDebug() << Q_FUNC_INFO << "relevant error.";
msgBox.setIcon(QMessageBox::Warning); msgBox.setIcon(QMessageBox::Warning);
msgBox.setText(errorString); msgBox.setText(errorString);
msgBox.exec(); msgBox.exec();
} }
} }
/** /**
@ -408,27 +409,27 @@ void jceSSLClient::showIfErrorMsg()
*/ */
void jceSSLClient::checkErrors(QAbstractSocket::SocketError a) void jceSSLClient::checkErrors(QAbstractSocket::SocketError a)
{ {
//ignore this stupid error //ignore this stupid error
bool timeout = (a == QAbstractSocket::SocketError::SocketTimeoutError); bool timeout = (a == QAbstractSocket::SocketError::SocketTimeoutError);
if (!((isConnected()) && (timeout))) if (!((isConnected()) && (timeout)))
{ {
qWarning() << Q_FUNC_INFO << "isOnline?: " << isConnectedToNetwork(); qWarning() << Q_FUNC_INFO << "isOnline?: " << isConnectedToNetwork();
qWarning() << Q_FUNC_INFO << "state is: " << state(); qWarning() << Q_FUNC_INFO << "state is: " << state();
qWarning() << Q_FUNC_INFO << "Var Error: " << a; qWarning() << Q_FUNC_INFO << "Var Error: " << a;
qWarning() << Q_FUNC_INFO << "Error: " << errorString(); qWarning() << Q_FUNC_INFO << "Error: " << errorString();
} }
else if (!readingFlag) else if (!readingFlag)
{ {
qWarning() << Q_FUNC_INFO << "isConnected?: " << isConnected() << "is timeout?" << timeout; qWarning() << Q_FUNC_INFO << "isConnected?: " << isConnected() << "is timeout?" << timeout;
qWarning() << Q_FUNC_INFO << "isOnline?: " << isConnectedToNetwork() << "state is: " << state(); qWarning() << Q_FUNC_INFO << "isOnline?: " << isConnectedToNetwork() << "state is: " << state();
qWarning() << Q_FUNC_INFO << "Error: " << errorString(); qWarning() << Q_FUNC_INFO << "Error: " << errorString();
} }
else else
{ {
//timeout when reading //timeout when reading
} }
showIfErrorMsg(); showIfErrorMsg();
} }
/** written by KARAN BALKAR /** written by KARAN BALKAR
@ -438,20 +439,20 @@ void jceSSLClient::checkErrors(QAbstractSocket::SocketError a)
*/ */
bool jceSSLClient::isConnectedToNetwork(){ bool jceSSLClient::isConnectedToNetwork(){
QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces(); QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces();
bool result = false; bool result = false;
for (int i = 0; i < ifaces.count(); ++i) for (int i = 0; i < ifaces.count(); ++i)
{ {
QNetworkInterface iface = ifaces.at(i); QNetworkInterface iface = ifaces.at(i);
if ( iface.flags().testFlag(QNetworkInterface::IsUp) && !iface.flags().testFlag(QNetworkInterface::IsLoopBack)) if ( iface.flags().testFlag(QNetworkInterface::IsUp) && !iface.flags().testFlag(QNetworkInterface::IsLoopBack))
for (int j=0; j < iface.addressEntries().count(); ++j) for (int j=0; j < iface.addressEntries().count(); ++j)
// got an interface which is up, and has an ip address // got an interface which is up, and has an ip address
if (result == false) if (result == false)
result = true; result = true;
} }
return result; return result;
} }

View file

@ -4,6 +4,7 @@
#include "../../src/jceSettings/user.h" #include "../../src/jceSettings/user.h"
#define dst_host "yedion.jce.ac.il" #define dst_host "yedion.jce.ac.il"
#define Boundry "----WebKitFormBoundaryN43Wu4LWxLef6EfL"
#define dst_port 443 #define dst_port 443
/** /**
@ -16,85 +17,122 @@ class jceLoginHtmlScripts
{ {
private: private:
jceLoginHtmlScripts();
jceLoginHtmlScripts();
public: public:
static QString makeRequest(QString parameters) static QString makeLoginRequest(QString parameters)
{ {
QString msg; QString msg;
msg = "POST /yedion/fireflyweb.aspx HTTP/1.1\r\n"; msg = "POST https://yedion.jce.ac.il/yedion/fireflyweb.aspx HTTP/1.1\r\n";
msg += "Host: " + QString(dst_host) + "\r\n"; msg += "Host: yedion.jce.ac.il\r\n";
msg += "Content-Type: application/x-www-form-urlencoded\r\n"; msg += "Content-Length: " + QString::number(parameters.length()) + "\r\n";
msg += "Content-Length: " + QString::number(parameters.length()) + "\r\n"; msg += "Content-Type: multipart/form-data; boundary=" + QString(Boundry) + "\r\n";
msg += "Proxy-Connection: Keep-Alive\r\n"; msg += "Proxy-Connection: Keep-Alive\r\n";
msg += "Accept-Charset: UTF-8"; msg += "Connection: Keep-Alive\r\n";
msg += "Accept: text/plain\r\n"; msg += "\r\n";
msg += "Connection: Keep-Alive\r\n"; msg += parameters;
msg += "\r\n";
msg += parameters;
return msg;
}
const static QString getFirstValidationStep(const user &usr) return msg;
{ }
QString parameters = "?appname=BSHITA&prgname=LoginValidation&arguments=-N";
parameters += usr.getUsername();
parameters += ",-N";
parameters += usr.getPassword();
return parameters;
}
const static QString getSecondValidationStep(const user &usr) static QString makeRequest(QString parameters)
{ {
QString parameters; QString msg;
parameters = "prgname=LoginValidtion1&Arguments=-N"; msg = "POST /yedion/fireflyweb.aspx HTTP/1.1\r\n";
parameters += usr.getUserID(); msg += "Host: " + QString(dst_host) + "\r\n";
parameters += ",-A,-N"; msg += "Content-Type: application/x-www-form-urlencoded\r\n";
parameters += usr.getHashedPassword(); msg += "Content-Length: " + QString::number(parameters.length()) + "\r\n";
parameters += ",-A,-A"; msg += "Proxy-Connection: Keep-Alive\r\n";
return parameters; msg += "Accept-Charset: UTF-8";
} msg += "Accept: text/plain\r\n";
const static QString getGradesPath(const user &usr, msg += "Connection: Keep-Alive\r\n";
int fromYear, msg += "\r\n";
int toYear, msg += parameters;
int fromSemester, return msg;
int toSemester) }
{
QString parameters; const static QString getFirstValidationStep(const user &usr)
parameters = "PRGNAME=HADPASAT_MISMAHIM_LETALMID&ARGUMENTS=TZ,-N4,R1C2,R1C4,R1C1,R1C3,-A,-A,R1C5,-A,UNIQ&"; {
parameters += "TZ=" + usr.getUserID() + "&"; QString parameters;
parameters += "UNIQ=" + usr.getHashedPassword() + "&"; parameters += "--";
parameters += "R1C2=" + QString::number(fromYear) + "&"; parameters += QString(Boundry);
parameters += "R1C1=" + QString::number(toYear) + "&"; parameters += "\nContent-Disposition: form-data; name=\"PRGNAME\"";
parameters += "R1C3=" + QString::number(toSemester) + "&"; parameters += "\n\n";
parameters += "R1C4=" + QString::number(fromSemester) + "&"; parameters += "LoginValidation";
parameters += "R1C5=0"; parameters += "\n";
return parameters; parameters += "--";
} parameters += QString(Boundry);
const static QString getCalendar(const user &usr,int year, int semester) parameters += "\nContent-Disposition: form-data; name=\"ARGUMENTS\"";
{ parameters += "\n\n";
QString parameters; parameters += "R1C1,R1C2,-A,-A";
parameters = "PRGNAME=Bitsua_maarechet_shaot&ARGUMENTS=TZ,UNIQ,MisparSheilta,R1C1,R1C2&"; parameters += "\n";
parameters += "TZ=" + usr.getUserID() + "&"; parameters += "--";
parameters += "UNIQ=" + usr.getHashedPassword() + "&"; parameters += QString(Boundry);
parameters += "MisparSheilta=3&"; parameters += "\nContent-Disposition: form-data; name=\"R1C1\"";
parameters += "R1C1=" + QString::number(year) + "&"; parameters += "\n\n";
parameters += "R1C2=" + QString::number(semester) + "&"; parameters += usr.getUsername();
return parameters; parameters += "\n";
} parameters += "--";
const static QString getExamSchedule(const user &usr,int year, int semester) parameters += QString(Boundry);
{ parameters += "\nContent-Disposition: form-data; name=\"R1C2\"";
QString parameters; parameters += "\n\n";
parameters = "PRGNAME=HADPASAT_TOCHNIT_BEHINOT&ARGUMENTS=TZ,UNIQ,R1C1,R1C2,R1C3&"; parameters += usr.getPassword();
parameters += "TZ=" + usr.getUserID() + "&"; parameters += "\n";
parameters += "UNIQ=" + usr.getHashedPassword() + "&"; parameters += "--";
parameters += "R1C1=" + QString::number(year) + "&"; parameters += QString(Boundry) + "--";
parameters += "R1C2=" + QString::number(semester) + "&"; return parameters;
parameters += "R1C3=0"; }
return parameters;
} const static QString getSecondValidationStep(const user &usr)
{
QString parameters;
parameters = "prgname=LoginValidtion1&Arguments=-N";
parameters += usr.getUserID();
parameters += ",-A,-N";
parameters += usr.getHashedPassword();
parameters += ",-A,-A";
return parameters;
}
const static QString getGradesPath(const user &usr,
int fromYear,
int toYear,
int fromSemester,
int toSemester)
{
QString parameters;
parameters = "PRGNAME=HADPASAT_MISMAHIM_LETALMID&ARGUMENTS=TZ,-N4,R1C2,R1C4,R1C1,R1C3,-A,-A,R1C5,-A,UNIQ&";
parameters += "TZ=" + usr.getUserID() + "&";
parameters += "UNIQ=" + usr.getHashedPassword() + "&";
parameters += "R1C2=" + QString::number(fromYear) + "&";
parameters += "R1C1=" + QString::number(toYear) + "&";
parameters += "R1C3=" + QString::number(toSemester) + "&";
parameters += "R1C4=" + QString::number(fromSemester) + "&";
parameters += "R1C5=0";
return parameters;
}
const static QString getCalendar(const user &usr,int year, int semester)
{
QString parameters;
parameters = "PRGNAME=Bitsua_maarechet_shaot&ARGUMENTS=TZ,UNIQ,MisparSheilta,R1C1,R1C2&";
parameters += "TZ=" + usr.getUserID() + "&";
parameters += "UNIQ=" + usr.getHashedPassword() + "&";
parameters += "MisparSheilta=3&";
parameters += "R1C1=" + QString::number(year) + "&";
parameters += "R1C2=" + QString::number(semester) + "&";
return parameters;
}
const static QString getExamSchedule(const user &usr,int year, int semester)
{
QString parameters;
parameters = "PRGNAME=HADPASAT_TOCHNIT_BEHINOT&ARGUMENTS=TZ,UNIQ,R1C1,R1C2,R1C3&";
parameters += "TZ=" + usr.getUserID() + "&";
parameters += "UNIQ=" + usr.getHashedPassword() + "&";
parameters += "R1C1=" + QString::number(year) + "&";
parameters += "R1C2=" + QString::number(semester) + "&";
parameters += "R1C3=0";
return parameters;
}
}; };

View file

@ -58,7 +58,7 @@ int jceLogin::makeConnection()
if (returnMode == (int)true) //check if username and password are matching if (returnMode == (int)true) //check if username and password are matching
{ {
// status = jceStatus::JCE_VALIDATION_PASSED; // status = jceStatus::JCE_VALIDATION_PASSED;
returnMode = makeSecondVisit(); //returnMode = makeSecondVisit();
if (returnMode == (int)true) //siging in the website if (returnMode == (int)true) //siging in the website
{ {
qDebug() << Q_FUNC_INFO << "Signed in succeesfully"; qDebug() << Q_FUNC_INFO << "Signed in succeesfully";
@ -152,7 +152,7 @@ void jceLogin::reMakeConnection()
*/ */
int jceLogin::makeFirstVisit() int jceLogin::makeFirstVisit()
{ {
if (JceConnector->sendData(jceLoginHtmlScripts::makeRequest(jceLoginHtmlScripts::getFirstValidationStep(*jceA)))) if (JceConnector->sendData(jceLoginHtmlScripts::makeLoginRequest(jceLoginHtmlScripts::getFirstValidationStep(*jceA))))
{ {
if (!JceConnector->recieveData(recieverPage)) if (!JceConnector->recieveData(recieverPage))
return jceLogin::ERROR_ON_GETTING_INFO; return jceLogin::ERROR_ON_GETTING_INFO;
@ -248,34 +248,36 @@ bool jceLogin::checkValidation()
{ {
//finds the hashed password //finds the hashed password
QString constUserID_TAG = "value=\"-N"; QString startingIndex = "javascript:send_form('Menu','";
QString constHassID_TAG = "-A,-N"; QString constUserID_TAG = "-N";
QString constHassID_TAG = ",-A,-N";
QString hasspass,hassid; QString hasspass,hassid;
int hasspass_position1,hasspass_position2; int hasspass_position1,hasspass_position2;
int id_position1,id_position2; int id_position1,id_position2;
hasspass_position1 = this->recieverPage->indexOf(constHassID_TAG); //looking for hasspass index
if (hasspass_position1 == -1) //didnt find the tag id_position1 = this->recieverPage->indexOf(constUserID_TAG,this->recieverPage->indexOf(startingIndex));
return false;
else
hasspass_position1 += constHassID_TAG.length(); //skip the index of tag
hasspass_position2 = this->recieverPage->indexOf(",-A,-A", hasspass_position1);
//finds the hass pass
if (hasspass_position2 != -1) //found the hasspass! storing it
hasspass = recieverPage->mid(hasspass_position1,hasspass_position2-hasspass_position1);
else
return false;
//finds the user id
id_position1 = this->recieverPage->indexOf(constUserID_TAG, 0); //looking for hassid index
if (id_position1 == -1) //didnt find the tag if (id_position1 == -1) //didnt find the tag
return false; return false;
else else
id_position1 += constUserID_TAG.length(); //skip the index of tag id_position1 += constUserID_TAG.length(); //skip the index of tag
id_position2 = this->recieverPage->indexOf(",-A", id_position1); id_position2 = this->recieverPage->indexOf(constHassID_TAG,id_position1);
if (id_position2 != -1) //found the hassid! storing it if (id_position2 != -1) //found the hasspass! storing it
hassid = recieverPage->mid(id_position1,id_position2-id_position1); hassid = recieverPage->mid(id_position1,id_position2-id_position1);
else else
return false; return false;
hasspass_position1 = this->recieverPage->indexOf(constHassID_TAG,this->recieverPage->indexOf(startingIndex)); //looking for hasspass index
if (hasspass_position1 == -1) //didnt find the tag
return false;
else
hasspass_position1 += constHassID_TAG.length(); //skip the index of tag
hasspass_position2 = this->recieverPage->indexOf(",-N150", hasspass_position1);
//finds the hass pass
if (hasspass_position2 != -1) //found the hasspass! storing it
hasspass = recieverPage->mid(hasspass_position1,hasspass_position2-hasspass_position1);
else
return false;
//setting user information with given data hassid and hasspass //setting user information with given data hassid and hasspass
jceA->setHashedPassword(hasspass); jceA->setHashedPassword(hasspass);
jceA->setUserID(hassid); jceA->setUserID(hassid);