From 6d64a1858b5d34878dec5635c8b7bcd5e71c9483 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Tue, 1 Nov 2011 22:13:35 +0100 Subject: [PATCH] Dummy encryption key implementation + logging glib errors in main log --- backends/libpurple/main.cpp | 71 +++++++++++++++++++++++++++++++++++-- include/transport/util.h | 5 +++ src/config.cpp | 1 + src/mysqlbackend.cpp | 11 +++++- src/util.cpp | 28 +++++++++++++++ 5 files changed, 113 insertions(+), 3 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 89cc433a..2b0b0491 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -1569,11 +1569,78 @@ static void transport_core_ui_init(void) // #endif } +/***** Core Ui Ops *****/ +static void +spectrum_glib_log_handler(const gchar *domain, + GLogLevelFlags flags, + const gchar *message, + gpointer user_data) +{ + const char *level; + char *new_msg = NULL; + char *new_domain = NULL; + + if ((flags & G_LOG_LEVEL_ERROR) == G_LOG_LEVEL_ERROR) + level = "ERROR"; + else if ((flags & G_LOG_LEVEL_CRITICAL) == G_LOG_LEVEL_CRITICAL) + level = "CRITICAL"; + else if ((flags & G_LOG_LEVEL_WARNING) == G_LOG_LEVEL_WARNING) + level = "WARNING"; + else if ((flags & G_LOG_LEVEL_MESSAGE) == G_LOG_LEVEL_MESSAGE) + level = "MESSAGE"; + else if ((flags & G_LOG_LEVEL_INFO) == G_LOG_LEVEL_INFO) + level = "INFO"; + else if ((flags & G_LOG_LEVEL_DEBUG) == G_LOG_LEVEL_DEBUG) + level = "DEBUG"; + else { + LOG4CXX_ERROR(logger, "Unknown glib logging level in " << (guint)flags); + level = "UNKNOWN"; /* This will never happen. */ + } + + if (message != NULL) + new_msg = purple_utf8_try_convert(message); + + if (domain != NULL) + new_domain = purple_utf8_try_convert(domain); + + if (new_msg != NULL) { + std::string area("glib"); + area.push_back('/'); + area.append(level); + + std::string message(new_domain ? new_domain : "g_log"); + message.push_back(' '); + message.append(new_msg); + + LOG4CXX_ERROR(logger, message); + g_free(new_msg); + } + + g_free(new_domain); +} + +static void +debug_init(void) +{ +#define REGISTER_G_LOG_HANDLER(name) \ + g_log_set_handler((name), \ + (GLogLevelFlags)(G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL \ + | G_LOG_FLAG_RECURSION), \ + spectrum_glib_log_handler, NULL) + + REGISTER_G_LOG_HANDLER(NULL); + REGISTER_G_LOG_HANDLER("GLib"); + REGISTER_G_LOG_HANDLER("GModule"); + REGISTER_G_LOG_HANDLER("GLib-GObject"); + REGISTER_G_LOG_HANDLER("GThread"); + +#undef REGISTER_G_LOD_HANDLER +} + static PurpleCoreUiOps coreUiOps = { NULL, -// debug_init, - NULL, + debug_init, transport_core_ui_init, NULL, spectrum_ui_get_info, diff --git a/include/transport/util.h b/include/transport/util.h index e5fc086f..79d52a47 100644 --- a/include/transport/util.h +++ b/include/transport/util.h @@ -24,6 +24,7 @@ #include #include #include +#include "Swiften/StringCodecs/Base64.h" namespace Transport { @@ -31,6 +32,10 @@ namespace Util { void removeEverythingOlderThan(const std::vector &dirs, time_t t); +std::string encryptPassword(const std::string &password, const std::string &key); + +std::string decryptPassword(std::string &encrypted, const std::string &key); + } } diff --git a/src/config.cpp b/src/config.cpp index 88e6e2c2..d0307788 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -92,6 +92,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("database.password", value()->default_value(""), "Database Password.") ("database.port", value()->default_value(0), "Database port.") ("database.prefix", value()->default_value(""), "Prefix of tables in database") + ("database.encryption_key", value()->default_value(""), "Encryption key.") ("logging.config", value()->default_value(""), "Path to log4cxx config file which is used for Spectrum 2 instance") ("logging.backend_config", value()->default_value(""), "Path to log4cxx config file which is used for backends") ("backend.default_avatar", value()->default_value(""), "Full path to default avatar") diff --git a/src/mysqlbackend.cpp b/src/mysqlbackend.cpp index a10d89ec..1c45b738 100644 --- a/src/mysqlbackend.cpp +++ b/src/mysqlbackend.cpp @@ -21,6 +21,7 @@ #ifdef WITH_MYSQL #include "transport/mysqlbackend.h" +#include "transport/util.h" #include #include "log4cxx/logger.h" @@ -409,7 +410,11 @@ bool MySQLBackend::exec(const std::string &query) { } void MySQLBackend::setUser(const UserInfo &user) { - *m_setUser << user.jid << user.uin << user.password << user.language << user.encoding << user.vip << user.password; + std::string encrypted = user.password; + if (!CONFIG_STRING(m_config, "database.encryption_key").empty()) { + encrypted = Util::decryptPassword(encrypted, CONFIG_STRING(m_config, "database.encryption_key")); + } + *m_setUser << user.jid << user.uin << encrypted << user.language << user.encoding << user.vip << user.password; EXEC(m_setUser, setUser(user)); } @@ -423,6 +428,10 @@ bool MySQLBackend::getUser(const std::string &barejid, UserInfo &user) { while (m_getUser->fetch() == 0) { ret = true; *m_getUser >> user.id >> user.jid >> user.uin >> user.password >> user.encoding >> user.language >> user.vip; + + if (!CONFIG_STRING(m_config, "database.encryption_key").empty()) { + user.password = Util::decryptPassword(user.password, CONFIG_STRING(m_config, "database.encryption_key")); + } } return ret; diff --git a/src/util.cpp b/src/util.cpp index 322d06ad..0a5f3a04 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -75,6 +75,34 @@ void removeEverythingOlderThan(const std::vector &dirs, time_t t) { } } +std::string encryptPassword(const std::string &password, const std::string &key) { + std::string encrypted; + encrypted.resize(password.size()); + for (int i = 0; i < password.size(); i++) { + char c = password[i]; + char keychar = key[i % key.size()]; + c += keychar; + encrypted[i] = c; + } + + encrypted = Swift::Base64::encode(Swift::createByteArray(encrypted)); + return encrypted; +} + +std::string decryptPassword(std::string &encrypted, const std::string &key) { + encrypted = Swift::byteArrayToString(Swift::Base64::decode(encrypted)); + std::string password; + password.resize(encrypted.size()); + for (int i = 0; i < encrypted.size(); i++) { + char c = encrypted[i]; + char keychar = key[i % key.size()]; + c -= keychar; + password[i] = c; + } + + return password; +} + } }