summaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/Makefile.am2
-rw-r--r--src/modules/Makefile.in11
-rw-r--r--src/modules/SystemBackendPosix.h4
-rw-r--r--src/modules/UserBackendMysql.cpp96
-rw-r--r--src/modules/UserBackendMysql.h35
5 files changed, 122 insertions, 26 deletions
diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am
index 67a82b8..ee11f5c 100644
--- a/src/modules/Makefile.am
+++ b/src/modules/Makefile.am
@@ -34,4 +34,4 @@ UserBackendMysql_la_SOURCES = UserBackendMysql.cpp
UserBackendMysql_la_LIBADD = $(MYSQL_LDFLAGS)
UserBackendMysql_la_LDFLAGS = $(default_ldflags) -export-symbols-regex '^UserBackendMysql_LTX_'
-noinst_HEADERS = SystemBackendPosix.h SystemBackendProc.h UserBackendMysql.h
+noinst_HEADERS = FileLogger.h SystemBackendPosix.h SystemBackendProc.h UserBackendMysql.h
diff --git a/src/modules/Makefile.in b/src/modules/Makefile.in
index f396b8d..294f1d3 100644
--- a/src/modules/Makefile.in
+++ b/src/modules/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -250,6 +250,7 @@ srcdir = @srcdir@
sys_symbol_underscore = @sys_symbol_underscore@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
moddir = ${pkglibdir}/modules
@@ -268,7 +269,7 @@ SystemBackendProc_la_LDFLAGS = $(static_ldflags) -export-symbols-regex '^SystemB
UserBackendMysql_la_SOURCES = UserBackendMysql.cpp
UserBackendMysql_la_LIBADD = $(MYSQL_LDFLAGS)
UserBackendMysql_la_LDFLAGS = $(default_ldflags) -export-symbols-regex '^UserBackendMysql_LTX_'
-noinst_HEADERS = SystemBackendPosix.h SystemBackendProc.h UserBackendMysql.h
+noinst_HEADERS = FileLogger.h SystemBackendPosix.h SystemBackendProc.h UserBackendMysql.h
all: all-am
.SUFFIXES:
@@ -277,8 +278,8 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
- && exit 0; \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
@@ -390,7 +391,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
- $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
mkid -fID $$unique
tags: TAGS
diff --git a/src/modules/SystemBackendPosix.h b/src/modules/SystemBackendPosix.h
index bbf1941..a307f22 100644
--- a/src/modules/SystemBackendPosix.h
+++ b/src/modules/SystemBackendPosix.h
@@ -27,8 +27,8 @@
#include <vector>
#include <sys/types.h>
-#include <sigc++/signal.h>
-#include <sigc++/hide.h>
+#include <sigc++/slot.h>
+#include <sigc++/adaptors/hide.h>
namespace Mad {
namespace Modules {
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;
+}
+
}
}
diff --git a/src/modules/UserBackendMysql.h b/src/modules/UserBackendMysql.h
index 85a25ee..60b2bd9 100644
--- a/src/modules/UserBackendMysql.h
+++ b/src/modules/UserBackendMysql.h
@@ -24,6 +24,8 @@
#include <Common/Configurable.h>
#include <Common/ConfigManager.h>
+#include <mysql/mysql.h>
+
namespace Mad {
namespace Modules {
@@ -32,37 +34,36 @@ class UserBackendMysql : private Core::UserBackend, private Common::Configurable
private:
static UserBackendMysql *backend;
- std::string host, username, password, db;
+ std::string host, username, passwd, db, unixSocket;
+ uint16_t port;
std::string queryListUsers, queryListGroups;
std::string queryListUserGroups, queryListGroupUsers;
std::string queryUserById, queryUserByName;
std::string queryGroupById, queryGroupByName;
- UserBackendMysql() {}
+ MYSQL *mysql;
+
+ UserBackendMysql() : port(0), mysql(0) {}
protected:
virtual bool handleConfigEntry(const Common::ConfigEntry &entry, bool);
virtual void configFinished();
- public:
- static void registerBackend() {
- if(backend)
- return;
+ virtual bool userList(const sigc::slot<void, const std::map<unsigned long, Common::UserInfo>& > &callback);
+ virtual bool userInfo(unsigned long uid, const sigc::slot<void, const Common::UserInfo&> &callback);
+ virtual bool password(unsigned long uid, const std::string &password, const sigc::slot<void, bool> &callback);
- backend = new UserBackendMysql();
- Common::ConfigManager::get()->registerConfigurable(backend);
+ public:
+ virtual ~UserBackendMysql() {
+ if(mysql) {
+ mysql_close(mysql);
+ mysql = 0;
+ }
}
- static void unregisterBackend() {
- if(!backend)
- return;
-
- Common::ConfigManager::get()->unregisterConfigurable(backend);
- UserBackend::unregisterBackend(backend);
- delete backend;
- backend = 0;
- }
+ static void registerBackend();
+ static void unregisterBackend();
};
}