diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2009-02-13 00:00:05 +0100 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2009-02-13 00:00:05 +0100 |
commit | 04363ca342914ba75e693edb876cbe535839fa79 (patch) | |
tree | d1309d7b0f6288a8250e972e5cab2546f2a77609 /src/modules | |
parent | 2ab1fbd763ad8692ea3ca29705a4fe821ccb1309 (diff) | |
download | mad-04363ca342914ba75e693edb876cbe535839fa79.tar mad-04363ca342914ba75e693edb876cbe535839fa79.zip |
Einfache Abfrage der Benutzerdatenbank implementiert
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/Makefile.am | 2 | ||||
-rw-r--r-- | src/modules/Makefile.in | 11 | ||||
-rw-r--r-- | src/modules/SystemBackendPosix.h | 4 | ||||
-rw-r--r-- | src/modules/UserBackendMysql.cpp | 96 | ||||
-rw-r--r-- | src/modules/UserBackendMysql.h | 35 |
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(); }; } |