+ while(SignalProxy::readDataFromDevice(socket, blocksizes[socket], item)) {
+ QVariantMap msg = item.toMap();
+ if(!msg.contains("MsgType")) {
+ // Client is way too old, does not even use the current init format
+ qWarning() << qPrintable(tr("Antique client trying to connect... refusing."));
+ socket->close();
+ return;
+ }
+ // OK, so we have at least an init message format we can understand
+ if(msg["MsgType"] == "ClientInit") {
+ QVariantMap reply;
+ reply["CoreVersion"] = Global::quasselVersion;
+ reply["CoreDate"] = Global::quasselDate;
+ reply["CoreBuild"] = Global::quasselBuild;
+ // TODO: Make the core info configurable
+ int uptime = startTime.secsTo(QDateTime::currentDateTime());
+ int updays = uptime / 86400; uptime %= 86400;
+ int uphours = uptime / 3600; uptime %= 3600;
+ int upmins = uptime / 60;
+ reply["CoreInfo"] = tr("<b>Quassel Core Version %1 (Build >= %2)</b><br>"
+ "Up %3d%4h%5m (since %6)").arg(Global::quasselVersion).arg(Global::quasselBuild)
+ .arg(updays).arg(uphours,2,10,QChar('0')).arg(upmins,2,10,QChar('0')).arg(startTime.toString(Qt::TextDate));
+
+ reply["SupportSsl"] = false;
+ reply["LoginEnabled"] = true;
+ // TODO: check if we are configured, start wizard otherwise
+
+ // Just version information -- check it!
+ if(msg["ClientBuild"].toUInt() < Global::clientBuildNeeded) {
+ reply["MsgType"] = "ClientInitReject";
+ reply["Error"] = tr("<b>Your Quassel Client is too old!</b><br>"
+ "This core needs at least client version %1 (Build >= %2).<br>"
+ "Please consider upgrading your client.").arg(Global::quasselVersion).arg(Global::quasselBuild);
+ SignalProxy::writeDataToDevice(socket, reply);
+ qWarning() << qPrintable(tr("Client %1 too old, rejecting.").arg(socket->peerAddress().toString()));
+ socket->close(); return;
+ }
+ clientInfo[socket] = msg; // store for future reference
+ reply["MsgType"] = "ClientInitAck";
+ SignalProxy::writeDataToDevice(socket, reply);
+ } else if(msg["MsgType"] == "ClientLogin") {
+ QVariantMap reply;
+ if(!clientInfo.contains(socket)) {
+ reply["MsgType"] = "ClientLoginReject";
+ reply["Error"] = tr("<b>Client not initialized!</b><br>You need to send an init message before trying to login.");
+ SignalProxy::writeDataToDevice(socket, reply);
+ qWarning() << qPrintable(tr("Client %1 did not send an init message before trying to login, rejecting.").arg(socket->peerAddress().toString()));
+ socket->close(); return;
+ }
+ mutex.lock();
+ UserId uid = storage->validateUser(msg["User"].toString(), msg["Password"].toString());
+ mutex.unlock();
+ if(uid == 0) {
+ reply["MsgType"] = "ClientLoginReject";
+ reply["Error"] = tr("<b>Invalid username or password!</b><br>The username/password combination you supplied could not be found in the database.");
+ SignalProxy::writeDataToDevice(socket, reply);
+ continue;
+ }
+ reply["MsgType"] = "ClientLoginAck";
+ SignalProxy::writeDataToDevice(socket, reply);
+ qDebug() << qPrintable(tr("Client %1 initialized and authentificated successfully as \"%2\".").arg(socket->peerAddress().toString(), msg["User"].toString()));
+ setupClientSession(socket, uid);
+ }
+ //socket->close(); return;
+ /*