summaryrefslogtreecommitdiffstats
path: root/src/modules/UserBackendMysql.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/UserBackendMysql.cpp')
-rw-r--r--src/modules/UserBackendMysql.cpp96
1 files changed, 95 insertions, 1 deletions
diff --git a/src/modules/UserBackendMysql.cpp b/src/modules/UserBackendMysql.cpp
index e5818c6..886f345 100644
--- a/src/modules/UserBackendMysql.cpp
+++ b/src/modules/UserBackendMysql.cpp
@@ -18,7 +18,13 @@
*/
#include "UserBackendMysql.h"
+#include <Common/ActionManager.h>
#include <Common/ConfigEntry.h>
+#include <Common/Logger.h>
+
+#include <sigc++/bind.h>
+
+#include <cstdlib>
#define init UserBackendMysql_LTX_init
#define deinit UserBackendMysql_LTX_deinit
@@ -44,12 +50,29 @@ bool UserBackendMysql::handleConfigEntry(const Common::ConfigEntry &entry, bool
}
else if(entry[1].getKey().matches("Password")) {
if(entry[2].empty())
- password = entry[1][0];
+ passwd = entry[1][0];
}
else if(entry[1].getKey().matches("Database")) {
if(entry[2].empty())
db = entry[1][0];
}
+ else if(entry[1].getKey().matches("Port")) {
+ if(entry[2].empty()) {
+ char *endptr;
+ long val;
+
+ val = std::strtol(entry[1][0].c_str(), &endptr, 10);
+
+ if(endptr != 0 || val < 0 || val > 65535)
+ Common::Logger::log(Common::Logger::WARNING, "UserBackendMysql: Invalid port");
+ else
+ port = val;
+ }
+ }
+ else if(entry[1].getKey().matches("UnixSocket")) {
+ if(entry[2].empty())
+ unixSocket = entry[1][0];
+ }
else if(entry[1].getKey().matches("Queries")) {
if(entry[2].getKey().matches("ListUsers")) {
if(entry[3].empty())
@@ -83,14 +106,85 @@ bool UserBackendMysql::handleConfigEntry(const Common::ConfigEntry &entry, bool
if(entry[3].empty())
queryGroupByName = entry[2][0];
}
+ else if(!entry[2].empty())
+ return false;
}
+ else if(!entry[1].empty())
+ return false;
+
+ return true;
}
+
+ return false;
}
void UserBackendMysql::configFinished() {
+ if(db.empty()) {
+ Common::Logger::log(Common::Logger::ERROR, "UserBackendMysql: No database name given");
+ return;
+ }
+
+ mysql = mysql_init(0);
+ mysql_real_connect(mysql, host.c_str(), username.c_str(), passwd.c_str(), db.c_str(), port, unixSocket.empty() ? 0 : unixSocket.c_str(), 0);
+
UserBackend::registerBackend(backend);
}
+
+bool UserBackendMysql::userList(const sigc::slot<void, const std::map<unsigned long, Common::UserInfo>& > &callback) {
+ mysql_ping(mysql);
+
+ mysql_real_query(mysql, queryListUsers.c_str(), queryListUsers.length());
+ MYSQL_RES *result = mysql_use_result(mysql);
+
+ if(mysql_num_fields(result) < 4)
+ return true; // TODO Error
+
+ std::map<unsigned long, Common::UserInfo> users;
+
+ MYSQL_ROW row;
+ while(MYSQL_ROW row = mysql_fetch_row(result)) {
+ Common::UserInfo user(std::strtoul(row[0], 0, 10), row[2]);
+
+ user.setGid(std::strtoul(row[1], 0, 10));
+ user.setFullName(row[3]);
+
+ users.insert(std::make_pair(user.getUid(), user));
+ }
+
+ Common::ActionManager::get()->add(sigc::bind(callback, users));
+
+ return true;
+}
+
+bool UserBackendMysql::userInfo(unsigned long uid, const sigc::slot<void, const Common::UserInfo&> &callback) {
+ return false;
+}
+
+bool UserBackendMysql::password(unsigned long uid, const std::string &password, const sigc::slot<void, bool> &callback) {
+ return false;
+}
+
+
+void UserBackendMysql::registerBackend() {
+ if(backend)
+ return;
+
+ backend = new UserBackendMysql();
+ Common::ConfigManager::get()->registerConfigurable(backend);
+}
+
+void UserBackendMysql::unregisterBackend() {
+ if(!backend)
+ return;
+
+ Common::ConfigManager::get()->unregisterConfigurable(backend);
+ UserBackend::unregisterBackend(backend);
+
+ delete backend;
+ backend = 0;
+}
+
}
}