Compare commits

..

13 Commits

Author SHA1 Message Date
Jan Vidar Krey
c9f32c8f7f Split out the system includes from the rest of the OS/arch/compiler detection. 2010-11-12 18:39:12 +01:00
Jan Vidar Krey
4c94753469 Minor compile fixes. 2010-11-12 11:31:16 +01:00
Jan Vidar Krey
43375d8443 Shutdown SSL on close. 2010-09-01 23:57:55 +02:00
Jan Vidar Krey
0190c38c32 0.3.3 release candidate. 2010-08-24 23:36:30 +02:00
Jan Vidar Krey
25c03f5c96 Fix stupid mistake. 2010-08-24 23:22:37 +02:00
Jan Vidar Krey
f25cb7bd5d Don't do SSL_clear unless the SSL object is initialized. 2010-08-24 23:18:42 +02:00
Jan Vidar Krey
1e6d6cd1e7 Several SSL/TLS related memory leak fixes. 2010-08-24 23:10:23 +02:00
Jan Vidar Krey
f55243cf88 Fix SSL/TLS related memory leak. 2010-08-23 21:40:07 +02:00
Jan Vidar Krey
6e1de7329c Fix 100% CPU issue with SSL connections. 2010-08-19 11:37:18 +02:00
Jan Vidar Krey
f65a81a2aa Added option to redirect from adc:// to adcs:// if tls is required. 2010-08-18 23:32:53 +02:00
Jan Vidar Krey
6daa5ecf95 Added more informative error messages for the configuration file parser. 2010-08-10 23:20:56 +02:00
Jan Vidar Krey
23498e9ac8 Made sure logs can be rotated by sending a SIGHUP to the hub. 2010-07-12 16:56:55 +02:00
Jan Vidar Krey
c30b85bbcb Fix bug #139: Unable to use TLS - due to not handling quotes around configuration strings. 2010-07-07 18:53:39 +02:00
75 changed files with 885 additions and 3783 deletions

3
.gitignore vendored
View File

@@ -2,8 +2,7 @@
*.[oa] *.[oa]
*.exe *.exe
*.gch *.gch
mod_*.so
uhub-admin uhub-admin
adcrush adcrush
uhub uhub
revision.h*

View File

@@ -1,8 +1,6 @@
Authors of uhub Authors of uHub
=============== ===============
Jan Vidar Krey, Design and implementation Jan Vidar Krey, Design and implementation
E_zombie, Centos/RedHat customization scripts and heavy load testing E_zombie, Centos/RedHat customization scripts and heavy load testing
FleetCommand, Hub topic
MiMic, Implemented user commands

View File

@@ -1,3 +1,13 @@
0.3.3:
- Fix SSL/TLS related memory leak.
- Fix 100% CPU issue with SSL connections.
- Added option to redirect from adc:// to adcs:// if tls is required.
- Added more informative error messages for the configuration file parser.
- Made sure logs can be rotated by sending a SIGHUP to the hub
- Fix bug #139: Unable to use TLS - due to not handling quotes around configuration strings.
- Fix bug #136 - !broadcast does not report status back to to sender.
0.3.2: 0.3.2:
- Fixed bugs in the kqueue network backend (OSX/BSD) - Fixed bugs in the kqueue network backend (OSX/BSD)
- Rewrote the configuration backend code. - Rewrote the configuration backend code.

View File

@@ -10,7 +10,7 @@ LD := $(CC)
MV := mv MV := mv
RANLIB := ranlib RANLIB := ranlib
CFLAGS += -pipe -Wall CFLAGS += -pipe -Wall
USE_SSL ?= NO USE_SSL ?= YES
USE_BIGENDIAN ?= AUTO USE_BIGENDIAN ?= AUTO
BITS ?= AUTO BITS ?= AUTO
SILENT ?= YES SILENT ?= YES
@@ -46,7 +46,6 @@ else
DESTDIR ?= / DESTDIR ?= /
UHUB_CONF_DIR ?= $(DESTDIR)/etc/uhub UHUB_CONF_DIR ?= $(DESTDIR)/etc/uhub
UHUB_PREFIX ?= $(DESTDIR)/usr/local UHUB_PREFIX ?= $(DESTDIR)/usr/local
UHUB_MOD_DIR ?= $(DESTDIR)/var/lib/uhub
CFLAGS += -I/usr/local/include CFLAGS += -I/usr/local/include
LDFLAGS += -L/usr/local/lib LDFLAGS += -L/usr/local/lib
BIN_EXT ?= BIN_EXT ?=
@@ -119,8 +118,6 @@ CFLAGS += -DSSL_SUPPORT
LDLIBS += -lssl LDLIBS += -lssl
endif endif
LDLIBS += -ldl
GIT_VERSION=$(shell git describe --tags 2>/dev/null || echo "") GIT_VERSION=$(shell git describe --tags 2>/dev/null || echo "")
GIT_REVISION=$(shell git show --abbrev-commit 2>/dev/null | head -n 1 | cut -f 2 -d " " || echo "") GIT_REVISION=$(shell git show --abbrev-commit 2>/dev/null | head -n 1 | cut -f 2 -d " " || echo "")
OLD_REVISION=$(shell grep GIT_REVISION revision.h 2>/dev/null | cut -f 3 -d " " | tr -d "\"") OLD_REVISION=$(shell grep GIT_REVISION revision.h 2>/dev/null | cut -f 3 -d " " | tr -d "\"")
@@ -131,6 +128,7 @@ libuhub_SOURCES := \
src/core/commands.c \ src/core/commands.c \
src/core/config.c \ src/core/config.c \
src/core/eventqueue.c \ src/core/eventqueue.c \
src/core/floodctl.c \
src/core/hub.c \ src/core/hub.c \
src/core/hubevent.c \ src/core/hubevent.c \
src/core/hubio.c \ src/core/hubio.c \
@@ -140,9 +138,6 @@ libuhub_SOURCES := \
src/core/route.c \ src/core/route.c \
src/core/user.c \ src/core/user.c \
src/core/usermanager.c \ src/core/usermanager.c \
src/core/plugincallback.c \
src/core/plugininvoke.c \
src/core/pluginloader.c \
src/network/backend.c \ src/network/backend.c \
src/network/connection.c \ src/network/connection.c \
src/network/epoll.c \ src/network/epoll.c \
@@ -150,17 +145,7 @@ libuhub_SOURCES := \
src/network/network.c \ src/network/network.c \
src/network/select.c \ src/network/select.c \
src/network/timeout.c \ src/network/timeout.c \
src/network/timer.c src/network/timer.c \
libadc_common_SOURCES := \
src/adc/message.c \
src/adc/sid.c
libutils_SOURCES := \
src/util/config_token.c \
src/util/credentials.c \
src/util/floodctl.c \
src/util/ipcalc.c \ src/util/ipcalc.c \
src/util/list.c \ src/util/list.c \
src/util/log.c \ src/util/log.c \
@@ -169,6 +154,10 @@ libutils_SOURCES := \
src/util/rbtree.c \ src/util/rbtree.c \
src/util/tiger.c src/util/tiger.c
libadc_common_SOURCES := \
src/adc/message.c \
src/adc/sid.c
libadc_client_SOURCES := \ libadc_client_SOURCES := \
src/tools/adcclient.c src/tools/adcclient.c
@@ -179,7 +168,6 @@ adcrush_SOURCES := src/tools/adcrush.c
admin_SOURCES := src/tools/admin.c admin_SOURCES := src/tools/admin.c
autotest_SOURCES := \ autotest_SOURCES := \
autotest/test_credentials.tcc \
autotest/test_eventqueue.tcc \ autotest/test_eventqueue.tcc \
autotest/test_hub.tcc \ autotest/test_hub.tcc \
autotest/test_inf.tcc \ autotest/test_inf.tcc \
@@ -191,31 +179,12 @@ autotest_SOURCES := \
autotest/test_sid.tcc \ autotest/test_sid.tcc \
autotest/test_tiger.tcc \ autotest/test_tiger.tcc \
autotest/test_timer.tcc \ autotest/test_timer.tcc \
autotest/test_tokenizer.tcc \
autotest/test_usermanager.tcc autotest/test_usermanager.tcc
autotest_OBJECTS = autotest.o autotest_OBJECTS = autotest.o
# Plugin targets:
plugin_example_SOURCES := src/plugins/mod_example.c
plugin_example_TARGET := mod_example.so
plugin_logging_SOURCES := src/plugins/mod_logging.c
plugin_logging_TARGET := mod_logging.so
plugin_auth_SOURCES := src/plugins/mod_auth_simple.c
plugin_auth_TARGET := mod_auth_simple.so
plugin_auth_sqlite_SOURCES := src/plugins/mod_auth_sqlite.c
plugin_auth_sqlite_TARGET := mod_auth_sqlite.so
plugin_auth_sqlite_LIBS := -lsqlite3
plugin_chat_history_SOURCE := src/plugins/mod_chat_history.c
plugin_chat_history_TARGET := mod_chat_history.so
# Source to objects # Source to objects
libuhub_OBJECTS := $(libuhub_SOURCES:.c=.o) libuhub_OBJECTS := $(libuhub_SOURCES:.c=.o)
libutils_OBJECTS := $(libutils_SOURCES:.c=.o)
libadc_client_OBJECTS := $(libadc_client_SOURCES:.c=.o) libadc_client_OBJECTS := $(libadc_client_SOURCES:.c=.o)
libadc_common_OBJECTS := $(libadc_common_SOURCES:.c=.o) libadc_common_OBJECTS := $(libadc_common_SOURCES:.c=.o)
@@ -223,49 +192,27 @@ uhub_OBJECTS := $(uhub_SOURCES:.c=.o)
adcrush_OBJECTS := $(adcrush_SOURCES:.c=.o) adcrush_OBJECTS := $(adcrush_SOURCES:.c=.o)
admin_OBJECTS := $(admin_SOURCES:.c=.o) admin_OBJECTS := $(admin_SOURCES:.c=.o)
all_OBJECTS := $(libuhub_OBJECTS) $(uhub_OBJECTS) $(libutils_OBJECTS) $(adcrush_OBJECTS) $(autotest_OBJECTS) $(admin_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS) all_OBJECTS := $(libuhub_OBJECTS) $(uhub_OBJECTS) $(adcrush_OBJECTS) $(autotest_OBJECTS) $(admin_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS)
all_plugins := $(plugin_example_TARGET) $(plugin_logging_TARGET) $(plugin_auth_TARGET) $(plugin_auth_sqlite_TARGET) $(plugin_chat_history_TARGET)
uhub_BINARY=uhub$(BIN_EXT) uhub_BINARY=uhub$(BIN_EXT)
adcrush_BINARY=adcrush$(BIN_EXT) adcrush_BINARY=adcrush$(BIN_EXT)
admin_BINARY=uhub-admin$(BIN_EXT) admin_BINARY=uhub-admin$(BIN_EXT)
autotest_BINARY=autotest/test$(BIN_EXT) autotest_BINARY=autotest/test$(BIN_EXT)
ifeq ($(USE_PLUGINS),YES) .PHONY: revision.h.tmp
all_OBJECTS += $(plugins)
endif
.PHONY: revision.h.tmp all plugins
%.o: %.c version.h revision.h %.o: %.c version.h revision.h
$(MSG_CC) $(CC) -fPIC -c $(CFLAGS) -o $@ $< $(MSG_CC) $(CC) -c $(CFLAGS) -o $@ $<
all: $(uhub_BINARY) all: $(uhub_BINARY)
plugins: $(uhub_BINARY) $(all_plugins) $(adcrush_BINARY): $(adcrush_OBJECTS) $(libuhub_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS)
$(plugin_auth_TARGET): $(plugin_auth_SOURCES) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(plugin_auth_sqlite_TARGET): $(plugin_auth_sqlite_SOURCES) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS) $(plugin_auth_sqlite_LIBS)
$(plugin_example_TARGET): $(plugin_example_SOURCES)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(plugin_logging_TARGET): $(plugin_logging_SOURCES) $(libutils_OBJECTS) $(libadc_common_OBJECTS) src/network/network.o
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(plugin_chat_history_TARGET): $(plugin_chat_history_SOURCE) $(libutils_OBJECTS)
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
$(adcrush_BINARY): $(adcrush_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS)
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) $(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
$(admin_BINARY): $(admin_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS) $(admin_BINARY): $(admin_OBJECTS) $(libuhub_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS)
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) $(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
$(uhub_BINARY): $(uhub_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS) $(uhub_BINARY): $(uhub_OBJECTS) $(libuhub_OBJECTS) $(libadc_common_OBJECTS)
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) $(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
autotest.c: $(autotest_SOURCES) autotest.c: $(autotest_SOURCES)
@@ -286,7 +233,7 @@ revision.h: revision.h.tmp
$(autotest_OBJECTS): autotest.c $(autotest_OBJECTS): autotest.c
$(MSG_CC) $(CC) -c $(CFLAGS) -Isrc -o $@ $< $(MSG_CC) $(CC) -c $(CFLAGS) -Isrc -o $@ $<
$(autotest_BINARY): $(autotest_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS) $(autotest_BINARY): $(autotest_OBJECTS) $(libuhub_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS)
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) $(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
autotest: $(autotest_BINARY) autotest: $(autotest_BINARY)
@@ -302,10 +249,6 @@ install: $(uhub_BINARY)
@if [ ! -d $(UHUB_CONF_DIR) ]; then echo Creating $(UHUB_CONF_DIR); mkdir -p $(UHUB_CONF_DIR); fi @if [ ! -d $(UHUB_CONF_DIR) ]; then echo Creating $(UHUB_CONF_DIR); mkdir -p $(UHUB_CONF_DIR); fi
@if [ ! -f $(UHUB_CONF_DIR)/uhub.conf ]; then cp doc/uhub.conf $(UHUB_CONF_DIR); fi @if [ ! -f $(UHUB_CONF_DIR)/uhub.conf ]; then cp doc/uhub.conf $(UHUB_CONF_DIR); fi
@if [ ! -f $(UHUB_CONF_DIR)/users.conf ]; then cp doc/users.conf $(UHUB_CONF_DIR); fi @if [ ! -f $(UHUB_CONF_DIR)/users.conf ]; then cp doc/users.conf $(UHUB_CONF_DIR); fi
@if [ ! -f $(UHUB_CONF_DIR)/rules.txt ]; then cp doc/rules.txt $(UHUB_CONF_DIR); fi
@if [ ! -f $(UHUB_CONF_DIR)/plugins.conf ]; then cp doc/plugins.conf $(UHUB_CONF_DIR); fi
@if [ ! -d $(UHUB_MOD_DIR) ]; then echo Creating $(UHUB_MOD_DIR); mkdir -p $(UHUB_MOD_DIR); fi
@cp -f mod_*.so $(UHUB_MOD_DIR)
@touch $(UHUB_CONF_DIR)/motd.txt @touch $(UHUB_CONF_DIR)/motd.txt
@echo done. @echo done.
endif endif
@@ -314,7 +257,7 @@ dist-clean:
@rm -rf $(all_OBJECTS) *~ core @rm -rf $(all_OBJECTS) *~ core
clean: clean:
@rm -rf $(libuhub_OBJECTS) *~ core $(uhub_BINARY) $(admin_BINARY) $(autotest_BINARY) $(adcrush_BINARY) $(all_OBJECTS) $(all_plugins) autotest.c revision.h revision.h.tmp && \ @rm -rf $(libuhub_OBJECTS) *~ core $(uhub_BINARY) $(admin_BINARY) $(autotest_BINARY) $(adcrush_BINARY) $(all_OBJECTS) autotest.c revision.h revision.h.tmp && \
echo $(MSG_CLEAN) echo $(MSG_CLEAN)

View File

@@ -1,24 +0,0 @@
#include <uhub.h>
EXO_TEST(cred_to_string_1, { return !strcmp(auth_cred_to_string(auth_cred_none), "none"); });
EXO_TEST(cred_to_string_2, { return !strcmp(auth_cred_to_string(auth_cred_bot), "bot"); });
EXO_TEST(cred_to_string_3, { return !strcmp(auth_cred_to_string(auth_cred_guest), "guest"); });
EXO_TEST(cred_to_string_4, { return !strcmp(auth_cred_to_string(auth_cred_user), "user"); });
EXO_TEST(cred_to_string_5, { return !strcmp(auth_cred_to_string(auth_cred_operator), "operator"); });
EXO_TEST(cred_to_string_6, { return !strcmp(auth_cred_to_string(auth_cred_super), "super"); });
EXO_TEST(cred_to_string_7, { return !strcmp(auth_cred_to_string(auth_cred_link), "link"); });
EXO_TEST(cred_to_string_8, { return !strcmp(auth_cred_to_string(auth_cred_admin), "admin"); });
#define CRED_FROM_STRING(STR, EXPECT) enum auth_credentials cred; return auth_string_to_cred(STR, &cred) && cred == EXPECT;
EXO_TEST(cred_from_string_1, { CRED_FROM_STRING("none", auth_cred_none); });
EXO_TEST(cred_from_string_2, { CRED_FROM_STRING("bot", auth_cred_bot); });
EXO_TEST(cred_from_string_3, { CRED_FROM_STRING("guest", auth_cred_guest); });
EXO_TEST(cred_from_string_4, { CRED_FROM_STRING("user", auth_cred_user); });
EXO_TEST(cred_from_string_5, { CRED_FROM_STRING("reg", auth_cred_user); });
EXO_TEST(cred_from_string_6, { CRED_FROM_STRING("operator", auth_cred_operator); });
EXO_TEST(cred_from_string_7, { CRED_FROM_STRING("op", auth_cred_operator); });
EXO_TEST(cred_from_string_8, { CRED_FROM_STRING("super", auth_cred_super); });
EXO_TEST(cred_from_string_9, { CRED_FROM_STRING("link", auth_cred_link); });
EXO_TEST(cred_from_string_10, { CRED_FROM_STRING("admin", auth_cred_admin); });

View File

@@ -1,107 +0,0 @@
#include <uhub.h>
#define SETUP(X, STR) struct cfg_tokens* tokens = cfg_tokenize(STR)
#define CLEANUP_LIST(X) do { list_clear(X, hub_free); list_destroy(X); } while(0)
#define CLEANUP_TOKENS(X) do { cfg_tokens_free(X); } while(0)
static int match_str(const char* str1, char* str2)
{
size_t i;
for (i = 0; i < strlen(str2); i++)
if (str2[i] == '_')
str2[i] = ' ';
else if (str2[i] == '|')
str2[i] = '\t';
int ret = strcmp(str1, str2);
if (ret) {
fprintf(stderr, "\n Mismatch: \"%s\" != \"%s\"\n", str1, str2);
}
return ret;
}
static int count(const char* STR, size_t EXPECT) {
SETUP(tokens, STR);
int pass = cfg_token_count(tokens) == EXPECT;
CLEANUP_TOKENS(tokens);
return pass;
}
static int compare(const char* str, const char* ref) {
size_t i, max;
struct linked_list* compare = list_create();
SETUP(tokens, str);
split_string(ref, " ", compare, 0);
int pass = cfg_token_count(tokens) == list_size(compare);
if (pass) {
max = cfg_token_count(tokens);
for (i = 0; i < max; i++) {
char* token = (char*) cfg_token_get(tokens, i);
char* refer = (char*) list_get_index(compare, i);
if (match_str(token, refer)) {
pass = 0;
break;
}
}
}
CLEANUP_TOKENS(tokens);
CLEANUP_LIST(compare);
return pass;
}
EXO_TEST(tokenizer_basic_0, { return count("", 0); });
EXO_TEST(tokenizer_basic_1, { return count("a", 1); });
EXO_TEST(tokenizer_basic_1a, { return count(" a", 1); })
EXO_TEST(tokenizer_basic_1b, { return count("\ta", 1); })
EXO_TEST(tokenizer_basic_1c, { return count(" a", 1); })
EXO_TEST(tokenizer_basic_1d, { return count(" a ", 1); })
EXO_TEST(tokenizer_basic_1e, { return count(" a ", 1); })
EXO_TEST(tokenizer_basic_2, { return count("a b", 2); });
EXO_TEST(tokenizer_basic_2a, { return count(" a b ", 2); });
EXO_TEST(tokenizer_basic_3, { return count("a b c", 3); });
EXO_TEST(tokenizer_basic_3a, { return count("a b c", 3); });
EXO_TEST(tokenizer_basic_3b, { return count("a b\tc", 3); });
EXO_TEST(tokenizer_basic_3c, { return count("a b c ", 3); });
EXO_TEST(tokenizer_basic_3d, { return count("a b c ", 3); });
EXO_TEST(tokenizer_basic_compare_0, { return compare("value1 value2 value3", "value1 value2 value3"); });
EXO_TEST(tokenizer_basic_compare_1, { return compare("a b c", "a b c"); });
EXO_TEST(tokenizer_basic_compare_2, { return compare("a b c", "a b c"); });
EXO_TEST(tokenizer_basic_compare_3, { return compare(" a b c", "a b c"); });
EXO_TEST(tokenizer_basic_compare_4, { return compare(" a b c ", "a b c"); });
EXO_TEST(tokenizer_basic_compare_5, { return compare("a b c ", "a b c"); });
EXO_TEST(tokenizer_basic_compare_6, { return compare("a b c ", "a b c"); });
EXO_TEST(tokenizer_comment_1, { return compare("value1 value2 # value3", "value1 value2"); });
EXO_TEST(tokenizer_comment_2, { return compare("value1 value2\\# value3", "value1 value2# value3"); });
EXO_TEST(tokenizer_comment_3, { return compare("value1 \"value2#\" value3", "value1 value2# value3"); });
EXO_TEST(tokenizer_escape_1, { return compare("\"value1\" value2", "value1 value2"); });
EXO_TEST(tokenizer_escape_2, { return compare("\"value1\\\"\" value2", "value1\" value2"); });
EXO_TEST(tokenizer_escape_3, { return compare("\"value1\" \"value 2\"", "value1 value_2"); });
EXO_TEST(tokenizer_escape_4, { return compare("\"value1\" value\\ 2", "value1 value_2"); });
EXO_TEST(tokenizer_escape_5, { return compare("\"value1\" value\\\\2", "value1 value\\2"); });
EXO_TEST(tokenizer_escape_6, { return compare("\"value1\" value\\\t2", "value1 value|2"); });
EXO_TEST(tokenizer_escape_7, { return compare("\"value1\" \"value\t2\"", "value1 value|2"); });
static int test_setting(const char* str, const char* expected_key, const char* expected_value)
{
int success = 0;
struct cfg_settings* setting = cfg_settings_split(str);
if (!setting) return expected_key == NULL;
success = (!strcmp(cfg_settings_get_key(setting), expected_key) && !strcmp(cfg_settings_get_value(setting), expected_value));
cfg_settings_free(setting);
return success;
}
EXO_TEST(tokenizer_settings_1, { return test_setting("foo=bar", "foo", "bar"); });
EXO_TEST(tokenizer_settings_2, { return test_setting("foo =bar", "foo", "bar"); });
EXO_TEST(tokenizer_settings_3, { return test_setting("foo= bar", "foo", "bar"); });
EXO_TEST(tokenizer_settings_4, { return test_setting("\tfoo=bar", "foo", "bar"); });
EXO_TEST(tokenizer_settings_5, { return test_setting("foo=bar\t", "foo", "bar"); });
EXO_TEST(tokenizer_settings_6, { return test_setting("\tfoo=bar\t", "foo", "bar"); });
EXO_TEST(tokenizer_settings_7, { return test_setting("\tfoo\t=\tbar\t", "foo", "bar"); });
EXO_TEST(tokenizer_settings_8, { return test_setting("foo=", "foo", ""); });
EXO_TEST(tokenizer_settings_9, { return test_setting("=bar", NULL, ""); });

6
debian/changelog vendored
View File

@@ -1,3 +1,9 @@
uhub (0.3.3-1) unstable; urgency=low
* Updated upstream version.
-- Jan Vidar Krey <janvidar@extatic.org> Tue 24 Aug 2010 18:00:00 +0200
uhub (0.3.2-1) unstable; urgency=low uhub (0.3.2-1) unstable; urgency=low
* Updated upstream version. * Updated upstream version.

View File

@@ -9,11 +9,6 @@ Before you try to compile µHub, please make sure the following prerequisites ar
* GNU make * GNU make
* gcc > 3.0 (or MinGW on Windows) * gcc > 3.0 (or MinGW on Windows)
* Perl 5 * Perl 5
* openssl > 0.9.8 (or use "make USE_SSL=NO")
* sqlite > 3.x
or read http://www.uhub.org/compile.php for more info.
Linux, Mac OSX, FreeBSD, NetBSD and OpenBSD Linux, Mac OSX, FreeBSD, NetBSD and OpenBSD
------------------------------------------- -------------------------------------------

View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# #
# chkconfig: - 91 35 # chkconfig: - 91 35
# description: Starts and stops the Uhub ( http://www.uhub.org ) daemons on RHEL\CentOS \ # description: Starts and stops the Uhub ( http://www.extatic.org/uhub ) daemons on RHEL\CentOS \
# used to provide p2p network services. # used to provide p2p network services.
# #
# pidfile: /var/run/uhub.pid # pidfile: /var/run/uhub.pid
@@ -68,14 +68,6 @@ reload() {
return $RETVAL return $RETVAL
} }
relog() {
echo -n $"Reopen main log file: "
killproc uhub -SIGHUP
RETVAL=$?
echo ""
return $RETVAL
}
rhstatus() { rhstatus() {
status uhub status uhub
RETVAL=$? RETVAL=$?
@@ -98,14 +90,11 @@ case "$1" in
reload) reload)
reload reload
;; ;;
relog)
relog
;;
status) status)
rhstatus rhstatus
;; ;;
*) *)
echo $"Usage: $0 {start|stop|restart|reload|relog|status}" echo $"Usage: $0 {start|stop|restart|reload|status}"
exit 2 exit 2
esac esac

View File

@@ -1,16 +0,0 @@
# ATTENTION!
# Plugins are invoked in the order of listing in the plugin config file.
# auth user
# file={path for DB file with user auth information}
plugin /var/lib/uhub/mod_auth_sqlite.so "file=/etc/uhub/users.db"
# log subsystem.
# file={/path/to/logfile}
plugin /var/lib/uhub/mod_logging.so "file=/var/log/uhub.log"
#
# plugin /var/lib/uhub/mod_auth_simple.so
#
# plugin /var/lib/uhub/mod_example.so

View File

@@ -49,8 +49,6 @@ file_motd=/etc/uhub/motd.txt
# Normally this message is sent to clients when write in chat !rules # Normally this message is sent to clients when write in chat !rules
file_rules=/etc/uhub/rules.txt file_rules=/etc/uhub/rules.txt
# This file can contain a conf for plugin subsystem
file_plugins = /etc/uhub/plugins.conf
# Slots/share/hubs limits # Slots/share/hubs limits
limit_max_hubs_user = 0 limit_max_hubs_user = 0

View File

@@ -1,14 +1,13 @@
Summary: High performance ADC p2p hub. Summary: High performance ADC p2p hub.
Name: uhub Name: uhub
Version: 0.4.0 Version: 0.3.3
Release: 1 Release: 3
License: GPLv3 License: GPLv3
Group: Networking/File transfer Group: Networking/File transfer
Source: uhub-%{version}.tar.gz Source: uhub-%{version}.tar.gz
URL: http://www.uhub.org URL: http://www.uhub.org
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: sqlite-devel
%description %description
uhub is a high performance peer-to-peer hub for the ADC network. uhub is a high performance peer-to-peer hub for the ADC network.
@@ -21,7 +20,7 @@ Key features:
- Experimental SSL support (optional) - Experimental SSL support (optional)
- Advanced access control support - Advanced access control support
- Easy configuration - Easy configuration
- plugin support
%prep %prep
%setup -q -n %{name}-%{version} %setup -q -n %{name}-%{version}
@@ -37,17 +36,15 @@ mkdir -p $RPM_BUILD_ROOT/etc/init.d
mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d
mkdir -p $RPM_BUILD_ROOT/etc/sysconfig mkdir -p $RPM_BUILD_ROOT/etc/sysconfig
mkdir -p $RPM_BUILD_ROOT/usr/share/man/man1 mkdir -p $RPM_BUILD_ROOT/usr/share/man/man1
mkdir -p $RPM_BUILD_ROOT/var/lib/uhub
install uhub $RPM_BUILD_ROOT/usr/bin/ install uhub $RPM_BUILD_ROOT/usr/bin/
> doc/motd.txt > doc/motd.txt
install -m644 doc/uhub.conf doc/users.conf doc/rules.txt doc/motd.txt doc/plugins.conf $RPM_BUILD_ROOT/etc/uhub install -m644 doc/uhub.conf doc/users.conf doc/rules.txt doc/motd.txt $RPM_BUILD_ROOT/etc/uhub
install doc/init.d.RedHat/etc/init.d/uhub $RPM_BUILD_ROOT/etc/init.d install doc/init.d.RedHat/etc/init.d/uhub $RPM_BUILD_ROOT/etc/init.d
install -m644 doc/init.d.RedHat/etc/sysconfig/uhub $RPM_BUILD_ROOT/etc/sysconfig/ install -m644 doc/init.d.RedHat/etc/sysconfig/uhub $RPM_BUILD_ROOT/etc/sysconfig/
install -m644 doc/init.d.RedHat/etc/logrotate.d/uhub $RPM_BUILD_ROOT/etc/logrotate.d/ install -m644 doc/init.d.RedHat/etc/logrotate.d/uhub $RPM_BUILD_ROOT/etc/logrotate.d/
/bin/gzip -9c doc/uhub.1 > doc/uhub.1.gz && /bin/gzip -9c doc/uhub.1 > doc/uhub.1.gz &&
install -m644 doc/uhub.1.gz $RPM_BUILD_ROOT/usr/share/man/man1 install -m644 doc/uhub.1.gz $RPM_BUILD_ROOT/usr/share/man/man1
install -m644 mod_*.so $RPM_BUILD_ROOT/var/lib/uhub
%files %files
@@ -58,13 +55,12 @@ install -m644 mod_*.so $RPM_BUILD_ROOT/var/lib/uhub
%config(noreplace) %{_sysconfdir}/uhub/users.conf %config(noreplace) %{_sysconfdir}/uhub/users.conf
%config(noreplace) %{_sysconfdir}/uhub/motd.txt %config(noreplace) %{_sysconfdir}/uhub/motd.txt
%config(noreplace) %{_sysconfdir}/uhub/rules.txt %config(noreplace) %{_sysconfdir}/uhub/rules.txt
%config(noreplace) %{_sysconfdir}/uhub/plugins.conf
%{_sysconfdir}/init.d/uhub %{_sysconfdir}/init.d/uhub
%config(noreplace) %{_sysconfdir}/logrotate.d/uhub %config(noreplace) %{_sysconfdir}/logrotate.d/uhub
%config(noreplace) %{_sysconfdir}/sysconfig/uhub %config(noreplace) %{_sysconfdir}/sysconfig/uhub
/usr/share/man/man1/uhub.1.gz /usr/share/man/man1/uhub.1.gz
%{_bindir}/uhub %{_bindir}/uhub
%{_libdir}/uhub/mod_*.so
%clean %clean
rm -rf $RPM_BUILD_ROOT rm -rf $RPM_BUILD_ROOT
@@ -78,8 +74,6 @@ fi
/usr/sbin/adduser -M -d /tmp -G nobody -s /sbin/nologin -c 'The Uhub ADC p2p hub Daemon' uhub >/dev/null 2>&1 ||: /usr/sbin/adduser -M -d /tmp -G nobody -s /sbin/nologin -c 'The Uhub ADC p2p hub Daemon' uhub >/dev/null 2>&1 ||:
%changelog %changelog
* Tue Jun 26 2001 E_zombie
- add plugins.conf
* Tue Jan 31 2010 E_zombie * Tue Jan 31 2010 E_zombie
- change GROUP - change GROUP
- chmod for files - chmod for files

View File

@@ -20,11 +20,7 @@
#ifndef HAVE_UHUB_ADC_CONSTANTS_H #ifndef HAVE_UHUB_ADC_CONSTANTS_H
#define HAVE_UHUB_ADC_CONSTANTS_H #define HAVE_UHUB_ADC_CONSTANTS_H
#ifndef SID_T_DEFINED
typedef uint32_t sid_t; typedef uint32_t sid_t;
#define SID_T_DEFINED
#endif
typedef uint32_t fourcc_t; typedef uint32_t fourcc_t;
/* Internal uhub limit */ /* Internal uhub limit */

View File

@@ -600,7 +600,7 @@ int adc_msg_has_named_argument(struct adc_message* cmd, const char prefix_[2])
while (start) while (start)
{ {
count++; count++;
if ((size_t) (&start[0] - &cmd->cache[0]) < 1+cmd->length) if ((&start[0] - &cmd->cache[0]) < 1+cmd->length)
start = memmem(&start[1], (&cmd->cache[cmd->length] - &start[0]), prefix, 3); start = memmem(&start[1], (&cmd->cache[cmd->length] - &start[0]), prefix, 3);
else else
start = NULL; start = NULL;
@@ -881,8 +881,8 @@ char* adc_msg_unescape(const char* string)
char* adc_msg_escape(const char* string) char* adc_msg_escape(const char* string)
{ {
char* str = hub_malloc(adc_msg_escape_length(string)+1); char* str = hub_malloc(adc_msg_escape_length(string)+1);
size_t n = 0; int n = 0;
size_t i = 0; int i = 0;
for (i = 0; i < strlen(string); i++) for (i = 0; i < strlen(string); i++)
{ {
switch (string[i]) { switch (string[i]) {

View File

@@ -120,7 +120,6 @@ void sid_pool_destroy(struct sid_pool* pool)
sid_t sid_alloc(struct sid_pool* pool, struct hub_user* user) sid_t sid_alloc(struct sid_pool* pool, struct hub_user* user)
{ {
sid_t n; sid_t n;
if (pool->count >= (pool->max - pool->min)) if (pool->count >= (pool->max - pool->min))
{ {
#ifdef DEBUG_SID #ifdef DEBUG_SID
@@ -129,8 +128,7 @@ sid_t sid_alloc(struct sid_pool* pool, struct hub_user* user)
return 0; return 0;
} }
n = ++pool->count; n = (++pool->count);
for (; (pool->map[n % pool->max]); n++) ; for (; (pool->map[n % pool->max]); n++) ;
#ifdef DEBUG_SID #ifdef DEBUG_SID

View File

@@ -25,6 +25,7 @@
struct sid_pool; struct sid_pool;
struct hub_user; struct hub_user;
extern const char* BASE32_ALPHABET;
extern char* sid_to_string(sid_t sid_); extern char* sid_to_string(sid_t sid_);
extern sid_t string_to_sid(const char* sid); extern sid_t string_to_sid(const char* sid);

View File

@@ -23,6 +23,23 @@
#define ACL_ADD_BOOL(S, L) do { ret = check_cmd_bool(S, L, line, line_count); if (ret != 0) return ret; } while(0) #define ACL_ADD_BOOL(S, L) do { ret = check_cmd_bool(S, L, line, line_count); if (ret != 0) return ret; } while(0)
#define ACL_ADD_ADDR(S, L) do { ret = check_cmd_addr(S, L, line, line_count); if (ret != 0) return ret; } while(0) #define ACL_ADD_ADDR(S, L) do { ret = check_cmd_addr(S, L, line, line_count); if (ret != 0) return ret; } while(0)
const char* get_user_credential_string(enum user_credentials cred)
{
switch (cred)
{
case cred_none: return "none";
case cred_bot: return "bot";
case cred_guest: return "guest";
case cred_user: return "user";
case cred_operator: return "operator";
case cred_super: return "super";
case cred_admin: return "admin";
case cred_link: return "link";
}
return "";
};
static int check_cmd_bool(const char* cmd, struct linked_list* list, char* line, int line_count) static int check_cmd_bool(const char* cmd, struct linked_list* list, char* line, int line_count)
{ {
char* data; char* data;
@@ -53,7 +70,7 @@ static int check_cmd_user(const char* cmd, int status, struct linked_list* list,
{ {
char* data; char* data;
char* data_extra; char* data_extra;
struct auth_info* info = 0; struct hub_user_access_info* info = 0;
if (!strncmp(line, cmd, strlen(cmd))) if (!strncmp(line, cmd, strlen(cmd)))
{ {
@@ -69,7 +86,7 @@ static int check_cmd_user(const char* cmd, int status, struct linked_list* list,
return -1; return -1;
} }
info = hub_malloc_zero(sizeof(struct auth_info)); info = hub_malloc_zero(sizeof(struct hub_user_access_info));
if (!info) if (!info)
{ {
@@ -87,11 +104,11 @@ static int check_cmd_user(const char* cmd, int status, struct linked_list* list,
} }
} }
strncpy(info->nickname, data, MAX_NICK_LEN); info->username = hub_strdup(data);
strncpy(info->password, data_extra, MAX_PASS_LEN); info->password = data_extra ? hub_strdup(data_extra) : 0;
info->credentials = status; info->status = status;
list_append(list, info); list_append(list, info);
LOG_DEBUG("ACL: Added user '%s' (%s)", info->nickname, auth_cred_to_string(info->credentials)); LOG_DEBUG("ACL: Added user '%s' (%s)", info->username, get_user_credential_string(info->status));
return 1; return 1;
} }
return 0; return 0;
@@ -170,12 +187,12 @@ static int acl_parse_line(char* line, int line_count, void* ptr_data)
LOG_DEBUG("acl_parse_line: '%s'", line); LOG_DEBUG("acl_parse_line: '%s'", line);
ACL_ADD_USER("bot", handle->users, auth_cred_bot); ACL_ADD_USER("bot", handle->users, cred_bot);
ACL_ADD_USER("user_admin", handle->users, auth_cred_admin); ACL_ADD_USER("user_admin", handle->users, cred_admin);
ACL_ADD_USER("user_super", handle->users, auth_cred_super); ACL_ADD_USER("user_super", handle->users, cred_super);
ACL_ADD_USER("user_op", handle->users, auth_cred_operator); ACL_ADD_USER("user_op", handle->users, cred_operator);
ACL_ADD_USER("user_reg", handle->users, auth_cred_user); ACL_ADD_USER("user_reg", handle->users, cred_user);
ACL_ADD_USER("link", handle->users, auth_cred_link); ACL_ADD_USER("link", handle->users, cred_link);
ACL_ADD_BOOL("deny_nick", handle->users_denied); ACL_ADD_BOOL("deny_nick", handle->users_denied);
ACL_ADD_BOOL("ban_nick", handle->users_banned); ACL_ADD_BOOL("ban_nick", handle->users_banned);
ACL_ADD_BOOL("ban_cid", handle->cids); ACL_ADD_BOOL("ban_cid", handle->cids);
@@ -226,9 +243,11 @@ int acl_initialize(struct hub_config* config, struct acl_handle* handle)
static void acl_free_access_info(void* ptr) static void acl_free_access_info(void* ptr)
{ {
struct auth_info* info = (struct auth_info*) ptr; struct hub_user_access_info* info = (struct hub_user_access_info*) ptr;
if (info) if (info)
{ {
hub_free(info->username);
hub_free(info->password);
hub_free(info); hub_free(info);
} }
} }
@@ -282,80 +301,24 @@ int acl_shutdown(struct acl_handle* handle)
list_destroy(handle->nat_override); list_destroy(handle->nat_override);
} }
memset(handle, 0, sizeof(struct acl_handle)); memset(handle, 0, sizeof(struct acl_handle));
return 0; return 0;
} }
extern int acl_register_user(struct hub_info* hub, struct auth_info* info)
{
#ifdef PLUGIN_SUPPORT
if (plugin_auth_register_user(hub, info) != st_allow)
{
return 0;
}
return 1;
#else
// NOT SUPPORTED!
return 0;
#endif
}
extern int acl_update_user(struct hub_info* hub, struct auth_info* info) struct hub_user_access_info* acl_get_access_info(struct acl_handle* handle, const char* name)
{ {
#ifdef PLUGIN_SUPPORT struct hub_user_access_info* info = (struct hub_user_access_info*) list_get_first(handle->users);
if (plugin_auth_update_user(hub, info) != st_allow)
{
return 0;
}
return 1;
#else
// NOT SUPPORTED!
return 0;
#endif
}
extern int acl_delete_user(struct hub_info* hub, const char* name)
{
#ifdef PLUGIN_SUPPORT
struct auth_info data;
strncpy(data.nickname, name, MAX_NICK_LEN);
data.nickname[MAX_NICK_LEN] = '\0';
data.password[0] = '\0';
data.credentials = auth_cred_none;
if (plugin_auth_delete_user(hub, &data) != st_allow)
{
return 0;
}
return 1;
#else
// NOT SUPPORTED!
return 0;
#endif
}
struct auth_info* acl_get_access_info(struct hub_info* hub, const char* name)
{
struct auth_info* info = 0;
#ifdef PLUGIN_SUPPORT
info = (struct auth_info*) hub_malloc(sizeof(struct auth_info));
if (plugin_auth_get_user(hub, name, info) != st_allow)
{
hub_free(info);
return NULL;
}
return info;
#else
info = (struct auth_info*) list_get_first(hub->acl->users);
while (info) while (info)
{ {
if (strcasecmp((char*)info->nickname, name) == 0) if (strcasecmp(info->username, name) == 0)
{ {
return info; return info;
} }
info = (struct auth_info*) list_get_next(hub->acl->users); info = (struct hub_user_access_info*) list_get_next(handle->users);
} }
return NULL; return NULL;
#endif
} }
#define STR_LIST_CONTAINS(LIST, STR) \ #define STR_LIST_CONTAINS(LIST, STR) \
@@ -467,7 +430,7 @@ int acl_is_ip_nat_override(struct acl_handle* handle, const char* ip_address)
* seconds since the unix epoch (modulus 1 million) * seconds since the unix epoch (modulus 1 million)
* and the SID of the user (0-1 million). * and the SID of the user (0-1 million).
*/ */
const char* acl_password_generate_challenge(struct hub_info* hub, struct hub_user* user) const char* acl_password_generate_challenge(struct acl_handle* acl, struct hub_user* user)
{ {
char buf[64]; char buf[64];
uint64_t tiger_res[3]; uint64_t tiger_res[3];
@@ -483,40 +446,36 @@ const char* acl_password_generate_challenge(struct hub_info* hub, struct hub_use
} }
int acl_password_verify(struct hub_info* hub, struct hub_user* user, const char* password) int acl_password_verify(struct acl_handle* acl, struct hub_user* user, const char* password)
{ {
char buf[1024]; char buf[1024];
struct auth_info* access; struct hub_user_access_info* access;
const char* challenge; const char* challenge;
char raw_challenge[64]; char raw_challenge[64];
char password_calc[64]; char password_calc[64];
uint64_t tiger_res[3]; uint64_t tiger_res[3];
size_t password_len;
if (!password || !user || strlen(password) != MAX_CID_LEN) if (!password || !user || strlen(password) != MAX_CID_LEN)
return 0; return 0;
access = acl_get_access_info(hub, user->id.nick); access = acl_get_access_info(acl, user->id.nick);
if (!access) if (!access || !access->password)
return 0; return 0;
challenge = acl_password_generate_challenge(hub, user); if (TIGERSIZE+strlen(access->password) >= 1024)
return 0;
challenge = acl_password_generate_challenge(acl, user);
base32_decode(challenge, (unsigned char*) raw_challenge, MAX_CID_LEN); base32_decode(challenge, (unsigned char*) raw_challenge, MAX_CID_LEN);
password_len = strlen(access->password); memcpy(&buf[0], (char*) access->password, strlen(access->password));
memcpy(&buf[strlen(access->password)], raw_challenge, TIGERSIZE);
memcpy(&buf[0], access->password, password_len); tiger((uint64_t*) buf, TIGERSIZE+strlen(access->password), (uint64_t*) tiger_res);
memcpy(&buf[password_len], raw_challenge, TIGERSIZE);
tiger((uint64_t*) buf, TIGERSIZE+password_len, (uint64_t*) tiger_res);
base32_encode((unsigned char*) tiger_res, TIGERSIZE, password_calc); base32_encode((unsigned char*) tiger_res, TIGERSIZE, password_calc);
password_calc[MAX_CID_LEN] = 0; password_calc[MAX_CID_LEN] = 0;
#ifdef PLUGIN_SUPPORT
hub_free(access);
#endif
if (strcasecmp(password, password_calc) == 0) if (strcasecmp(password, password_calc) == 0)
{ {
return 1; return 1;

View File

@@ -21,10 +21,30 @@
#define HAVE_UHUB_ACL_H #define HAVE_UHUB_ACL_H
struct hub_config; struct hub_config;
struct hub_info;
struct hub_user; struct hub_user;
struct ip_addr_encap; struct ip_addr_encap;
enum user_credentials
{
cred_none, /**<<< "User has no credentials (not yet logged in)" */
cred_bot, /**<<< "User is a robot" */
cred_guest, /**<<< "User is a guest (unregistered user)" */
cred_user, /**<<< "User is identified as a registered user" */
cred_operator, /**<<< "User is identified as a hub operator" */
cred_super, /**<<< "User is a super user" (not used) */
cred_admin, /**<<< "User is identified as a hub administrator/owner" */
cred_link, /**<<< "User is a link (not used currently)" */
};
const char* get_user_credential_string(enum user_credentials cred);
struct hub_user_access_info
{
char* username; /* name of user, cid or IP range */
char* password; /* password */
enum user_credentials status;
};
struct acl_handle struct acl_handle
{ {
struct linked_list* users; /* Known users. See enum user_status */ struct linked_list* users; /* Known users. See enum user_status */
@@ -39,12 +59,7 @@ struct acl_handle
extern int acl_initialize(struct hub_config* config, struct acl_handle* handle); extern int acl_initialize(struct hub_config* config, struct acl_handle* handle);
extern int acl_shutdown(struct acl_handle* handle); extern int acl_shutdown(struct acl_handle* handle);
extern struct auth_info* acl_get_access_info(struct hub_info* hub, const char* name); extern struct hub_user_access_info* acl_get_access_info(struct acl_handle* handle, const char* name);
extern int acl_register_user(struct hub_info* hub, struct auth_info* info);
extern int acl_update_user(struct hub_info* hub, struct auth_info* info);
extern int acl_delete_user(struct hub_info* hub, const char* name);
extern int acl_is_cid_banned(struct acl_handle* handle, const char* cid); extern int acl_is_cid_banned(struct acl_handle* handle, const char* cid);
extern int acl_is_ip_banned(struct acl_handle* handle, const char* ip_address); extern int acl_is_ip_banned(struct acl_handle* handle, const char* ip_address);
extern int acl_is_ip_nat_override(struct acl_handle* handle, const char* ip_address); extern int acl_is_ip_nat_override(struct acl_handle* handle, const char* ip_address);
@@ -57,14 +72,14 @@ extern int acl_user_ban_cid(struct acl_handle* handle, const char* cid);
extern int acl_user_unban_nick(struct acl_handle* handle, const char* nick); extern int acl_user_unban_nick(struct acl_handle* handle, const char* nick);
extern int acl_user_unban_cid(struct acl_handle* handle, const char* cid); extern int acl_user_unban_cid(struct acl_handle* handle, const char* cid);
extern const char* acl_password_generate_challenge(struct acl_handle* acl, struct hub_user* user);
/** /**
* Verify a password. * Verify a password.
* *
* @param password the hashed password (based on the nonce). * @param password the hashed password (based on the nonce).
* @return 1 if the password matches, or 0 if the password is incorrect. * @return 1 if the password matches, or 0 if the password is incorrect.
*/ */
extern int acl_password_verify(struct hub_info* hub, struct hub_user* user, const char* password); extern int acl_password_verify(struct acl_handle* acl, struct hub_user* user, const char* password);
extern const char* acl_password_generate_challenge(struct hub_info* hub, struct hub_user* user);
#endif /* HAVE_UHUB_ACL_H */ #endif /* HAVE_UHUB_ACL_H */

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey * Copyright (C) 2007-2010, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -19,80 +19,4 @@
#include "uhub.h" #include "uhub.h"
struct command_base; extern int command_dipatcher(struct hub_info* hub, struct hub_user* user, const char* message);
struct hub_command
{
const char* message;
char* prefix;
size_t prefix_len;
struct linked_list* args;
};
typedef int (*command_handler)(struct command_base*, struct hub_user* user, struct hub_command*);
/**
* Argument codes are used to automatically parse arguments
* for a a hub command.
*
* n = nick name (must exist in hub session)
* i = CID (must exist in hub)
* a = (IP) address (must be a valid IPv4 or IPv6 address)
* m = message (string)
* p = password (string)
* C = credentials (see auth_string_to_cred).
* c = command (name of command)
* N = number (integer)
*
* Prefix an argument with ? to make it optional.
* NOTE; if an argument is optional then all following arguments must also be optional.
*
* Example:
* "nia" means "nick cid ip"
* "n?p" means "nick [password]" where password is optional.
*
*/
struct command_handle
{
const char* prefix; /**<<< "Command prefix, for instance 'help' would be the prefix for the !help command." */
size_t length; /**<<< "Length of the prefix" */
const char* args; /**<<< "Argument codes (see above)" */
enum auth_credentials cred; /**<<< "Minimum access level for the command" */
command_handler handler; /**<<< "Function pointer for the command" */
const char* description; /**<<< "Description for the command" */
const char* command_origin; /**<<< "Name of module where the command is implemented." */
};
/**
* Returns NULL on error, or handle
*/
extern struct command_base* command_initialize(struct hub_info* hub);
extern void command_shutdown(struct command_base* cbase);
/**
* Add a new command to the command base.
* Returns 1 on success, or 0 on error.
*/
extern int command_add(struct command_base*, struct command_handle*);
/**
* Remove a command from the command base.
* Returns 1 on success, or 0 on error.
*/
extern int command_del(struct command_base*, struct command_handle*);
/**
* Returns 1 if a command is available to a user (user has access to run it.)
*/
extern int command_is_available(struct command_handle*, struct hub_user* user);
/**
* Dispatch a message and forward it as a command.
* Returns 1 if the message should be forwarded as a chat message, or 0 if
* it is supposed to be handled internally in the dispatcher.
*
* This will break the message down into a struct hub_command and invoke the command handler
* for that command if the sufficient access credentials are met.
*/
extern int command_invoke(struct command_base*, struct hub_user* user, const char* message);

View File

@@ -31,7 +31,17 @@
static int apply_boolean(const char* key, const char* data, int* target) static int apply_boolean(const char* key, const char* data, int* target)
{ {
return string_to_boolean(data, target); if (strlen(data) == 1 && (data[0] == '1')) *target = 1;
else if (strlen(data) == 1 && (data[0] == '0')) *target = 0;
else if (strncasecmp(data, "true", 4) == 0) *target = 1;
else if (strncasecmp(data, "false", 5) == 0) *target = 0;
else if (strncasecmp(data, "yes", 3) == 0) *target = 1;
else if (strncasecmp(data, "no", 2) == 0) *target = 0;
else if (strncasecmp(data, "on", 2) == 0) *target = 1;
else if (strncasecmp(data, "off", 3) == 0) *target = 0;
else
return 0;
return 1;
} }
static int apply_string(const char* key, const char* data, char** target, char* regexp) static int apply_string(const char* key, const char* data, char** target, char* regexp)

View File

@@ -125,6 +125,7 @@ sub write_c_impl_apply(@)
my $min; my $min;
my $max; my $max;
my $regexp; my $regexp;
my $expect = "";
if (defined $p) if (defined $p)
{ {
@@ -141,14 +142,21 @@ sub write_c_impl_apply(@)
print GENIMPL "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n"; print GENIMPL "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n";
$expect = "\\\"$name\\\"";
if ($type eq "int") if ($type eq "int")
{ {
$expect .= " (integer)";
$expect .= ", default=" . $default;
if (defined $min) if (defined $min)
{ {
$expect .= ", min=" . $min;
print GENIMPL "\t\tmin = $min;\n" print GENIMPL "\t\tmin = $min;\n"
} }
if (defined $max) if (defined $max)
{ {
$expect .= ", max=" . $max;
print GENIMPL "\t\tmax = $max;\n" print GENIMPL "\t\tmax = $max;\n"
} }
@@ -178,16 +186,27 @@ sub write_c_impl_apply(@)
} }
elsif ($type eq "boolean") elsif ($type eq "boolean")
{ {
$expect .= " (boolean)";
$expect .= ", default=" . $default;
print GENIMPL "\t\tif (!apply_boolean(key, data, &config->$name))\n"; print GENIMPL "\t\tif (!apply_boolean(key, data, &config->$name))\n";
} }
elsif ($type =~ /(string|file|message)/) elsif ($type =~ /(string|file|message)/)
{ {
$expect .= " (" . $type . ")";
$expect .= ", default=\\\"" . $default . "\\\"";
print GENIMPL "\t\tif (!apply_string(key, data, &config->$name, (char*) \"\"))\n"; print GENIMPL "\t\tif (!apply_string(key, data, &config->$name, (char*) \"\"))\n";
} }
else
{
$expect = " is unknown.";
}
print GENIMPL "\t\t{\n" . print GENIMPL "\t\t{\n" .
"\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n" . "\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n";
"\t\t\treturn -1;\n" .
print GENIMPL "\t\t\tLOG_ERROR(\"" . $expect . "\");\n" if ($expect ne "");
print GENIMPL "\t\t\treturn -1;\n" .
"\t\t}\n" . "\t\t}\n" .
"\t\treturn 0;\n" . "\t\treturn 0;\n" .
"\t}\n\n"; "\t}\n\n";

View File

@@ -417,6 +417,17 @@
<since>0.3.0</since> <since>0.3.0</since>
</option> </option>
<option name="tls_require_redirect_addr" type="string" default="">
<check regexp="(adc|adcs|dchub)://.*" />
<short>A redirect address in case a client connects using "adc://" when "adcs://" is required.</short>
<description><![CDATA[
This is the redirect address used when the hub wants to redirect a client for not using ADCS.
For instance a hub at adc://adc.example.com might redirect to adcs://adc.example.com
]]></description>
<since>0.3.3</since>
</option>
<option name="tls_certificate" type="file" default=""> <option name="tls_certificate" type="file" default="">
<short>Certificate file</short> <short>Certificate file</short>
<description><![CDATA[ <description><![CDATA[
@@ -490,19 +501,6 @@
]]></example> ]]></example>
</option> </option>
<option name="file_plugins" type="file" default="">
<short>Plugin configuration file</short>
<description><![CDATA[
Plugin configuration file.
]]></description>
<since>0.3.3</since>
<example><![CDATA[
<p>
file_plugins = "/etc/uhub/plugins.conf"
</p>
]]></example>
</option>
<option name="msg_hub_full" type="message" default="Hub is full" > <option name="msg_hub_full" type="message" default="Hub is full" >
<description><![CDATA[This will be sent if the hub is full]]></description> <description><![CDATA[This will be sent if the hub is full]]></description>
<since>0.2.0</since> <since>0.2.0</since>

View File

@@ -42,12 +42,12 @@ void config_defaults(struct hub_config* config)
config->flood_ctl_extras = 0; config->flood_ctl_extras = 0;
config->tls_enable = 0; config->tls_enable = 0;
config->tls_require = 0; config->tls_require = 0;
config->tls_require_redirect_addr = hub_strdup("");
config->tls_certificate = hub_strdup(""); config->tls_certificate = hub_strdup("");
config->tls_private_key = hub_strdup(""); config->tls_private_key = hub_strdup("");
config->file_motd = hub_strdup(""); config->file_motd = hub_strdup("");
config->file_acl = hub_strdup(""); config->file_acl = hub_strdup("");
config->file_rules = hub_strdup(""); config->file_rules = hub_strdup("");
config->file_plugins = hub_strdup("");
config->msg_hub_full = hub_strdup("Hub is full"); config->msg_hub_full = hub_strdup("Hub is full");
config->msg_hub_disabled = hub_strdup("Hub is disabled"); config->msg_hub_disabled = hub_strdup("Hub is disabled");
config->msg_hub_registered_users_only = hub_strdup("Hub is for registered users only"); config->msg_hub_registered_users_only = hub_strdup("Hub is for registered users only");
@@ -96,6 +96,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->hub_enabled)) if (!apply_boolean(key, data, &config->hub_enabled))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"hub_enabled\" (boolean), default=1");
return -1; return -1;
} }
return 0; return 0;
@@ -106,6 +107,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->server_port, 0, 0)) if (!apply_integer(key, data, &config->server_port, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"server_port\" (integer), default=1511");
return -1; return -1;
} }
return 0; return 0;
@@ -116,6 +118,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->server_bind_addr, (char*) "")) if (!apply_string(key, data, &config->server_bind_addr, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"server_bind_addr\" (string), default=\"any\"");
return -1; return -1;
} }
return 0; return 0;
@@ -126,6 +129,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->server_listen_backlog, 0, 0)) if (!apply_integer(key, data, &config->server_listen_backlog, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"server_listen_backlog\" (integer), default=50");
return -1; return -1;
} }
return 0; return 0;
@@ -136,6 +140,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->server_alt_ports, (char*) "")) if (!apply_string(key, data, &config->server_alt_ports, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"server_alt_ports\" (string), default=\"\"");
return -1; return -1;
} }
return 0; return 0;
@@ -146,6 +151,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->show_banner)) if (!apply_boolean(key, data, &config->show_banner))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"show_banner\" (boolean), default=1");
return -1; return -1;
} }
return 0; return 0;
@@ -156,6 +162,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->show_banner_sys_info)) if (!apply_boolean(key, data, &config->show_banner_sys_info))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"show_banner_sys_info\" (boolean), default=1");
return -1; return -1;
} }
return 0; return 0;
@@ -168,6 +175,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->max_users, &min, &max)) if (!apply_integer(key, data, &config->max_users, &min, &max))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"max_users\" (integer), default=500, min=1, max=1048576");
return -1; return -1;
} }
return 0; return 0;
@@ -178,6 +186,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->registered_users_only)) if (!apply_boolean(key, data, &config->registered_users_only))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"registered_users_only\" (boolean), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -188,6 +197,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->obsolete_clients)) if (!apply_boolean(key, data, &config->obsolete_clients))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"obsolete_clients\" (boolean), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -198,6 +208,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->chat_only)) if (!apply_boolean(key, data, &config->chat_only))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"chat_only\" (boolean), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -208,6 +219,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->chat_is_privileged)) if (!apply_boolean(key, data, &config->chat_is_privileged))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"chat_is_privileged\" (boolean), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -218,6 +230,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->hub_name, (char*) "")) if (!apply_string(key, data, &config->hub_name, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"hub_name\" (string), default=\"uhub\"");
return -1; return -1;
} }
return 0; return 0;
@@ -228,6 +241,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->hub_description, (char*) "")) if (!apply_string(key, data, &config->hub_description, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"hub_description\" (string), default=\"no description\"");
return -1; return -1;
} }
return 0; return 0;
@@ -238,6 +252,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->redirect_addr, (char*) "")) if (!apply_string(key, data, &config->redirect_addr, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"redirect_addr\" (string), default=\"\"");
return -1; return -1;
} }
return 0; return 0;
@@ -248,6 +263,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->max_recv_buffer, 0, 0)) if (!apply_integer(key, data, &config->max_recv_buffer, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"max_recv_buffer\" (integer), default=4096");
return -1; return -1;
} }
return 0; return 0;
@@ -258,6 +274,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->max_send_buffer, 0, 0)) if (!apply_integer(key, data, &config->max_send_buffer, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"max_send_buffer\" (integer), default=131072");
return -1; return -1;
} }
return 0; return 0;
@@ -268,6 +285,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->max_send_buffer_soft, 0, 0)) if (!apply_integer(key, data, &config->max_send_buffer_soft, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"max_send_buffer_soft\" (integer), default=98304");
return -1; return -1;
} }
return 0; return 0;
@@ -278,6 +296,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->low_bandwidth_mode)) if (!apply_boolean(key, data, &config->low_bandwidth_mode))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"low_bandwidth_mode\" (boolean), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -288,6 +307,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->max_chat_history, 0, 0)) if (!apply_integer(key, data, &config->max_chat_history, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"max_chat_history\" (integer), default=20");
return -1; return -1;
} }
return 0; return 0;
@@ -298,6 +318,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->max_logout_log, 0, 0)) if (!apply_integer(key, data, &config->max_logout_log, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"max_logout_log\" (integer), default=20");
return -1; return -1;
} }
return 0; return 0;
@@ -308,6 +329,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_max_hubs_user, 0, 0)) if (!apply_integer(key, data, &config->limit_max_hubs_user, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_max_hubs_user\" (integer), default=10");
return -1; return -1;
} }
return 0; return 0;
@@ -318,6 +340,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_max_hubs_reg, 0, 0)) if (!apply_integer(key, data, &config->limit_max_hubs_reg, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_max_hubs_reg\" (integer), default=10");
return -1; return -1;
} }
return 0; return 0;
@@ -328,6 +351,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_max_hubs_op, 0, 0)) if (!apply_integer(key, data, &config->limit_max_hubs_op, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_max_hubs_op\" (integer), default=10");
return -1; return -1;
} }
return 0; return 0;
@@ -338,6 +362,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_max_hubs, 0, 0)) if (!apply_integer(key, data, &config->limit_max_hubs, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_max_hubs\" (integer), default=25");
return -1; return -1;
} }
return 0; return 0;
@@ -348,6 +373,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_min_hubs_user, 0, 0)) if (!apply_integer(key, data, &config->limit_min_hubs_user, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_min_hubs_user\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -358,6 +384,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_min_hubs_reg, 0, 0)) if (!apply_integer(key, data, &config->limit_min_hubs_reg, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_min_hubs_reg\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -368,6 +395,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_min_hubs_op, 0, 0)) if (!apply_integer(key, data, &config->limit_min_hubs_op, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_min_hubs_op\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -379,6 +407,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_min_share, &min, 0)) if (!apply_integer(key, data, &config->limit_min_share, &min, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_min_share\" (integer), default=0, min=0");
return -1; return -1;
} }
return 0; return 0;
@@ -389,6 +418,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_max_share, 0, 0)) if (!apply_integer(key, data, &config->limit_max_share, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_max_share\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -399,6 +429,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_min_slots, 0, 0)) if (!apply_integer(key, data, &config->limit_min_slots, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_min_slots\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -409,6 +440,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->limit_max_slots, 0, 0)) if (!apply_integer(key, data, &config->limit_max_slots, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"limit_max_slots\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -421,6 +453,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->flood_ctl_interval, &min, &max)) if (!apply_integer(key, data, &config->flood_ctl_interval, &min, &max))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"flood_ctl_interval\" (integer), default=0, min=1, max=60");
return -1; return -1;
} }
return 0; return 0;
@@ -431,6 +464,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->flood_ctl_chat, 0, 0)) if (!apply_integer(key, data, &config->flood_ctl_chat, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"flood_ctl_chat\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -441,6 +475,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->flood_ctl_connect, 0, 0)) if (!apply_integer(key, data, &config->flood_ctl_connect, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"flood_ctl_connect\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -451,6 +486,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->flood_ctl_search, 0, 0)) if (!apply_integer(key, data, &config->flood_ctl_search, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"flood_ctl_search\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -461,6 +497,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->flood_ctl_update, 0, 0)) if (!apply_integer(key, data, &config->flood_ctl_update, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"flood_ctl_update\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -471,6 +508,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_integer(key, data, &config->flood_ctl_extras, 0, 0)) if (!apply_integer(key, data, &config->flood_ctl_extras, 0, 0))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"flood_ctl_extras\" (integer), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -481,6 +519,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->tls_enable)) if (!apply_boolean(key, data, &config->tls_enable))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"tls_enable\" (boolean), default=0");
return -1; return -1;
} }
return 0; return 0;
@@ -491,6 +530,18 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_boolean(key, data, &config->tls_require)) if (!apply_boolean(key, data, &config->tls_require))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"tls_require\" (boolean), default=0");
return -1;
}
return 0;
}
if (!strcmp(key, "tls_require_redirect_addr"))
{
if (!apply_string(key, data, &config->tls_require_redirect_addr, (char*) ""))
{
LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"tls_require_redirect_addr\" (string), default=\"\"");
return -1; return -1;
} }
return 0; return 0;
@@ -501,6 +552,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->tls_certificate, (char*) "")) if (!apply_string(key, data, &config->tls_certificate, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"tls_certificate\" (file), default=\"\"");
return -1; return -1;
} }
return 0; return 0;
@@ -511,6 +563,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->tls_private_key, (char*) "")) if (!apply_string(key, data, &config->tls_private_key, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"tls_private_key\" (file), default=\"\"");
return -1; return -1;
} }
return 0; return 0;
@@ -521,6 +574,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->file_motd, (char*) "")) if (!apply_string(key, data, &config->file_motd, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"file_motd\" (file), default=\"\"");
return -1; return -1;
} }
return 0; return 0;
@@ -531,6 +585,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->file_acl, (char*) "")) if (!apply_string(key, data, &config->file_acl, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"file_acl\" (file), default=\"\"");
return -1; return -1;
} }
return 0; return 0;
@@ -541,16 +596,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->file_rules, (char*) "")) if (!apply_string(key, data, &config->file_rules, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
return -1; LOG_ERROR("\"file_rules\" (file), default=\"\"");
}
return 0;
}
if (!strcmp(key, "file_plugins"))
{
if (!apply_string(key, data, &config->file_plugins, (char*) ""))
{
LOG_ERROR("Configuration parse error on line %d", line_count);
return -1; return -1;
} }
return 0; return 0;
@@ -561,6 +607,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_hub_full, (char*) "")) if (!apply_string(key, data, &config->msg_hub_full, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_hub_full\" (message), default=\"Hub is full\"");
return -1; return -1;
} }
return 0; return 0;
@@ -571,6 +618,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_hub_disabled, (char*) "")) if (!apply_string(key, data, &config->msg_hub_disabled, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_hub_disabled\" (message), default=\"Hub is disabled\"");
return -1; return -1;
} }
return 0; return 0;
@@ -581,6 +629,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_hub_registered_users_only, (char*) "")) if (!apply_string(key, data, &config->msg_hub_registered_users_only, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_hub_registered_users_only\" (message), default=\"Hub is for registered users only\"");
return -1; return -1;
} }
return 0; return 0;
@@ -591,6 +640,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_missing, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_missing, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_missing\" (message), default=\"No nickname given\"");
return -1; return -1;
} }
return 0; return 0;
@@ -601,6 +651,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_multiple, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_multiple, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_multiple\" (message), default=\"Multiple nicknames given\"");
return -1; return -1;
} }
return 0; return 0;
@@ -611,6 +662,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_invalid, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_invalid, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_invalid\" (message), default=\"Nickname is invalid\"");
return -1; return -1;
} }
return 0; return 0;
@@ -621,6 +673,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_long, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_long, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_long\" (message), default=\"Nickname too long\"");
return -1; return -1;
} }
return 0; return 0;
@@ -631,6 +684,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_short, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_short, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_short\" (message), default=\"Nickname too short\"");
return -1; return -1;
} }
return 0; return 0;
@@ -641,6 +695,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_spaces, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_spaces, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_spaces\" (message), default=\"Nickname cannot start with spaces\"");
return -1; return -1;
} }
return 0; return 0;
@@ -651,6 +706,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_bad_chars, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_bad_chars, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_bad_chars\" (message), default=\"Nickname contains invalid characters\"");
return -1; return -1;
} }
return 0; return 0;
@@ -661,6 +717,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_not_utf8, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_not_utf8, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_not_utf8\" (message), default=\"Nickname is not valid UTF-8\"");
return -1; return -1;
} }
return 0; return 0;
@@ -671,6 +728,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_taken, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_taken, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_taken\" (message), default=\"Nickname is already in use\"");
return -1; return -1;
} }
return 0; return 0;
@@ -681,6 +739,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_nick_restricted, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_nick_restricted, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_nick_restricted\" (message), default=\"Nickname cannot be used on this hub\"");
return -1; return -1;
} }
return 0; return 0;
@@ -691,6 +750,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_cid_invalid, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_cid_invalid, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_cid_invalid\" (message), default=\"CID is not valid\"");
return -1; return -1;
} }
return 0; return 0;
@@ -701,6 +761,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_cid_missing, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_cid_missing, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_cid_missing\" (message), default=\"CID is not specified\"");
return -1; return -1;
} }
return 0; return 0;
@@ -711,6 +772,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_cid_taken, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_cid_taken, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_cid_taken\" (message), default=\"CID is taken\"");
return -1; return -1;
} }
return 0; return 0;
@@ -721,6 +783,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_pid_missing, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_pid_missing, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_pid_missing\" (message), default=\"PID is not specified\"");
return -1; return -1;
} }
return 0; return 0;
@@ -731,6 +794,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_inf_error_pid_invalid, (char*) "")) if (!apply_string(key, data, &config->msg_inf_error_pid_invalid, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_inf_error_pid_invalid\" (message), default=\"PID is invalid\"");
return -1; return -1;
} }
return 0; return 0;
@@ -741,6 +805,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_ban_permanently, (char*) "")) if (!apply_string(key, data, &config->msg_ban_permanently, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_ban_permanently\" (message), default=\"Banned permanently\"");
return -1; return -1;
} }
return 0; return 0;
@@ -751,6 +816,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_ban_temporarily, (char*) "")) if (!apply_string(key, data, &config->msg_ban_temporarily, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_ban_temporarily\" (message), default=\"Banned temporarily\"");
return -1; return -1;
} }
return 0; return 0;
@@ -761,6 +827,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_auth_invalid_password, (char*) "")) if (!apply_string(key, data, &config->msg_auth_invalid_password, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_auth_invalid_password\" (message), default=\"Password is wrong\"");
return -1; return -1;
} }
return 0; return 0;
@@ -771,6 +838,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_auth_user_not_found, (char*) "")) if (!apply_string(key, data, &config->msg_auth_user_not_found, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_auth_user_not_found\" (message), default=\"User not found in password database\"");
return -1; return -1;
} }
return 0; return 0;
@@ -781,6 +849,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_error_no_memory, (char*) "")) if (!apply_string(key, data, &config->msg_error_no_memory, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_error_no_memory\" (message), default=\"No memory\"");
return -1; return -1;
} }
return 0; return 0;
@@ -791,6 +860,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_share_size_low, (char*) "")) if (!apply_string(key, data, &config->msg_user_share_size_low, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_share_size_low\" (message), default=\"User is not sharing enough\"");
return -1; return -1;
} }
return 0; return 0;
@@ -801,6 +871,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_share_size_high, (char*) "")) if (!apply_string(key, data, &config->msg_user_share_size_high, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_share_size_high\" (message), default=\"User is sharing too much\"");
return -1; return -1;
} }
return 0; return 0;
@@ -811,6 +882,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_slots_low, (char*) "")) if (!apply_string(key, data, &config->msg_user_slots_low, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_slots_low\" (message), default=\"User have too few upload slots.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -821,6 +893,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_slots_high, (char*) "")) if (!apply_string(key, data, &config->msg_user_slots_high, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_slots_high\" (message), default=\"User have too many upload slots.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -831,6 +904,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_hub_limit_low, (char*) "")) if (!apply_string(key, data, &config->msg_user_hub_limit_low, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_hub_limit_low\" (message), default=\"User is on too few hubs.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -841,6 +915,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_hub_limit_high, (char*) "")) if (!apply_string(key, data, &config->msg_user_hub_limit_high, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_hub_limit_high\" (message), default=\"User is on too many hubs.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -851,6 +926,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_flood_chat, (char*) "")) if (!apply_string(key, data, &config->msg_user_flood_chat, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_flood_chat\" (message), default=\"Chat flood detected, messages are dropped.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -861,6 +937,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_flood_connect, (char*) "")) if (!apply_string(key, data, &config->msg_user_flood_connect, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_flood_connect\" (message), default=\"Connect flood detected, connection refused.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -871,6 +948,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_flood_search, (char*) "")) if (!apply_string(key, data, &config->msg_user_flood_search, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_flood_search\" (message), default=\"Search flood detected, search is stopped.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -881,6 +959,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_flood_update, (char*) "")) if (!apply_string(key, data, &config->msg_user_flood_update, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_flood_update\" (message), default=\"Update flood detected.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -891,6 +970,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_user_flood_extras, (char*) "")) if (!apply_string(key, data, &config->msg_user_flood_extras, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_user_flood_extras\" (message), default=\"Flood detected.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -901,6 +981,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_proto_no_common_hash, (char*) "")) if (!apply_string(key, data, &config->msg_proto_no_common_hash, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_proto_no_common_hash\" (message), default=\"No common hash algorithm.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -911,6 +992,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
if (!apply_string(key, data, &config->msg_proto_obsolete_adc0, (char*) "")) if (!apply_string(key, data, &config->msg_proto_obsolete_adc0, (char*) ""))
{ {
LOG_ERROR("Configuration parse error on line %d", line_count); LOG_ERROR("Configuration parse error on line %d", line_count);
LOG_ERROR("\"msg_proto_obsolete_adc0\" (message), default=\"Client is using an obsolete ADC protocol version.\"");
return -1; return -1;
} }
return 0; return 0;
@@ -933,6 +1015,8 @@ void free_config(struct hub_config* config)
hub_free(config->redirect_addr); hub_free(config->redirect_addr);
hub_free(config->tls_require_redirect_addr);
hub_free(config->tls_certificate); hub_free(config->tls_certificate);
hub_free(config->tls_private_key); hub_free(config->tls_private_key);
@@ -943,8 +1027,6 @@ void free_config(struct hub_config* config)
hub_free(config->file_rules); hub_free(config->file_rules);
hub_free(config->file_plugins);
hub_free(config->msg_hub_full); hub_free(config->msg_hub_full);
hub_free(config->msg_hub_disabled); hub_free(config->msg_hub_disabled);
@@ -1141,6 +1223,9 @@ void dump_config(struct hub_config* config, int ignore_defaults)
if (!ignore_defaults || config->tls_require != 0) if (!ignore_defaults || config->tls_require != 0)
fprintf(stdout, "tls_require = %s\n", config->tls_require ? "yes" : "no"); fprintf(stdout, "tls_require = %s\n", config->tls_require ? "yes" : "no");
if (!ignore_defaults || strcmp(config->tls_require_redirect_addr, "") != 0)
fprintf(stdout, "tls_require_redirect_addr = \"%s\"\n", config->tls_require_redirect_addr);
if (!ignore_defaults || strcmp(config->tls_certificate, "") != 0) if (!ignore_defaults || strcmp(config->tls_certificate, "") != 0)
fprintf(stdout, "tls_certificate = \"%s\"\n", config->tls_certificate); fprintf(stdout, "tls_certificate = \"%s\"\n", config->tls_certificate);
@@ -1156,9 +1241,6 @@ void dump_config(struct hub_config* config, int ignore_defaults)
if (!ignore_defaults || strcmp(config->file_rules, "") != 0) if (!ignore_defaults || strcmp(config->file_rules, "") != 0)
fprintf(stdout, "file_rules = \"%s\"\n", config->file_rules); fprintf(stdout, "file_rules = \"%s\"\n", config->file_rules);
if (!ignore_defaults || strcmp(config->file_plugins, "") != 0)
fprintf(stdout, "file_plugins = \"%s\"\n", config->file_plugins);
if (!ignore_defaults || strcmp(config->msg_hub_full, "Hub is full") != 0) if (!ignore_defaults || strcmp(config->msg_hub_full, "Hub is full") != 0)
fprintf(stdout, "msg_hub_full = \"%s\"\n", config->msg_hub_full); fprintf(stdout, "msg_hub_full = \"%s\"\n", config->msg_hub_full);

View File

@@ -42,12 +42,12 @@ struct hub_config
int flood_ctl_extras; /*<<< Max extra messages allowed in time interval (default: 0) */ int flood_ctl_extras; /*<<< Max extra messages allowed in time interval (default: 0) */
int tls_enable; /*<<< Enable SSL/TLS support (default: 0) */ int tls_enable; /*<<< Enable SSL/TLS support (default: 0) */
int tls_require; /*<<< If SSL/TLS enabled, should it be required (default: 0) (default: 0) */ int tls_require; /*<<< If SSL/TLS enabled, should it be required (default: 0) (default: 0) */
char* tls_require_redirect_addr; /*<<< A redirect address in case a client connects using "adc://" when "adcs://" is required. (default: ) */
char* tls_certificate; /*<<< Certificate file (default: ) */ char* tls_certificate; /*<<< Certificate file (default: ) */
char* tls_private_key; /*<<< Private key file (default: ) */ char* tls_private_key; /*<<< Private key file (default: ) */
char* file_motd; /*<<< File containing the 'message of the day (default: ) */ char* file_motd; /*<<< File containing the 'message of the day (default: ) */
char* file_acl; /*<<< File containing access control lists (default: ) */ char* file_acl; /*<<< File containing access control lists (default: ) */
char* file_rules; /*<<< File containing hub rules (default: ) */ char* file_rules; /*<<< File containing hub rules (default: ) */
char* file_plugins; /*<<< Plugin configuration file (default: ) */
char* msg_hub_full; /*<<< "Hub is full" */ char* msg_hub_full; /*<<< "Hub is full" */
char* msg_hub_disabled; /*<<< "Hub is disabled" */ char* msg_hub_disabled; /*<<< "Hub is disabled" */
char* msg_hub_registered_users_only; /*<<< "Hub is for registered users only" */ char* msg_hub_registered_users_only; /*<<< "Hub is for registered users only" */

View File

@@ -22,10 +22,9 @@
struct hub_info* g_hub = 0; struct hub_info* g_hub = 0;
#define CHECK_CHAT_ONLY \ #define CHECK_CHAT_ONLY \
if (hub->config->chat_only && u->credentials < auth_cred_operator) \ if (hub->config->chat_only && u->credentials < cred_operator) \
break break
/* FIXME: Flood control should be done in a plugin! */
#define CHECK_FLOOD(TYPE, WARN) \ #define CHECK_FLOOD(TYPE, WARN) \
if (flood_control_check(&u->flood_ ## TYPE , hub->config->flood_ctl_ ## TYPE, hub->config->flood_ctl_interval, net_get_time())) \ if (flood_control_check(&u->flood_ ## TYPE , hub->config->flood_ctl_ ## TYPE, hub->config->flood_ctl_interval, net_get_time())) \
{ \ { \
@@ -235,7 +234,7 @@ int hub_handle_password(struct hub_info* hub, struct hub_user* u, struct adc_mes
if (u->state == state_verify) if (u->state == state_verify)
{ {
if (acl_password_verify(hub, u, password)) if (acl_password_verify(hub->acl, u, password))
{ {
on_login_success(hub, u); on_login_success(hub, u);
} }
@@ -256,9 +255,6 @@ int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc
char* message = adc_msg_get_argument(cmd, 0); char* message = adc_msg_get_argument(cmd, 0);
int ret = 0; int ret = 0;
int relay = 1; int relay = 1;
int broadcast;
int private_msg;
int command;
int offset; int offset;
if (!message) if (!message)
@@ -270,11 +266,7 @@ int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc
return 0; return 0;
} }
broadcast = (cmd->cache[0] == 'B'); if ((cmd->cache[0] == 'B') && (message[0] == '!' || message[0] == '+'))
private_msg = (cmd->cache[0] == 'D' || cmd->cache[0] == 'E');
command = (message[0] == '!' || message[0] == '+');
if (broadcast && command)
{ {
/* /*
* A message such as "++message" is handled as "+message", by removing the first character. * A message such as "++message" is handled as "+message", by removing the first character.
@@ -289,44 +281,20 @@ int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc
} }
else else
{ {
relay = command_invoke(hub->commands, u, message); relay = command_dipatcher(hub, u, message);
} }
} }
/* FIXME: Plugin should do this! */ if (((hub->config->chat_is_privileged && !user_is_protected(u)) || (user_flag_get(u, flag_muted))) && (cmd->cache[0] == 'B' || cmd->cache[0] == 'F'))
if (relay && (((hub->config->chat_is_privileged && !user_is_protected(u)) || (user_flag_get(u, flag_muted))) && broadcast))
{ {
relay = 0; relay = 0;
} }
if (relay)
{
plugin_st status;
if (broadcast)
{
status = plugin_handle_chat_message(hub, u, message, 0);
}
else if (private_msg)
{
struct hub_user* target = uman_get_user_by_sid(hub, cmd->target);
if (target)
status = plugin_handle_private_message(hub, u, target, message, 0);
else
relay = 0;
}
if (status == st_deny)
relay = 0;
}
if (relay) if (relay)
{ {
/* adc_msg_remove_named_argument(cmd, "PM"); */ /* adc_msg_remove_named_argument(cmd, "PM"); */
if (broadcast) if (cmd->cache[0] == 'B')
{
hub_chat_history_add(hub, u, cmd); hub_chat_history_add(hub, u, cmd);
plugin_log_chat_message(hub, u, message, 0);
}
ret = route_message(hub, u, cmd); ret = route_message(hub, u, cmd);
} }
hub_free(message); hub_free(message);
@@ -396,7 +364,6 @@ void hub_send_hubinfo(struct hub_info* hub, struct hub_user* u)
{ {
struct adc_message* info = adc_msg_copy(hub->command_info); struct adc_message* info = adc_msg_copy(hub->command_info);
int value = 0; int value = 0;
uint64_t size = 0;
if (user_flag_get(u, feature_ping)) if (user_flag_get(u, feature_ping))
{ {
@@ -410,13 +377,13 @@ void hub_send_hubinfo(struct hub_info* hub, struct hub_user* u)
adc_msg_add_named_argument(info, "UC", uhub_itoa(hub_get_user_count(hub))); adc_msg_add_named_argument(info, "UC", uhub_itoa(hub_get_user_count(hub)));
adc_msg_add_named_argument(info, "MC", uhub_itoa(hub_get_max_user_count(hub))); adc_msg_add_named_argument(info, "MC", uhub_itoa(hub_get_max_user_count(hub)));
adc_msg_add_named_argument(info, "SS", uhub_ulltoa(hub_get_shared_size(hub))); adc_msg_add_named_argument(info, "SS", uhub_ulltoa(hub_get_shared_size(hub)));
adc_msg_add_named_argument(info, "SF", uhub_ulltoa(hub_get_shared_files(hub))); adc_msg_add_named_argument(info, "SF", uhub_itoa(hub_get_shared_files(hub)));
/* Maximum/minimum share size */ /* Maximum/minimum share size */
size = hub_get_max_share(hub); value = hub_get_max_share(hub);
if (size) adc_msg_add_named_argument(info, "XS", uhub_ulltoa(size)); if (value) adc_msg_add_named_argument(info, "XS", uhub_itoa(value));
size = hub_get_min_share(hub); value = hub_get_min_share(hub);
if (size) adc_msg_add_named_argument(info, "MS", uhub_ulltoa(size)); if (value) adc_msg_add_named_argument(info, "MS", uhub_itoa(value));
/* Maximum/minimum upload slots allowed per user */ /* Maximum/minimum upload slots allowed per user */
value = hub_get_max_slots(hub); value = hub_get_max_slots(hub);
@@ -498,7 +465,7 @@ void hub_send_password_challenge(struct hub_info* hub, struct hub_user* u)
{ {
struct adc_message* igpa; struct adc_message* igpa;
igpa = adc_msg_construct(ADC_CMD_IGPA, 38); igpa = adc_msg_construct(ADC_CMD_IGPA, 38);
adc_msg_add_argument(igpa, acl_password_generate_challenge(hub, u)); adc_msg_add_argument(igpa, acl_password_generate_challenge(hub->acl, u));
user_set_state(u, state_verify); user_set_state(u, state_verify);
route_to_user(hub, u, igpa); route_to_user(hub, u, igpa);
adc_msg_free(igpa); adc_msg_free(igpa);
@@ -695,6 +662,7 @@ static int load_ssl_certificates(struct hub_info* hub, struct hub_config* config
/* Disable SSLv2 */ /* Disable SSLv2 */
SSL_CTX_set_options(hub->ssl_ctx, SSL_OP_NO_SSLv2); SSL_CTX_set_options(hub->ssl_ctx, SSL_OP_NO_SSLv2);
SSL_CTX_set_quiet_shutdown(hub->ssl_ctx, 1);
if (SSL_CTX_use_certificate_file(hub->ssl_ctx, config->tls_certificate, SSL_FILETYPE_PEM) < 0) if (SSL_CTX_use_certificate_file(hub->ssl_ctx, config->tls_certificate, SSL_FILETYPE_PEM) < 0)
{ {
@@ -810,9 +778,6 @@ struct hub_info* hub_start_service(struct hub_config* config)
hub->status = hub_status_running; hub->status = hub_status_running;
g_hub = hub; g_hub = hub;
// Start the hub command sub-system
hub->commands = command_initialize(hub);
return hub; return hub;
} }
@@ -827,7 +792,6 @@ void hub_shutdown_service(struct hub_info* hub)
event_queue_shutdown(hub->queue); event_queue_shutdown(hub->queue);
net_con_close(hub->server); net_con_close(hub->server);
hub_free(hub->server);
server_alt_port_stop(hub); server_alt_port_stop(hub);
uman_shutdown(hub); uman_shutdown(hub);
hub->status = hub_status_stopped; hub->status = hub_status_stopped;
@@ -837,41 +801,11 @@ void hub_shutdown_service(struct hub_info* hub)
list_destroy(hub->chat_history); list_destroy(hub->chat_history);
list_clear(hub->logout_info, &hub_free); list_clear(hub->logout_info, &hub_free);
list_destroy(hub->logout_info); list_destroy(hub->logout_info);
command_shutdown(hub->commands);
hub_free(hub); hub_free(hub);
hub = 0; hub = 0;
g_hub = 0; g_hub = 0;
} }
#ifdef PLUGIN_SUPPORT
void hub_plugins_load(struct hub_info* hub)
{
if (!hub->config->file_plugins || !*hub->config->file_plugins)
return;
hub->plugins = hub_malloc_zero(sizeof(struct uhub_plugins));
if (!hub->plugins)
return;
if (plugin_initialize(hub->config, hub) < 0)
{
hub_free(hub->plugins);
hub->plugins = 0;
return;
}
}
void hub_plugins_unload(struct hub_info* hub)
{
if (hub->plugins)
{
plugin_shutdown(hub->plugins);
hub_free(hub->plugins);
hub->plugins = 0;
}
}
#endif
void hub_set_variables(struct hub_info* hub, struct acl_handle* acl) void hub_set_variables(struct hub_info* hub, struct acl_handle* acl)
{ {
int fd, ret; int fd, ret;
@@ -946,10 +880,6 @@ void hub_set_variables(struct hub_info* hub, struct acl_handle* acl)
hub_free(tmp); hub_free(tmp);
} }
#ifdef PLUGIN_SUPPORT
hub_plugins_load(hub);
#endif
hub->status = (hub->config->hub_enabled ? hub_status_running : hub_status_disabled); hub->status = (hub->config->hub_enabled ? hub_status_running : hub_status_disabled);
hub_free(server); hub_free(server);
} }
@@ -957,10 +887,6 @@ void hub_set_variables(struct hub_info* hub, struct acl_handle* acl)
void hub_free_variables(struct hub_info* hub) void hub_free_variables(struct hub_info* hub)
{ {
#ifdef PLUGIN_SUPPORT
hub_plugins_unload(hub);
#endif
adc_msg_free(hub->command_info); adc_msg_free(hub->command_info);
adc_msg_free(hub->command_banner); adc_msg_free(hub->command_banner);
@@ -973,6 +899,37 @@ void hub_free_variables(struct hub_info* hub)
adc_msg_free(hub->command_support); adc_msg_free(hub->command_support);
} }
/**
* @return 1 if nickname is in use, or 0 if not used.
*/
static inline int is_nick_in_use(struct hub_info* hub, const char* nick)
{
struct hub_user* lookup = uman_get_user_by_nick(hub, nick);
if (lookup)
{
return 1;
}
return 0;
}
/**
* @return 1 if CID is in use, or 0 if not used.
*/
static inline int is_cid_in_use(struct hub_info* hub, const char* cid)
{
struct hub_user* lookup = uman_get_user_by_cid(hub, cid);
if (lookup)
{
return 1;
}
return 0;
}
static void set_status_code(enum msg_status_level level, int code, char buffer[4]) static void set_status_code(enum msg_status_level level, int code, char buffer[4])
{ {
buffer[0] = ('0' + (int) level); buffer[0] = ('0' + (int) level);
@@ -1058,8 +1015,6 @@ void hub_send_status(struct hub_info* hub, struct hub_user* user, enum status_me
if (level >= status_level_fatal) if (level >= status_level_fatal)
{ {
adc_msg_add_argument(qui, sid_to_string(user->id.sid));
snprintf(buf, 230, "MS%s", escaped_text); snprintf(buf, 230, "MS%s", escaped_text);
adc_msg_add_argument(qui, buf); adc_msg_add_argument(qui, buf);
@@ -1127,42 +1082,42 @@ const char* hub_get_status_message(struct hub_info* hub, enum status_message msg
const char* hub_get_status_message_log(struct hub_info* hub, enum status_message msg) const char* hub_get_status_message_log(struct hub_info* hub, enum status_message msg)
{ {
#define STATUS(MSG) case status_ ## MSG : return #MSG; break #define STATUS(MSG) case status_ ## MSG : return #MSG; break
switch (msg) switch (msg)
{ {
STATUS(msg_hub_full); STATUS(msg_hub_full);
STATUS(msg_hub_disabled); STATUS(msg_hub_disabled);
STATUS(msg_hub_registered_users_only); STATUS(msg_hub_registered_users_only);
STATUS(msg_inf_error_nick_missing); STATUS(msg_inf_error_nick_missing);
STATUS(msg_inf_error_nick_multiple); STATUS(msg_inf_error_nick_multiple);
STATUS(msg_inf_error_nick_invalid); STATUS(msg_inf_error_nick_invalid);
STATUS(msg_inf_error_nick_long); STATUS(msg_inf_error_nick_long);
STATUS(msg_inf_error_nick_short); STATUS(msg_inf_error_nick_short);
STATUS(msg_inf_error_nick_spaces); STATUS(msg_inf_error_nick_spaces);
STATUS(msg_inf_error_nick_bad_chars); STATUS(msg_inf_error_nick_bad_chars);
STATUS(msg_inf_error_nick_not_utf8); STATUS(msg_inf_error_nick_not_utf8);
STATUS(msg_inf_error_nick_taken); STATUS(msg_inf_error_nick_taken);
STATUS(msg_inf_error_nick_restricted); STATUS(msg_inf_error_nick_restricted);
STATUS(msg_inf_error_cid_invalid); STATUS(msg_inf_error_cid_invalid);
STATUS(msg_inf_error_cid_missing); STATUS(msg_inf_error_cid_missing);
STATUS(msg_inf_error_cid_taken); STATUS(msg_inf_error_cid_taken);
STATUS(msg_inf_error_pid_missing); STATUS(msg_inf_error_pid_missing);
STATUS(msg_inf_error_pid_invalid); STATUS(msg_inf_error_pid_invalid);
STATUS(msg_ban_permanently); STATUS(msg_ban_permanently);
STATUS(msg_ban_temporarily); STATUS(msg_ban_temporarily);
STATUS(msg_auth_invalid_password); STATUS(msg_auth_invalid_password);
STATUS(msg_auth_user_not_found); STATUS(msg_auth_user_not_found);
STATUS(msg_error_no_memory); STATUS(msg_error_no_memory);
STATUS(msg_user_share_size_low); STATUS(msg_user_share_size_low);
STATUS(msg_user_share_size_high); STATUS(msg_user_share_size_high);
STATUS(msg_user_slots_low); STATUS(msg_user_slots_low);
STATUS(msg_user_slots_high); STATUS(msg_user_slots_high);
STATUS(msg_user_hub_limit_low); STATUS(msg_user_hub_limit_low);
STATUS(msg_user_hub_limit_high); STATUS(msg_user_hub_limit_high);
STATUS(msg_proto_no_common_hash); STATUS(msg_proto_no_common_hash);
STATUS(msg_proto_obsolete_adc0); STATUS(msg_proto_obsolete_adc0);
} }
#undef STATUS #undef STATUS
return "unknown"; return "unknown";
} }
@@ -1188,16 +1143,12 @@ uint64_t hub_get_shared_files(struct hub_info* hub)
uint64_t hub_get_min_share(struct hub_info* hub) uint64_t hub_get_min_share(struct hub_info* hub)
{ {
uint64_t size = hub->config->limit_min_share; return 1024 * 1024 * hub->config->limit_min_share;
size *= (1024 * 1024);
return size;
} }
uint64_t hub_get_max_share(struct hub_info* hub) uint64_t hub_get_max_share(struct hub_info* hub)
{ {
uint64_t size = hub->config->limit_max_share; return 1024 * 1024 * hub->config->limit_max_share;
size *= (1024 * 1024);
return size;
} }
size_t hub_get_min_slots(struct hub_info* hub) size_t hub_get_min_slots(struct hub_info* hub)

View File

@@ -114,12 +114,6 @@ struct hub_info
struct linked_list* chat_history; /* Chat history */ struct linked_list* chat_history; /* Chat history */
struct linked_list* logout_info; /* Log of people logging out. */ struct linked_list* logout_info; /* Log of people logging out. */
struct command_base* commands; /* Hub command handler */
#ifdef PLUGIN_SUPPORT
struct uhub_plugins* plugins;
#endif
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
SSL_METHOD* ssl_method; SSL_METHOD* ssl_method;
SSL_CTX* ssl_ctx; SSL_CTX* ssl_ctx;

View File

@@ -18,12 +18,10 @@
*/ */
#include "uhub.h" #include "uhub.h"
#include "plugin_api/handle.h"
#ifndef PLUGIN_SUPPORT
static void log_user_login(struct hub_user* u) static void log_user_login(struct hub_user* u)
{ {
const char* cred = auth_cred_to_string(u->credentials); const char* cred = get_user_credential_string(u->credentials);
const char* addr = user_get_address(u); const char* addr = user_get_address(u);
LOG_USER("LoginOK %s/%s %s \"%s\" (%s) \"%s\"", sid_to_string(u->id.sid), u->id.cid, addr, u->id.nick, cred, u->user_agent); LOG_USER("LoginOK %s/%s %s \"%s\" (%s) \"%s\"", sid_to_string(u->id.sid), u->id.cid, addr, u->id.nick, cred, u->user_agent);
} }
@@ -53,7 +51,7 @@ static void log_user_nick_change(struct hub_user* u, const char* nick)
const char* addr = user_get_address(u); const char* addr = user_get_address(u);
LOG_USER("NickChange %s/%s %s \"%s\" -> \"%s\"", sid_to_string(u->id.sid), u->id.cid, addr, u->id.nick, nick); LOG_USER("NickChange %s/%s %s \"%s\" -> \"%s\"", sid_to_string(u->id.sid), u->id.cid, addr, u->id.nick, nick);
} }
#endif /* !PLUGIN_SUPPORT */
/* Send MOTD, do logging etc */ /* Send MOTD, do logging etc */
void on_login_success(struct hub_info* hub, struct hub_user* u) void on_login_success(struct hub_info* hub, struct hub_user* u)
@@ -66,12 +64,8 @@ void on_login_success(struct hub_info* hub, struct hub_user* u)
user_set_state(u, state_normal); user_set_state(u, state_normal);
uman_add(hub, u); uman_add(hub, u);
#ifdef PLUGIN_SUPPORT
plugin_log_user_login_success(hub, u);
#else
/* Print log message */ /* Print log message */
log_user_login(u); log_user_login(u);
#endif
/* Announce new user to all connected users */ /* Announce new user to all connected users */
if (user_is_logged_in(u)) if (user_is_logged_in(u))
@@ -91,22 +85,14 @@ void on_login_success(struct hub_info* hub, struct hub_user* u)
void on_login_failure(struct hub_info* hub, struct hub_user* u, enum status_message msg) void on_login_failure(struct hub_info* hub, struct hub_user* u, enum status_message msg)
{ {
#ifdef PLUGIN_SUPPORT
plugin_log_user_login_error(hub, u, hub_get_status_message_log(hub, msg));
#else
log_user_login_error(u, msg); log_user_login_error(u, msg);
#endif
hub_send_status(hub, u, msg, status_level_fatal); hub_send_status(hub, u, msg, status_level_fatal);
hub_disconnect_user(hub, u, quit_logon_error); hub_disconnect_user(hub, u, quit_logon_error);
} }
void on_update_failure(struct hub_info* hub, struct hub_user* u, enum status_message msg) void on_update_failure(struct hub_info* hub, struct hub_user* u, enum status_message msg)
{ {
#ifdef PLUGIN_SUPPORT
plugin_log_user_update_error(hub, u, hub_get_status_message_log(hub, msg));
#else
log_user_update_error(u, msg); log_user_update_error(u, msg);
#endif
hub_send_status(hub, u, msg, status_level_fatal); hub_send_status(hub, u, msg, status_level_fatal);
hub_disconnect_user(hub, u, quit_update_error); hub_disconnect_user(hub, u, quit_update_error);
} }
@@ -115,24 +101,14 @@ void on_nick_change(struct hub_info* hub, struct hub_user* u, const char* nick)
{ {
if (user_is_logged_in(u)) if (user_is_logged_in(u))
{ {
#ifdef PLUGIN_SUPPORT
plugin_log_user_nick_change(hub, u, nick);
#else
log_user_nick_change(u, nick); log_user_nick_change(u, nick);
#endif
} }
} }
void on_logout_user(struct hub_info* hub, struct hub_user* user) void on_logout_user(struct hub_info* hub, struct hub_user* user)
{ {
const char* reason = user_get_quit_reason_string(user->quit_reason); const char* reason = user_get_quit_reason_string(user->quit_reason);
#ifdef PLUGIN_SUPPORT
plugin_log_user_logout(hub, user, reason);
#else
log_user_logout(user, reason); log_user_logout(user, reason);
#endif
hub_logout_log(hub, user); hub_logout_log(hub, user);
} }

View File

@@ -378,7 +378,7 @@ static int check_user_agent(struct hub_info* hub, struct hub_user* user, struct
ua = adc_msg_unescape(ua_encoded); ua = adc_msg_unescape(ua_encoded);
if (ua) if (ua)
{ {
memcpy(user->id.user_agent, ua, MIN(strlen(ua), MAX_UA_LEN)); memcpy(user->user_agent, ua, MIN(strlen(ua), MAX_UA_LEN));
hub_free(ua); hub_free(ua);
} }
} }
@@ -429,7 +429,7 @@ static int check_limits(struct hub_info* hub, struct hub_user* user, struct adc_
arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_SHARED_FILES); arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_SHARED_FILES);
if (arg) if (arg)
{ {
int shared_files = atoi(arg); ssize_t shared_files = atoll(arg);
if (shared_files < 0) if (shared_files < 0)
shared_files = 0; shared_files = 0;
@@ -446,7 +446,7 @@ static int check_limits(struct hub_info* hub, struct hub_user* user, struct adc_
arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_COUNT_HUB_NORMAL); arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_COUNT_HUB_NORMAL);
if (arg) if (arg)
{ {
int num = atoi(arg); ssize_t num = atoll(arg);
if (num < 0) num = 0; if (num < 0) num = 0;
user->limits.hub_count_user = num; user->limits.hub_count_user = num;
hub_free(arg); hub_free(arg);
@@ -456,7 +456,7 @@ static int check_limits(struct hub_info* hub, struct hub_user* user, struct adc_
arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_COUNT_HUB_REGISTER); arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_COUNT_HUB_REGISTER);
if (arg) if (arg)
{ {
int num = atoi(arg); ssize_t num = atoll(arg);
if (num < 0) num = 0; if (num < 0) num = 0;
user->limits.hub_count_registered = num; user->limits.hub_count_registered = num;
hub_free(arg); hub_free(arg);
@@ -466,7 +466,7 @@ static int check_limits(struct hub_info* hub, struct hub_user* user, struct adc_
arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_COUNT_HUB_OPERATOR); arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_COUNT_HUB_OPERATOR);
if (arg) if (arg)
{ {
int num = atoi(arg); ssize_t num = atoll(arg);
if (num < 0) num = 0; if (num < 0) num = 0;
user->limits.hub_count_operator = num; user->limits.hub_count_operator = num;
hub_free(arg); hub_free(arg);
@@ -476,7 +476,7 @@ static int check_limits(struct hub_info* hub, struct hub_user* user, struct adc_
arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_UPLOAD_SLOTS); arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_UPLOAD_SLOTS);
if (arg) if (arg)
{ {
int num = atoi(arg); ssize_t num = atoll(arg);
if (num < 0) num = 0; if (num < 0) num = 0;
user->limits.upload_slots = num; user->limits.upload_slots = num;
hub_free(arg); hub_free(arg);
@@ -535,48 +535,48 @@ static int check_limits(struct hub_info* hub, struct hub_user* user, struct adc_
static int set_credentials(struct hub_info* hub, struct hub_user* user, struct adc_message* cmd) static int set_credentials(struct hub_info* hub, struct hub_user* user, struct adc_message* cmd)
{ {
int ret = 0; int ret = 0;
struct auth_info* info = acl_get_access_info(hub, user->id.nick); struct hub_user_access_info* info = acl_get_access_info(hub->acl, user->id.nick);
if (info) if (info)
{ {
user->credentials = info->credentials; user->credentials = info->status;
ret = 1; ret = 1;
} }
else else
{ {
user->credentials = auth_cred_guest; user->credentials = cred_guest;
} }
switch (user->credentials) switch (user->credentials)
{ {
case auth_cred_none: case cred_none:
break; break;
case auth_cred_bot: case cred_bot:
adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_BOT); adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_BOT);
break; break;
case auth_cred_guest: case cred_guest:
/* Nothing to be added to the info message */ /* Nothing to be added to the info message */
break; break;
case auth_cred_user: case cred_user:
adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_REGISTERED_USER); adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_REGISTERED_USER);
break; break;
case auth_cred_operator: case cred_operator:
adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_OPERATOR); adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_OPERATOR);
break; break;
case auth_cred_super: case cred_super:
adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_SUPER_USER); adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_SUPER_USER);
break; break;
case auth_cred_admin: case cred_admin:
adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_ADMIN); adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_ADMIN);
break; break;
case auth_cred_link: case cred_link:
break; break;
} }
@@ -591,7 +591,7 @@ static int check_is_hub_full(struct hub_info* hub, struct hub_user* user)
* If hub is full, don't let users in, but we still want to allow * If hub is full, don't let users in, but we still want to allow
* operators and admins to enter the hub. * operators and admins to enter the hub.
*/ */
if (hub->config->max_users && hub->users->count >= (size_t) hub->config->max_users && !user_is_protected(user)) if (hub->config->max_users && hub->users->count >= hub->config->max_users && !user_is_protected(user))
{ {
return 1; return 1;
} }

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey * Copyright (C) 2007-2009, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -19,6 +19,7 @@
#include "uhub.h" #include "uhub.h"
static int arg_verbose = 5; static int arg_verbose = 5;
static int arg_fork = 0; static int arg_fork = 0;
static int arg_check_config = 0; static int arg_check_config = 0;

View File

@@ -88,7 +88,7 @@ int handle_net_read(struct hub_user* user)
if (lastPos || remaining) if (lastPos || remaining)
{ {
if (remaining < (size_t) g_hub->config->max_recv_buffer) if (remaining < g_hub->config->max_recv_buffer)
{ {
hub_recvq_set(q, lastPos ? lastPos : buf, remaining); hub_recvq_set(q, lastPos ? lastPos : buf, remaining);
} }
@@ -175,10 +175,8 @@ void net_on_accept(struct net_connection* con, int event, void *arg)
struct hub_info* hub = (struct hub_info*) arg; struct hub_info* hub = (struct hub_info*) arg;
struct hub_probe* probe = 0; struct hub_probe* probe = 0;
struct ip_addr_encap ipaddr; struct ip_addr_encap ipaddr;
const char* addr;
int server_fd = net_con_get_sd(con); int server_fd = net_con_get_sd(con);
#ifdef PLUGIN_SUPPORT
plugin_st status;
#endif
for (;;) for (;;)
{ {
@@ -196,18 +194,19 @@ void net_on_accept(struct net_connection* con, int event, void *arg)
} }
} }
#ifdef PLUGIN_SUPPORT addr = ip_convert_to_string(&ipaddr);
status = plugin_check_ip_early(hub, &ipaddr);
if (status == st_deny) /* FIXME: Should have a plugin log this */
LOG_TRACE("Got connection from %s", addr);
/* FIXME: A plugin should perform this check: is IP banned? */
if (acl_is_ip_banned(hub->acl, addr))
{ {
plugin_log_connection_denied(hub, &ipaddr); LOG_INFO("Denied [%s] (IP banned)", addr);
net_close(fd); net_close(fd);
continue; continue;
} }
plugin_log_connection_accepted(hub, &ipaddr);
#endif
probe = probe_create(hub, fd, &ipaddr); probe = probe_create(hub, fd, &ipaddr);
if (!probe) if (!probe)
{ {

View File

@@ -1,84 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "uhub.h"
struct plugin_callback_data
{
struct linked_list* commands;
};
/*
static struct plugin_callback_data* get_callback_data(struct plugin_handle* plugin)
{
uhub_assert(plugin && plugin->handle && plugin->handle->callback_data);
struct plugin_callback_data* data = (struct plugin_callback_data*) plugin->handle->callback_data;
return data;
}
*/
static struct hub_user* convert_user_type(struct plugin_user* user)
{
struct hub_user* huser = (struct hub_user*) user;
return huser;
}
static int cbfunc_send_message(struct plugin_handle* plugin, struct plugin_user* user, const char* message)
{
// struct plugin_callback_data* data = get_callback_data(plugin);
char* buffer = adc_msg_escape(message);
struct adc_message* command = adc_msg_construct(ADC_CMD_IMSG, strlen(buffer) + 6);
adc_msg_add_argument(command, buffer);
route_to_user(plugin_get_hub(plugin), convert_user_type(user), command);
adc_msg_free(command);
hub_free(buffer);
return 1;
}
static int cbfunc_user_disconnect(struct plugin_handle* plugin, struct plugin_user* user)
{
// struct plugin_callback_data* data = get_callback_data(plugin);
hub_disconnect_user(plugin_get_hub(plugin), convert_user_type(user), quit_kicked);
return 0;
}
static int cbfunc_command_add(struct plugin_handle* plugin, struct plugin_command_handle* cmdh)
{
// struct plugin_callback_data* data = get_callback_data(plugin);
return 0;
}
static int cbfunc_command_del(struct plugin_handle* plugin, struct plugin_command_handle* cmdh)
{
// struct plugin_callback_data* data = get_callback_data(plugin);
return 0;
}
void plugin_register_callback_functions(struct plugin_handle* handle)
{
handle->hub.send_message = cbfunc_send_message;
handle->hub.user_disconnect = cbfunc_user_disconnect;
handle->hub.command_add = cbfunc_command_add;
handle->hub.command_del = cbfunc_command_del;
}
void plugin_unregister_callback_functions(struct plugin_handle* handle)
{
}

View File

@@ -1,28 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_PLUGIN_CALLBACK_H
#define HAVE_UHUB_PLUGIN_CALLBACK_H
struct plugin_handle;
extern void plugin_register_callback_functions(struct plugin_handle* handle);
extern void plugin_unregister_callback_functions(struct plugin_handle* handle);
#endif /* HAVE_UHUB_PLUGIN_CALLBACK_H */

View File

@@ -1,190 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "uhub.h"
#include "plugin_api/handle.h"
#define PLUGIN_DEBUG(hub, name) printf("Invoke %s on %d plugins\n",name, (int) (hub->plugins ? list_size(hub->plugins->loaded) : -1));
#define INVOKE(HUB, FUNCNAME, CODE) \
PLUGIN_DEBUG(HUB, # FUNCNAME) \
if (HUB->plugins && HUB->plugins->loaded) \
{ \
struct plugin_handle* plugin = (struct plugin_handle*) list_get_first(HUB->plugins->loaded); \
while (plugin) \
{ \
if (plugin->funcs.FUNCNAME) \
CODE \
plugin = (struct plugin_handle*) list_get_next(HUB->plugins->loaded); \
} \
}
#define PLUGIN_INVOKE_STATUS_1(HUB, FUNCNAME, ARG1) \
do { \
plugin_st status = st_default; \
INVOKE(HUB, FUNCNAME, { \
status = plugin->funcs.FUNCNAME(plugin, ARG1); \
if (status != st_default) \
break; \
}); \
return status; \
} while(0)
#define PLUGIN_INVOKE_STATUS_2(HUB, FUNCNAME, ARG1, ARG2) \
do { \
plugin_st status = st_default; \
INVOKE(HUB, FUNCNAME, { \
status = plugin->funcs.FUNCNAME(plugin, ARG1, ARG2); \
if (status != st_default) \
break; \
}); \
return status; \
} while(0)
#define PLUGIN_INVOKE_STATUS_3(HUB, FUNCNAME, ARG1, ARG2, ARG3) \
do { \
plugin_st status = st_default; \
INVOKE(HUB, FUNCNAME, { \
status = plugin->funcs.FUNCNAME(plugin, ARG1, ARG2, ARG3); \
if (status != st_default) \
break; \
}); \
return status; \
} while(0)
#define PLUGIN_INVOKE_1(HUB, FUNCNAME, ARG1) INVOKE(HUB, FUNCNAME, { plugin->funcs.FUNCNAME(plugin, ARG1); })
#define PLUGIN_INVOKE_2(HUB, FUNCNAME, ARG1, ARG2) INVOKE(HUB, FUNCNAME, { plugin->funcs.FUNCNAME(plugin, ARG1, ARG2); })
#define PLUGIN_INVOKE_3(HUB, FUNCNAME, ARG1, ARG2, ARG3) INVOKE(HUB, FUNCNAME, { plugin->funcs.FUNCNAME(plugin, ARG1, ARG2, ARG3); })
static struct plugin_user* convert_user_type(struct hub_user* user)
{
struct plugin_user* puser = (struct plugin_user*) user;
return puser;
}
plugin_st plugin_check_ip_early(struct hub_info* hub, struct ip_addr_encap* addr)
{
PLUGIN_INVOKE_STATUS_1(hub, login_check_ip_early, addr);
}
plugin_st plugin_check_ip_late(struct hub_info* hub, struct ip_addr_encap* addr)
{
PLUGIN_INVOKE_STATUS_1(hub, login_check_ip_late, addr);
}
void plugin_log_connection_accepted(struct hub_info* hub, struct ip_addr_encap* ipaddr)
{
PLUGIN_INVOKE_1(hub, on_connection_accepted, ipaddr);
}
void plugin_log_connection_denied(struct hub_info* hub, struct ip_addr_encap* ipaddr)
{
PLUGIN_INVOKE_1(hub, on_connection_refused, ipaddr);
}
void plugin_log_user_login_success(struct hub_info* hub, struct hub_user* who)
{
struct plugin_user* user = convert_user_type(who);
PLUGIN_INVOKE_1(hub, on_user_login, user);
}
void plugin_log_user_login_error(struct hub_info* hub, struct hub_user* who, const char* reason)
{
struct plugin_user* user = convert_user_type(who);
PLUGIN_INVOKE_2(hub, on_user_login_error, user, reason);
}
void plugin_log_user_logout(struct hub_info* hub, struct hub_user* who, const char* reason)
{
struct plugin_user* user = convert_user_type(who);
PLUGIN_INVOKE_2(hub, on_user_logout, user, reason);
}
void plugin_log_user_nick_change(struct hub_info* hub, struct hub_user* who, const char* new_nick)
{
struct plugin_user* user = convert_user_type(who);
PLUGIN_INVOKE_2(hub, on_user_nick_change, user, new_nick);
}
void plugin_log_user_update_error(struct hub_info* hub, struct hub_user* who, const char* reason)
{
struct plugin_user* user = convert_user_type(who);
PLUGIN_INVOKE_2(hub, on_user_update_error, user, reason);
}
void plugin_log_chat_message(struct hub_info* hub, struct hub_user* who, const char* message, int flags)
{
struct plugin_user* user = convert_user_type(who);
PLUGIN_INVOKE_3(hub, on_user_chat_message, user, message, flags);
}
plugin_st plugin_handle_chat_message(struct hub_info* hub, struct hub_user* from, const char* message, int flags)
{
struct plugin_user* user = convert_user_type(from);
PLUGIN_INVOKE_STATUS_2(hub, on_chat_msg, user, message);
}
plugin_st plugin_handle_private_message(struct hub_info* hub, struct hub_user* from, struct hub_user* to, const char* message, int flags)
{
struct plugin_user* user1 = convert_user_type(from);
struct plugin_user* user2 = convert_user_type(to);
PLUGIN_INVOKE_STATUS_3(hub, on_private_msg, user1, user2, message);
}
plugin_st plugin_handle_search(struct hub_info* hub, struct hub_user* from, const char* data)
{
struct plugin_user* user = convert_user_type(from);
PLUGIN_INVOKE_STATUS_2(hub, on_search, user, data);
}
plugin_st plugin_handle_connect(struct hub_info* hub, struct hub_user* from, struct hub_user* to)
{
struct plugin_user* user1 = convert_user_type(from);
struct plugin_user* user2 = convert_user_type(to);
PLUGIN_INVOKE_STATUS_2(hub, on_p2p_connect, user1, user2);
}
plugin_st plugin_handle_revconnect(struct hub_info* hub, struct hub_user* from, struct hub_user* to)
{
struct plugin_user* user1 = convert_user_type(from);
struct plugin_user* user2 = convert_user_type(to);
PLUGIN_INVOKE_STATUS_2(hub, on_p2p_revconnect, user1, user2);
}
plugin_st plugin_auth_get_user(struct hub_info* hub, const char* nickname, struct auth_info* info)
{
PLUGIN_INVOKE_STATUS_2(hub, auth_get_user, nickname, info);
}
plugin_st plugin_auth_register_user(struct hub_info* hub, struct auth_info* info)
{
PLUGIN_INVOKE_STATUS_1(hub, auth_register_user, info);
}
plugin_st plugin_auth_update_user(struct hub_info* hub, struct auth_info* info)
{
PLUGIN_INVOKE_STATUS_1(hub, auth_update_user, info);
}
plugin_st plugin_auth_delete_user(struct hub_info* hub, struct auth_info* info)
{
PLUGIN_INVOKE_STATUS_1(hub, auth_delete_user, info);
}

View File

@@ -1,69 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_PLUGIN_INVOKE_H
#define HAVE_UHUB_PLUGIN_INVOKE_H
#include "uhub.h"
#include "plugin_api/handle.h"
#ifdef PLUGIN_SUPPORT
struct hub_info;
struct ip_addr_encap;
/* All log related functions */
void plugin_log_connection_accepted(struct hub_info* hub, struct ip_addr_encap* addr);
void plugin_log_connection_denied(struct hub_info* hub, struct ip_addr_encap* addr);
void plugin_log_user_login_success(struct hub_info* hub, struct hub_user* user);
void plugin_log_user_login_error(struct hub_info* hub, struct hub_user* user, const char* reason);
void plugin_log_user_logout(struct hub_info* hub, struct hub_user* user, const char* reason);
void plugin_log_user_nick_change(struct hub_info* hub, struct hub_user* user, const char* new_nick);
void plugin_log_user_update_error(struct hub_info* hub, struct hub_user* user, const char* reason);
void plugin_log_chat_message(struct hub_info* hub, struct hub_user* from, const char* message, int flags);
/* IP ban related */
plugin_st plugin_check_ip_early(struct hub_info* hub, struct ip_addr_encap* addr);
plugin_st plugin_check_ip_late(struct hub_info* hub, struct ip_addr_encap* addr);
/* Nickname allow/deny handling */
plugin_st plugin_check_nickname_valid(struct hub_info* hub, const char* nick);
plugin_st plugin_check_nickname_reserved(struct hub_info* hub, const char* nick);
/* Handle chat messages */
plugin_st plugin_handle_chat_message(struct hub_info* hub, struct hub_user* from, const char* message, int flags);
plugin_st plugin_handle_private_message(struct hub_info* hub, struct hub_user* from, struct hub_user* to, const char* message, int flags);
/* Handle searches */
plugin_st plugin_handle_search(struct hub_info* hub, struct hub_user* user, const char* data);
/* Handle p2p connections */
plugin_st plugin_handle_connect(struct hub_info* hub, struct hub_user* from, struct hub_user* to);
plugin_st plugin_handle_revconnect(struct hub_info* hub, struct hub_user* from, struct hub_user* to);
/* Authentication related */
plugin_st plugin_auth_get_user(struct hub_info* hub, const char* nickname, struct auth_info* info);
plugin_st plugin_auth_register_user(struct hub_info* hub, struct auth_info* user);
plugin_st plugin_auth_update_user(struct hub_info* hub, struct auth_info* user);
plugin_st plugin_auth_delete_user(struct hub_info* hub, struct auth_info* user);
#endif
#endif // HAVE_UHUB_PLUGIN_INVOKE_H

View File

@@ -1,235 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "uhub.h"
#ifdef PLUGIN_SUPPORT
#include "plugin_api/handle.h"
struct plugin_hub_internals
{
struct hub_info* hub;
plugin_unregister_f unregister;
};
static struct plugin_hub_internals* get_internals(struct plugin_handle* handle)
{
assert(handle && handle->handle && handle->handle->internals);
struct plugin_hub_internals* internals = (struct plugin_hub_internals*) handle->handle->internals;
return internals;
}
struct uhub_plugin* plugin_open(const char* filename)
{
LOG_TRACE("plugin_open: \"%s\"", filename);
#ifdef HAVE_DLOPEN
struct uhub_plugin* plugin = (struct uhub_plugin*) hub_malloc_zero(sizeof(struct uhub_plugin));
if (!plugin)
{
return 0;
}
plugin->handle = dlopen(filename, RTLD_LAZY);
if (!plugin->handle)
{
LOG_ERROR("Unable to open plugin %s: %s", filename, dlerror());
hub_free(plugin);
return 0;
}
plugin->internals = hub_malloc_zero(sizeof(struct plugin_hub_internals));
return plugin;
#else
return 0;
#endif
}
void plugin_close(struct uhub_plugin* plugin)
{
hub_free(plugin->internals);
#ifdef HAVE_DLOPEN
dlclose(plugin->handle);
hub_free(plugin);
#endif
}
void* plugin_lookup_symbol(struct uhub_plugin* plugin, const char* symbol)
{
#ifdef HAVE_DLOPEN
void* addr = dlsym(plugin->handle, symbol);
return addr;
#else
return 0;
#endif
}
struct plugin_handle* plugin_load(const char* filename, const char* config, struct hub_info* hub)
{
plugin_register_f register_f;
plugin_unregister_f unregister_f;
int ret;
struct plugin_handle* handle = hub_malloc_zero(sizeof(struct plugin_handle));
struct uhub_plugin* plugin = plugin_open(filename);
struct plugin_hub_internals* internals;
if (!plugin)
return NULL;
if (!handle)
{
plugin_close(plugin);
return NULL;
}
handle->handle = plugin;
register_f = plugin_lookup_symbol(plugin, "plugin_register");
unregister_f = plugin_lookup_symbol(plugin, "plugin_unregister");
plugin_register_callback_functions(handle);
internals = (struct plugin_hub_internals*) plugin->internals;
if (register_f && unregister_f)
{
ret = register_f(handle, config);
if (ret == 0)
{
if (handle->plugin_api_version == PLUGIN_API_VERSION && handle->plugin_funcs_size == sizeof(struct plugin_funcs))
{
LOG_INFO("Loaded plugin: %s: %s, version %s.", filename, handle->name, handle->version);
LOG_TRACE("Plugin API version: %d (func table size: " PRINTF_SIZE_T ")", handle->plugin_api_version, handle->plugin_funcs_size);
// Set hub internals
internals->unregister = unregister_f;
internals->hub = hub;
return handle;
}
else
{
LOG_ERROR("Unable to load plugin: %s - API version mistmatch", filename);
}
}
else
{
LOG_ERROR("Unable to load plugin: %s - Failed to initialize: %s", filename, handle->error_msg);
}
}
plugin_close(plugin);
hub_free(handle);
return NULL;
}
void plugin_unload(struct plugin_handle* plugin)
{
struct plugin_hub_internals* internals = get_internals(plugin);
plugin_unregister_callback_functions(plugin);
internals->unregister(plugin);
plugin_close(plugin->handle);
}
static int plugin_parse_line(char* line, int line_count, void* ptr_data)
{
struct hub_info* hub = (struct hub_info*) ptr_data;
struct uhub_plugins* handle = hub->plugins;
struct cfg_tokens* tokens = cfg_tokenize(line);
struct plugin_handle* plugin;
char *directive, *soname, *params;
if (cfg_token_count(tokens) == 0)
{
cfg_tokens_free(tokens);
return 0;
}
if (cfg_token_count(tokens) < 2)
{
cfg_tokens_free(tokens);
return -1;
}
directive = cfg_token_get_first(tokens);
soname = cfg_token_get_next(tokens);
params = cfg_token_get_next(tokens);
if (strcmp(directive, "plugin") == 0 && soname && *soname)
{
if (!params)
params = "";
LOG_TRACE("Load plugin: \"%s\", params=\"%s\"", soname, params);
plugin = plugin_load(soname, params, hub);
if (plugin)
{
list_append(handle->loaded, plugin);
cfg_tokens_free(tokens);
return 0;
}
}
cfg_tokens_free(tokens);
return -1;
}
int plugin_initialize(struct hub_config* config, struct hub_info* hub)
{
int ret;
hub->plugins->loaded = list_create();
if (!hub->plugins->loaded)
return -1;
if (config)
{
if (!*config->file_plugins)
return 0;
ret = file_read_lines(config->file_plugins, hub, &plugin_parse_line);
if (ret == -1)
return -1;
}
return 0;
}
void plugin_shutdown(struct uhub_plugins* handle)
{
struct plugin_handle* plugin = (struct plugin_handle*) list_get_first(handle->loaded);
while (plugin)
{
list_remove(handle->loaded, plugin);
plugin_unload(plugin);
plugin = (struct plugin_handle*) list_get_first(handle->loaded);
}
list_destroy(handle->loaded);
}
// Used internally only
struct hub_info* plugin_get_hub(struct plugin_handle* plugin)
{
struct plugin_hub_internals* data = get_internals(plugin);
return data->hub;
}
#endif /* PLUGIN_SUPPORT */

View File

@@ -1,59 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_PLUGIN_LOADER_H
#define HAVE_UHUB_PLUGIN_LOADER_H
#include "plugin_api/handle.h"
struct hub_config;
struct hub_info;
struct linked_list;
struct plugin_handle;
struct uhub_plugin
{
void* handle;
void* internals; // Hub internal stuff
void* callback_data; // Hub internal stuff
};
struct uhub_plugins
{
struct linked_list* loaded;
};
// High level plugin loader ode
extern struct plugin_handle* plugin_load(const char* filename, const char* config, struct hub_info* hub);
extern void plugin_unload(struct plugin_handle* plugin);
// extern void plugin_unload(struct plugin_handle*);
extern int plugin_initialize(struct hub_config* config, struct hub_info* hub);
extern void plugin_shutdown(struct uhub_plugins* handle);
// Low level plugin loader code (used internally)
extern struct uhub_plugin* plugin_open(const char* filename);
extern void plugin_close(struct uhub_plugin*);
extern void* plugin_lookup_symbol(struct uhub_plugin*, const char* symbol);
// Used internally only
extern struct hub_info* plugin_get_hub(struct plugin_handle*);
#endif /* HAVE_UHUB_PLUGIN_LOADER_H */

View File

@@ -49,7 +49,17 @@ static void probe_net_event(struct net_connection* con, int events, void *arg)
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
if (probe->hub->config->tls_enable && probe->hub->config->tls_require) if (probe->hub->config->tls_enable && probe->hub->config->tls_require)
{ {
LOG_TRACE("Not TLS connection - closing connection."); if (*probe->hub->config->tls_require_redirect_addr)
{
char buf[512];
ssize_t len = snprintf(buf, sizeof(buf), "ISUP " ADC_PROTO_SUPPORT "\nISID AAAB\nIINF NIRedirecting...\nIQUI AAAB RD%s\n", probe->hub->config->tls_require_redirect_addr);
net_con_send(con, buf, (size_t) len);
LOG_TRACE("Not TLS connection - Redirecting to %s.", probe->hub->config->tls_require_redirect_addr);
}
else
{
LOG_TRACE("Not TLS connection - closing connection.");
}
} }
else else
#endif #endif
@@ -60,9 +70,8 @@ static void probe_net_event(struct net_connection* con, int events, void *arg)
probe_destroy(probe); probe_destroy(probe);
return; return;
} }
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
if (bytes >= 11 && else if (bytes >= 11 &&
probe_recvbuf[0] == 22 && probe_recvbuf[0] == 22 &&
probe_recvbuf[1] == 3 && /* protocol major version */ probe_recvbuf[1] == 3 && /* protocol major version */
probe_recvbuf[5] == 1 && /* message type */ probe_recvbuf[5] == 1 && /* message type */
@@ -107,6 +116,8 @@ struct hub_probe* probe_create(struct hub_info* hub, int sd, struct ip_addr_enca
if (probe == NULL) if (probe == NULL)
return NULL; /* OOM */ return NULL; /* OOM */
LOG_TRACE("probe_create(): %p", probe);
probe->hub = hub; probe->hub = hub;
probe->connection = net_con_create(); probe->connection = net_con_create();
net_con_initialize(probe->connection, sd, probe_net_event, probe, NET_EVENT_READ); net_con_initialize(probe->connection, sd, probe_net_event, probe, NET_EVENT_READ);
@@ -118,6 +129,7 @@ struct hub_probe* probe_create(struct hub_info* hub, int sd, struct ip_addr_enca
void probe_destroy(struct hub_probe* probe) void probe_destroy(struct hub_probe* probe)
{ {
LOG_TRACE("probe_destroy(): %p (connection=%p)", probe, probe->connection);
if (probe->connection) if (probe->connection)
{ {
net_con_close(probe->connection); net_con_close(probe->connection);

View File

@@ -57,7 +57,7 @@ int route_message(struct hub_info* hub, struct hub_user* u, struct adc_message*
return 0; return 0;
} }
static size_t get_max_send_queue(struct hub_info* hub) static inline size_t get_max_send_queue(struct hub_info* hub)
{ {
/* TODO: More dynamic send queue limit, for instance: /* TODO: More dynamic send queue limit, for instance:
* return MAX(hub->config->max_send_buffer, (hub->config->max_recv_buffer * hub_get_user_count(hub))); * return MAX(hub->config->max_send_buffer, (hub->config->max_recv_buffer * hub_get_user_count(hub)));
@@ -65,7 +65,7 @@ static size_t get_max_send_queue(struct hub_info* hub)
return hub->config->max_send_buffer; return hub->config->max_send_buffer;
} }
static size_t get_max_send_queue_soft(struct hub_info* hub) static inline size_t get_max_send_queue_soft(struct hub_info* hub)
{ {
return hub->config->max_send_buffer_soft; return hub->config->max_send_buffer_soft;
} }
@@ -75,7 +75,7 @@ static size_t get_max_send_queue_soft(struct hub_info* hub)
* -1 if send queue is overflowed * -1 if send queue is overflowed
* 0 if soft send queue is overflowed (not implemented at the moment) * 0 if soft send queue is overflowed (not implemented at the moment)
*/ */
static int check_send_queue(struct hub_info* hub, struct hub_user* user, struct adc_message* msg) static inline int check_send_queue(struct hub_info* hub, struct hub_user* user, struct adc_message* msg)
{ {
if (user_flag_get(user, flag_user_list)) if (user_flag_get(user, flag_user_list))
return 1; return 1;

View File

@@ -71,6 +71,12 @@ void user_destroy(struct hub_user* user)
hub_recvq_destroy(user->recv_queue); hub_recvq_destroy(user->recv_queue);
hub_sendq_destroy(user->send_queue); hub_sendq_destroy(user->send_queue);
if (user->connection)
{
LOG_TRACE("user_destory() -> net_con_close(%p)", user->connection);
net_con_close(user->connection);
}
adc_msg_free(user->info); adc_msg_free(user->info);
user_clear_feature_cast_support(user); user_clear_feature_cast_support(user);
hub_free(user); hub_free(user);
@@ -288,7 +294,18 @@ int user_is_disconnecting(struct hub_user* user)
int user_is_protected(struct hub_user* user) int user_is_protected(struct hub_user* user)
{ {
return auth_cred_is_protected(user->credentials); switch (user->credentials)
{
case cred_bot:
case cred_operator:
case cred_super:
case cred_admin:
case cred_link:
return 1;
default:
break;
}
return 0;
} }
/** /**
@@ -298,7 +315,19 @@ int user_is_protected(struct hub_user* user)
*/ */
int user_is_registered(struct hub_user* user) int user_is_registered(struct hub_user* user)
{ {
return auth_cred_is_registered(user->credentials); switch (user->credentials)
{
case cred_bot:
case cred_user:
case cred_operator:
case cred_super:
case cred_admin:
case cred_link:
return 1;
default:
break;
}
return 0;
} }
void user_net_io_want_write(struct hub_user* user) void user_net_io_want_write(struct hub_user* user)

View File

@@ -82,9 +82,8 @@ extern const char* user_get_quit_reason_string(enum user_quit_reason);
struct hub_user_info struct hub_user_info
{ {
sid_t sid; /** session ID */ sid_t sid; /** session ID */
char nick[MAX_NICK_LEN+1]; /** User's nick name */
char cid[MAX_CID_LEN+1]; /** global client ID */ char cid[MAX_CID_LEN+1]; /** global client ID */
char user_agent[MAX_UA_LEN+1];/** User agent string */ char nick[MAX_NICK_LEN+1]; /** User's nick name */
struct ip_addr_encap addr; /** User's IP address */ struct ip_addr_encap addr; /** User's IP address */
}; };
@@ -106,10 +105,11 @@ struct hub_user_limits
struct hub_user struct hub_user
{ {
struct hub_user_info id; /** Contains nick name and CID */
enum auth_credentials credentials; /** see enum user_credentials */
enum user_state state; /** see enum user_state */ enum user_state state; /** see enum user_state */
enum user_credentials credentials; /** see enum user_credentials */
struct hub_user_info id; /** Contains nick name and CID */
uint32_t flags; /** see enum user_features */ uint32_t flags; /** see enum user_features */
char user_agent[MAX_UA_LEN+1];/** User agent string */
struct linked_list* feature_cast; /** Features supported by feature cast */ struct linked_list* feature_cast; /** Features supported by feature cast */
struct adc_message* info; /** ADC 'INF' message (broadcasted to everyone joining the hub) */ struct adc_message* info; /** ADC 'INF' message (broadcasted to everyone joining the hub) */
struct hub_info* hub; /** The hub instance this user belong to */ struct hub_info* hub; /** The hub instance this user belong to */

View File

@@ -33,7 +33,7 @@ static void clear_user_list_callback(void* ptr)
* This prevents the hub from trying to send * This prevents the hub from trying to send
* quit messages to other users. * quit messages to other users.
*/ */
u->credentials = auth_cred_none; u->credentials = cred_none;
user_destroy(u); user_destroy(u);
} }
} }

109
src/includes.h Normal file
View File

@@ -0,0 +1,109 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_INCLUDES_H
#define HAVE_UHUB_INCLUDES_H
#define _FILE_OFFSET_BITS 64
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#ifdef WINSOCK
# include <winsock2.h>
# include <ws2tcpip.h>
#else
# include <sys/types.h>
# include <sys/time.h>
# include <arpa/inet.h>
# include <netdb.h>
# include <netinet/in.h>
# include <sys/ioctl.h>
# include <sys/socket.h>
#endif
# include <assert.h>
# include <errno.h>
# include <fcntl.h>
#ifndef __sun__
# include <getopt.h>
# include <stdint.h>
#endif
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#if !defined(WIN32)
# include <grp.h>
# include <pwd.h>
# include <sys/resource.h>
#endif
#ifdef SSL_SUPPORT
# include <openssl/ssl.h>
# include <openssl/err.h>
#endif
#ifdef __linux__
# define USE_EPOLL
# include <sys/epoll.h>
#endif
#ifdef BSD_LIKE
# define USE_KQUEUE
# include <sys/event.h>
#endif
#define USE_SELECT
# ifndef WINSOCK
# include <sys/select.h>
#endif
#if !defined(WIN32)
# define HAVE_STRNDUP
# define HAVE_GETRLIMIT
# if !defined(__HAIKU__)
# define HAVE_MEMMEM
# endif
#endif
#if defined(BSD_LIKE) || defined(__sun__)
# undef HAVE_STRNDUP
# undef HAVE_MEMMEM
#endif
#if defined(WIN32)
/* Windows uses %Iu for size_t */
#define PRINTF_SIZE_T "%Iu"
#else
/* NOTE: does not work for old versions of gcc (like 2.95) */
#define PRINTF_SIZE_T "%zu"
#endif
#define uhub_assert assert
#endif /* HAVE_UHUB_INCLUDES_H */

View File

@@ -179,6 +179,14 @@ void net_con_close(struct net_connection* con)
g_backend->handler.con_del(g_backend->data, con); g_backend->handler.con_del(g_backend->data, con);
#ifdef SSL_SUPPORT
if (con->ssl)
{
SSL_shutdown(con->ssl);
SSL_clear(con->ssl);
}
#endif
net_close(con->sd); net_close(con->sd);
con->sd = -1; con->sd = -1;
@@ -196,6 +204,7 @@ struct net_cleanup_handler* net_cleanup_initialize(size_t max)
void net_cleanup_shutdown(struct net_cleanup_handler* handler) void net_cleanup_shutdown(struct net_cleanup_handler* handler)
{ {
net_cleanup_process(handler);
hub_free(handler->queue); hub_free(handler->queue);
hub_free(handler); hub_free(handler);
} }

View File

@@ -38,7 +38,7 @@ typedef void (*net_con_backend_init)(struct net_backend*, struct net_connection*
typedef void (*net_con_backend_add)(struct net_backend*, struct net_connection*, int mask); typedef void (*net_con_backend_add)(struct net_backend*, struct net_connection*, int mask);
typedef void (*net_con_backend_mod)(struct net_backend*, struct net_connection*, int mask); typedef void (*net_con_backend_mod)(struct net_backend*, struct net_connection*, int mask);
typedef void (*net_con_backend_del)(struct net_backend*,struct net_connection*); typedef void (*net_con_backend_del)(struct net_backend*,struct net_connection*);
typedef const char* (*net_con_backend_name)(); typedef const char* (*net_con_backend_name)(void);
struct net_backend_handler struct net_backend_handler
{ {

View File

@@ -161,7 +161,7 @@ ssize_t net_con_send(struct net_connection* con, const void* buf, size_t len)
LOG_PROTO("SSL_write(con=%p, buf=%p, len=" PRINTF_SIZE_T ") => %d", con, buf, len, ret); LOG_PROTO("SSL_write(con=%p, buf=%p, len=" PRINTF_SIZE_T ") => %d", con, buf, len, ret);
if (ret <= 0) if (ret <= 0)
{ {
return -handle_openssl_error(con, ret); return handle_openssl_error(con, ret);
} }
} }
#endif #endif
@@ -201,7 +201,7 @@ ssize_t net_con_recv(struct net_connection* con, void* buf, size_t len)
} }
else else
{ {
return -handle_openssl_error(con, ret); return handle_openssl_error(con, ret);
} }
} }
#endif #endif
@@ -251,6 +251,9 @@ void* net_con_get_ptr(struct net_connection* con)
void net_con_destroy(struct net_connection* con) void net_con_destroy(struct net_connection* con)
{ {
#ifdef SSL_SUPPORT
SSL_free(con->ssl);
#endif
hub_free(con); hub_free(con);
} }

View File

@@ -34,14 +34,12 @@ static struct net_statistics stats_total;
int net_initialize() int net_initialize()
{ {
#ifdef WINSOCK
struct WSAData wsa;
#endif
if (!net_initialized) if (!net_initialized)
{ {
LOG_TRACE("Initializing network monitor."); LOG_TRACE("Initializing network monitor.");
#ifdef WINSOCK #ifdef WINSOCK
struct WSAData wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != NO_ERROR) if (WSAStartup(MAKEWORD(2, 2), &wsa) != NO_ERROR)
{ {
LOG_ERROR("Unable to initialize winsock."); LOG_ERROR("Unable to initialize winsock.");
@@ -62,7 +60,6 @@ int net_initialize()
LOG_TRACE("Initializing OpenSSL..."); LOG_TRACE("Initializing OpenSSL...");
SSL_library_init(); SSL_library_init();
SSL_load_error_strings(); SSL_load_error_strings();
OpenSSL_add_all_algorithms();
#endif /* SSL_SUPPORT */ #endif /* SSL_SUPPORT */
net_initialized = 1; net_initialized = 1;
@@ -83,7 +80,8 @@ size_t net_get_max_sockets()
return 1024; return 1024;
#else #else
#ifdef WIN32 #ifdef WIN32
return FD_SETSIZE; LOG_WARN("Windows system, limited to 4096 connections.");
return 4096;
#else #else
LOG_WARN("System does not have getrlimit(): constrained to 1024 sockets"); LOG_WARN("System does not have getrlimit(): constrained to 1024 sockets");
return 1024; return 1024;
@@ -101,7 +99,9 @@ int net_destroy()
net_backend_shutdown(); net_backend_shutdown();
#ifdef SSL_SUPPORT #ifdef SSL_SUPPORT
/* FIXME: Shutdown OpenSSL here. */ ERR_free_strings();
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
#endif #endif
#ifdef WINSOCK #ifdef WINSOCK
@@ -529,7 +529,7 @@ const char* net_address_to_string(int af, const void* src, char* dst, socklen_t
return NULL; return NULL;
} }
if (WSAAddressToStringA(addr, size, NULL, dst, &len) == 0) if (WSAAddressToString(addr, size, NULL, dst, &len) == 0)
{ {
return dst; return dst;
} }
@@ -649,16 +649,12 @@ const char* net_get_local_address(int fd)
if (getsockname(fd, (struct sockaddr*) name, &namelen) != -1) if (getsockname(fd, (struct sockaddr*) name, &namelen) != -1)
{ {
#ifndef WINSOCK
int af = storage.ss_family; int af = storage.ss_family;
if (af == AF_INET6) if (af == AF_INET6)
{ {
net_address_to_string(af, (void*) &name6->sin6_addr, address, INET6_ADDRSTRLEN); net_address_to_string(af, (void*) &name6->sin6_addr, address, INET6_ADDRSTRLEN);
} }
else else
#else
int af = AF_INET;
#endif
{ {
net_address_to_string(af, (void*) &name4->sin_addr, address, INET6_ADDRSTRLEN); net_address_to_string(af, (void*) &name4->sin_addr, address, INET6_ADDRSTRLEN);
} }

View File

@@ -255,7 +255,7 @@ extern int net_stats_timeout();
extern void net_stats_get(struct net_statistics** intermediate, struct net_statistics** total); extern void net_stats_get(struct net_statistics** intermediate, struct net_statistics** total);
#if defined(WINSOCK) && !defined(__CYGWIN__) && !defined(_MSC_VER) #if defined(WINSOCK) && !defined(__CYGWIN__)
#define EWOULDBLOCK WSAEWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK
#define EINPROGRESS WSAEINPROGRESS #define EINPROGRESS WSAEINPROGRESS

View File

@@ -35,7 +35,6 @@ struct net_backend_select
struct net_connection_select** conns; struct net_connection_select** conns;
fd_set rfds; fd_set rfds;
fd_set wfds; fd_set wfds;
fd_set xfds;
int maxfd; int maxfd;
struct net_backend_common* common; struct net_backend_common* common;
}; };
@@ -49,8 +48,7 @@ const char* net_backend_name_select()
int net_backend_poll_select(struct net_backend* data, int ms) int net_backend_poll_select(struct net_backend* data, int ms)
{ {
int res; int found, res, n;
size_t n, found;
struct timeval tval; struct timeval tval;
struct net_backend_select* backend = (struct net_backend_select*) data; struct net_backend_select* backend = (struct net_backend_select*) data;
@@ -59,7 +57,6 @@ int net_backend_poll_select(struct net_backend* data, int ms)
FD_ZERO(&backend->rfds); FD_ZERO(&backend->rfds);
FD_ZERO(&backend->wfds); FD_ZERO(&backend->wfds);
FD_ZERO(&backend->xfds);
backend->maxfd = -1; backend->maxfd = -1;
for (n = 0, found = 0; found < backend->common->num && n < backend->common->max; n++) for (n = 0, found = 0; found < backend->common->num && n < backend->common->max; n++)
@@ -75,14 +72,10 @@ int net_backend_poll_select(struct net_backend* data, int ms)
} }
backend->maxfd++; backend->maxfd++;
res = select(backend->maxfd, &backend->rfds, &backend->wfds, &backend->xfds, &tval); res = select(backend->maxfd, &backend->rfds, &backend->wfds, 0, &tval);
if (res == -1)
{
printf("Error: %d\n", net_error());
}
if (res == -1 && net_error() == EINTR)
return 0;
if (res == -1 && errno == EINTR)
return 0;
return res; return res;
} }
@@ -128,13 +121,11 @@ void net_con_backend_add_select(struct net_backend* data, struct net_connection*
{ {
struct net_backend_select* backend = (struct net_backend_select*) data; struct net_backend_select* backend = (struct net_backend_select*) data;
backend->conns[con->sd] = (struct net_connection_select*) con; backend->conns[con->sd] = (struct net_connection_select*) con;
con->flags |= (events & (NET_EVENT_READ | NET_EVENT_WRITE));
} }
void net_con_backend_mod_select(struct net_backend* data, struct net_connection* con, int events) void net_con_backend_mod_select(struct net_backend* data, struct net_connection* con, int events)
{ {
con->flags |= (events & (NET_EVENT_READ | NET_EVENT_WRITE)); con->flags |= (events & (NET_EVENT_READ | NET_EVENT_WRITE));;
} }
void net_con_backend_del_select(struct net_backend* data, struct net_connection* con) void net_con_backend_del_select(struct net_backend* data, struct net_connection* con)

View File

@@ -54,7 +54,7 @@ void timeout_queue_shutdown(struct timeout_queue* t)
size_t timeout_queue_process(struct timeout_queue* t, time_t now) size_t timeout_queue_process(struct timeout_queue* t, time_t now)
{ {
size_t pos = (size_t) t->last; size_t pos = t->last;
size_t events = 0; size_t events = 0;
struct timeout_evt* evt = 0; struct timeout_evt* evt = 0;
t->last = now; t->last = now;

View File

@@ -1,79 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_PLUGIN_API_H
#define HAVE_UHUB_PLUGIN_API_H
/**
* This file describes the interface a plugin implementation may use from
* uhub.
*/
#include "system.h"
#include "plugin_api/types.h"
struct plugin_command
{
const char* message;
char* prefix;
size_t prefix_len;
struct linked_list* args;
};
typedef int (*plugin_command_handler)(struct plugin_handle*, struct plugin_user* to, struct plugin_command*);
struct plugin_command_handle
{
void* internal_handle; /**<<< "Internal used by the hub only" */
struct plugin_handle* handle; /**<<< "The plugin handle this is associated with" */
const char* prefix; /**<<< "Command prefix, for instance 'help' would be the prefix for the !help command." */
size_t length; /**<<< "Length of the prefix" */
const char* args; /**<<< "Argument codes" */
enum auth_credentials cred; /**<<< "Minimum access level for the command" */
plugin_command_handler handler; /**<<< "Function pointer for the command" */
const char* description; /**<<< "Description for the command" */
};
#define PLUGIN_COMMAND_INITIALIZE(PTR, HANDLE, PREFIX, ARGS, CRED, CALLBACK, DESC) \
do { \
PTR->internal_handle = 0; \
PTR->handle = HANDLE; \
PTR->prefix = PREFIX; \
PTR->length = strlen(PREFIX); \
PTR->args = ARGS; \
PTR->cred = CRED; \
PTR->handler = CALLBACK; \
PTR->description = DESC; \
} while (0)
extern int plugin_command_add(struct plugin_handle*, struct plugin_command_handle*);
extern int plugin_command_del(struct plugin_handle*, struct plugin_command_handle*);
/**
* Send a message to a user.
* From the user's perspective the message will originate from the hub.
*/
extern int plugin_command_send_message(struct plugin_handle*, struct plugin_user* to, const char* message);
/**
* Send a reply to a command.
*/
extern int plugin_command_send_reply(struct plugin_handle*, struct plugin_user* user, struct plugin_command* command, const char* message);
#endif /* HAVE_UHUB_PLUGIN_API_H */

View File

@@ -1,159 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_PLUGIN_HANDLE_H
#define HAVE_UHUB_PLUGIN_HANDLE_H
/**
* This file describes the interface a uhub uses to interact with plugins.
*/
#include "system.h"
#include "util/credentials.h"
#include "util/ipcalc.h"
#include "plugin_api/types.h"
typedef plugin_st (*on_chat_msg_t)(struct plugin_handle*, struct plugin_user* from, const char* message);
typedef plugin_st (*on_private_msg_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to, const char* message);
typedef plugin_st (*on_search_t)(struct plugin_handle*, struct plugin_user* from, const char* data);
typedef plugin_st (*on_p2p_connect_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to);
typedef plugin_st (*on_p2p_revconnect_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to);
typedef void (*on_connection_accepted_t)(struct plugin_handle*, struct ip_addr_encap*);
typedef void (*on_connection_refused_t)(struct plugin_handle*, struct ip_addr_encap*);
typedef void (*on_user_login_t)(struct plugin_handle*, struct plugin_user*);
typedef void (*on_user_login_error_t)(struct plugin_handle*, struct plugin_user*, const char* reason);
typedef void (*on_user_logout_t)(struct plugin_handle*, struct plugin_user*, const char* reason);
typedef void (*on_user_nick_change_t)(struct plugin_handle*, struct plugin_user*, const char* new_nick);
typedef void (*on_user_update_error_t)(struct plugin_handle*, struct plugin_user*, const char* reason);
typedef void (*on_user_chat_msg_t)(struct plugin_handle*, struct plugin_user*, const char* message, int flags);
typedef plugin_st (*on_change_nick_t)(struct plugin_handle*, struct plugin_user*, const char* new_nick);
typedef plugin_st (*on_check_ip_early_t)(struct plugin_handle*, struct ip_addr_encap*);
typedef plugin_st (*on_check_ip_late_t)(struct plugin_handle*, struct ip_addr_encap*);
typedef plugin_st (*on_validate_nick_t)(struct plugin_handle*, const char* nick);
typedef plugin_st (*on_validate_cid_t)(struct plugin_handle*, const char* cid);
typedef plugin_st (*auth_get_user_t)(struct plugin_handle*, const char* nickname, struct auth_info* info);
typedef plugin_st (*auth_register_user_t)(struct plugin_handle*, struct auth_info* user);
typedef plugin_st (*auth_update_user_t)(struct plugin_handle*, struct auth_info* user);
typedef plugin_st (*auth_delete_user_t)(struct plugin_handle*, struct auth_info* user);
/**
* These are callbacks used for the hub to invoke functions in plugins.
*/
struct plugin_funcs
{
// Log events for connections
on_connection_accepted_t on_connection_accepted; /* Someone successfully connected to the hub */
on_connection_refused_t on_connection_refused; /* Someone was refused connection to the hub */
// Log events for users
on_user_login_t on_user_login; /* A user has successfully logged in to the hub */
on_user_login_error_t on_user_login_error; /* A user has failed to log in to the hub */
on_user_logout_t on_user_logout; /* A user has logged out of the hub (was previously logged in) */
on_user_nick_change_t on_user_nick_change; /* A user has changed nickname */
on_user_update_error_t on_user_update_error;/* A user has failed to update - nickname, etc. */
on_user_chat_msg_t on_user_chat_message;/* A user has sent a public chat message */
// Activity events (can be intercepted and refused/accepted by a plugin)
on_chat_msg_t on_chat_msg; /* A public chat message is about to be sent (can be intercepted) */
on_private_msg_t on_private_msg; /* A public chat message is about to be sent (can be intercepted) */
on_search_t on_search; /* A search is about to be sent (can be intercepted) */
on_p2p_connect_t on_p2p_connect; /* A user is about to connect to another user (can be intercepted) */
on_p2p_revconnect_t on_p2p_revconnect; /* A user is about to connect to another user (can be intercepted) */
// Authentication actions.
auth_get_user_t auth_get_user; /* Get authentication info from plugin */
auth_register_user_t auth_register_user; /* Register user */
auth_update_user_t auth_update_user; /* Update a registered user */
auth_delete_user_t auth_delete_user; /* Delete a registered user */
// Login check functions
on_check_ip_early_t login_check_ip_early;
on_check_ip_late_t login_check_ip_late;
};
struct plugin_command_handle;
typedef int (*hfunc_send_message)(struct plugin_handle*, struct plugin_user* user, const char* message);
typedef int (*hfunc_user_disconnect)(struct plugin_handle*, struct plugin_user* user);
typedef int (*hfunc_command_add)(struct plugin_handle*, struct plugin_command_handle*);
typedef int (*hfunc_command_del)(struct plugin_handle*, struct plugin_command_handle*);
/**
* These are functions created and initialized by the hub and which can be used
* by plugins to access functionality internal to the hub.
*/
struct plugin_hub_funcs
{
hfunc_send_message send_message;
hfunc_user_disconnect user_disconnect;
hfunc_command_add command_add;
hfunc_command_del command_del;
};
struct plugin_handle
{
struct uhub_plugin* handle; /* Must NOT be modified by the plugin */
const char* name; /* plugin name */
const char* version; /* plugin version */
const char* description; /* plugin description */
void* ptr; /* Plugin specific data */
const char* error_msg; /* Error message for registration error. */
size_t plugin_api_version; /* Plugin API version */
size_t plugin_funcs_size; /* Size of the plugin funcs */
struct plugin_funcs funcs; /* Table of functions that can be implemented by a plugin */
struct plugin_hub_funcs hub; /* Table of core hub functions that can be used by a plugin */
};
#define PLUGIN_INITIALIZE(PTR, NAME, VERSION, DESCRIPTION) \
do { \
PTR->name = NAME; \
PTR->version = VERSION; \
PTR->description = DESCRIPTION; \
PTR->ptr = NULL; \
PTR->error_msg = NULL; \
PTR->plugin_api_version = PLUGIN_API_VERSION; \
PTR->plugin_funcs_size = sizeof(struct plugin_funcs); \
memset(&PTR->funcs, 0, sizeof(struct plugin_funcs)); \
} while (0)
/**
* Implemented by the plugin.
*
* @param handle[out] Sets all information by the plugin
* @param config A configuration string
* @return 0 on success, -1 on error.
*/
extern int plugin_register(struct plugin_handle* handle, const char* config);
/**
* @return 0 on success, -1 on error.
*/
extern int plugin_unregister(struct plugin_handle*);
typedef int (*plugin_register_f)(struct plugin_handle* handle, const char* config);
typedef int (*plugin_unregister_f)(struct plugin_handle*);
#endif /* HAVE_UHUB_PLUGIN_HANDLE_H */

View File

@@ -1,29 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_PLUGIN_MESSAGE_API_H
#define HAVE_UHUB_PLUGIN_MESSAGE_API_H
/**
* Send an informal message to a user.
* The user will see the message as if the hub sent it.
*/
extern int plugin_send_message(struct plugin_handle*, struct plugin_user* to, const char* message);
#endif /* HAVE_UHUB_PLUGIN_API_H */

View File

@@ -1,91 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_PLUGIN_TYPES_H
#define HAVE_UHUB_PLUGIN_TYPES_H
#define PLUGIN_API_VERSION 1
#ifndef MAX_NICK_LEN
#define MAX_NICK_LEN 64
#endif
#ifndef MAX_PASS_LEN
#define MAX_PASS_LEN 64
#endif
#ifndef MAX_CID_LEN
#define MAX_CID_LEN 39
#endif
#ifndef MAX_UA_LEN
#define MAX_UA_LEN 32
#endif
#ifndef SID_T_DEFINED
typedef uint32_t sid_t;
#define SID_T_DEFINED
#endif
struct plugin_handle;
struct plugin_user
{
sid_t sid;
char nick[MAX_NICK_LEN+1];
char cid[MAX_CID_LEN+1];
char user_agent[MAX_UA_LEN+1];
struct ip_addr_encap addr;
enum auth_credentials credentials;
};
enum plugin_status
{
st_default = 0, /* Use default */
st_allow = 1, /* Allow action */
st_deny = -1, /* Deny action */
};
typedef enum plugin_status plugin_st;
struct auth_info
{
char nickname[MAX_NICK_LEN+1];
char password[MAX_PASS_LEN+1];
enum auth_credentials credentials;
};
enum ban_flags
{
ban_nickname = 0x01, /* Nickname is banned */
ban_cid = 0x02, /* CID is banned */
ban_ip = 0x04, /* IP address (range) is banned */
};
struct ban_info
{
unsigned int flags; /* See enum ban_flags. */
char nickname[MAX_NICK_LEN+1]; /* Nickname - only defined if (ban_nickname & flags). */
char cid[MAX_CID_LEN+1]; /* CID - only defined if (ban_cid & flags). */
struct ip_addr_encap ip_addr_lo; /* Low IP address of an IP range */
struct ip_addr_encap ip_addr_hi; /* High IP address of an IP range */
time_t expiry; /* Time when the ban record expires */
};
#endif /* HAVE_UHUB_PLUGIN_TYPES_H */

View File

@@ -1,228 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2011, Jan Vidar Krey
*/
#include "plugin_api/handle.h"
#include "util/memory.h"
#include "util/list.h"
#include "util/ipcalc.h"
#include "util/misc.h"
#include "util/log.h"
#include "util/config_token.h"
static void set_error_message(struct plugin_handle* plugin, const char* msg)
{
plugin->error_msg = msg;
}
struct acl_data
{
struct linked_list* users;
char* file;
int readonly;
int exclusive;
};
static void insert_user(struct linked_list* users, const char* nick, const char* pass, enum auth_credentials cred)
{
struct auth_info* data = (struct auth_info*) hub_malloc_zero(sizeof(struct auth_info));
strncpy(data->nickname, nick, MAX_NICK_LEN);
strncpy(data->password, pass, MAX_PASS_LEN);
data->credentials = cred;
list_append(users, data);
}
static void free_acl(struct acl_data* data)
{
if (!data)
return;
if (data->users)
{
list_clear(data->users, hub_free);
list_destroy(data->users);
}
hub_free(data->file);
hub_free(data);
}
static struct acl_data* parse_config(const char* line)
{
struct acl_data* data = (struct acl_data*) hub_malloc_zero(sizeof(struct acl_data));
struct cfg_tokens* tokens = cfg_tokenize(line);
char* token = cfg_token_get_first(tokens);
if (!data)
return 0;
// set defaults
data->readonly = 1;
data->exclusive = 0;
data->users = list_create();
while (token)
{
char* split = strchr(token, '=');
size_t len = strlen(token);
size_t key = split ? (split - token) : len;
if (key == 4 && strncmp(token, "file", 4) == 0)
{
if (data->file)
hub_free(data->file);
data->file = strdup(split + 1);
}
else if (key == 8 && strncmp(token, "readonly", 8) == 0)
{
if (!string_to_boolean(split + 1, &data->readonly))
data->readonly = 1;
}
else if (key == 9 && strncmp(token, "exclusive", 9) == 0)
{
if (!string_to_boolean(split + 1, &data->exclusive))
data->exclusive = 1;
}
else
{
cfg_tokens_free(tokens);
free_acl(data);
return 0;
}
token = cfg_token_get_next(tokens);
}
cfg_tokens_free(tokens);
return data;
}
static int parse_line(char* line, int line_count, void* ptr_data)
{
struct linked_list* users = (struct linked_list*) ptr_data;
struct cfg_tokens* tokens = cfg_tokenize(line);
enum auth_credentials cred;
char* credential;
char* username;
char* password;
if (cfg_token_count(tokens) == 0)
{
cfg_tokens_free(tokens);
return 0;
}
if (cfg_token_count(tokens) < 2)
{
cfg_tokens_free(tokens);
return -1;
}
credential = cfg_token_get_first(tokens);
username = cfg_token_get_next(tokens);
password = cfg_token_get_next(tokens);
if (!auth_string_to_cred(credential, &cred))
{
cfg_tokens_free(tokens);
return -1;
}
insert_user(users, username, password, cred);
cfg_tokens_free(tokens);
return 0;
}
static struct acl_data* load_acl(const char* config, struct plugin_handle* handle)
{
struct acl_data* data = parse_config(config);
if (!data)
return 0;
if (!data->file || !*data->file)
{
free_acl(data); data = 0;
set_error_message(handle, "No configuration file given, missing \"file=<filename>\" configuration option.");
return 0;
}
if (file_read_lines(data->file, data->users, &parse_line) == -1)
{
fprintf(stderr, "Unable to load %s\n", data->file);
set_error_message(handle, "Unable to load file");
}
return data;
}
static void unload_acl(struct acl_data* data)
{
free_acl(data);
}
static plugin_st get_user(struct plugin_handle* plugin, const char* nickname, struct auth_info* data)
{
struct acl_data* acl = (struct acl_data*) plugin->ptr;
struct auth_info* info = (struct auth_info*) list_get_first(acl->users);
while (info)
{
if (strcasecmp((char*)info->nickname, nickname) == 0)
{
memcpy(data, info, sizeof(struct auth_info));
return st_allow;
}
info = (struct auth_info*) list_get_next(acl->users);
}
if (acl->exclusive)
return st_deny;
return st_default;
}
static plugin_st register_user(struct plugin_handle* plugin, struct auth_info* user)
{
struct acl_data* acl = (struct acl_data*) plugin->ptr;
if (acl->exclusive)
return st_deny;
return st_default;
}
static plugin_st update_user(struct plugin_handle* plugin, struct auth_info* user)
{
struct acl_data* acl = (struct acl_data*) plugin->ptr;
if (acl->exclusive)
return st_deny;
return st_default;
}
static plugin_st delete_user(struct plugin_handle* plugin, struct auth_info* user)
{
struct acl_data* acl = (struct acl_data*) plugin->ptr;
if (acl->exclusive)
return st_deny;
return st_default;
}
int plugin_register(struct plugin_handle* plugin, const char* config)
{
PLUGIN_INITIALIZE(plugin, "File authentication plugin", "0.1", "Authenticate users based on a read-only text file.");
// Authentication actions.
plugin->funcs.auth_get_user = get_user;
plugin->funcs.auth_register_user = register_user;
plugin->funcs.auth_update_user = update_user;
plugin->funcs.auth_delete_user = delete_user;
plugin->ptr = load_acl(config, plugin);
if (plugin->ptr)
return 0;
return -1;
}
int plugin_unregister(struct plugin_handle* plugin)
{
set_error_message(plugin, 0);
unload_acl(plugin->ptr);
return 0;
}

View File

@@ -1,213 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2010, Jan Vidar Krey
*/
#include "plugin_api/handle.h"
#include <sqlite3.h>
#include "util/memory.h"
#include "util/list.h"
#include "util/ipcalc.h"
#include "util/misc.h"
#include "util/log.h"
#include "util/config_token.h"
#define DEBUG_SQL
static void set_error_message(struct plugin_handle* plugin, const char* msg)
{
plugin->error_msg = msg;
}
struct sql_data
{
int exclusive;
sqlite3* db;
};
static struct sql_data* parse_config(const char* line, struct plugin_handle* plugin)
{
struct sql_data* data = (struct sql_data*) hub_malloc_zero(sizeof(struct sql_data));
struct cfg_tokens* tokens = cfg_tokenize(line);
char* token = cfg_token_get_first(tokens);
if (!data)
return 0;
while (token)
{
struct cfg_settings* setting = cfg_settings_split(token);
if (!setting)
{
set_error_message(plugin, "Unable to parse startup parameters");
cfg_tokens_free(tokens);
hub_free(data);
return 0;
}
if (strcmp(cfg_settings_get_key(setting), "file") == 0)
{
if (!data->db)
{
if (sqlite3_open(cfg_settings_get_value(setting), &data->db))
{
cfg_tokens_free(tokens);
cfg_settings_free(setting);
hub_free(data);
set_error_message(plugin, "Unable to open database file");
return 0;
}
}
}
else if (strcmp(cfg_settings_get_key(setting), "exclusive") == 0)
{
if (!string_to_boolean(cfg_settings_get_value(setting), &data->exclusive))
data->exclusive = 1;
}
else
{
set_error_message(plugin, "Unknown startup parameters given");
cfg_tokens_free(tokens);
cfg_settings_free(setting);
hub_free(data);
return 0;
}
cfg_settings_free(setting);
token = cfg_token_get_next(tokens);
}
cfg_tokens_free(tokens);
if (!data->db)
{
set_error_message(plugin, "No database file is given, use file=<database>");
hub_free(data);
return 0;
}
return data;
}
static const char* sql_escape_string(const char* str)
{
static char out[1024];
size_t i = 0;
size_t n = 0;
for (; n < strlen(str); n++)
{
if (str[n] == '\'')
out[i++] = '\'';
out[i++] = str[n];
}
out[i++] = '\0';
return out;
}
struct data_record {
struct auth_info* data;
int found;
};
static int get_user_callback(void* ptr, int argc, char **argv, char **colName){
struct data_record* data = (struct data_record*) ptr;
int i = 0;
for (; i < argc; i++) {
if (strcmp(colName[i], "nickname") == 0)
strncpy(data->data->nickname, argv[i], MAX_NICK_LEN);
else if (strcmp(colName[i], "password") == 0)
strncpy(data->data->password, argv[i], MAX_PASS_LEN);
else if (strcmp(colName[i], "credentials") == 0)
{
auth_string_to_cred(argv[i], &data->data->credentials);
data->found = 1;
}
}
#ifdef DEBUG_SQL
printf("SQL: nickname=%s, password=%s, credentials=%s\n", data->data->nickname, data->data->password, auth_cred_to_string(data->data->credentials));
#endif
return 0;
}
static plugin_st get_user(struct plugin_handle* plugin, const char* nickname, struct auth_info* data)
{
struct sql_data* sql = (struct sql_data*) plugin->ptr;
struct data_record result;
char query[1024];
char* errMsg;
int rc;
snprintf(query, sizeof(query), "SELECT * FROM users WHERE nickname='%s';", sql_escape_string(nickname));
memset(data, 0, sizeof(struct auth_info));
result.data = data;
result.found = 0;
#ifdef DEBUG_SQL
printf("SQL: %s\n", query);
#endif
rc = sqlite3_exec(sql->db, query , get_user_callback, &result, &errMsg);
if (rc != SQLITE_OK) {
#ifdef DEBUG_SQL
fprintf(stderr, "SQL: ERROR: %s\n", errMsg);
#endif
sqlite3_free(errMsg);
return st_default;
}
if (result.found)
return st_allow;
return st_default;
}
static plugin_st register_user(struct plugin_handle* plugin, struct auth_info* user)
{
struct sql_data* sql = (struct sql_data*) plugin->ptr;
if (sql->exclusive)
return st_deny;
return st_default;
}
static plugin_st update_user(struct plugin_handle* plugin, struct auth_info* user)
{
struct sql_data* sql = (struct sql_data*) plugin->ptr;
if (sql->exclusive)
return st_deny;
return st_default;
}
static plugin_st delete_user(struct plugin_handle* plugin, struct auth_info* user)
{
struct sql_data* sql = (struct sql_data*) plugin->ptr;
if (sql->exclusive)
return st_deny;
return st_default;
}
int plugin_register(struct plugin_handle* plugin, const char* config)
{
PLUGIN_INITIALIZE(plugin, "SQLite authentication plugin", "0.1", "Authenticate users based on a SQLite database.");
// Authentication actions.
plugin->funcs.auth_get_user = get_user;
plugin->funcs.auth_register_user = register_user;
plugin->funcs.auth_update_user = update_user;
plugin->funcs.auth_delete_user = delete_user;
plugin->ptr = parse_config(config, plugin);
if (plugin->ptr)
return 0;
return -1;
}
int plugin_unregister(struct plugin_handle* plugin)
{
set_error_message(plugin, 0);
struct sql_data* sql = (struct sql_data*) plugin->ptr;
sqlite3_close(sql->db);
hub_free(sql);
return 0;
}

View File

@@ -1,18 +0,0 @@
/**
* This is a minimal example plugin for uhub.
*/
#include "plugin_api/handle.h"
int plugin_register(struct plugin_handle* plugin, const char* config)
{
PLUGIN_INITIALIZE(plugin, "Example plugin", "1.0", "A simple example plugin");
return 0;
}
int plugin_unregister(struct plugin_handle* plugin)
{
/* No need to do anything! */
return 0;
}

View File

@@ -1,116 +0,0 @@
/**
* This is a minimal example plugin for uhub.
*/
#include "system.h"
#include "adc/adcconst.h"
#include "adc/sid.h"
#include "util/memory.h"
#include "util/ipcalc.h"
#include "plugin_api/handle.h"
struct ip_addr_encap;
struct log_data
{
char* logfile;
int fd;
};
static void set_error_message(struct plugin_handle* plugin, const char* msg)
{
plugin->error_msg = msg;
}
static struct log_data* log_open(struct plugin_handle* plugin, const char* config)
{
struct log_data* data = (struct log_data*) hub_malloc(sizeof(struct log_data));
data->logfile = strdup(config);
data->fd = open(data->logfile, O_CREAT | O_APPEND | O_NOATIME | O_LARGEFILE | O_WRONLY, 0664);
if (data->fd == -1)
{
set_error_message(plugin, "Unable to open log file!");
hub_free(data->logfile);
hub_free(data);
return NULL;
}
return data;
}
static void log_close(struct log_data* data)
{
hub_free(data->logfile);
close(data->fd);
hub_free(data);
}
static void log_message(struct log_data* data, const char *format, ...)
{
static char logmsg[1024];
struct tm *tmp;
time_t t;
va_list args;
ssize_t size = 0;
t = time(NULL);
tmp = localtime(&t);
strftime(logmsg, 32, "%Y-%m-%d %H:%M:%S ", tmp);
va_start(args, format);
size = vsnprintf(logmsg + 20, 1004, format, args);
va_end(args);
write(data->fd, logmsg, size + 20);
fdatasync(data->fd);
}
static void log_user_login(struct plugin_handle* plugin, struct plugin_user* user)
{
const char* cred = auth_cred_to_string(user->credentials);
const char* addr = ip_convert_to_string(&user->addr);
log_message(plugin->ptr, "LoginOK %s/%s %s \"%s\" (%s) \"%s\"\n", sid_to_string(user->sid), user->cid, addr, user->nick, cred, user->user_agent);
}
static void log_user_login_error(struct plugin_handle* plugin, struct plugin_user* user, const char* reason)
{
const char* addr = ip_convert_to_string(&user->addr);
log_message(plugin->ptr, "LoginError %s/%s %s \"%s\" (%s) \"%s\"\n", sid_to_string(user->sid), user->cid, addr, user->nick, reason, user->user_agent);
}
static void log_user_logout(struct plugin_handle* plugin, struct plugin_user* user, const char* reason)
{
const char* addr = ip_convert_to_string(&user->addr);
log_message(plugin->ptr, "Logout %s/%s %s \"%s\" (%s) \"%s\"\n", sid_to_string(user->sid), user->cid, addr, user->nick, reason, user->user_agent);
}
static void log_change_nick(struct plugin_handle* plugin, struct plugin_user* user, const char* new_nick)
{
const char* addr = ip_convert_to_string(&user->addr);
log_message(plugin->ptr, "NickChange %s/%s %s \"%s\" -> \"%s\"\n", sid_to_string(user->sid), user->cid, addr, user->nick, new_nick);
}
int plugin_register(struct plugin_handle* plugin, const char* config)
{
PLUGIN_INITIALIZE(plugin, "Logging plugin", "1.0", "Logs users entering and leaving the hub.");
plugin->funcs.on_user_login = log_user_login;
plugin->funcs.on_user_login_error = log_user_login_error;
plugin->funcs.on_user_logout = log_user_logout;
plugin->funcs.on_user_nick_change = log_change_nick;
plugin->ptr = log_open(plugin, config);
if (!plugin->ptr)
return -1;
return 0;
}
int plugin_unregister(struct plugin_handle* plugin)
{
/* No need to do anything! */
log_close(plugin->ptr);
return 0;
}

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2009, Jan Vidar Krey * Copyright (C) 2007-2010, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -20,108 +20,14 @@
#ifndef HAVE_UHUB_SYSTEM_H #ifndef HAVE_UHUB_SYSTEM_H
#define HAVE_UHUB_SYSTEM_H #define HAVE_UHUB_SYSTEM_H
#define _FILE_OFFSET_BITS 64
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || (defined(__APPLE__) && defined(__MACH__)) #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) || (defined(__APPLE__) && defined(__MACH__))
#define BSD_LIKE # define BSD_LIKE
#endif #endif
#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(_MSC_VER) #if defined(__CYGWIN__) || defined(__MINGW32__)
#ifndef WINSOCK # ifndef WINSOCK
#define WINSOCK # define WINSOCK
#endif # endif
#endif
#ifdef WINSOCK
#ifndef FD_SETSIZE
#define FD_SETSIZE 4096
#endif
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#endif
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#ifndef __sun__
#include <stdint.h>
#endif
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#if !defined(WIN32)
#include <unistd.h>
#include <grp.h>
#include <pwd.h>
#include <sys/resource.h>
#define HAVE_STRNDUP
#define HAVE_DLOPEN
#define HAVE_GETOPT
#define HAVE_SSIZE_T
#include <dlfcn.h>
#ifndef __HAIKU__
#define HAVE_MEMMEM
#endif
#define HAVE_GETRLIMIT
#endif
/* printf and size_t support */
#if defined(WIN32)
/* Windows uses %Iu for size_t */
#define PRINTF_SIZE_T "%Iu"
#else
#define PRINTF_SIZE_T "%zu"
#endif
#ifdef SSL_SUPPORT
#include <openssl/ssl.h>
#include <openssl/err.h>
#endif
#include "../version.h"
#define uhub_assert assert
#ifdef __linux__
#define USE_EPOLL
#include <sys/epoll.h>
#endif
#ifdef BSD_LIKE
#define USE_KQUEUE
#include <sys/event.h>
#endif
#define USE_SELECT
#ifndef WINSOCK
#include <sys/select.h>
#endif
#if defined(BSD_LIKE) || defined(__sun__)
#undef HAVE_STRNDUP
#undef HAVE_MEMMEM
#endif
#ifdef HAVE_GETOPT
#include <getopt.h>
#endif #endif
/* /*
@@ -129,131 +35,112 @@
* See: http://predef.sourceforge.net/ * See: http://predef.sourceforge.net/
*/ */
#if defined(__linux__) #if defined(__linux__)
#define OPSYS "Linux" # define OPSYS "Linux"
#endif #endif
#if defined(_WIN32) || defined(__MINGW32__) || defined(_WIN64) || defined(__WIN32__) || defined(__WINDOWS__) #if defined(_WIN32) || defined(__MINGW32__) || defined(_WIN64) || defined(__WIN32__) || defined(__WINDOWS__)
#define OPSYS "Windows" # define OPSYS "Windows"
#endif #endif
#if defined(__APPLE__) && defined(__MACH__) #if defined(__APPLE__) && defined(__MACH__)
#define OPSYS "MacOSX" # define OPSYS "MacOSX"
#endif #endif
#if defined(__FreeBSD__) #if defined(__FreeBSD__)
#define OPSYS "FreeBSD" # define OPSYS "FreeBSD"
#endif #endif
#if defined(__OpenBSD__) #if defined(__OpenBSD__)
#define OPSYS "OpenBSD" # define OPSYS "OpenBSD"
#endif #endif
#if defined(__NetBSD__) #if defined(__NetBSD__)
#define OPSYS "NetBSD" # define OPSYS "NetBSD"
#endif #endif
#if defined(__sun__) #if defined(__sun__)
#if defined(__SVR4) || defined(__svr4__) # if defined(__SVR4) || defined(__svr4__)
#define OPSYS "Solaris" # define OPSYS "Solaris"
#else # else
#define OPSYS "SunOS" # define OPSYS "SunOS"
#endif # endif
#endif #endif
#if defined(__HAIKU__) #if defined(__HAIKU__)
#define OPSYS "Haiku" # define OPSYS "Haiku"
#endif #endif
/* Detect CPUs */ /* Detect CPUs */
#if defined(__alpha__) || defined(__alpha) #if defined(__alpha__) || defined(__alpha)
#define CPUINFO "Alpha" # define CPUINFO "Alpha"
#endif #endif
#if defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) || defined(__amd64) || defined(_M_X64) #if defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) || defined(__amd64) || defined(_M_X64)
#define CPUINFO "AMD64" # define CPUINFO "AMD64"
#endif #endif
#if defined(__arm__) || defined(__thumb__) || defined(_ARM) || defined(__TARGET_ARCH_ARM) #if defined(__arm__) || defined(__thumb__) || defined(_ARM) || defined(__TARGET_ARCH_ARM)
#define CPUINFO "ARM" # define CPUINFO "ARM"
#endif #endif
#if defined(__i386__) || defined(__i386) || defined(i386) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) || defined(__I86__) || defined(__INTEL__) || defined(__THW_INTEL__) #if defined(__i386__) || defined(__i386) || defined(i386) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) || defined(__I86__) || defined(__INTEL__) || defined(__THW_INTEL__)
#define CPUINFO "i386" # define CPUINFO "i386"
#endif #endif
#if defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(__ia64) || defined(_M_IA64) #if defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(__ia64) || defined(_M_IA64)
#define CPUINFO "IA64" # define CPUINFO "IA64"
#endif #endif
#if defined(__hppa__) || defined(__hppa) #if defined(__hppa__) || defined(__hppa)
#define CPUINFO "PARISC" # define CPUINFO "PARISC"
#endif #endif
#if defined(__m68k__) || defined(M68000) #if defined(__m68k__) || defined(M68000)
#define CPUINFO "M68K" # define CPUINFO "M68K"
#endif #endif
#if defined(__mips__) || defined(mips) || defined(__mips) || defined(__MIPS__) #if defined(__mips__) || defined(mips) || defined(__mips) || defined(__MIPS__)
#define CPUINFO "MIPS" # define CPUINFO "MIPS"
#endif #endif
#if defined(__POWERPC__) || defined(__ppc__) || defined(_ARCH_PPC) || defined(__powerpc) || defined(__powerpc__) #if defined(__POWERPC__) || defined(__ppc__) || defined(_ARCH_PPC) || defined(__powerpc) || defined(__powerpc__)
#define CPUINFO "PowerPC" # define CPUINFO "PowerPC"
#endif #endif
#if defined(__sparc__) || defined(__sparc) #if defined(__sparc__) || defined(__sparc)
#define CPUINFO "SPARC" # define CPUINFO "SPARC"
#endif #endif
#if defined(__sh__) #if defined(__sh__)
#define CPUINFO "SuperH" # define CPUINFO "SuperH"
#endif #endif
/* System includes */
#include "includes.h"
#include "../version.h"
/* Misc */ /* Misc */
#ifdef MSG_NOSIGNAL #ifdef MSG_NOSIGNAL
#define UHUB_SEND_SIGNAL MSG_NOSIGNAL # define UHUB_SEND_SIGNAL MSG_NOSIGNAL
#else #else
#ifdef MSG_NOPIPE # ifdef MSG_NOPIPE
#define UHUB_SEND_SIGNAL MSG_NOPIPE # define UHUB_SEND_SIGNAL MSG_NOPIPE
#else # else
#define UHUB_SEND_SIGNAL 0 # define UHUB_SEND_SIGNAL 0
#endif # endif
#endif #endif
#ifndef INET6_ADDRSTRLEN #ifndef INET6_ADDRSTRLEN
#define INET6_ADDRSTRLEN 46 # define INET6_ADDRSTRLEN 46
#endif #endif
#ifndef MIN #ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b)) # define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif #endif
#ifndef MAX #ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b)) # define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
#ifndef HAVE_SSIZE_T
typedef int ssize_t;
#define HAVE_SSIZE_T
#endif
#ifdef _MSC_VER
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
#endif
#ifdef _MSC_VER
#define strdup _strdup
#define snprintf _snprintf
#define strcasecmp _stricmp
#define strncasecmp _strnicmp
#define atoll _atoi64
#include <io.h>
#define open _open
#define close _close
#define read _read
#define NEED_GETOPT
#endif #endif
#endif /* HAVE_UHUB_SYSTEM_H */ #endif /* HAVE_UHUB_SYSTEM_H */

View File

@@ -26,7 +26,6 @@ static int handle(struct ADC_client* client, enum ADC_client_callback_type type,
case ADC_CLIENT_PASSWORD_REQ: case ADC_CLIENT_PASSWORD_REQ:
puts("*** Requesting password."); puts("*** Requesting password.");
break;
case ADC_CLIENT_LOGGED_IN: case ADC_CLIENT_LOGGED_IN:
puts("*** Logged in."); puts("*** Logged in.");
@@ -81,7 +80,10 @@ int main(int argc, char** argv)
ADC_client_set_callback(&client, handle); ADC_client_set_callback(&client, handle);
ADC_client_connect(&client, argv[1]); ADC_client_connect(&client, argv[1]);
while (running && net_backend_process()) { } while (running)
{
net_backend_process();
}
ADC_client_destroy(&client); ADC_client_destroy(&client);
net_destroy(); net_destroy();

View File

@@ -25,8 +25,6 @@
/* #define MEMORY_DEBUG */ /* #define MEMORY_DEBUG */
/* #define DEBUG_SENDQ 1 */ /* #define DEBUG_SENDQ 1 */
#define PLUGIN_SUPPORT
#include "system.h" #include "system.h"
#ifndef WIN32 #ifndef WIN32
@@ -47,7 +45,6 @@
#define MAX_CID_LEN 39 #define MAX_CID_LEN 39
#define MAX_NICK_LEN 64 #define MAX_NICK_LEN 64
#define MAX_PASS_LEN 64
#define MAX_UA_LEN 32 #define MAX_UA_LEN 32
#define TIGERSIZE 24 #define TIGERSIZE 24
@@ -60,10 +57,6 @@ extern "C" {
#include "adc/adcconst.h" #include "adc/adcconst.h"
#include "util/config_token.h"
#include "util/credentials.h"
#include "util/floodctl.h"
#include "util/getopt.h"
#include "util/ipcalc.h" #include "util/ipcalc.h"
#include "util/list.h" #include "util/list.h"
#include "util/log.h" #include "util/log.h"
@@ -73,13 +66,13 @@ extern "C" {
#include "adc/sid.h" #include "adc/sid.h"
#include "adc/message.h" #include "adc/message.h"
#include "network/network.h" #include "network/network.h"
#include "network/connection.h" #include "network/connection.h"
#include "network/timeout.h" #include "network/timeout.h"
#include "core/auth.h" #include "core/auth.h"
#include "core/config.h" #include "core/config.h"
#include "core/floodctl.h"
#include "core/eventid.h" #include "core/eventid.h"
#include "core/eventqueue.h" #include "core/eventqueue.h"
#include "core/netevent.h" #include "core/netevent.h"
@@ -87,17 +80,10 @@ extern "C" {
#include "core/user.h" #include "core/user.h"
#include "core/usermanager.h" #include "core/usermanager.h"
#include "core/route.h" #include "core/route.h"
#include "core/pluginloader.h"
#include "core/hub.h" #include "core/hub.h"
#include "core/commands.h" #include "core/commands.h"
#include "core/commands_builtin.h"
#include "core/inf.h" #include "core/inf.h"
#include "core/hubevent.h" #include "core/hubevent.h"
#include "core/plugincallback.h"
#include "core/plugininvoke.h"
#include "core/pluginloader.h"
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -1,268 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "uhub.h"
#define ADD_CHAR(X) do { *out = X; out++; token_size++; } while(0)
#define RESET_TOKEN do { ADD_CHAR('\0'); out = buffer; if (cfg_token_add(tokens, out)) token_count++; token_size = 0; buffer[0] = '\0'; } while (0)
struct cfg_tokens
{
struct linked_list* list;
};
struct cfg_tokens* cfg_tokenize(const char* line)
{
struct cfg_tokens* tokens = (struct cfg_tokens*) hub_malloc_zero(sizeof(struct cfg_tokens));
char* buffer = (char*) hub_malloc_zero(strlen(line));
char* out = buffer;
const char* p = line;
int backslash = 0;
char quote = 0;
size_t token_count = 0;
size_t token_size = 0;
tokens->list = list_create();
for (; *p; p++)
{
switch (*p)
{
case '\\':
if (backslash)
{
ADD_CHAR('\\');
backslash = 0;
}
else
{
backslash = 1;
}
break;
case '#':
if (backslash)
{
ADD_CHAR('#');
backslash = 0;
}
else if (quote)
{
ADD_CHAR('#');
}
else
{
RESET_TOKEN;
return tokens;
}
break;
case '\"':
if (backslash)
{
ADD_CHAR('\"');
backslash = 0;
}
else if (quote)
{
quote = 0;
}
else
{
quote = 1;
}
break;
case '\r':
/* Pretend it does not exist! */
break;
case ' ':
case '\t':
if (quote)
{
ADD_CHAR(*p);
}
else if (backslash)
{
ADD_CHAR(*p);
backslash = 0;
}
else
{
RESET_TOKEN;
}
break;
default:
ADD_CHAR(*p);
}
}
RESET_TOKEN;
return tokens;
}
void cfg_tokens_free(struct cfg_tokens* tokens)
{
list_clear(tokens->list, hub_free);
list_destroy(tokens->list);
hub_free(tokens);
}
int cfg_token_add(struct cfg_tokens* tokens, char* new_token)
{
if (*new_token)
{
list_append(tokens->list, hub_strdup(new_token));
return 1;
}
return 0;
}
size_t cfg_token_count(struct cfg_tokens* tokens)
{
return list_size(tokens->list);
}
char* cfg_token_get(struct cfg_tokens* tokens, size_t offset)
{
return list_get_index(tokens->list, offset);
}
char* cfg_token_get_first(struct cfg_tokens* tokens)
{
return list_get_first(tokens->list);
}
char* cfg_token_get_next(struct cfg_tokens* tokens)
{
return list_get_next(tokens->list);
}
struct cfg_settings
{
char* key;
char* value;
};
struct cfg_settings* cfg_settings_split(const char* line)
{
struct cfg_settings* s = NULL;
struct cfg_tokens* tok = NULL;
char* pos = NULL;
if ( !line
|| !*line
|| ((pos = (char*) strchr(line, '=')) == NULL)
|| ((s = hub_malloc_zero(sizeof(struct cfg_settings))) == NULL)
|| ((tok = cfg_tokenize(line)) == NULL)
|| (cfg_token_count(tok) < 1)
|| (cfg_token_count(tok) > 3)
|| (cfg_token_count(tok) == 3 && strcmp(cfg_token_get(tok, 1), "="))
)
{
cfg_tokens_free(tok);
cfg_settings_free(s);
return NULL;
}
if (cfg_token_count(tok) == 1)
{
char* key = cfg_token_get_first(tok);
pos = strchr(key, '=');
if (!pos)
{
cfg_tokens_free(tok);
cfg_settings_free(s);
return NULL;
}
pos[0] = 0;
key = strip_white_space(key);
if (!*key)
{
cfg_tokens_free(tok);
cfg_settings_free(s);
return NULL;
}
s->key = strdup(key);
s->value = strdup(strip_white_space(pos+1));
}
else if (cfg_token_count(tok) == 2)
{
char* key = cfg_token_get_first(tok);
char* val = cfg_token_get_next(tok);
if ((pos = strchr(key, '=')))
{
pos[0] = 0;
key = strip_white_space(key);
}
else if ((pos = strchr(val, '=')))
{
val = strip_white_space(pos+1);
}
else
{
cfg_tokens_free(tok);
cfg_settings_free(s);
return NULL;
}
if (!*key)
{
cfg_tokens_free(tok);
cfg_settings_free(s);
return NULL;
}
s->key = strdup(key);
s->value = strdup(val);
}
else
{
s->key = strdup(strip_white_space(cfg_token_get(tok, 0)));
s->value = strdup(strip_white_space(cfg_token_get(tok, 2)));
}
cfg_tokens_free(tok);
return s;
}
const char* cfg_settings_get_key(struct cfg_settings* s)
{
return s->key;
}
const char* cfg_settings_get_value(struct cfg_settings* s)
{
return s->value;
}
void cfg_settings_free(struct cfg_settings* s)
{
if (s)
{
hub_free(s->key);
hub_free(s->value);
hub_free(s);
}
}

View File

@@ -1,44 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_CONFIG_TOKEN_H
#define HAVE_UHUB_CONFIG_TOKEN_H
struct cfg_tokens;
struct cfg_tokens* cfg_tokenize(const char* line);
void cfg_tokens_free(struct cfg_tokens*);
int cfg_token_add(struct cfg_tokens*, char* new_token);
size_t cfg_token_count(struct cfg_tokens*);
char* cfg_token_get(struct cfg_tokens*, size_t offset);
char* cfg_token_get_first(struct cfg_tokens*);
char* cfg_token_get_next(struct cfg_tokens*);
struct cfg_settings;
struct cfg_settings* cfg_settings_split(const char* line);
const char* cfg_settings_get_key(struct cfg_settings*);
const char* cfg_settings_get_value(struct cfg_settings*);
void cfg_settings_free(struct cfg_settings*);
#endif /* HAVE_UHUB_CONFIG_TOKEN_H */

View File

@@ -1,113 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "uhub.h"
int auth_cred_is_protected(enum auth_credentials cred)
{
switch (cred)
{
case auth_cred_bot:
case auth_cred_operator:
case auth_cred_super:
case auth_cred_admin:
case auth_cred_link:
return 1;
default:
break;
}
return 0;
}
/**
* Returns 1 if a user is registered.
* Only registered users will be let in if the hub is configured for registered
* users only.
*/
int auth_cred_is_registered(enum auth_credentials cred)
{
switch (cred)
{
case auth_cred_bot:
case auth_cred_user:
case auth_cred_operator:
case auth_cred_super:
case auth_cred_admin:
case auth_cred_link:
return 1;
default:
break;
}
return 0;
}
const char* auth_cred_to_string(enum auth_credentials cred)
{
switch (cred)
{
case auth_cred_none: return "none";
case auth_cred_bot: return "bot";
case auth_cred_guest: return "guest";
case auth_cred_user: return "user";
case auth_cred_operator: return "operator";
case auth_cred_super: return "super";
case auth_cred_link: return "link";
case auth_cred_admin: return "admin";
}
return "";
};
int auth_string_to_cred(const char* str, enum auth_credentials* out)
{
if (!str || !*str || !out)
return 0;
switch (strlen(str))
{
case 2:
if (!strcasecmp(str, "op")) { *out = auth_cred_operator; return 1; }
return 0;
case 3:
if (!strcasecmp(str, "bot")) { *out = auth_cred_bot; return 1; }
if (!strcasecmp(str, "reg")) { *out = auth_cred_user; return 1; }
return 0;
case 4:
if (!strcasecmp(str, "none")) { *out = auth_cred_none; return 1; }
if (!strcasecmp(str, "user")) { *out = auth_cred_user; return 1; }
if (!strcasecmp(str, "link")) { *out = auth_cred_link; return 1; }
return 0;
case 5:
if (!strcasecmp(str, "admin")) { *out = auth_cred_admin; return 1; }
if (!strcasecmp(str, "super")) { *out = auth_cred_super; return 1; }
if (!strcasecmp(str, "guest")) { *out = auth_cred_guest; return 1; }
return 0;
case 8:
if (!strcasecmp(str, "operator")) { *out = auth_cred_operator; return 1; }
return 0;
default:
return 0;
}
}

View File

@@ -1,57 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef HAVE_UHUB_CREDENTIALS_H
#define HAVE_UHUB_CREDENTIALS_H
enum auth_credentials
{
auth_cred_none, /**<<< "User has no credentials (not yet logged in)" */
auth_cred_bot, /**<<< "User is a robot" */
auth_cred_guest, /**<<< "User is a guest (unregistered user)" */
auth_cred_user, /**<<< "User is identified as a registered user" */
auth_cred_operator, /**<<< "User is identified as a hub operator" */
auth_cred_super, /**<<< "User is a super user" (not used) */
auth_cred_link, /**<<< "User is a link (not used currently)" */
auth_cred_admin, /**<<< "User is identified as a hub administrator/owner" */
};
/**
* Returns 1 if the credentials means that a user is protected.
* Returns 0 otherwise.
*/
int auth_cred_is_protected(enum auth_credentials cred);
/**
* Returns 1 if a user is registered.
* Returns 0 otherwise.
* Only registered users will be let in if the hub is configured for registered
* users only.
*/
int auth_cred_is_registered(enum auth_credentials cred);
/**
* Returns a string representation of the credentials enum.
*/
const char* auth_cred_to_string(enum auth_credentials cred);
int auth_string_to_cred(const char* str, enum auth_credentials* out);
#endif /* HAVE_UHUB_CREDENTIALS_H */

View File

@@ -1,59 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "uhub.h"
#ifdef NEED_GETOPT
char *optarg = NULL;
int optind = 1;
/*
* This is a very simple subset of the real getopt().
*/
int getopt(int argc, char* const argv[], const char *optstring)
{
int ret;
char* pos;
char* arg = argv[optind++];
optarg = NULL;
if (optind > argc)
return -1;
if (*arg != '-')
return -1;
arg++;
if (*arg == '-')
arg++;
ret = *arg;
pos = strchr(optstring, ret);
if (!pos)
return ret;
if (*(pos+1) == ':')
optarg = argv[optind++];
return ret;
}
#endif

View File

@@ -1,29 +0,0 @@
/*
* uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "uhub.h"
#ifdef NEED_GETOPT
extern char* optarg;
extern int optind;
extern int getopt(int argc, char* const argv[], const char *optstring);
#endif

View File

@@ -21,7 +21,7 @@
int ip_is_valid_ipv4(const char* address) int ip_is_valid_ipv4(const char* address)
{ {
size_t i = 0; /* address index */ int i = 0; /* address index */
int o = 0; /* octet number */ int o = 0; /* octet number */
int n = 0; /* numbers after each dot */ int n = 0; /* numbers after each dot */
int d = 0; /* dots */ int d = 0; /* dots */

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2010, Jan Vidar Krey * Copyright (C) 2007-2009, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
* uhub - A tiny ADC p2p connection hub * uhub - A tiny ADC p2p connection hub
* Copyright (C) 2007-2011, Jan Vidar Krey * Copyright (C) 2007-2009, Jan Vidar Krey
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -19,8 +19,6 @@
#include "uhub.h" #include "uhub.h"
static const char* BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
int is_space(char c) int is_space(char c)
{ {
if (c == ' ') return 1; if (c == ' ') return 1;
@@ -343,7 +341,7 @@ void* memmem(const void *haystack, size_t haystacklen, const void *needle, size_
char* c_pat = (char*) needle; char* c_pat = (char*) needle;
char* ptr = memchr(c_buf, c_pat[0], haystacklen); char* ptr = memchr(c_buf, c_pat[0], haystacklen);
while (ptr && ((size_t) (&ptr[0] - &c_buf[0]) < haystacklen)) while (ptr && (&ptr[0] - &c_buf[0] < haystacklen))
{ {
if (!memcmp(ptr, c_pat, needlelen)) if (!memcmp(ptr, c_pat, needlelen))
return ptr; return ptr;
@@ -451,41 +449,6 @@ void strip_off_ini_line_comments(char* line, int line_count)
*out = '\0'; *out = '\0';
} }
int string_to_boolean(const char* str, int* boolean)
{
if (!str || !*str || !boolean)
return 0;
switch (strlen(str))
{
case 1:
if (str[0] == '1') { *boolean = 1; return 1; }
else if (str[0] == '0') { *boolean = 0; return 1; }
return 0;
case 2:
if (!strcasecmp(str, "on")) { *boolean = 1; return 1; }
if (!strcasecmp(str, "no")) { *boolean = 0; return 1; }
return 0;
case 3:
if (!strcasecmp(str, "yes")) { *boolean = 1; return 1; }
if (!strcasecmp(str, "off")) { *boolean = 0; return 1; }
return 0;
case 4:
if (!strcasecmp(str, "true")) { *boolean = 1; return 1; }
return 0;
case 5:
if (!strcasecmp(str, "false")) { *boolean = 0; return 1; }
return 0;
default:
return 0;
}
}
char* strip_off_quotes(char* line) char* strip_off_quotes(char* line)
{ {
size_t len; size_t len;

View File

@@ -38,14 +38,6 @@ extern char* strip_off_quotes(char* line);
extern int file_read_lines(const char* file, void* data, file_line_handler_t handler); extern int file_read_lines(const char* file, void* data, file_line_handler_t handler);
/**
* Convert a string to a boolean (0 or 1).
* Example:
* "yes", "true", "1", "on" sets 1 in boolean, and returns 1.
* "no", "false", "0", "off" sets 0 in boolean, and returns 1.
* All other values return 0, and boolean is unchanged.
*/
extern int string_to_boolean(const char* str, int* boolean);
extern const char* uhub_itoa(int val); extern const char* uhub_itoa(int val);
@@ -53,6 +45,11 @@ extern const char* uhub_ulltoa(uint64_t val);
extern int uhub_atoi(const char* value); extern int uhub_atoi(const char* value);
#ifdef NEED_ATOLL
extern int atoll(const char* value);
#endif
#ifndef HAVE_STRNDUP #ifndef HAVE_STRNDUP
extern char* strndup(const char* string, size_t n); extern char* strndup(const char* string, size_t n);
#endif #endif

View File

@@ -1,42 +0,0 @@
#!/usr/bin/perl
# use script
# sqlite3 users.db < `tools/convert_to_sqlite.pl /etc/uhub/users.conf`
my $input = $ARGV[0];
open (FILE, "$input") || die "# Unable to open input file $input: $!";
my @lines = <FILE>;
close (FILE);
print "CREATE TABLE users(nickname CHAR(64) UNIQUE, password CHAR(64), credentials CHAR(5));\n";
foreach my $line (@lines) {
chomp($line);
$line =~ s/#.*//g;
next if ($line =~ /^\s*$/);
if ($line =~ /^\s*user_(op|admin|super|reg)\s*(.+):(.+)\s*/)
{
my $cred = $1;
my $nick = $2;
my $pass = $3;
$nick =~ s/'/\\'/g;
$pass =~ s/'/\\'/g;
print "INSERT INTO users VALUES('" . $nick . "', '" . $pass . "', '" . $cred . "');\n";
}
else
{
# print "# Warning: Unrecognized line: \"" . $line . "\"\n";
}
}

View File

@@ -5,7 +5,7 @@
#endif #endif
#ifndef VERSION #ifndef VERSION
#define VERSION "0.4.0" #define VERSION "0.3.3"
#endif #endif
#ifndef GIT_REVISION #ifndef GIT_REVISION
@@ -14,7 +14,7 @@
#else #else
#define REVISION "(git: " GIT_REVISION ")" #define REVISION "(git: " GIT_REVISION ")"
#ifdef GIT_VERSION #ifdef GIT_VERSION
#define PRODUCT_STRING PRODUCT "/" GIT_VERSION #define PRODUCT_STRING PRODUCT "/" VERSION " (" GIT_VERSION ")"
#else #else
#define PRODUCT_STRING PRODUCT "/" VERSION " " REVISION #define PRODUCT_STRING PRODUCT "/" VERSION " " REVISION
#endif #endif