Properly reject invalid handshake data
[quassel.git] / src / core / core.cpp
index b2e3ee4..f9b08df 100644 (file)
 #ifdef Q_OS_WIN32
 #  include <windows.h>
 #else
+#  include <unistd.h>
 #  include <termios.h>
 #endif /* Q_OS_WIN32 */
 
+// umask
+#ifndef Q_OS_WIN32
+#  include <sys/types.h>
+#  include <sys/stat.h>
+#endif /* Q_OS_WIN32 */
+
 // ==============================
 //  Custom Events
 // ==============================
@@ -73,6 +80,9 @@ void Core::destroy() {
 Core::Core()
   : _storage(0)
 {
+#ifndef Q_OS_WIN32
+  umask(S_IRWXG | S_IRWXO);
+#endif /* Q_OS_WIN32 */
   _startTime = QDateTime::currentDateTime().toUTC();  // for uptime :)
 
   Quassel::loadTranslation(QLocale::system());
@@ -252,7 +262,7 @@ QString Core::setupCoreForInternalUsage() {
   }
   setupData["AdminUser"] = "AdminUser";
   setupData["AdminPasswd"] = QString::number(pass);
-  setupData["Backend"] = _storageBackends[_storageBackends.keys().first()]->displayName();
+  setupData["Backend"] = QString("SQLite"); // mono client currently needs sqlite
   return setupCore(setupData);
 }
 
@@ -262,8 +272,7 @@ QString Core::setupCore(QVariantMap setupData) {
   if(user.isEmpty() || password.isEmpty()) {
     return tr("Admin user or password not set.");
   }
-  _configured = initStorage(setupData, true);
-  if(!_configured) {
+  if(_configured || !(_configured = initStorage(setupData, true))) {
     return tr("Could not setup storage!");
   }
   CoreSettings s;
@@ -509,10 +518,15 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) {
       socket->close(); return;
     }
 
+    reply["ProtocolVersion"] = Quassel::buildInfo().protocolVersion;
     reply["CoreVersion"] = Quassel::buildInfo().fancyVersionString;
     reply["CoreDate"] = Quassel::buildInfo().buildDate;
-    reply["ProtocolVersion"] = Quassel::buildInfo().protocolVersion;
-    // TODO: Make the core info configurable
+    reply["CoreStartTime"] = startTime(); // v10 clients don't necessarily parse this, see below
+
+    // FIXME: newer clients no longer use the hardcoded CoreInfo (for now), since it gets the
+    //        time zone wrong. With the next protocol bump (10 -> 11), we should remove this
+    //        or make it properly configurable.
+
     int uptime = startTime().secsTo(QDateTime::currentDateTime().toUTC());
     int updays = uptime / 86400; uptime %= 86400;
     int uphours = uptime / 3600; uptime %= 3600;
@@ -523,6 +537,8 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) {
                                                      .arg(Quassel::buildInfo().buildDate)
       .arg(updays).arg(uphours,2,10,QChar('0')).arg(upmins,2,10,QChar('0')).arg(startTime().toString(Qt::TextDate));
 
+    reply["CoreFeatures"] = (int)Quassel::features();
+
 #ifdef HAVE_SSL
     SslServer *sslServer = qobject_cast<SslServer *>(&_server);
     QSslSocket *sslSocket = qobject_cast<QSslSocket *>(socket);
@@ -858,7 +874,7 @@ void Core::createUser() {
     return;
   }
 
-  if(_storage->addUser(username, password).isValid()) {
+  if(_configured && _storage->addUser(username, password).isValid()) {
     out << "Added user " << username << " successfully!" << endl;
   } else {
     qWarning() << "Unable to add user:" << qPrintable(username);
@@ -896,7 +912,7 @@ void Core::changeUserPass(const QString &username) {
     return;
   }
 
-  if(_storage->updateUser(userId, password)) {
+  if(_configured && _storage->updateUser(userId, password)) {
     out << "Password changed successfuly!" << endl;
   } else {
     qWarning() << "Failed to change password!";