Compare commits
140 Commits
dynamic_hu
...
0.4.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9651a99d46 | ||
|
|
571abddd98 | ||
|
|
9ea85ad1ac | ||
|
|
3ae6da4a64 | ||
|
|
f3754fb4e4 | ||
|
|
79ca108f48 | ||
|
|
210d5d276e | ||
|
|
a6d87f95ef | ||
|
|
274f17bce0 | ||
|
|
53b3087735 | ||
|
|
8365278cbf | ||
|
|
eb49174ab3 | ||
|
|
9e52ea7eff | ||
|
|
05fd6bb723 | ||
|
|
7b77f7dc31 | ||
|
|
685e56f4c6 | ||
|
|
d19e78941a | ||
|
|
c5516b5729 | ||
|
|
3aaabbc543 | ||
|
|
ccb66ced4f | ||
|
|
dce8b97bba | ||
|
|
d49127b507 | ||
|
|
ccded3f642 | ||
|
|
216757a1f4 | ||
|
|
458c7fa741 | ||
|
|
74ca5a0a33 | ||
|
|
9efe4bce57 | ||
|
|
e4cf01ff1f | ||
|
|
82615fc86e | ||
|
|
b72f5a407a | ||
|
|
776f7d0bff | ||
|
|
27ceb7ad33 | ||
|
|
c5036a3ff8 | ||
|
|
832277f653 | ||
|
|
c525e59fa5 | ||
|
|
781f22edab | ||
|
|
55030935a7 | ||
|
|
4f0c8e0356 | ||
|
|
e925db2b98 | ||
|
|
0cbb382b14 | ||
|
|
303dbadac2 | ||
|
|
e408ae3eba | ||
|
|
5b6ab7e1d2 | ||
|
|
2298f09c0f | ||
|
|
ad5e5d2837 | ||
|
|
106574008f | ||
|
|
1dba731cc3 | ||
|
|
df7bbc094f | ||
|
|
390b63e80a | ||
|
|
5068fe8351 | ||
|
|
e4df1884d2 | ||
|
|
8607b40278 | ||
|
|
a9b5c6db38 | ||
|
|
0ae8a08f55 | ||
|
|
ff639d87c3 | ||
|
|
5edf2b60d4 | ||
|
|
66215cc535 | ||
|
|
eee2636582 | ||
|
|
f44a420970 | ||
|
|
fcf6827a68 | ||
|
|
ca3782c570 | ||
|
|
875f55a401 | ||
|
|
a9ed03cf38 | ||
|
|
b0a8c3251b | ||
|
|
2ebd916992 | ||
|
|
3c6254d007 | ||
|
|
7b392acbf5 | ||
|
|
66c77d5170 | ||
|
|
c2e25453f6 | ||
|
|
1700a27619 | ||
|
|
aa01fd40e5 | ||
|
|
5b7382a27c | ||
|
|
a5b02d1672 | ||
|
|
fe15c4cb58 | ||
|
|
ecedd44fee | ||
|
|
24e2c2090e | ||
|
|
2a190859bd | ||
|
|
88dd1341d2 | ||
|
|
b24d4b85cd | ||
|
|
f34f0328a3 | ||
|
|
f31fc65e1d | ||
|
|
7325b15786 | ||
|
|
ec3afc3a44 | ||
|
|
ba26f4c5e2 | ||
|
|
68dc3cafc7 | ||
|
|
583900cec5 | ||
|
|
93caa9b3c1 | ||
|
|
f2cb84180a | ||
|
|
fc5e09aa9e | ||
|
|
b4779bfb12 | ||
|
|
6d609e18a2 | ||
|
|
ebd3ccf98e | ||
|
|
b28417c3a3 | ||
|
|
aec89fc125 | ||
|
|
9377fb537a | ||
|
|
afda1d7b9d | ||
|
|
2352e5a0dd | ||
|
|
1dc79c641c | ||
|
|
41824ce2bf | ||
|
|
65c2652a22 | ||
|
|
fb89307b0a | ||
|
|
8d607dff13 | ||
|
|
7825c413d4 | ||
|
|
318163c066 | ||
|
|
78ed83840b | ||
|
|
e972b03f38 | ||
|
|
9f16298688 | ||
|
|
c17b43e77f | ||
|
|
675e6af3ba | ||
|
|
2396d8555c | ||
|
|
9981acca08 | ||
|
|
99e644597d | ||
|
|
3a39a36fbb | ||
|
|
1102a86463 | ||
|
|
bad4512a37 | ||
|
|
3b4a199673 | ||
|
|
f8d057f15a | ||
|
|
39572c3684 | ||
|
|
0d8283930f | ||
|
|
33b94d8eb4 | ||
|
|
324bfcd2c8 | ||
|
|
87535ff0d6 | ||
|
|
800f6a70f9 | ||
|
|
5d2a25a1be | ||
|
|
70f13158d3 | ||
|
|
9327615448 | ||
|
|
ebe54bcf27 | ||
|
|
e4aa565fab | ||
|
|
998f5a57e2 | ||
|
|
472c489ae1 | ||
|
|
bba7c0d05b | ||
|
|
169b8a4a75 | ||
|
|
f13bcd8c28 | ||
|
|
a79fcd796e | ||
|
|
474e2be308 | ||
|
|
47cf3326fd | ||
|
|
3353049ae3 | ||
|
|
3ccce614d0 | ||
|
|
e30505b54e | ||
|
|
3bc764adf5 |
8
.gitignore
vendored
8
.gitignore
vendored
@@ -7,3 +7,11 @@ uhub-admin
|
||||
adcrush
|
||||
uhub
|
||||
revision.h*
|
||||
build-stamp
|
||||
debian/files
|
||||
debian/uhub.debhelper.log
|
||||
debian/uhub.postinst.debhelper
|
||||
debian/uhub.postrm.debhelper
|
||||
debian/uhub.prerm.debhelper
|
||||
debian/uhub.substvars
|
||||
uhub-passwd
|
||||
|
||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "thirdparty/sqlite"]
|
||||
path = thirdparty/sqlite
|
||||
url = git://github.com/janvidar/sqlite.git
|
||||
1
AUTHORS
1
AUTHORS
@@ -5,4 +5,5 @@ Jan Vidar Krey, Design and implementation
|
||||
E_zombie, Centos/RedHat customization scripts and heavy load testing
|
||||
FleetCommand, Hub topic
|
||||
MiMic, Implemented user commands
|
||||
tehnick, Debian and Ubuntu packaging.
|
||||
|
||||
|
||||
25
COPYING.OpenSSL
Normal file
25
COPYING.OpenSSL
Normal file
@@ -0,0 +1,25 @@
|
||||
OpenSSL License Exception
|
||||
-------------------------
|
||||
|
||||
Copyright (c) 2007-2012, 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 3 (GPL) as published by
|
||||
the Free Software Foundation.
|
||||
The full text the GPL can be found in the COPYING file.
|
||||
|
||||
In addition this distribution of uhub may be linked against OpenSSL
|
||||
according to the terms described here:
|
||||
|
||||
You have permission to copy, modify, propagate, and distribute a work
|
||||
formed by combining OpenSSL with uhub, or a work derivative of such a
|
||||
combination, even if such copying, modification, propagation, or
|
||||
distribution would otherwise violate the terms of the GPL. You must
|
||||
comply with the GPL in all respects for all of the code used other than
|
||||
OpenSSL.
|
||||
|
||||
You may include this OpenSSL exception and its grant of permissions when
|
||||
you distribute uhub. Inclusion of this notice with such a distribution
|
||||
constitutes a grant of such permission. If you do not wish to grant these
|
||||
permissions, delete this file.
|
||||
|
||||
50
ChangeLog
50
ChangeLog
@@ -1,3 +1,53 @@
|
||||
0.4.0:
|
||||
- Cleaned up code generator for config file parsing.
|
||||
- Merge pull request #5 from yorhel/master
|
||||
- Print error message in case of shutting down due to errors loading plugins.
|
||||
- Fix Windows file read discrepancy.
|
||||
- convert_to_sqlite.pl: Update to the latest SQL schema + be more Perlish
|
||||
- Fix VS2010 project file - missing .c file.
|
||||
- Merge https://github.com/Tilka/uhub
|
||||
- use "I64u" instead of PRIu64 on Windows
|
||||
- remove obsolete settings in uhub.conf
|
||||
- fix uhub_itoa() and uhub_ulltoa()
|
||||
- marked plugin callbacks that are not called yet
|
||||
- add on_change_nick() to struct plugin_funcs
|
||||
- minimal changes
|
||||
- Updated init script in debian package.
|
||||
- Updated list of man pages in debian package.
|
||||
- Added man page for uhub-passwd.
|
||||
- Merge branch 'master' of https://github.com/Tilka/uhub
|
||||
- Fix issue with QUI messages being allowed through the hub
|
||||
- don't show error on SIGTERM in select() backend
|
||||
- fix dependency of 'install' target
|
||||
- changed all calls to assert() to uhub_assert()
|
||||
- Don't strip the U4/U6 port numbers if updated after login.
|
||||
- Fix compile issue with double typedefs.
|
||||
- Remove list assertion when removing element that is not in the list. Breaks autotest.
|
||||
- Cleaned up command handling code, by splitting into multiple files.
|
||||
- Fix bug #183 - Added proper OpenSSL license exception for the GPL.
|
||||
- OMG OPTIMIZED
|
||||
- use dh_prep instead of dh_clean -k
|
||||
- fix double free
|
||||
- use "0" instead of "false"
|
||||
- fix use of uninitialized struct ip_range
|
||||
- fix random crashes upon !reload
|
||||
- fix command syntax
|
||||
- use arg parser in !broadcast
|
||||
- Fixed tiny memory leak on reload/shutdown.
|
||||
- Merge https://github.com/Tilka/uhub
|
||||
- fix multiple optional arguments
|
||||
- small cleanup
|
||||
- also clean uhub-passwd
|
||||
- ignore files generated by dpkg-buildpackage
|
||||
- automatically clean up plugin commands
|
||||
- minimal documentation fixes
|
||||
- update client software link
|
||||
- update compile howto link
|
||||
- fix debian changelog
|
||||
- Fix bug #158 - Added plugin for setting topic (hub description).
|
||||
- Command arguments handling + cleanups
|
||||
|
||||
|
||||
0.3.2:
|
||||
- Fixed bugs in the kqueue network backend (OSX/BSD)
|
||||
- Rewrote the configuration backend code.
|
||||
|
||||
94
GNUmakefile
94
GNUmakefile
@@ -10,12 +10,14 @@ LD := $(CC)
|
||||
MV := mv
|
||||
RANLIB := ranlib
|
||||
CFLAGS += -pipe -Wall
|
||||
USE_SSL ?= NO
|
||||
USE_SSL ?= YES
|
||||
USE_PLUGINS ?= YES
|
||||
USE_BIGENDIAN ?= AUTO
|
||||
BITS ?= AUTO
|
||||
SILENT ?= YES
|
||||
TERSE ?= NO
|
||||
STACK_PROTECT ?= NO
|
||||
NEED_LIBDL ?= NO
|
||||
|
||||
ifeq ($(OS), Windows_NT)
|
||||
WINDOWS ?= YES
|
||||
@@ -32,6 +34,10 @@ ifeq ($(OPSYS),Haiku)
|
||||
LDLIBS += -lnetwork
|
||||
endif
|
||||
|
||||
ifeq ($(OPSYS),Linux)
|
||||
NEED_LIBDL = YES
|
||||
endif
|
||||
|
||||
CFLAGS += -I./src/
|
||||
|
||||
ifeq ($(OPSYS),Windows)
|
||||
@@ -116,10 +122,12 @@ endif
|
||||
|
||||
ifeq ($(USE_SSL),YES)
|
||||
CFLAGS += -DSSL_SUPPORT
|
||||
LDLIBS += -lssl
|
||||
LDLIBS += -lssl -lcrypto
|
||||
endif
|
||||
|
||||
ifeq ($(NEED_LIBDL),YES)
|
||||
LDLIBS += -ldl
|
||||
endif
|
||||
|
||||
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 "")
|
||||
@@ -128,6 +136,7 @@ OLD_REVISION=$(shell grep GIT_REVISION revision.h 2>/dev/null | cut -f 3 -d " "
|
||||
# Sources
|
||||
libuhub_SOURCES := \
|
||||
src/core/auth.c \
|
||||
src/core/command_parser.c \
|
||||
src/core/commands.c \
|
||||
src/core/config.c \
|
||||
src/core/eventqueue.c \
|
||||
@@ -147,7 +156,6 @@ libuhub_SOURCES := \
|
||||
src/network/connection.c \
|
||||
src/network/epoll.c \
|
||||
src/network/kqueue.c \
|
||||
src/network/network.c \
|
||||
src/network/select.c \
|
||||
src/network/timeout.c \
|
||||
src/network/timer.c
|
||||
@@ -158,6 +166,7 @@ libadc_common_SOURCES := \
|
||||
src/adc/sid.c
|
||||
|
||||
libutils_SOURCES := \
|
||||
src/util/cbuffer.c \
|
||||
src/util/config_token.c \
|
||||
src/util/credentials.c \
|
||||
src/util/floodctl.c \
|
||||
@@ -166,6 +175,7 @@ libutils_SOURCES := \
|
||||
src/util/log.c \
|
||||
src/util/memory.c \
|
||||
src/util/misc.c \
|
||||
src/network/network.c \
|
||||
src/util/rbtree.c \
|
||||
src/util/tiger.c
|
||||
|
||||
@@ -174,11 +184,15 @@ libadc_client_SOURCES := \
|
||||
|
||||
uhub_SOURCES := src/core/main.c
|
||||
|
||||
uhub-passwd_SOURCES := src/tools/uhub-passwd.c
|
||||
uhub-passwd_LIBS := -lsqlite3
|
||||
|
||||
adcrush_SOURCES := src/tools/adcrush.c
|
||||
|
||||
admin_SOURCES := src/tools/admin.c
|
||||
|
||||
autotest_SOURCES := \
|
||||
autotest/test_commands.tcc \
|
||||
autotest/test_credentials.tcc \
|
||||
autotest/test_eventqueue.tcc \
|
||||
autotest/test_hub.tcc \
|
||||
@@ -200,6 +214,9 @@ autotest_OBJECTS = autotest.o
|
||||
plugin_example_SOURCES := src/plugins/mod_example.c
|
||||
plugin_example_TARGET := mod_example.so
|
||||
|
||||
plugin_welcome_SOURCES := src/plugins/mod_welcome.c
|
||||
plugin_welcome_TARGET := mod_welcome.so
|
||||
|
||||
plugin_logging_SOURCES := src/plugins/mod_logging.c
|
||||
plugin_logging_TARGET := mod_logging.so
|
||||
|
||||
@@ -210,9 +227,15 @@ 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_SOURCES := src/plugins/mod_chat_history.c
|
||||
plugin_chat_history_TARGET := mod_chat_history.so
|
||||
|
||||
plugin_chat_only_SOURCES := src/plugins/mod_chat_only.c
|
||||
plugin_chat_only_TARGET := mod_chat_only.so
|
||||
|
||||
plugin_topic_SOURCES := src/plugins/mod_topic.c
|
||||
plugin_topic_TARGET := mod_topic.so
|
||||
|
||||
# Source to objects
|
||||
libuhub_OBJECTS := $(libuhub_SOURCES:.c=.o)
|
||||
libutils_OBJECTS := $(libutils_SOURCES:.c=.o)
|
||||
@@ -220,27 +243,50 @@ libadc_client_OBJECTS := $(libadc_client_SOURCES:.c=.o)
|
||||
libadc_common_OBJECTS := $(libadc_common_SOURCES:.c=.o)
|
||||
|
||||
uhub_OBJECTS := $(uhub_SOURCES:.c=.o)
|
||||
uhub-passwd_OBJECTS := $(uhub-passwd_SOURCES:.c=.o)
|
||||
adcrush_OBJECTS := $(adcrush_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_plugins := $(plugin_example_TARGET) $(plugin_logging_TARGET) $(plugin_auth_TARGET) $(plugin_auth_sqlite_TARGET) $(plugin_chat_history_TARGET)
|
||||
all_plugins := \
|
||||
$(plugin_example_TARGET) \
|
||||
$(plugin_logging_TARGET) \
|
||||
$(plugin_auth_TARGET) \
|
||||
$(plugin_auth_sqlite_TARGET) \
|
||||
$(plugin_welcome_TARGET) \
|
||||
$(plugin_chat_history_TARGET) \
|
||||
$(plugin_chat_only_TARGET) \
|
||||
$(plugin_topic_TARGET)
|
||||
|
||||
all_OBJECTS := \
|
||||
$(libuhub_OBJECTS) \
|
||||
$(uhub_OBJECTS) \
|
||||
$(libutils_OBJECTS) \
|
||||
$(adcrush_OBJECTS) \
|
||||
$(autotest_OBJECTS) \
|
||||
$(admin_OBJECTS) \
|
||||
$(libadc_common_OBJECTS) \
|
||||
$(libadc_client_OBJECTS)
|
||||
|
||||
all_OBJECTS += $(all_plugins)
|
||||
|
||||
uhub_BINARY=uhub$(BIN_EXT)
|
||||
uhub-passwd_BINARY=uhub-passwd$(BIN_EXT)
|
||||
adcrush_BINARY=adcrush$(BIN_EXT)
|
||||
admin_BINARY=uhub-admin$(BIN_EXT)
|
||||
autotest_BINARY=autotest/test$(BIN_EXT)
|
||||
|
||||
ifeq ($(USE_PLUGINS),YES)
|
||||
all_OBJECTS += $(plugins)
|
||||
endif
|
||||
|
||||
.PHONY: revision.h.tmp all plugins
|
||||
|
||||
%.o: %.c version.h revision.h
|
||||
$(MSG_CC) $(CC) -fPIC -c $(CFLAGS) -o $@ $<
|
||||
|
||||
all: $(uhub_BINARY)
|
||||
|
||||
#%.so: %.c
|
||||
# $(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
|
||||
|
||||
|
||||
all: $(uhub_BINARY) $(uhub-passwd_BINARY) plugins
|
||||
|
||||
plugins: $(uhub_BINARY) $(all_plugins)
|
||||
|
||||
@@ -248,17 +294,27 @@ $(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)
|
||||
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS) $(LDFLAGS) $(plugin_auth_sqlite_LIBS)
|
||||
|
||||
$(plugin_example_TARGET): $(plugin_example_SOURCES)
|
||||
$(plugin_example_TARGET): $(plugin_example_SOURCES) $(libutils_OBJECTS)
|
||||
$(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)
|
||||
$(plugin_chat_history_TARGET): $(plugin_chat_history_SOURCES) $(libutils_OBJECTS)
|
||||
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
|
||||
|
||||
$(plugin_chat_only_TARGET): $(plugin_chat_only_SOURCES) $(libutils_OBJECTS)
|
||||
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
|
||||
|
||||
$(plugin_welcome_TARGET): $(plugin_welcome_SOURCES) $(libutils_OBJECTS)
|
||||
$(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS)
|
||||
|
||||
$(plugin_topic_TARGET): $(plugin_topic_SOURCES) $(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)
|
||||
|
||||
@@ -268,6 +324,10 @@ $(admin_BINARY): $(admin_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libad
|
||||
$(uhub_BINARY): $(uhub_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS)
|
||||
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
|
||||
|
||||
$(uhub-passwd_BINARY): $(uhub-passwd_OBJECTS) src/util/misc.o src/util/list.o src/util/memory.o src/util/log.o
|
||||
$(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) $(uhub-passwd_LIBS)
|
||||
|
||||
|
||||
autotest.c: $(autotest_SOURCES)
|
||||
$(shell exotic --standalone $(autotest_SOURCES) > $@)
|
||||
|
||||
@@ -296,12 +356,12 @@ ifeq ($(WINDOWS),YES)
|
||||
install:
|
||||
@echo "Cannot install automatically on windows."
|
||||
else
|
||||
install: $(uhub_BINARY)
|
||||
install: all
|
||||
@echo Copying $(uhub_BINARY) to $(UHUB_PREFIX)/bin/
|
||||
@cp $(uhub_BINARY) $(UHUB_PREFIX)/bin/
|
||||
@cp $(uhub-passwd_BINARY) $(UHUB_PREFIX)/bin/
|
||||
@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)/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
|
||||
@@ -314,7 +374,5 @@ dist-clean:
|
||||
@rm -rf $(all_OBJECTS) *~ core
|
||||
|
||||
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) $(uhub-passwd_BINARY) $(admin_BINARY) $(autotest_BINARY) $(adcrush_BINARY) $(all_OBJECTS) $(all_plugins) autotest.c revision.h revision.h.tmp && \
|
||||
echo $(MSG_CLEAN)
|
||||
|
||||
|
||||
|
||||
2
README
2
README
@@ -4,5 +4,5 @@ For the official documentation, bugs and other information, please visit:
|
||||
http://www.uhub.org/
|
||||
|
||||
For a list of compatible ADC clients, see:
|
||||
http://www.adcportal.com/wiki/index.php/ADC_Software_List#Client_Software
|
||||
http://en.wikipedia.org/wiki/Advanced_Direct_Connect#Client_software
|
||||
|
||||
|
||||
243
autotest/test_commands.tcc
Normal file
243
autotest/test_commands.tcc
Normal file
@@ -0,0 +1,243 @@
|
||||
#include <uhub.h>
|
||||
|
||||
static struct hub_info* hub = NULL;
|
||||
static struct hub_command* cmd = NULL;
|
||||
static struct hub_user user;
|
||||
static struct command_base* cbase = NULL;
|
||||
static struct command_handle* c_test1 = NULL;
|
||||
static struct command_handle* c_test2 = NULL;
|
||||
static struct command_handle* c_test3 = NULL;
|
||||
static struct command_handle* c_test4 = NULL;
|
||||
static struct command_handle* c_test5 = NULL;
|
||||
static struct command_handle* c_test6 = NULL;
|
||||
static struct command_handle* c_test7 = NULL;
|
||||
|
||||
// for results:
|
||||
static int result = 0;
|
||||
|
||||
EXO_TEST(setup, {
|
||||
hub = hub_malloc_zero(sizeof(struct hub_info));
|
||||
cbase = command_initialize(hub);
|
||||
hub->commands = cbase;
|
||||
return cbase && hub && uman_init(hub) == 0;
|
||||
});
|
||||
|
||||
static int test_handler(struct command_base* cbase, struct hub_user* user, struct hub_command* hcmd)
|
||||
{
|
||||
printf("test_handler\n");
|
||||
result = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct command_handle* create_handler(const char* prefix, const char* args, enum auth_credentials cred)
|
||||
{
|
||||
struct command_handle* c = hub_malloc_zero(sizeof(struct command_handle));
|
||||
c->prefix = prefix;
|
||||
c->length = strlen(prefix);
|
||||
c->args = args;
|
||||
c->cred = cred;
|
||||
c->handler = test_handler;
|
||||
c->description = "A handler added by autotest.";
|
||||
c->origin = "exotic test";
|
||||
c->ptr = &c->ptr;
|
||||
return c;
|
||||
}
|
||||
|
||||
EXO_TEST(command_setup_user, {
|
||||
memset(&user, 0, sizeof(user));
|
||||
user.id.sid = 1;
|
||||
strcpy(user.id.nick, "tester");
|
||||
strcpy(user.id.cid, "3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY");
|
||||
user.credentials = auth_cred_guest;
|
||||
return 1;
|
||||
});
|
||||
|
||||
#define ADD_TEST(var, prefix, args, cred) \
|
||||
var = create_handler(prefix, args, cred); \
|
||||
if (!command_add(cbase, var, NULL)) \
|
||||
return 0;
|
||||
|
||||
#define DEL_TEST(var) \
|
||||
if (var) \
|
||||
{ \
|
||||
if (!command_del(cbase, var)) \
|
||||
return 0; \
|
||||
hub_free(var); \
|
||||
var = NULL; \
|
||||
}
|
||||
|
||||
EXO_TEST(command_create, {
|
||||
ADD_TEST(c_test1, "test1", "", auth_cred_guest);
|
||||
ADD_TEST(c_test2, "test2", "", auth_cred_operator);
|
||||
ADD_TEST(c_test3, "test3", "N?N?N", auth_cred_guest);
|
||||
ADD_TEST(c_test4, "test4", "u", auth_cred_guest);
|
||||
ADD_TEST(c_test5, "test5", "i", auth_cred_guest);
|
||||
ADD_TEST(c_test6, "test6", "?c", auth_cred_guest);
|
||||
ADD_TEST(c_test6, "test7", "C", auth_cred_guest);
|
||||
return 1;
|
||||
});
|
||||
|
||||
extern void command_destroy(struct hub_command* cmd);
|
||||
|
||||
static int verify(const char* str, enum command_parse_status expected)
|
||||
{
|
||||
struct hub_command* cmd = command_parse(cbase, hub, &user, str);
|
||||
enum command_parse_status status = cmd->status;
|
||||
command_free(cmd);
|
||||
return status == expected;
|
||||
}
|
||||
|
||||
static struct hub_command_arg_data* verify_argument(struct hub_command* cmd, enum hub_command_arg_type type)
|
||||
{
|
||||
return hub_command_arg_next(cmd, type);
|
||||
}
|
||||
|
||||
static int verify_arg_integer(struct hub_command* cmd, int expected)
|
||||
{
|
||||
struct hub_command_arg_data* data = verify_argument(cmd, type_integer);
|
||||
return data->data.integer == expected;
|
||||
}
|
||||
|
||||
static int verify_arg_user(struct hub_command* cmd, struct hub_user* expected)
|
||||
{
|
||||
struct hub_command_arg_data* data = verify_argument(cmd, type_user);
|
||||
return data->data.user == expected;
|
||||
}
|
||||
|
||||
static int verify_arg_cred(struct hub_command* cmd, enum auth_credentials cred)
|
||||
{
|
||||
struct hub_command_arg_data* data = verify_argument(cmd, type_credentials);
|
||||
return data->data.credentials == cred;
|
||||
}
|
||||
|
||||
|
||||
EXO_TEST(command_access_1, { return verify("!test1", cmd_status_ok); });
|
||||
EXO_TEST(command_access_2, { return verify("!test2", cmd_status_access_error); });
|
||||
EXO_TEST(command_access_3, { user.credentials = auth_cred_operator; return verify("!test2", cmd_status_ok); });
|
||||
|
||||
EXO_TEST(command_syntax_1, { return verify("", cmd_status_syntax_error); });
|
||||
EXO_TEST(command_syntax_2, { return verify("!", cmd_status_syntax_error); });
|
||||
|
||||
EXO_TEST(command_missing_args_1, { return verify("!test3", cmd_status_missing_args); });
|
||||
EXO_TEST(command_missing_args_2, { return verify("!test3 12345", cmd_status_ok); });
|
||||
EXO_TEST(command_missing_args_3, { return verify("!test3 1 2 345", cmd_status_ok); });
|
||||
EXO_TEST(command_number_1, { return verify("!test3 abc", cmd_status_arg_number); });
|
||||
EXO_TEST(command_number_2, { return verify("!test3 -", cmd_status_arg_number); });
|
||||
EXO_TEST(command_number_3, { return verify("!test3 -12", cmd_status_ok); });
|
||||
|
||||
EXO_TEST(command_user_1, { return verify("!test4 tester", cmd_status_arg_nick); });
|
||||
EXO_TEST(command_user_2, { return verify("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY", cmd_status_arg_cid); });
|
||||
EXO_TEST(command_user_3, { return uman_add(hub, &user) == 0; });
|
||||
EXO_TEST(command_user_4, { return verify("!test4 tester", cmd_status_ok); });
|
||||
EXO_TEST(command_user_5, { return verify("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY", cmd_status_ok); });
|
||||
|
||||
EXO_TEST(command_command_1, { return verify("!test6 test1", cmd_status_ok); });
|
||||
EXO_TEST(command_command_2, { return verify("!test6 test2", cmd_status_ok); });
|
||||
EXO_TEST(command_command_3, { return verify("!test6 test3", cmd_status_ok); });
|
||||
EXO_TEST(command_command_4, { return verify("!test6 test4", cmd_status_ok); });
|
||||
EXO_TEST(command_command_5, { return verify("!test6 test5", cmd_status_ok); });
|
||||
EXO_TEST(command_command_6, { return verify("!test6 test6", cmd_status_ok); });
|
||||
EXO_TEST(command_command_7, { return verify("!test6 fail", cmd_status_arg_command); });
|
||||
EXO_TEST(command_command_8, { return verify("!test6", cmd_status_ok); });
|
||||
|
||||
EXO_TEST(command_cred_1, { return verify("!test7 guest", cmd_status_ok); });
|
||||
EXO_TEST(command_cred_2, { return verify("!test7 user", cmd_status_ok); });
|
||||
EXO_TEST(command_cred_3, { return verify("!test7 operator", cmd_status_ok); });
|
||||
EXO_TEST(command_cred_4, { return verify("!test7 super", cmd_status_ok); });
|
||||
EXO_TEST(command_cred_5, { return verify("!test7 admin", cmd_status_ok); });
|
||||
EXO_TEST(command_cred_6, { return verify("!test7 nobody", cmd_status_arg_cred); });
|
||||
EXO_TEST(command_cred_7, { return verify("!test7 bot", cmd_status_ok); });
|
||||
EXO_TEST(command_cred_8, { return verify("!test7 link", cmd_status_ok); });
|
||||
|
||||
|
||||
#if 0
|
||||
cmd_status_arg_cred, /** <<< "A credentials argument is not valid ('C')" */
|
||||
};
|
||||
#endif
|
||||
|
||||
// command not found
|
||||
EXO_TEST(command_parse_3, { return verify("!fail", cmd_status_not_found); });
|
||||
|
||||
// built-in command
|
||||
EXO_TEST(command_parse_4, { return verify("!help", cmd_status_ok); });
|
||||
|
||||
|
||||
#define SETUP_COMMAND(string) \
|
||||
do { \
|
||||
if (cmd) command_free(cmd); \
|
||||
cmd = command_parse(cbase, hub, &user, string); \
|
||||
} while(0)
|
||||
|
||||
EXO_TEST(command_argument_integer_1, {
|
||||
SETUP_COMMAND("!test3");
|
||||
return verify_argument(cmd, type_integer) == NULL;
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_integer_2, {
|
||||
SETUP_COMMAND("!test3 10 42");
|
||||
return verify_arg_integer(cmd, 10) && verify_arg_integer(cmd, 42) && verify_argument(cmd, type_integer) == NULL;
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_integer_3, {
|
||||
SETUP_COMMAND("!test3 10 42 6784");
|
||||
return verify_arg_integer(cmd, 10) && verify_arg_integer(cmd, 42) && verify_arg_integer(cmd, 6784);
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_user_1, {
|
||||
SETUP_COMMAND("!test4 tester");
|
||||
return verify_arg_user(cmd, &user) ;
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_cid_1, {
|
||||
SETUP_COMMAND("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY");
|
||||
return verify_arg_user(cmd, &user) ;
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_cred_1, {
|
||||
SETUP_COMMAND("!test7 admin");
|
||||
return verify_arg_cred(cmd, auth_cred_admin);;
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_cred_2, {
|
||||
SETUP_COMMAND("!test7 op");
|
||||
return verify_arg_cred(cmd, auth_cred_operator);;
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_cred_3, {
|
||||
SETUP_COMMAND("!test7 operator");
|
||||
return verify_arg_cred(cmd, auth_cred_operator);
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_cred_4, {
|
||||
SETUP_COMMAND("!test7 super");
|
||||
return verify_arg_cred(cmd, auth_cred_super);
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_cred_5, {
|
||||
SETUP_COMMAND("!test7 guest");
|
||||
return verify_arg_cred(cmd, auth_cred_guest);
|
||||
});
|
||||
|
||||
EXO_TEST(command_argument_cred_6, {
|
||||
SETUP_COMMAND("!test7 user");
|
||||
return verify_arg_cred(cmd, auth_cred_user);
|
||||
});
|
||||
|
||||
#undef SETUP_COMMAND
|
||||
|
||||
EXO_TEST(command_user_destroy, { return uman_remove(hub, &user) == 0; });
|
||||
|
||||
EXO_TEST(command_destroy, {
|
||||
|
||||
command_free(cmd);
|
||||
cmd = NULL;
|
||||
|
||||
DEL_TEST(c_test1);
|
||||
DEL_TEST(c_test2);
|
||||
DEL_TEST(c_test3);
|
||||
DEL_TEST(c_test4);
|
||||
DEL_TEST(c_test5);
|
||||
DEL_TEST(c_test6);
|
||||
DEL_TEST(c_test7);
|
||||
return 1;
|
||||
});
|
||||
4
debian/changelog
vendored
4
debian/changelog
vendored
@@ -2,13 +2,13 @@ uhub (0.3.2-1) unstable; urgency=low
|
||||
|
||||
* Updated upstream version.
|
||||
|
||||
-- Jan Vidar Krey <janvidar@extatic.org> Mon 30 May 2010 18:00:00 +0200
|
||||
-- Jan Vidar Krey <janvidar@extatic.org> Mon, 30 May 2010 18:00:00 +0200
|
||||
|
||||
uhub (0.3.1-1) unstable; urgency=low
|
||||
|
||||
* Updated version number.
|
||||
|
||||
-- Jan Vidar Krey <janvidar@extatic.org> Mon 04 Apr 2010 16:44:21 +0200
|
||||
-- Jan Vidar Krey <janvidar@extatic.org> Mon, 04 Apr 2010 16:44:21 +0200
|
||||
|
||||
uhub (0.3.0-2) unstable; urgency=low
|
||||
|
||||
|
||||
2
debian/rules
vendored
2
debian/rules
vendored
@@ -24,7 +24,7 @@ binary-indep: build
|
||||
binary-arch: build
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_clean -k
|
||||
dh_prep
|
||||
dh_installdirs
|
||||
$(MAKE) install $(makeopts)
|
||||
dh_installdocs
|
||||
|
||||
9
debian/uhub.init
vendored
9
debian/uhub.init
vendored
@@ -5,7 +5,8 @@
|
||||
# Required-Stop: $remote_fs $network
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: uhub - High performance ADC p2p hub.
|
||||
# Short-Description: Start daemon at boot time
|
||||
# Description: Enable service provided by daemon.
|
||||
### END INIT INFO
|
||||
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
@@ -83,8 +84,12 @@ case "$1" in
|
||||
$0 start
|
||||
;;
|
||||
|
||||
status)
|
||||
status_of_proc $DAEMON $NAME && exit 0 || exit $?
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
||||
echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload|status}" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
1
debian/uhub.manpages
vendored
1
debian/uhub.manpages
vendored
@@ -1 +1,2 @@
|
||||
doc/uhub.1
|
||||
doc/uhub-passwd.1
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
= Architecture of uHub =
|
||||
|
||||
uHub is single threaded and handles network and timer events using the
|
||||
uHub is single-threaded and handles network and timer events using the
|
||||
libevent library.
|
||||
For each state there is a read event (and sometimes a write event) and timeout
|
||||
event in case an expected read (or write) event does not occur.
|
||||
|
||||
|
||||
== Protocol overview ==
|
||||
uHub use "speak" the ADC protocol, which works in short as follows:
|
||||
uHub "speaks" the ADC protocol, which works in short as follows:
|
||||
(C = client, S = server aka uHub).
|
||||
|
||||
C: HSUP ADBASE
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
How to compile:
|
||||
---------------
|
||||
|
||||
See the official compiling howto: http://www.extatic.org/uhub/compile.html
|
||||
See the official compiling howto: http://www.uhub.org/compile.php
|
||||
|
||||
Prerequisites
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ The hub should send a packet containing the token back:
|
||||
'IECH {token} {host:port}', aswell as the same message via TCP.
|
||||
|
||||
If the client receives the message via UDP, it should now be able to determine the type of NAT.
|
||||
If the client receives the message via TCP only it knows it has a firewall blocking icomming communication.
|
||||
If the client receives the message via TCP only it knows it has a firewall blocking incomming communication.
|
||||
If the client does not receive the message, it should assume a firewall is blocking all UDP communication,
|
||||
and resume in passive mode.
|
||||
|
||||
|
||||
@@ -1,16 +1,62 @@
|
||||
# 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}
|
||||
|
||||
# Sqlite based user authentication.
|
||||
#
|
||||
# This plugin provides a Sqlite based authentication database for
|
||||
# registered users.
|
||||
# Use the uhub-passwd utility to create the database and add/remove users.
|
||||
#
|
||||
# Parameters:
|
||||
# file: path/filename for database.
|
||||
#
|
||||
plugin /var/lib/uhub/mod_auth_sqlite.so "file=/etc/uhub/users.db"
|
||||
|
||||
# log subsystem.
|
||||
# file={/path/to/logfile}
|
||||
|
||||
# Log file writer
|
||||
#
|
||||
# Parameters:
|
||||
# file: path/filename for log file.
|
||||
# syslog: if true then syslog is used instead of writing to a file (Unix only)
|
||||
plugin /var/lib/uhub/mod_logging.so "file=/var/log/uhub.log"
|
||||
|
||||
#
|
||||
# plugin /var/lib/uhub/mod_auth_simple.so
|
||||
|
||||
#
|
||||
# A simple example plugin
|
||||
# plugin /var/lib/uhub/mod_example.so
|
||||
# A plugin sending a welcome message.
|
||||
#
|
||||
# This plugin provides the following commands:
|
||||
# !motd - Message of the day
|
||||
# !rules - Show hub rules.
|
||||
#
|
||||
# Parameters:
|
||||
# motd: path/filename for the welcome message (message of the day)
|
||||
# rules: path/filenam for the rules file
|
||||
#
|
||||
# NOTE: The files MUST exist, however if you do not wish to provide one then these parameters can be omitted.
|
||||
#
|
||||
# The motd/rules files can do the following substitutions:
|
||||
# %n - Nickname of the user who entered the hub or issued the command.
|
||||
# %a - IP address of the user
|
||||
# %c - The credentials of the user (guest, user, op, super, admin).
|
||||
# %% - Becomes '%'
|
||||
# %H - Hour 24-hour format (00-23) (Hub local time)
|
||||
# %I - Hour 12-hour format (01-12) (Hub local time)
|
||||
# %P - 'AM' or 'PM'
|
||||
# %p - 'am' or 'pm'
|
||||
# %M - Minutes (00-59) (Hub local time)
|
||||
# %S - Seconds (00-60) (Hub local time)
|
||||
plugin /var/lib/uhub/mod_welcome.so "motd=/etc/uhub/motd.txt rules=/etc/uhub/rules.txt"
|
||||
|
||||
# Load the chat history plugin.
|
||||
#
|
||||
# This plugin provides chat history when users are connecting, or
|
||||
# when users invoke the !history command.
|
||||
# The history command can optionally take a parameter to indicate how many lines of history is requested.
|
||||
#
|
||||
# Parameters:
|
||||
# history_max: the maximum number of messages to keep in history
|
||||
# history_default: when !history is provided without arguments, then this default number of messages are returned.
|
||||
# history_connect: the number of chat history messages to send when users connect (0 = do not send any history)
|
||||
plugin /var/lib/uhub/mod_chat_history.so "history_max=200 history_default=10 history_connect=5"
|
||||
|
||||
|
||||
42
doc/uhub-passwd.1
Normal file
42
doc/uhub-passwd.1
Normal file
@@ -0,0 +1,42 @@
|
||||
.TH UHUB-PASSWD "1" "May 2012"
|
||||
.SH NAME
|
||||
uhub-passwd \- small utility for manipulating passwords which are
|
||||
used by uhub daemon
|
||||
.SH SYNOPSIS
|
||||
.B uhub-passwd
|
||||
\fIfilename command \fR[...]
|
||||
.SH DESCRIPTION
|
||||
uHub is a high performance peer-to-peer hub for the ADC network.
|
||||
Its low memory footprint allows it to handle several thousand users
|
||||
on high-end servers, or a small private hub on embedded hardware.
|
||||
.SH "OPTIONS"
|
||||
.TP
|
||||
.BI \^create
|
||||
.TP
|
||||
.BI \^add " username password [credentials = user]"
|
||||
.TP
|
||||
.BI \^del " username"
|
||||
.TP
|
||||
.BI \^mod " username credentials"
|
||||
.TP
|
||||
.BI \^pass " username password"
|
||||
.TP
|
||||
.BI \^list
|
||||
.SH "PARAMETERS"
|
||||
.TP
|
||||
.B 'filename'
|
||||
is a database file
|
||||
.TP
|
||||
.B 'username'
|
||||
is a nickname (UTF\-8, up to 64 bytes)
|
||||
.TP
|
||||
.B 'password'
|
||||
is a password (UTF\-8, up to 64 bytes)
|
||||
.TP
|
||||
.B 'credentials'
|
||||
is one of 'admin', 'super', 'op', 'user'
|
||||
.SH AUTHOR
|
||||
This program was written by Jan Vidar Krey <janvidar@extatic.org>
|
||||
.SH "BUG REPORTS"
|
||||
If you find a bug in uhub please report it to
|
||||
.B http://bugs.extatic.org/
|
||||
@@ -23,7 +23,7 @@ on high-end servers, or a small private hub on embedded hardware.
|
||||
.SH "OPTIONS"
|
||||
.TP
|
||||
.BI \^\-v
|
||||
Verbose mode, add more -v's for higher verbosity.
|
||||
Verbose mode, add more \-v's for higher verbosity.
|
||||
.TP
|
||||
.BI \^\-q
|
||||
Quiet mode, if quiet mode is enabled no output or logs are made.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# uhub.conf - A example configuration file.
|
||||
# You should normally place this file in /etc/uhub/uhub.conf
|
||||
# And change the file_acl and file_motd below.
|
||||
# and customize some of the settings below.
|
||||
#
|
||||
# This file is read only to the uhub deamon, and if you
|
||||
# make changes to it while uhub is running you can send a
|
||||
@@ -38,17 +38,6 @@ hub_enabled=1
|
||||
# Access control list (user database)
|
||||
file_acl=/etc/uhub/users.conf
|
||||
|
||||
# This file can contain a message of the day. A welcome
|
||||
# message send to any client when connecting.
|
||||
# If the file does not exist, is empty, or cannot be opened
|
||||
# the motd will not be sent to the clients.
|
||||
# Normally this message is sent to clients when connecting.
|
||||
file_motd=/etc/uhub/motd.txt
|
||||
|
||||
# This file can contain a rules of the hub.
|
||||
# Normally this message is sent to clients when write in chat !rules
|
||||
file_rules=/etc/uhub/rules.txt
|
||||
|
||||
# This file can contain a conf for plugin subsystem
|
||||
file_plugins = /etc/uhub/plugins.conf
|
||||
|
||||
@@ -84,9 +73,6 @@ flood_ctl_extras=5
|
||||
# if chat_is_privileged=yes only registered users may write in main chat
|
||||
chat_is_privileged = no
|
||||
|
||||
# if chat_only = yes then search and transfer functionality is disabled for
|
||||
# non-operator users.
|
||||
chat_only = no
|
||||
|
||||
# if obsolete_clients=1 allows old clients to enter , 0 gives an error message (msg_proto_obsolete_adc0) if they try connect
|
||||
# defaults obsolete_clients=1
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Summary: High performance ADC p2p hub.
|
||||
Name: uhub
|
||||
Version: 0.4.0
|
||||
Release: 1
|
||||
Release: 2
|
||||
License: GPLv3
|
||||
Group: Networking/File transfer
|
||||
Source: uhub-%{version}.tar.gz
|
||||
@@ -9,6 +9,7 @@ URL: http://www.uhub.org
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
|
||||
|
||||
BuildRequires: sqlite-devel
|
||||
BuildRequires: openssl-devel
|
||||
|
||||
%description
|
||||
uhub is a high performance peer-to-peer hub for the ADC network.
|
||||
@@ -22,6 +23,9 @@ Key features:
|
||||
- Advanced access control support
|
||||
- Easy configuration
|
||||
- plugin support
|
||||
- mod_welcome - MOTD\RULES messages
|
||||
- mod_auth_sipmle - auth with sqlite DB
|
||||
- mod_logging - log hub activity
|
||||
|
||||
%prep
|
||||
%setup -q -n %{name}-%{version}
|
||||
@@ -40,8 +44,9 @@ 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-passwd $RPM_BUILD_ROOT/usr/bin/
|
||||
> 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 doc/plugins.conf doc/users.db $RPM_BUILD_ROOT/etc/uhub
|
||||
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/logrotate.d/uhub $RPM_BUILD_ROOT/etc/logrotate.d/
|
||||
@@ -59,6 +64,7 @@ install -m644 mod_*.so $RPM_BUILD_ROOT/var/lib/uhub
|
||||
%config(noreplace) %{_sysconfdir}/uhub/motd.txt
|
||||
%config(noreplace) %{_sysconfdir}/uhub/rules.txt
|
||||
%config(noreplace) %{_sysconfdir}/uhub/plugins.conf
|
||||
%config(noreplace) %{_sysconfdir}/uhub/users.db
|
||||
%{_sysconfdir}/init.d/uhub
|
||||
%config(noreplace) %{_sysconfdir}/logrotate.d/uhub
|
||||
%config(noreplace) %{_sysconfdir}/sysconfig/uhub
|
||||
@@ -76,9 +82,14 @@ if [ $1 -gt 1 ] ; then
|
||||
fi
|
||||
# need more informations about add services and users in system
|
||||
/usr/sbin/adduser -M -d /tmp -G nobody -s /sbin/nologin -c 'The Uhub ADC p2p hub Daemon' uhub >/dev/null 2>&1 ||:
|
||||
# write SSL create
|
||||
echo "PLS see /usr/share/doc/uhub/"
|
||||
|
||||
%changelog
|
||||
* Tue Jun 26 2001 E_zombie
|
||||
* Fri Dec 30 2011 E_zombie
|
||||
- add users.db
|
||||
- add new doc
|
||||
* Tue Jun 26 2010 E_zombie
|
||||
- add plugins.conf
|
||||
* Tue Jan 31 2010 E_zombie
|
||||
- change GROUP
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2009, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2012, 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
|
||||
@@ -64,6 +64,11 @@ typedef uint32_t fourcc_t;
|
||||
#define ADC_CMD_FSCH FOURCC('F','S','C','H')
|
||||
#define ADC_CMD_DRES FOURCC('D','R','E','S')
|
||||
|
||||
/* invalid search results (spam) */
|
||||
#define ADC_CMD_BRES FOURCC('B','R','E','S')
|
||||
#define ADC_CMD_ERES FOURCC('E','R','E','S')
|
||||
#define ADC_CMD_FRES FOURCC('F','R','E','S')
|
||||
|
||||
/* connection setup */
|
||||
#define ADC_CMD_DCTM FOURCC('D','C','T','M')
|
||||
#define ADC_CMD_DRCM FOURCC('D','R','C','M')
|
||||
@@ -80,6 +85,10 @@ typedef uint32_t fourcc_t;
|
||||
#define ADC_CMD_DINF FOURCC('D','I','N','F')
|
||||
#define ADC_CMD_EINF FOURCC('E','I','N','F')
|
||||
#define ADC_CMD_FINF FOURCC('F','I','N','F')
|
||||
#define ADC_CMD_BQUI FOURCC('B','Q','U','I')
|
||||
#define ADC_CMD_DQUI FOURCC('D','Q','U','I')
|
||||
#define ADC_CMD_EQUI FOURCC('E','Q','U','I')
|
||||
#define ADC_CMD_FQUI FOURCC('F','Q','U','I')
|
||||
|
||||
/* Extension messages */
|
||||
#define ADC_CMD_HCHK FOURCC('H','C','H','K')
|
||||
|
||||
@@ -127,7 +127,7 @@ static int adc_msg_cache_append(struct adc_message* msg, const char* string, siz
|
||||
memcpy(&msg->cache[msg->length], string, len);
|
||||
adc_msg_set_length(msg, msg->length + len);
|
||||
|
||||
assert(msg->capacity > msg->length);
|
||||
uhub_assert(msg->capacity > msg->length);
|
||||
msg->cache[msg->length] = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -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 n;
|
||||
|
||||
if (pool->count >= (pool->max - pool->min))
|
||||
{
|
||||
#ifdef DEBUG_SID
|
||||
@@ -129,8 +128,7 @@ sid_t sid_alloc(struct sid_pool* pool, struct hub_user* user)
|
||||
return 0;
|
||||
}
|
||||
|
||||
n = ++pool->count;
|
||||
|
||||
n = (++pool->count);
|
||||
for (; (pool->map[n % pool->max]); n++) ;
|
||||
|
||||
#ifdef DEBUG_SID
|
||||
|
||||
@@ -26,12 +26,10 @@
|
||||
static int check_cmd_bool(const char* cmd, struct linked_list* list, char* line, int line_count)
|
||||
{
|
||||
char* data;
|
||||
char* data_extra;
|
||||
|
||||
if (!strncmp(line, cmd, strlen(cmd)))
|
||||
{
|
||||
data = &line[strlen(cmd)];
|
||||
data_extra = 0;
|
||||
data[0] = '\0';
|
||||
data++;
|
||||
|
||||
@@ -88,6 +86,7 @@ static int check_cmd_user(const char* cmd, int status, struct linked_list* list,
|
||||
}
|
||||
|
||||
strncpy(info->nickname, data, MAX_NICK_LEN);
|
||||
if (data_extra)
|
||||
strncpy(info->password, data_extra, MAX_PASS_LEN);
|
||||
info->credentials = status;
|
||||
list_append(list, info);
|
||||
@@ -288,35 +287,24 @@ int acl_shutdown(struct acl_handle* handle)
|
||||
|
||||
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)
|
||||
{
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
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';
|
||||
@@ -327,16 +315,11 @@ extern int acl_delete_user(struct hub_info* hub, const char* name)
|
||||
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)
|
||||
{
|
||||
@@ -344,18 +327,6 @@ struct auth_info* acl_get_access_info(struct hub_info* hub, const char* name)
|
||||
return NULL;
|
||||
}
|
||||
return info;
|
||||
#else
|
||||
info = (struct auth_info*) list_get_first(hub->acl->users);
|
||||
while (info)
|
||||
{
|
||||
if (strcasecmp((char*)info->nickname, name) == 0)
|
||||
{
|
||||
return info;
|
||||
}
|
||||
info = (struct auth_info*) list_get_next(hub->acl->users);
|
||||
}
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
#define STR_LIST_CONTAINS(LIST, STR) \
|
||||
@@ -513,9 +484,7 @@ int acl_password_verify(struct hub_info* hub, struct hub_user* user, const char*
|
||||
base32_encode((unsigned char*) tiger_res, TIGERSIZE, password_calc);
|
||||
password_calc[MAX_CID_LEN] = 0;
|
||||
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
hub_free(access);
|
||||
#endif
|
||||
|
||||
if (strcasecmp(password, password_calc) == 0)
|
||||
{
|
||||
|
||||
298
src/core/command_parser.c
Normal file
298
src/core/command_parser.c
Normal file
@@ -0,0 +1,298 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, 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"
|
||||
|
||||
static void hub_command_args_free(struct hub_command* cmd)
|
||||
{
|
||||
struct hub_command_arg_data* data = NULL;
|
||||
|
||||
if (!cmd->args)
|
||||
return;
|
||||
|
||||
for (data = (struct hub_command_arg_data*) list_get_first(cmd->args); data; data = (struct hub_command_arg_data*) list_get_next(cmd->args))
|
||||
{
|
||||
switch (data->type)
|
||||
{
|
||||
case type_string:
|
||||
hub_free(data->data.string);
|
||||
break;
|
||||
case type_range:
|
||||
hub_free(data->data.range);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
list_clear(cmd->args, hub_free);
|
||||
list_destroy(cmd->args);
|
||||
cmd->args = NULL;
|
||||
}
|
||||
|
||||
void command_free(struct hub_command* cmd)
|
||||
{
|
||||
if (!cmd) return;
|
||||
|
||||
hub_free(cmd->prefix);
|
||||
hub_command_args_free(cmd);
|
||||
hub_free(cmd);
|
||||
}
|
||||
|
||||
static enum command_parse_status command_extract_arguments(struct hub_info* hub, const struct hub_user* user, struct command_handle* command, struct linked_list* tokens, struct linked_list* args)
|
||||
{
|
||||
int arg = 0;
|
||||
int opt = 0;
|
||||
int greedy = 0;
|
||||
char arg_code;
|
||||
char* token = NULL;
|
||||
char* tmp = NULL;
|
||||
size_t size = 0;
|
||||
struct hub_command_arg_data* data = NULL;
|
||||
enum command_parse_status status = cmd_status_ok;
|
||||
|
||||
// Ignore the first token since it is the prefix.
|
||||
token = list_get_first(tokens);
|
||||
list_remove(tokens, token);
|
||||
hub_free(token);
|
||||
|
||||
while (status == cmd_status_ok && (arg_code = command->args[arg++]))
|
||||
{
|
||||
if (greedy)
|
||||
{
|
||||
size = 1;
|
||||
for (tmp = (char*) list_get_first(tokens); tmp; tmp = (char*) list_get_next(tokens))
|
||||
size += (strlen(tmp) + 1);
|
||||
token = hub_malloc_zero(size);
|
||||
|
||||
while ((tmp = list_get_first(tokens)))
|
||||
{
|
||||
if (*token)
|
||||
strcat(token, " ");
|
||||
strcat(token, tmp);
|
||||
list_remove(tokens, tmp);
|
||||
hub_free(tmp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
token = list_get_first(tokens);
|
||||
}
|
||||
|
||||
if (!token || !*token)
|
||||
{
|
||||
if (arg_code == '?' || opt == 1)
|
||||
status = cmd_status_ok;
|
||||
else
|
||||
status = cmd_status_missing_args;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (arg_code)
|
||||
{
|
||||
case '?':
|
||||
opt = 1;
|
||||
continue;
|
||||
|
||||
case '+':
|
||||
greedy = 1;
|
||||
continue;
|
||||
|
||||
case 'u':
|
||||
data = hub_malloc(sizeof(*data));
|
||||
data->type = type_user;
|
||||
data->data.user = uman_get_user_by_nick(hub, token);
|
||||
if (!data->data.user)
|
||||
{
|
||||
hub_free(data);
|
||||
data = NULL;
|
||||
status = cmd_status_arg_nick;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
data = hub_malloc(sizeof(*data));
|
||||
data->type = type_user;
|
||||
data->data.user = uman_get_user_by_cid(hub, token);
|
||||
if (!data->data.user)
|
||||
{
|
||||
hub_free(data);
|
||||
data = NULL;
|
||||
status = cmd_status_arg_cid;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
data = hub_malloc(sizeof(*data));
|
||||
data->type = type_address;
|
||||
if (ip_convert_to_binary(token, data->data.address) == -1)
|
||||
{
|
||||
hub_free(data);
|
||||
data = NULL;
|
||||
status = cmd_status_arg_address;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
data = hub_malloc(sizeof(*data));
|
||||
data->type = type_range;
|
||||
data->data.range = hub_malloc_zero(sizeof(struct ip_range));
|
||||
if (!ip_convert_address_to_range(token, data->data.range))
|
||||
{
|
||||
hub_free(data->data.range);
|
||||
hub_free(data);
|
||||
data = NULL;
|
||||
status = cmd_status_arg_address;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
case 'm':
|
||||
case 'p':
|
||||
data = hub_malloc(sizeof(*data));
|
||||
data->type = type_string;
|
||||
data->data.string = strdup(token);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
data = hub_malloc(sizeof(*data));
|
||||
data->type = type_command;
|
||||
data->data.command = command_handler_lookup(hub->commands, token);
|
||||
if (!data->data.command)
|
||||
{
|
||||
hub_free(data);
|
||||
data = NULL;
|
||||
status = cmd_status_arg_command;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
data = hub_malloc(sizeof(*data));
|
||||
data->type = type_credentials;
|
||||
if (!auth_string_to_cred(token, &data->data.credentials))
|
||||
{
|
||||
hub_free(data);
|
||||
data = NULL;
|
||||
status = cmd_status_arg_cred;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'N':
|
||||
data = hub_malloc(sizeof(*data));
|
||||
data->type = type_integer;
|
||||
if (!is_number(token, &data->data.integer))
|
||||
{
|
||||
hub_free(data);
|
||||
data = NULL;
|
||||
status = cmd_status_arg_number;
|
||||
}
|
||||
break;
|
||||
|
||||
case '\0':
|
||||
if (!opt)
|
||||
{
|
||||
status = cmd_status_missing_args;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = cmd_status_ok;
|
||||
}
|
||||
}
|
||||
|
||||
if (data)
|
||||
{
|
||||
list_append(args, data);
|
||||
data = NULL;
|
||||
}
|
||||
|
||||
list_remove(tokens, token);
|
||||
hub_free(token);
|
||||
}
|
||||
|
||||
hub_free(data);
|
||||
return status;
|
||||
}
|
||||
|
||||
static struct command_handle* command_get_handler(struct command_base* cbase, const char* prefix, const struct hub_user* user, struct hub_command* cmd)
|
||||
{
|
||||
struct command_handle* handler = NULL;
|
||||
uhub_assert(cmd != NULL);
|
||||
|
||||
if (prefix && prefix[0] && prefix[1])
|
||||
{
|
||||
handler = command_handler_lookup(cbase, prefix + 1);
|
||||
if (handler)
|
||||
{
|
||||
cmd->ptr = handler->ptr;
|
||||
cmd->handler = handler->handler;
|
||||
cmd->status = command_is_available(handler, user->credentials) ? cmd_status_ok : cmd_status_access_error;
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd->status = cmd_status_not_found;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd->status = cmd_status_syntax_error;
|
||||
}
|
||||
return handler;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse a command and break it down into a struct hub_command.
|
||||
*/
|
||||
struct hub_command* command_parse(struct command_base* cbase, struct hub_info* hub, const struct hub_user* user, const char* message)
|
||||
{
|
||||
struct linked_list* tokens = list_create();
|
||||
struct hub_command* cmd = NULL;
|
||||
struct command_handle* handle = NULL;
|
||||
|
||||
cmd = hub_malloc_zero(sizeof(struct hub_command));
|
||||
cmd->status = cmd_status_ok;
|
||||
cmd->message = message;
|
||||
cmd->prefix = NULL;
|
||||
cmd->args = list_create();
|
||||
cmd->user = user;
|
||||
|
||||
if (split_string(message, " ", tokens, 0) <= 0)
|
||||
{
|
||||
cmd->status = cmd_status_syntax_error;
|
||||
goto command_parse_cleanup;
|
||||
}
|
||||
|
||||
// Setup hub command.
|
||||
cmd->prefix = strdup(((char*) list_get_first(tokens)) + 1);
|
||||
|
||||
// Find a matching command handler
|
||||
handle = command_get_handler(cbase, list_get_first(tokens), user, cmd);
|
||||
if (cmd->status != cmd_status_ok)
|
||||
goto command_parse_cleanup;
|
||||
|
||||
// Parse arguments
|
||||
cmd->status = command_extract_arguments(hub, user, handle, tokens, cmd->args);
|
||||
goto command_parse_cleanup;
|
||||
|
||||
command_parse_cleanup:
|
||||
list_clear(tokens, &hub_free);
|
||||
list_destroy(tokens);
|
||||
return cmd;
|
||||
}
|
||||
|
||||
131
src/core/command_parser.h
Normal file
131
src/core/command_parser.h
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, 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_COMMAND_PARSER_H
|
||||
#define HAVE_UHUB_COMMAND_PARSER_H
|
||||
|
||||
struct hub_command;
|
||||
struct hub_user;
|
||||
struct command_base;
|
||||
|
||||
/**
|
||||
* Parse a message as a command and return a status indicating if the command
|
||||
* is valid and that the arguments are sane.
|
||||
*
|
||||
* @param cbase Command base pointer.
|
||||
* @param user User who invoked the command.
|
||||
* @param message The message that is to be interpreted as a command (including the invokation prefix '!' or '+')
|
||||
*
|
||||
* @return a hub_command that must be freed with command_free(). @See struct hub_command.
|
||||
*/
|
||||
extern struct hub_command* command_parse(struct command_base* cbase, struct hub_info* hub, const struct hub_user* user, const char* message);
|
||||
|
||||
/**
|
||||
* Free a hub_command that was created in command_parse().
|
||||
*/
|
||||
extern void command_free(struct hub_command* command);
|
||||
|
||||
|
||||
enum command_parse_status
|
||||
{
|
||||
cmd_status_ok, /** <<< "Everything seems to OK" */
|
||||
cmd_status_not_found, /** <<< "Command was not found" */
|
||||
cmd_status_access_error, /** <<< "You don't have access to this command" */
|
||||
cmd_status_syntax_error, /** <<< "Not a valid command." */
|
||||
cmd_status_missing_args, /** <<< "Missing some or all required arguments." */
|
||||
cmd_status_arg_nick, /** <<< "A nick argument does not match an online user. ('n')" */
|
||||
cmd_status_arg_cid, /** <<< "A cid argument does not match an online user. ('i')." */
|
||||
cmd_status_arg_address, /** <<< "A address range argument is not valid ('a')." */
|
||||
cmd_status_arg_number, /** <<< "A number argument is not valid ('N')" */
|
||||
cmd_status_arg_cred, /** <<< "A credentials argument is not valid ('C')" */
|
||||
cmd_status_arg_command, /** <<< "A command argument is not valid ('c')" */
|
||||
};
|
||||
|
||||
enum hub_command_arg_type
|
||||
{
|
||||
type_integer,
|
||||
type_string,
|
||||
type_user,
|
||||
type_address,
|
||||
type_range,
|
||||
type_credentials,
|
||||
type_command
|
||||
};
|
||||
|
||||
struct hub_command_arg_data
|
||||
{
|
||||
enum hub_command_arg_type type;
|
||||
union {
|
||||
int integer;
|
||||
char* string;
|
||||
struct hub_user* user;
|
||||
struct ip_addr_encap* address;
|
||||
struct ip_range* range;
|
||||
enum auth_credentials credentials;
|
||||
struct command_handle* command;
|
||||
} data;
|
||||
};
|
||||
|
||||
typedef int (*command_handler)(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd);
|
||||
|
||||
/**
|
||||
* This struct contains all information needed to invoke
|
||||
* a command, which includes the whole message, the prefix,
|
||||
* the decoded arguments (according to parameter list), and
|
||||
* the user pointer (ptr) which comes from the command it was matched to.
|
||||
*
|
||||
* The message and prefix is generally always available, but args only
|
||||
* if status == cmd_status_ok.
|
||||
* Handler and ptr are NULL if status == cmd_status_not_found, or status == cmd_status_access_error.
|
||||
* Ptr might also be NULL if cmd_status_ok because the command that handles it was added with a NULL ptr.
|
||||
*/
|
||||
struct hub_command
|
||||
{
|
||||
const char* message; /**<<< "The complete message." */
|
||||
char* prefix; /**<<< "The prefix extracted from the message." */
|
||||
struct linked_list* args; /**<<< "List of arguments of type struct hub_command_arg_data. Parsed from message." */
|
||||
enum command_parse_status status; /**<<< "Status of the parsed hub_command." */
|
||||
command_handler handler; /**<<< "The function handler to call in order to invoke this command." */
|
||||
const struct hub_user* user; /**<<< "The user who invoked this command." */
|
||||
void* ptr; /**<<< "A pointer of data which came from struct command_handler" */
|
||||
};
|
||||
|
||||
/**
|
||||
* Reset the command argument iterator and return the number of arguments
|
||||
* that can be extracted from a parsed command.
|
||||
*
|
||||
* @param cmd the command to start iterating arguments
|
||||
* @return returns the number of arguments provided for the command
|
||||
*/
|
||||
extern size_t hub_command_arg_reset(struct hub_command* cmd);
|
||||
|
||||
/**
|
||||
* Obtain the current argument and place it in data and increments the iterator.
|
||||
* If no argument exists, or the argument is of a different type than \param type, then 0 is returned.
|
||||
*
|
||||
* NOTE: when calling hub_command_arg_next the first time during a command callback it is safe to assume
|
||||
* that the first argument will be extracted. Thus you don't need to call hub_command_arg_reset().
|
||||
*
|
||||
* @param cmd the command used for iterating arguments.
|
||||
* @param type the expected type of this argument
|
||||
* @return NULL if no argument is found or if the argument found does not match the expected type.
|
||||
*/
|
||||
extern struct hub_command_arg_data* hub_command_arg_next(struct hub_command* cmd, enum hub_command_arg_type type);
|
||||
|
||||
#endif /* HAVE_UHUB_COMMAND_PARSER_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2011, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2012, 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
|
||||
@@ -17,28 +17,22 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "uhub.h"
|
||||
#ifndef HAVE_UHUB_COMMANDS_H
|
||||
#define HAVE_UHUB_COMMANDS_H
|
||||
|
||||
struct command_base;
|
||||
|
||||
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*);
|
||||
|
||||
struct command_handle;
|
||||
struct hub_command;
|
||||
|
||||
/**
|
||||
* Argument codes are used to automatically parse arguments
|
||||
* for a a hub command.
|
||||
*
|
||||
* n = nick name (must exist in hub session)
|
||||
* u = user (must exist in hub session, or will cause error)
|
||||
* n = nick name (string)
|
||||
* i = CID (must exist in hub)
|
||||
* a = (IP) address (must be a valid IPv4 or IPv6 address)
|
||||
* r = (IP) address range (either: IP-IP or IP/mask, both IPv4 or IPv6 work)
|
||||
* m = message (string)
|
||||
* p = password (string)
|
||||
* C = credentials (see auth_string_to_cred).
|
||||
@@ -46,12 +40,17 @@ typedef int (*command_handler)(struct command_base*, struct hub_user* user, stru
|
||||
* 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.
|
||||
* Prefix with + to make the argument greedy, which causes it to grab the rest of the line ignoring boundaries (only supported for string types).
|
||||
*
|
||||
* NOTE: if an argument is optional then all following arguments must also be optional.
|
||||
* NOTE: You can combine optional and greedy, example: "?+m" would match "", "a", "a b c", etc.
|
||||
*
|
||||
* Example:
|
||||
* "nia" means "nick cid ip"
|
||||
* "n?p" means "nick [password]" where password is optional.
|
||||
*
|
||||
* "?N?N" means zero, one, or two integers.
|
||||
* "?NN" means zero or two integers.
|
||||
* "?+m" means an optional string which may contain spaces that would otherwise be split into separate arguments.
|
||||
*/
|
||||
struct command_handle
|
||||
{
|
||||
@@ -61,7 +60,8 @@ struct command_handle
|
||||
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." */
|
||||
const char* origin; /**<<< "Name of module where the command is implemented." */
|
||||
void* ptr; /**<<< "A pointer which will be passed along to the handler. @See hub_command::ptr" */
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -74,7 +74,7 @@ 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*);
|
||||
extern int command_add(struct command_base*, struct command_handle*, void* ptr);
|
||||
|
||||
/**
|
||||
* Remove a command from the command base.
|
||||
@@ -82,11 +82,6 @@ extern int command_add(struct command_base*, struct command_handle*);
|
||||
*/
|
||||
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
|
||||
@@ -96,3 +91,19 @@ extern int command_is_available(struct command_handle*, struct hub_user* user);
|
||||
* for that command if the sufficient access credentials are met.
|
||||
*/
|
||||
extern int command_invoke(struct command_base*, struct hub_user* user, const char* message);
|
||||
|
||||
/**
|
||||
* Returns 1 if the command handle can be used with the given credentials, 0 otherwise.
|
||||
*/
|
||||
int command_is_available(struct command_handle* handle, enum auth_credentials credentials);
|
||||
|
||||
/**
|
||||
* Lookup a command handle based on prefix.
|
||||
* If no matching command handle is found then NULL is returned.
|
||||
*/
|
||||
struct command_handle* command_handler_lookup(struct command_base* cbase, const char* prefix);
|
||||
|
||||
extern void commands_builtin_add(struct command_base*);
|
||||
extern void commands_builtin_remove(struct command_base*);
|
||||
|
||||
#endif /* HAVE_UHUB_COMMANDS_H */
|
||||
|
||||
@@ -1,80 +1,173 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
use strict;
|
||||
use XML::Twig;
|
||||
use XML::DOM;
|
||||
|
||||
sub write_c_header(@);
|
||||
sub write_c_impl_defaults(@);
|
||||
sub write_c_impl_apply(@);
|
||||
sub write_c_impl_free(@);
|
||||
sub write_c_impl_dump(@);
|
||||
sub write_sql_dump(@);
|
||||
sub get_data($);
|
||||
|
||||
my $dump_to_sql = 0;
|
||||
|
||||
# initialize parser and read the file
|
||||
my $input = "./config.xml";
|
||||
my $parser = XML::Twig->new();
|
||||
my $parser = new XML::DOM::Parser;
|
||||
my $tree = $parser->parsefile($input) || die "Unable to parse XML file.";
|
||||
|
||||
# Write header file
|
||||
open GENHEAD, ">gen_config.h" || die "Unable to write header file";
|
||||
print GENHEAD "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\nstruct hub_config\n{\n";
|
||||
foreach my $p ($tree->root->children("option"))
|
||||
# Get data
|
||||
my $nodes = $tree->getElementsByTagName("option");
|
||||
my @options = ();
|
||||
for (my $i = 0; $i < $nodes->getLength; $i++)
|
||||
{
|
||||
write_c_header(get_data($p));
|
||||
my @data = get_data($nodes->item($i));
|
||||
push @options, \@data;
|
||||
}
|
||||
print GENHEAD "};\n\n";
|
||||
|
||||
# Write c source file
|
||||
write_c_header(@options);
|
||||
write_sql_dump(@options) if ($dump_to_sql);
|
||||
|
||||
my $config_defaults = "void config_defaults(struct hub_config* config)\n{\n";
|
||||
my $config_apply = "static int apply_config(struct hub_config* config, char* key, char* data, int line_count)\n{\n\tint max = 0;\n\tint min = 0;\n\n";
|
||||
my $config_free = "void free_config(struct hub_config* config)\n{\n";
|
||||
my $config_dump = "void dump_config(struct hub_config* config, int ignore_defaults)\n{\n";
|
||||
|
||||
foreach my $option (@options)
|
||||
{
|
||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check) = @$option;
|
||||
my $string = ($type =~ /(string|file|message)/);
|
||||
my $min = undef;
|
||||
my $max = undef;
|
||||
my $regexp = undef;
|
||||
|
||||
if (defined $check)
|
||||
{
|
||||
$min = $check->getAttribute("min");
|
||||
$max = $check->getAttribute("max");
|
||||
$regexp = $check->getAttribute("regexp");
|
||||
|
||||
$max = undef if ($max eq "");
|
||||
$min = undef if ($min eq "");
|
||||
$regexp = undef if ($regexp eq "");
|
||||
}
|
||||
|
||||
$config_defaults .= "\tconfig->$name = ";
|
||||
$config_defaults .= "hub_strdup(\"" if ($string);
|
||||
$config_defaults .= $default;
|
||||
$config_defaults .= "\")" if ($string);
|
||||
$config_defaults .= ";\n";
|
||||
|
||||
$config_apply .= "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n";
|
||||
|
||||
if ($type eq "int")
|
||||
{
|
||||
$config_apply .= "\t\tmin = $min;\n" if (defined $min);
|
||||
$config_apply .= "\t\tmax = $max;\n" if (defined $max);
|
||||
$config_apply .= "\t\tif (!apply_integer(key, data, &config->$name, ";
|
||||
if (defined $min) { $config_apply .= "&min"; } else { $config_apply .= "0"; }
|
||||
$config_apply .= ", ";
|
||||
if (defined $max) { $config_apply .= "&max"; } else { $config_apply .= "0"; }
|
||||
$config_apply .= "))\n";
|
||||
}
|
||||
elsif ($type eq "boolean")
|
||||
{
|
||||
$config_apply .= "\t\tif (!apply_boolean(key, data, &config->$name))\n";
|
||||
}
|
||||
elsif ($string)
|
||||
{
|
||||
$config_apply .="\t\tif (!apply_string(key, data, &config->$name, (char*) \"\"))\n";
|
||||
}
|
||||
|
||||
$config_apply .= "\t\t{\n" .
|
||||
"\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n" .
|
||||
"\t\t\treturn -1;\n" .
|
||||
"\t\t}\n" .
|
||||
"\t\treturn 0;\n" .
|
||||
"\t}\n\n";
|
||||
|
||||
$config_free .= "\thub_free(config->" . $name . ");\n\n" if ($string);
|
||||
|
||||
|
||||
my $out = "%s";
|
||||
my $val = "config->$name";
|
||||
my $test = "config->$name != $default";
|
||||
|
||||
$out = "%d" if ($type eq "int");
|
||||
$val = "config->$name ? \"yes\" : \"no\"" if ($type eq "boolean");
|
||||
|
||||
if ($string)
|
||||
{
|
||||
$out = "\\\"%s\\\"";
|
||||
$test = "strcmp(config->$name, \"$default\") != 0";
|
||||
}
|
||||
|
||||
$config_dump .= "\tif (!ignore_defaults || $test)\n";
|
||||
$config_dump .= "\t\tfprintf(stdout, \"$name = $out\\n\", $val);\n\n";
|
||||
}
|
||||
|
||||
$config_apply .= "\t/* Still here -- unknown directive */\n";
|
||||
$config_apply .= "\tLOG_ERROR(\"Unknown configuration directive: '%s'\", key);\n";
|
||||
$config_apply .= "\treturn -1;\n";
|
||||
$config_apply .= "}\n\n";
|
||||
$config_defaults .= "}\n\n";
|
||||
$config_free .= "}\n\n";
|
||||
$config_dump .= "}\n\n";
|
||||
|
||||
open GENIMPL, ">gen_config.c" || die "Unable to write source file";
|
||||
print GENIMPL "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\n";
|
||||
print GENIMPL $config_defaults;
|
||||
print GENIMPL $config_apply;
|
||||
print GENIMPL $config_free;
|
||||
print GENIMPL $config_dump;
|
||||
|
||||
# The defaults function
|
||||
print GENIMPL "void config_defaults(struct hub_config* config)\n{\n";
|
||||
foreach my $p ($tree->root->children("option"))
|
||||
|
||||
sub get_data($)
|
||||
{
|
||||
write_c_impl_defaults(get_data($p));
|
||||
my $p = shift;
|
||||
|
||||
my $short = "";
|
||||
my $example = "";
|
||||
my $description = "";
|
||||
my $since = "";
|
||||
|
||||
$short = $p->getElementsByTagName("short")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("short")->getLength());
|
||||
$since = $p->getElementsByTagName("since")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("since")->getLength());
|
||||
$example = $p->getElementsByTagName("example")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("example")->getLength());
|
||||
$description = $p->getElementsByTagName("description")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("description")->getLength());
|
||||
my $check = $p->getElementsByTagName("check")->item(0);
|
||||
|
||||
my @data = (
|
||||
$p->getAttribute("type"),
|
||||
$p->getAttribute("name"),
|
||||
$p->getAttribute("default"),
|
||||
$p->getAttribute("advanced"),
|
||||
$short,
|
||||
$description,
|
||||
$since,
|
||||
$example,
|
||||
$check
|
||||
);
|
||||
return @data;
|
||||
}
|
||||
print GENIMPL "}\n\n";
|
||||
|
||||
# apply function
|
||||
print GENIMPL "static int apply_config(struct hub_config* config, char* key, char* data, int line_count)\n{\n\tint max = 0;\n\tint min = 0;\n\n";
|
||||
|
||||
foreach my $p ($tree->root->children("option"))
|
||||
{
|
||||
write_c_impl_apply(get_data($p));
|
||||
}
|
||||
print GENIMPL "\t/* Still here -- unknown directive */\n";
|
||||
print GENIMPL "\tLOG_ERROR(\"Unknown configuration directive: '%s'\", key);\n";
|
||||
print GENIMPL "\t\treturn -1;\n";
|
||||
print GENIMPL "}\n\n";
|
||||
|
||||
# free function (for strings)
|
||||
print GENIMPL "void free_config(struct hub_config* config)\n{\n";
|
||||
foreach my $p ($tree->root->children("option"))
|
||||
{
|
||||
write_c_impl_free(get_data($p));
|
||||
}
|
||||
print GENIMPL "}\n\n";
|
||||
|
||||
# dump function
|
||||
print GENIMPL "void dump_config(struct hub_config* config, int ignore_defaults)\n{\n";
|
||||
foreach my $p ($tree->root->children("option"))
|
||||
{
|
||||
write_c_impl_dump(get_data($p));
|
||||
}
|
||||
print GENIMPL "}\n\n";
|
||||
|
||||
|
||||
|
||||
# Write header file
|
||||
sub write_c_header(@)
|
||||
{
|
||||
my @output = @_;
|
||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
||||
my @data = @_;
|
||||
|
||||
open GENHEAD, ">gen_config.h" || die "Unable to write header file";
|
||||
print GENHEAD "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\n";
|
||||
print GENHEAD "struct hub_config\n{\n";
|
||||
|
||||
foreach my $option (@data)
|
||||
{
|
||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @$option;
|
||||
|
||||
my $string = ($type =~ /(string|file|message)/);
|
||||
|
||||
print GENHEAD "\t";
|
||||
print GENHEAD "int " if ($type eq "int");
|
||||
print GENHEAD "int " if ($type eq "boolean");
|
||||
print GENHEAD "char*" if ($type =~ /(string|file|message)/);
|
||||
print GENHEAD "char*" if ($string);
|
||||
print GENHEAD " " . $name . ";";
|
||||
|
||||
my $comment = "";
|
||||
@@ -85,7 +178,14 @@ sub write_c_header(@)
|
||||
elsif (defined $short && length $short > 0)
|
||||
{
|
||||
$comment = $short;
|
||||
$comment .= " (default: " . $default . ")" if (defined $default);
|
||||
if (defined $default)
|
||||
{
|
||||
$comment .= " (default: ";
|
||||
$comment .= "\"" if ($string);
|
||||
$comment .= $default;
|
||||
$comment .= "\"" if ($string);
|
||||
$comment .= ")";
|
||||
}
|
||||
}
|
||||
|
||||
if (length $comment > 0)
|
||||
@@ -97,145 +197,74 @@ sub write_c_header(@)
|
||||
}
|
||||
$comment = $pad . "/*<<< " . $comment . " */";
|
||||
}
|
||||
|
||||
print GENHEAD $comment . "\n";
|
||||
}
|
||||
|
||||
sub write_c_impl_defaults(@)
|
||||
{
|
||||
my @output = @_;
|
||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
||||
my $prefix = "";
|
||||
my $suffix = "";
|
||||
|
||||
print GENIMPL "\tconfig->$name = ";
|
||||
if ($type =~ /(string|file|message)/)
|
||||
{
|
||||
$prefix = "hub_strdup(\"";
|
||||
$suffix = "\")"
|
||||
}
|
||||
print GENIMPL $prefix . $default . $suffix . ";\n";
|
||||
print GENHEAD "};\n\n";
|
||||
}
|
||||
|
||||
sub write_c_impl_apply(@)
|
||||
{
|
||||
my @output = @_;
|
||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $p) = @output;
|
||||
|
||||
my $min;
|
||||
my $max;
|
||||
my $regexp;
|
||||
|
||||
if (defined $p)
|
||||
sub write_sql_dump(@)
|
||||
{
|
||||
$min = $p->att("min");
|
||||
$max = $p->att("max");
|
||||
$regexp = $p->att("regexp");
|
||||
my @data = @_;
|
||||
|
||||
print "'check' is defined for option $name";
|
||||
print ", min=$min" if (defined $min);
|
||||
print ", max=$max" if (defined $max);
|
||||
print ", regexp=\"$regexp\"" if (defined $regexp);
|
||||
print "\n";
|
||||
}
|
||||
# Write SQL dump code
|
||||
open GENSQL, ">gen_config.sql" || die "Unable to write SQL dump";
|
||||
print GENSQL "START TRANSACTION;\n\n
|
||||
DROP TABLE uhub_config IF EXISTS;\n\n
|
||||
CREATE TABLE uhub_config (
|
||||
name VARCHAR(32) UNIQUE NOT NULL,
|
||||
defaultValue TINYTEXT NOT NULL,
|
||||
description LONGTEXT NOT NULL,
|
||||
type TINYTEXT NOT NULL,
|
||||
advanced BOOLEAN,
|
||||
example LONGTEXT,
|
||||
since TINYTEXT
|
||||
);\n\n";
|
||||
|
||||
print GENIMPL "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n";
|
||||
|
||||
if ($type eq "int")
|
||||
foreach my $option (@data)
|
||||
{
|
||||
if (defined $min)
|
||||
{
|
||||
print GENIMPL "\t\tmin = $min;\n"
|
||||
}
|
||||
if (defined $max)
|
||||
{
|
||||
print GENIMPL "\t\tmax = $max;\n"
|
||||
}
|
||||
|
||||
print GENIMPL "\t\tif (!apply_integer(key, data, &config->$name, ";
|
||||
|
||||
if (defined $min)
|
||||
{
|
||||
print GENIMPL "&min";
|
||||
}
|
||||
else
|
||||
{
|
||||
print GENIMPL "0";
|
||||
}
|
||||
|
||||
print GENIMPL ", ";
|
||||
|
||||
if (defined $max)
|
||||
{
|
||||
print GENIMPL "&max";
|
||||
}
|
||||
else
|
||||
{
|
||||
print GENIMPL "0";
|
||||
}
|
||||
|
||||
print GENIMPL "))\n";
|
||||
}
|
||||
elsif ($type eq "boolean")
|
||||
{
|
||||
print GENIMPL "\t\tif (!apply_boolean(key, data, &config->$name))\n";
|
||||
}
|
||||
elsif ($type =~ /(string|file|message)/)
|
||||
{
|
||||
print GENIMPL "\t\tif (!apply_string(key, data, &config->$name, (char*) \"\"))\n";
|
||||
}
|
||||
|
||||
print GENIMPL "\t\t{\n" .
|
||||
"\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n" .
|
||||
"\t\t\treturn -1;\n" .
|
||||
"\t\t}\n" .
|
||||
"\t\treturn 0;\n" .
|
||||
"\t}\n\n";
|
||||
}
|
||||
|
||||
sub write_c_impl_free(@)
|
||||
{
|
||||
my @output = @_;
|
||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @$option;
|
||||
|
||||
if ($type =~ /(string|file|message)/ )
|
||||
{
|
||||
print GENIMPL "\thub_free(config->" . $name . ");\n\n"
|
||||
}
|
||||
$default = "\\\"$default\\\"";
|
||||
}
|
||||
|
||||
sub write_c_impl_dump(@)
|
||||
{
|
||||
my @output = @_;
|
||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
||||
my $out;
|
||||
my $val = "config->$name";
|
||||
my $test = "config->$name != $default";
|
||||
$desc =~ s/\"/\\\"/g;
|
||||
$type =~ s/^int$/integer/;
|
||||
|
||||
if ($type eq "int")
|
||||
my $stmt = "INSERT INTO uhub_config VALUES(";
|
||||
$stmt .= "\"$name\", ";
|
||||
$stmt .= "\"$default\", ";
|
||||
$stmt .= "\"$desc\", ";
|
||||
$stmt .= "\"$type\", ";
|
||||
|
||||
if (defined $example)
|
||||
{
|
||||
$out = "%d";
|
||||
}
|
||||
elsif ($type eq "boolean")
|
||||
{
|
||||
$out = "%s";
|
||||
$val = "config->$name ? \"yes\" : \"no\"";
|
||||
}
|
||||
elsif ($type =~ /(string|file|message)/)
|
||||
{
|
||||
$out = "\\\"%s\\\"";
|
||||
$test = "strcmp(config->$name, \"$default\") != 0";
|
||||
my $example_str = $example;
|
||||
$example_str =~ s/\\/\\\\/g;
|
||||
$example_str =~ s/\"/\\\"/g;
|
||||
$stmt .= "\"$example_str\", ";
|
||||
} else {
|
||||
$stmt .= "NULL, ";
|
||||
}
|
||||
|
||||
print GENIMPL "\tif (!ignore_defaults || $test)\n";
|
||||
print GENIMPL "\t\tfprintf(stdout, \"$name = $out\\n\", $val);\n\n";
|
||||
if (defined $since) {
|
||||
$stmt .= "\"$since\", ";
|
||||
} else {
|
||||
$stmt .= "NULL, ";
|
||||
}
|
||||
|
||||
sub get_data($)
|
||||
{
|
||||
my $p = shift;
|
||||
my $check = $p->first_child_matches("check");
|
||||
my @data = ($p->att("type"), $p->att("name"), $p->att("default"), $p->att("advanced"), $p->children_text("short"), $p->children_text("description"), $p->children_text("since"), $p->children_text("example"), $check);
|
||||
return @data;
|
||||
if (defined $advanced) {
|
||||
$stmt .= "\"$advanced\"";
|
||||
} else {
|
||||
$stmt .= "NULL";
|
||||
}
|
||||
|
||||
$stmt .= ");\n";
|
||||
|
||||
print GENSQL $stmt;
|
||||
}
|
||||
print GENSQL "\n\nCOMMIT;\n\n";
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<check min="1" max="65535" />
|
||||
<since>0.1.0</since>
|
||||
<short>Server port to bind to</short>
|
||||
<description><![CDATA[This is specifies the port number the hub should listen on.]]></description>
|
||||
<description><![CDATA[This specifies the port number the hub should listen on.]]></description>
|
||||
</option>
|
||||
|
||||
<option name="server_bind_addr" type="string" default="any">
|
||||
@@ -108,6 +108,15 @@
|
||||
<since>0.1.1</since>
|
||||
</option>
|
||||
|
||||
<option name="register_self" type="boolean" default="0">
|
||||
<short>Allow users to register themselves on the hub.</short>
|
||||
<description><![CDATA[
|
||||
If this is enabled guests can register their nickname on the hub.
|
||||
Otherwise only operators can register users.
|
||||
]]></description>
|
||||
<since>0.4.0</since>
|
||||
</option>
|
||||
|
||||
<option name="obsolete_clients" type="boolean" default="0">
|
||||
<short>Support obsolete clients using a ADC protocol prior to 1.0</short>
|
||||
<description><![CDATA[
|
||||
@@ -117,14 +126,6 @@
|
||||
<since>0.3.1</since>
|
||||
</option>
|
||||
|
||||
<option name="chat_only" type="boolean" default="0">
|
||||
<short>Allow chat only operation on hub</short>
|
||||
<description><![CDATA[
|
||||
If this is enabled the hub will refuse to relay messages for search and connection setup. This effectively makes the hub viable for chat only.
|
||||
]]></description>
|
||||
<since>0.1.1</since>
|
||||
</option>
|
||||
|
||||
<option name="chat_is_privileged" type="boolean" default="0">
|
||||
<short>Allow chat for operators and above only</short>
|
||||
<description><![CDATA[
|
||||
@@ -408,7 +409,7 @@
|
||||
</option>
|
||||
|
||||
<option name="tls_require" type="boolean" default="0">
|
||||
<short>If SSL/TLS enabled, should it be required (default: 0)</short>
|
||||
<short>If SSL/TLS enabled, should it be required</short>
|
||||
<description><![CDATA[
|
||||
If TLS/SSL support is enabled it can either be optional or mandatory.
|
||||
If this option is disabled then SSL/TLS is not required to enter the hub, however it is possible to enter either with or without.
|
||||
@@ -417,6 +418,17 @@
|
||||
<since>0.3.0</since>
|
||||
</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="">
|
||||
<short>Certificate file</short>
|
||||
<description><![CDATA[
|
||||
@@ -433,24 +445,6 @@
|
||||
<since>0.3.0</since>
|
||||
</option>
|
||||
|
||||
<option name="file_motd" type="file" default="">
|
||||
<short>File containing the 'message of the day</short>
|
||||
<description><![CDATA[
|
||||
This can be specified as a message of the day file. If a valid file is given here it's content will be sent to all users after they have logged in to the hub. If the file is missing or empty this configuration entry will be ignored.
|
||||
]]></description>
|
||||
<since>0.1.3</since>
|
||||
<example><![CDATA[
|
||||
<p>
|
||||
Unix users: <br />
|
||||
file_acl = "/etc/uhub/motd.txt"
|
||||
</p>
|
||||
<p>
|
||||
Windows users: <br />
|
||||
file_acl = "c:\uhub\motd.txt"
|
||||
</p>
|
||||
]]></example>
|
||||
</option>
|
||||
|
||||
<option name="file_acl" type="file" default="">
|
||||
<short>File containing access control lists</short>
|
||||
<description><![CDATA[
|
||||
@@ -471,25 +465,6 @@
|
||||
]]></example>
|
||||
</option>
|
||||
|
||||
<option name="file_rules" type="file" default="">
|
||||
<short>File containing hub rules</short>
|
||||
<description><![CDATA[
|
||||
This is a text file that is displayed on login as an extended message of the day.
|
||||
In addition the contents of the file is displayed when a user uses the "!rules" command.
|
||||
]]></description>
|
||||
<since>0.3.0</since>
|
||||
<example><![CDATA[
|
||||
<p>
|
||||
Unix users: <br />
|
||||
file_acl = "/etc/uhub/rules.txt"
|
||||
</p>
|
||||
<p>
|
||||
Windows users: <br />
|
||||
file_acl = "c:\uhub\rules.txt"
|
||||
</p>
|
||||
]]></example>
|
||||
</option>
|
||||
|
||||
<option name="file_plugins" type="file" default="">
|
||||
<short>Plugin configuration file</short>
|
||||
<description><![CDATA[
|
||||
@@ -615,7 +590,7 @@
|
||||
</option>
|
||||
|
||||
<option name="msg_error_no_memory" type="message" default="No memory">
|
||||
<description><![CDATA[]]></description>
|
||||
<description><![CDATA[Hub has no more memory]]></description>
|
||||
<since>0.2.0</since>
|
||||
</option>
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ int event_queue_process(struct event_queue* queue)
|
||||
}
|
||||
|
||||
list_clear(queue->q1, event_queue_cleanup_callback);
|
||||
assert(list_size(queue->q1) == 0);
|
||||
uhub_assert(list_size(queue->q1) == 0);
|
||||
|
||||
/* unlock queue */
|
||||
queue->locked = 0;
|
||||
|
||||
@@ -11,8 +11,8 @@ void config_defaults(struct hub_config* config)
|
||||
config->show_banner_sys_info = 1;
|
||||
config->max_users = 500;
|
||||
config->registered_users_only = 0;
|
||||
config->register_self = 0;
|
||||
config->obsolete_clients = 0;
|
||||
config->chat_only = 0;
|
||||
config->chat_is_privileged = 0;
|
||||
config->hub_name = hub_strdup("uhub");
|
||||
config->hub_description = hub_strdup("no description");
|
||||
@@ -42,11 +42,10 @@ void config_defaults(struct hub_config* config)
|
||||
config->flood_ctl_extras = 0;
|
||||
config->tls_enable = 0;
|
||||
config->tls_require = 0;
|
||||
config->tls_require_redirect_addr = hub_strdup("");
|
||||
config->tls_certificate = hub_strdup("");
|
||||
config->tls_private_key = hub_strdup("");
|
||||
config->file_motd = hub_strdup("");
|
||||
config->file_acl = hub_strdup("");
|
||||
config->file_rules = hub_strdup("");
|
||||
config->file_plugins = hub_strdup("");
|
||||
config->msg_hub_full = hub_strdup("Hub is full");
|
||||
config->msg_hub_disabled = hub_strdup("Hub is disabled");
|
||||
@@ -103,7 +102,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "server_port"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->server_port, 0, 0))
|
||||
min = 1;
|
||||
max = 65535;
|
||||
if (!apply_integer(key, data, &config->server_port, &min, &max))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -123,7 +124,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "server_listen_backlog"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->server_listen_backlog, 0, 0))
|
||||
min = 5;
|
||||
if (!apply_integer(key, data, &config->server_listen_backlog, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -183,9 +185,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(key, "obsolete_clients"))
|
||||
if (!strcmp(key, "register_self"))
|
||||
{
|
||||
if (!apply_boolean(key, data, &config->obsolete_clients))
|
||||
if (!apply_boolean(key, data, &config->register_self))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -193,9 +195,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(key, "chat_only"))
|
||||
if (!strcmp(key, "obsolete_clients"))
|
||||
{
|
||||
if (!apply_boolean(key, data, &config->chat_only))
|
||||
if (!apply_boolean(key, data, &config->obsolete_clients))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -245,7 +247,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "max_recv_buffer"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->max_recv_buffer, 0, 0))
|
||||
min = 1024;
|
||||
max = 1048576;
|
||||
if (!apply_integer(key, data, &config->max_recv_buffer, &min, &max))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -255,7 +259,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "max_send_buffer"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->max_send_buffer, 0, 0))
|
||||
min = 2048;
|
||||
if (!apply_integer(key, data, &config->max_send_buffer, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -265,7 +270,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "max_send_buffer_soft"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->max_send_buffer_soft, 0, 0))
|
||||
min = 1024;
|
||||
if (!apply_integer(key, data, &config->max_send_buffer_soft, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -285,7 +291,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "max_chat_history"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->max_chat_history, 0, 0))
|
||||
min = 0;
|
||||
max = 250;
|
||||
if (!apply_integer(key, data, &config->max_chat_history, &min, &max))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -295,7 +303,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "max_logout_log"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->max_logout_log, 0, 0))
|
||||
min = 0;
|
||||
max = 2000;
|
||||
if (!apply_integer(key, data, &config->max_logout_log, &min, &max))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -305,7 +315,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_max_hubs_user"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_max_hubs_user, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_max_hubs_user, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -315,7 +326,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_max_hubs_reg"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_max_hubs_reg, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_max_hubs_reg, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -325,7 +337,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_max_hubs_op"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_max_hubs_op, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_max_hubs_op, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -335,7 +348,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_max_hubs"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_max_hubs, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_max_hubs, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -345,7 +359,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_min_hubs_user"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_min_hubs_user, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_min_hubs_user, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -355,7 +370,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_min_hubs_reg"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_min_hubs_reg, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_min_hubs_reg, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -365,7 +381,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_min_hubs_op"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_min_hubs_op, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_min_hubs_op, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -386,7 +403,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_max_share"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_max_share, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_max_share, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -396,7 +414,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_min_slots"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_min_slots, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_min_slots, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -406,7 +425,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
|
||||
if (!strcmp(key, "limit_max_slots"))
|
||||
{
|
||||
if (!apply_integer(key, data, &config->limit_max_slots, 0, 0))
|
||||
min = 0;
|
||||
if (!apply_integer(key, data, &config->limit_max_slots, &min, 0))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
@@ -496,6 +516,16 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
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);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(key, "tls_certificate"))
|
||||
{
|
||||
if (!apply_string(key, data, &config->tls_certificate, (char*) ""))
|
||||
@@ -516,16 +546,6 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(key, "file_motd"))
|
||||
{
|
||||
if (!apply_string(key, data, &config->file_motd, (char*) ""))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(key, "file_acl"))
|
||||
{
|
||||
if (!apply_string(key, data, &config->file_acl, (char*) ""))
|
||||
@@ -536,16 +556,6 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(key, "file_rules"))
|
||||
{
|
||||
if (!apply_string(key, data, &config->file_rules, (char*) ""))
|
||||
{
|
||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(key, "file_plugins"))
|
||||
{
|
||||
if (!apply_string(key, data, &config->file_plugins, (char*) ""))
|
||||
@@ -933,16 +943,14 @@ void free_config(struct hub_config* config)
|
||||
|
||||
hub_free(config->redirect_addr);
|
||||
|
||||
hub_free(config->tls_require_redirect_addr);
|
||||
|
||||
hub_free(config->tls_certificate);
|
||||
|
||||
hub_free(config->tls_private_key);
|
||||
|
||||
hub_free(config->file_motd);
|
||||
|
||||
hub_free(config->file_acl);
|
||||
|
||||
hub_free(config->file_rules);
|
||||
|
||||
hub_free(config->file_plugins);
|
||||
|
||||
hub_free(config->msg_hub_full);
|
||||
@@ -1048,12 +1056,12 @@ void dump_config(struct hub_config* config, int ignore_defaults)
|
||||
if (!ignore_defaults || config->registered_users_only != 0)
|
||||
fprintf(stdout, "registered_users_only = %s\n", config->registered_users_only ? "yes" : "no");
|
||||
|
||||
if (!ignore_defaults || config->register_self != 0)
|
||||
fprintf(stdout, "register_self = %s\n", config->register_self ? "yes" : "no");
|
||||
|
||||
if (!ignore_defaults || config->obsolete_clients != 0)
|
||||
fprintf(stdout, "obsolete_clients = %s\n", config->obsolete_clients ? "yes" : "no");
|
||||
|
||||
if (!ignore_defaults || config->chat_only != 0)
|
||||
fprintf(stdout, "chat_only = %s\n", config->chat_only ? "yes" : "no");
|
||||
|
||||
if (!ignore_defaults || config->chat_is_privileged != 0)
|
||||
fprintf(stdout, "chat_is_privileged = %s\n", config->chat_is_privileged ? "yes" : "no");
|
||||
|
||||
@@ -1141,21 +1149,18 @@ void dump_config(struct hub_config* config, int ignore_defaults)
|
||||
if (!ignore_defaults || config->tls_require != 0)
|
||||
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)
|
||||
fprintf(stdout, "tls_certificate = \"%s\"\n", config->tls_certificate);
|
||||
|
||||
if (!ignore_defaults || strcmp(config->tls_private_key, "") != 0)
|
||||
fprintf(stdout, "tls_private_key = \"%s\"\n", config->tls_private_key);
|
||||
|
||||
if (!ignore_defaults || strcmp(config->file_motd, "") != 0)
|
||||
fprintf(stdout, "file_motd = \"%s\"\n", config->file_motd);
|
||||
|
||||
if (!ignore_defaults || strcmp(config->file_acl, "") != 0)
|
||||
fprintf(stdout, "file_acl = \"%s\"\n", config->file_acl);
|
||||
|
||||
if (!ignore_defaults || strcmp(config->file_rules, "") != 0)
|
||||
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);
|
||||
|
||||
|
||||
@@ -4,19 +4,19 @@ struct hub_config
|
||||
{
|
||||
int hub_enabled; /*<<< Is server enabled (default: 1) */
|
||||
int server_port; /*<<< Server port to bind to (default: 1511) */
|
||||
char* server_bind_addr; /*<<< Server bind address (default: any) */
|
||||
char* server_bind_addr; /*<<< Server bind address (default: "any") */
|
||||
int server_listen_backlog; /*<<< Server listen backlog (default: 50) */
|
||||
char* server_alt_ports; /*<<< Comma separated list of alternative ports to listen to (default: ) */
|
||||
char* server_alt_ports; /*<<< Comma separated list of alternative ports to listen to (default: "") */
|
||||
int show_banner; /*<<< Show banner on connect (default: 1) */
|
||||
int show_banner_sys_info; /*<<< Show banner on connect (default: 1) */
|
||||
int max_users; /*<<< Maximum number of users allowed on the hub (default: 500) */
|
||||
int registered_users_only; /*<<< Allow registered users only (default: 0) */
|
||||
int register_self; /*<<< Allow users to register themselves on the hub. (default: 0) */
|
||||
int obsolete_clients; /*<<< Support obsolete clients using a ADC protocol prior to 1.0 (default: 0) */
|
||||
int chat_only; /*<<< Allow chat only operation on hub (default: 0) */
|
||||
int chat_is_privileged; /*<<< Allow chat for operators and above only (default: 0) */
|
||||
char* hub_name; /*<<< Name of hub (default: uhub) */
|
||||
char* hub_description; /*<<< Short hub description, topic or subject. (default: no description) */
|
||||
char* redirect_addr; /*<<< A common hub redirect address. (default: ) */
|
||||
char* hub_name; /*<<< Name of hub (default: "uhub") */
|
||||
char* hub_description; /*<<< Short hub description, topic or subject. (default: "no description") */
|
||||
char* redirect_addr; /*<<< A common hub redirect address. (default: "") */
|
||||
int max_recv_buffer; /*<<< Max read buffer before parse, per user (default: 4096) */
|
||||
int max_send_buffer; /*<<< Max send buffer before disconnect, per user (default: 131072) */
|
||||
int max_send_buffer_soft; /*<<< Max send buffer before message drops, per user (default: 98304) */
|
||||
@@ -41,13 +41,12 @@ struct hub_config
|
||||
int flood_ctl_update; /*<<< Max updates 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_require; /*<<< If SSL/TLS enabled, should it be required (default: 0) (default: 0) */
|
||||
char* tls_certificate; /*<<< Certificate file (default: ) */
|
||||
char* tls_private_key; /*<<< Private key file (default: ) */
|
||||
char* file_motd; /*<<< File containing the 'message of the day (default: ) */
|
||||
char* file_acl; /*<<< File containing access control lists (default: ) */
|
||||
char* file_rules; /*<<< File containing hub rules (default: ) */
|
||||
char* file_plugins; /*<<< Plugin configuration file (default: ) */
|
||||
int tls_require; /*<<< If SSL/TLS enabled, should it be required (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_private_key; /*<<< Private key file (default: "") */
|
||||
char* file_acl; /*<<< File containing access control lists (default: "") */
|
||||
char* file_plugins; /*<<< Plugin configuration file (default: "") */
|
||||
char* msg_hub_full; /*<<< "Hub is full" */
|
||||
char* msg_hub_disabled; /*<<< "Hub is disabled" */
|
||||
char* msg_hub_registered_users_only; /*<<< "Hub is for registered users only" */
|
||||
|
||||
211
src/core/hub.c
211
src/core/hub.c
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2012, 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
|
||||
@@ -21,10 +21,6 @@
|
||||
|
||||
struct hub_info* g_hub = 0;
|
||||
|
||||
#define CHECK_CHAT_ONLY \
|
||||
if (hub->config->chat_only && u->credentials < auth_cred_operator) \
|
||||
break
|
||||
|
||||
/* FIXME: Flood control should be done in a plugin! */
|
||||
#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())) \
|
||||
@@ -80,7 +76,12 @@ int hub_handle_message(struct hub_info* hub, struct hub_user* u, const char* lin
|
||||
case ADC_CMD_DINF:
|
||||
case ADC_CMD_EINF:
|
||||
case ADC_CMD_FINF:
|
||||
case ADC_CMD_BQUI:
|
||||
case ADC_CMD_DQUI:
|
||||
case ADC_CMD_EQUI:
|
||||
case ADC_CMD_FQUI:
|
||||
/* these must never be allowed for security reasons, so we ignore them. */
|
||||
CHECK_FLOOD(extras, 1);
|
||||
break;
|
||||
|
||||
case ADC_CMD_EMSG:
|
||||
@@ -96,20 +97,35 @@ int hub_handle_message(struct hub_info* hub, struct hub_user* u, const char* lin
|
||||
case ADC_CMD_ESCH:
|
||||
case ADC_CMD_FSCH:
|
||||
cmd->priority = -1;
|
||||
CHECK_CHAT_ONLY;
|
||||
if (plugin_handle_search(hub, u, cmd->cache) == st_deny)
|
||||
break;
|
||||
CHECK_FLOOD(search, 1);
|
||||
ROUTE_MSG;
|
||||
|
||||
case ADC_CMD_FRES: // spam
|
||||
case ADC_CMD_BRES: // spam
|
||||
case ADC_CMD_ERES: // pointless.
|
||||
CHECK_FLOOD(extras, 1);
|
||||
break;
|
||||
|
||||
case ADC_CMD_DRES:
|
||||
cmd->priority = -1;
|
||||
CHECK_CHAT_ONLY;
|
||||
if (plugin_handle_search_result(hub, u, uman_get_user_by_sid(hub, cmd->target), cmd->cache) == st_deny)
|
||||
break;
|
||||
/* CHECK_FLOOD(search, 0); */
|
||||
ROUTE_MSG;
|
||||
|
||||
case ADC_CMD_DRCM:
|
||||
cmd->priority = -1;
|
||||
if (plugin_handle_revconnect(hub, u, uman_get_user_by_sid(hub, cmd->target)) == st_deny)
|
||||
break;
|
||||
CHECK_FLOOD(connect, 1);
|
||||
ROUTE_MSG;
|
||||
|
||||
case ADC_CMD_DCTM:
|
||||
cmd->priority = -1;
|
||||
CHECK_CHAT_ONLY;
|
||||
if (plugin_handle_connect(hub, u, uman_get_user_by_sid(hub, cmd->target)) == st_deny)
|
||||
break;
|
||||
CHECK_FLOOD(connect, 1);
|
||||
ROUTE_MSG;
|
||||
|
||||
@@ -254,6 +270,7 @@ int hub_handle_password(struct hub_info* hub, struct hub_user* u, struct adc_mes
|
||||
int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc_message* cmd)
|
||||
{
|
||||
char* message = adc_msg_get_argument(cmd, 0);
|
||||
char* message_decoded = NULL;
|
||||
int ret = 0;
|
||||
int relay = 1;
|
||||
int broadcast;
|
||||
@@ -264,6 +281,13 @@ int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc
|
||||
if (!message)
|
||||
return 0;
|
||||
|
||||
message_decoded = adc_msg_unescape(message);
|
||||
if (!message_decoded)
|
||||
{
|
||||
hub_free(message);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!user_is_logged_in(u))
|
||||
{
|
||||
hub_free(message);
|
||||
@@ -289,7 +313,7 @@ int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc
|
||||
}
|
||||
else
|
||||
{
|
||||
relay = command_invoke(hub->commands, u, message);
|
||||
relay = command_invoke(hub->commands, u, message_decoded);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -301,16 +325,16 @@ int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc
|
||||
|
||||
if (relay)
|
||||
{
|
||||
plugin_st status;
|
||||
plugin_st status = st_default;
|
||||
if (broadcast)
|
||||
{
|
||||
status = plugin_handle_chat_message(hub, u, message, 0);
|
||||
status = plugin_handle_chat_message(hub, u, message_decoded, 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);
|
||||
status = plugin_handle_private_message(hub, u, target, message_decoded, 0);
|
||||
else
|
||||
relay = 0;
|
||||
}
|
||||
@@ -324,37 +348,15 @@ int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc
|
||||
/* adc_msg_remove_named_argument(cmd, "PM"); */
|
||||
if (broadcast)
|
||||
{
|
||||
hub_chat_history_add(hub, u, cmd);
|
||||
plugin_log_chat_message(hub, u, message, 0);
|
||||
plugin_log_chat_message(hub, u, message_decoded, 0);
|
||||
}
|
||||
ret = route_message(hub, u, cmd);
|
||||
}
|
||||
hub_free(message);
|
||||
hub_free(message_decoded);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void hub_chat_history_add(struct hub_info* hub, struct hub_user* user, struct adc_message* cmd)
|
||||
{
|
||||
char* msg_esc = adc_msg_get_argument(cmd, 0);
|
||||
char* message = adc_msg_unescape(msg_esc);
|
||||
char* log = hub_malloc(strlen(message) + strlen(user->id.nick) + 14);
|
||||
sprintf(log, "%s <%s> %s\n", get_timestamp(time(NULL)), user->id.nick, message);
|
||||
list_append(hub->chat_history, log);
|
||||
while (list_size(hub->chat_history) > (size_t) hub->config->max_chat_history)
|
||||
{
|
||||
char* msg = list_get_first(hub->chat_history);
|
||||
list_remove(hub->chat_history, msg);
|
||||
hub_free(msg);
|
||||
}
|
||||
hub_free(message);
|
||||
hub_free(msg_esc);
|
||||
}
|
||||
|
||||
void hub_chat_history_clear(struct hub_info* hub)
|
||||
{
|
||||
list_clear(hub->chat_history, &hub_free);
|
||||
}
|
||||
|
||||
void hub_send_support(struct hub_info* hub, struct hub_user* u)
|
||||
{
|
||||
if (user_is_connecting(u) || user_is_logged_in(u))
|
||||
@@ -473,27 +475,6 @@ void hub_send_handshake(struct hub_info* hub, struct hub_user* u)
|
||||
}
|
||||
}
|
||||
|
||||
int hub_send_motd(struct hub_info* hub, struct hub_user* u)
|
||||
{
|
||||
if (hub->command_motd)
|
||||
{
|
||||
route_to_user(hub, u, hub->command_motd);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hub_send_rules(struct hub_info* hub, struct hub_user* u)
|
||||
{
|
||||
if (hub->command_rules)
|
||||
{
|
||||
route_to_user(hub, u, hub->command_rules);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void hub_send_password_challenge(struct hub_info* hub, struct hub_user* u)
|
||||
{
|
||||
struct adc_message* igpa;
|
||||
@@ -526,11 +507,28 @@ void hub_send_flood_warning(struct hub_info* hub, struct hub_user* u, const char
|
||||
}
|
||||
}
|
||||
|
||||
static int check_duplicate_logins_ok(struct hub_info* hub, struct hub_user* user)
|
||||
{
|
||||
struct hub_user* lookup1;
|
||||
struct hub_user* lookup2;
|
||||
|
||||
lookup1 = uman_get_user_by_nick(hub, user->id.nick);
|
||||
if (lookup1)
|
||||
return status_msg_inf_error_nick_taken;
|
||||
|
||||
lookup2 = uman_get_user_by_cid(hub, user->id.cid);
|
||||
if (lookup2)
|
||||
return status_msg_inf_error_cid_taken;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hub_event_dispatcher(void* callback_data, struct event_data* message)
|
||||
{
|
||||
int status;
|
||||
struct hub_info* hub = (struct hub_info*) callback_data;
|
||||
struct hub_user* user = (struct hub_user*) message->ptr;
|
||||
assert(hub != NULL);
|
||||
uhub_assert(hub != NULL);
|
||||
|
||||
switch (message->id)
|
||||
{
|
||||
@@ -544,9 +542,19 @@ static void hub_event_dispatcher(void* callback_data, struct event_data* message
|
||||
hub_send_password_challenge(hub, user);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Race condition, we could have two messages for two logins queued up.
|
||||
So make sure we don't let the second client in. */
|
||||
status = check_duplicate_logins_ok(hub, user);
|
||||
if (!status)
|
||||
{
|
||||
on_login_success(hub, user);
|
||||
}
|
||||
else
|
||||
{
|
||||
on_login_failure(hub, user, (enum status_message) status);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -690,11 +698,12 @@ static int load_ssl_certificates(struct hub_info* hub, struct hub_config* config
|
||||
{
|
||||
if (config->tls_enable)
|
||||
{
|
||||
hub->ssl_method = SSLv23_method(); /* TLSv1_method() */
|
||||
hub->ssl_method = (SSL_METHOD*) SSLv23_method(); /* TLSv1_method() */
|
||||
hub->ssl_ctx = SSL_CTX_new(hub->ssl_method);
|
||||
|
||||
/* Disable 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)
|
||||
{
|
||||
@@ -791,20 +800,7 @@ struct hub_info* hub_start_service(struct hub_config* config)
|
||||
return 0;
|
||||
}
|
||||
|
||||
hub->chat_history = (struct linked_list*) list_create();
|
||||
hub->logout_info = (struct linked_list*) list_create();
|
||||
if (!hub->chat_history)
|
||||
{
|
||||
net_con_close(hub->server);
|
||||
list_destroy(hub->chat_history);
|
||||
list_destroy(hub->logout_info);
|
||||
hub_free(hub->recvbuf);
|
||||
hub_free(hub->sendbuf);
|
||||
uman_shutdown(hub);
|
||||
hub_free(hub);
|
||||
return 0;
|
||||
}
|
||||
|
||||
server_alt_port_start(hub, config);
|
||||
|
||||
hub->status = hub_status_running;
|
||||
@@ -827,14 +823,11 @@ void hub_shutdown_service(struct hub_info* hub)
|
||||
|
||||
event_queue_shutdown(hub->queue);
|
||||
net_con_close(hub->server);
|
||||
hub_free(hub->server);
|
||||
server_alt_port_stop(hub);
|
||||
uman_shutdown(hub);
|
||||
hub->status = hub_status_stopped;
|
||||
hub_free(hub->sendbuf);
|
||||
hub_free(hub->recvbuf);
|
||||
hub_chat_history_clear(hub);
|
||||
list_destroy(hub->chat_history);
|
||||
list_clear(hub->logout_info, &hub_free);
|
||||
list_destroy(hub->logout_info);
|
||||
command_shutdown(hub->commands);
|
||||
@@ -843,22 +836,22 @@ void hub_shutdown_service(struct hub_info* hub)
|
||||
g_hub = 0;
|
||||
}
|
||||
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
void hub_plugins_load(struct hub_info* hub)
|
||||
int hub_plugins_load(struct hub_info* hub)
|
||||
{
|
||||
if (!hub->config->file_plugins || !*hub->config->file_plugins)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
hub->plugins = hub_malloc_zero(sizeof(struct uhub_plugins));
|
||||
if (!hub->plugins)
|
||||
return;
|
||||
return -1;
|
||||
|
||||
if (plugin_initialize(hub->config, hub) < 0)
|
||||
{
|
||||
hub_free(hub->plugins);
|
||||
hub->plugins = 0;
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hub_plugins_unload(struct hub_info* hub)
|
||||
@@ -870,12 +863,9 @@ void hub_plugins_unload(struct hub_info* hub)
|
||||
hub->plugins = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void hub_set_variables(struct hub_info* hub, struct acl_handle* acl)
|
||||
{
|
||||
int fd, ret;
|
||||
char buf[MAX_RECV_BUF];
|
||||
char* tmp;
|
||||
char* server = adc_msg_escape(PRODUCT_STRING); /* FIXME: OOM */
|
||||
|
||||
@@ -895,39 +885,6 @@ void hub_set_variables(struct hub_info* hub, struct acl_handle* acl)
|
||||
hub_free(tmp);
|
||||
}
|
||||
|
||||
/* (Re-)read the message of the day */
|
||||
hub->command_motd = 0;
|
||||
fd = (hub->config->file_motd && *hub->config->file_motd) ? open(hub->config->file_motd, 0) : -1;
|
||||
if (fd != -1)
|
||||
{
|
||||
ret = read(fd, buf, MAX_RECV_BUF);
|
||||
if (ret > 0)
|
||||
{
|
||||
buf[ret] = 0;
|
||||
tmp = adc_msg_escape(buf);
|
||||
hub->command_motd = adc_msg_construct(ADC_CMD_IMSG, 6 + strlen(tmp));
|
||||
adc_msg_add_argument(hub->command_motd, tmp);
|
||||
hub_free(tmp);
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
|
||||
hub->command_rules = 0;
|
||||
fd = (hub->config->file_rules && *hub->config->file_rules) ? open(hub->config->file_rules, 0) : -1;
|
||||
if (fd != -1)
|
||||
{
|
||||
ret = read(fd, buf, MAX_RECV_BUF);
|
||||
if (ret > 0)
|
||||
{
|
||||
buf[ret] = 0;
|
||||
tmp = adc_msg_escape(buf);
|
||||
hub->command_rules = adc_msg_construct(ADC_CMD_IMSG, 6 + strlen(tmp));
|
||||
adc_msg_add_argument(hub->command_rules, tmp);
|
||||
hub_free(tmp);
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
|
||||
hub->command_support = adc_msg_construct(ADC_CMD_ISUP, 6 + strlen(ADC_PROTO_SUPPORT));
|
||||
if (hub->command_support)
|
||||
{
|
||||
@@ -946,9 +903,12 @@ void hub_set_variables(struct hub_info* hub, struct acl_handle* acl)
|
||||
hub_free(tmp);
|
||||
}
|
||||
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
hub_plugins_load(hub);
|
||||
#endif
|
||||
if (hub_plugins_load(hub) < 0)
|
||||
{
|
||||
LOG_FATAL("Unable to load plugins.");
|
||||
hub->status = hub_status_shutdown;
|
||||
}
|
||||
else
|
||||
|
||||
hub->status = (hub->config->hub_enabled ? hub_status_running : hub_status_disabled);
|
||||
hub_free(server);
|
||||
@@ -957,19 +917,10 @@ void hub_set_variables(struct hub_info* hub, struct acl_handle* acl)
|
||||
|
||||
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_banner);
|
||||
|
||||
if (hub->command_motd)
|
||||
adc_msg_free(hub->command_motd);
|
||||
|
||||
if (hub->command_rules)
|
||||
adc_msg_free(hub->command_rules);
|
||||
|
||||
adc_msg_free(hub->command_support);
|
||||
}
|
||||
|
||||
@@ -1330,8 +1281,8 @@ void hub_logout_log(struct hub_info* hub, struct hub_user* user)
|
||||
struct hub_logout_info* loginfo = hub_malloc_zero(sizeof(struct hub_logout_info));
|
||||
if (!loginfo) return;
|
||||
loginfo->time = time(NULL);
|
||||
strcpy(loginfo->cid, user->id.cid);
|
||||
strcpy(loginfo->nick, user->id.nick);
|
||||
memcpy(loginfo->cid, user->id.cid, sizeof(loginfo->cid));
|
||||
memcpy(loginfo->nick, user->id.nick, sizeof(loginfo->nick));
|
||||
memcpy(&loginfo->addr, &user->id.addr, sizeof(struct ip_addr_encap));
|
||||
loginfo->reason = user->quit_reason;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* 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
|
||||
@@ -103,22 +103,16 @@ struct hub_info
|
||||
struct acl_handle* acl;
|
||||
struct adc_message* command_info; /* The hub's INF command */
|
||||
struct adc_message* command_support; /* The hub's SUP command */
|
||||
struct adc_message* command_motd; /* The message of the day */
|
||||
struct adc_message* command_rules; /* The hub rules */
|
||||
struct adc_message* command_banner; /* The default welcome message */
|
||||
time_t tm_started;
|
||||
int status;
|
||||
char* recvbuf; /* Global receive buffer */
|
||||
char* sendbuf; /* Global send buffer */
|
||||
|
||||
struct linked_list* chat_history; /* Chat history */
|
||||
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
|
||||
struct uhub_plugins* plugins; /* Plug-ins loaded for this hub instance. */
|
||||
|
||||
#ifdef SSL_SUPPORT
|
||||
SSL_METHOD* ssl_method;
|
||||
@@ -156,16 +150,6 @@ extern int hub_handle_password(struct hub_info* hub, struct hub_user* u, struct
|
||||
*/
|
||||
extern int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc_message* cmd);
|
||||
|
||||
/**
|
||||
* Add a chat message to the chat history
|
||||
*/
|
||||
extern void hub_chat_history_add(struct hub_info* hub, struct hub_user* user, struct adc_message* cmd);
|
||||
|
||||
/**
|
||||
* Clear the chat history.
|
||||
*/
|
||||
extern void hub_chat_history_clear(struct hub_info* hub);
|
||||
|
||||
/**
|
||||
* Used internally by hub_handle_info
|
||||
* @return 1 if nickname is OK, or 0 if nickname is not accepted.
|
||||
@@ -208,19 +192,6 @@ extern void hub_send_hubinfo(struct hub_info* hub, struct hub_user* u);
|
||||
*/
|
||||
extern void hub_send_handshake(struct hub_info* hub, struct hub_user* u);
|
||||
|
||||
/**
|
||||
* Send a welcome message containing the message of the day to
|
||||
* one particular user. This can be sent in any point in time.
|
||||
* @return 1 if the motd were sent.
|
||||
*/
|
||||
extern int hub_send_motd(struct hub_info* hub, struct hub_user* u);
|
||||
|
||||
/**
|
||||
* Send the rules if configured.
|
||||
* @return 1 if the rules were sent.
|
||||
*/
|
||||
extern int hub_send_rules(struct hub_info* hub, struct hub_user* u);
|
||||
|
||||
/**
|
||||
* Send a password challenge to a user.
|
||||
* This is only used if the user tries to access the hub using a
|
||||
|
||||
@@ -20,42 +20,7 @@
|
||||
#include "uhub.h"
|
||||
#include "plugin_api/handle.h"
|
||||
|
||||
#ifndef PLUGIN_SUPPORT
|
||||
static void log_user_login(struct hub_user* u)
|
||||
{
|
||||
const char* cred = auth_cred_to_string(u->credentials);
|
||||
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);
|
||||
}
|
||||
|
||||
static void log_user_login_error(struct hub_user* u, enum status_message msg)
|
||||
{
|
||||
const char* addr = user_get_address(u);
|
||||
const char* message = hub_get_status_message_log(u->hub, msg);
|
||||
LOG_USER("LoginError %s/%s %s \"%s\" (%s) \"%s\"", sid_to_string(u->id.sid), u->id.cid, addr, u->id.nick, message, u->user_agent);
|
||||
}
|
||||
|
||||
static void log_user_update_error(struct hub_user* u, enum status_message msg)
|
||||
{
|
||||
const char* addr = user_get_address(u);
|
||||
const char* message = hub_get_status_message_log(u->hub, msg);
|
||||
LOG_USER("UpdateError %s/%s %s \"%s\" (%s) \"%s\"", sid_to_string(u->id.sid), u->id.cid, addr, u->id.nick, message, u->user_agent);
|
||||
}
|
||||
|
||||
static void log_user_logout(struct hub_user* u, const char* message)
|
||||
{
|
||||
const char* addr = user_get_address(u);
|
||||
LOG_USER("Logout %s/%s %s \"%s\" (%s)", sid_to_string(u->id.sid), u->id.cid, addr, u->id.nick, message);
|
||||
}
|
||||
|
||||
static void log_user_nick_change(struct hub_user* u, const char* nick)
|
||||
{
|
||||
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);
|
||||
}
|
||||
#endif /* !PLUGIN_SUPPORT */
|
||||
|
||||
/* Send MOTD, do logging etc */
|
||||
/* Notify plugins, etc */
|
||||
void on_login_success(struct hub_info* hub, struct hub_user* u)
|
||||
{
|
||||
/* Send user list of all existing users */
|
||||
@@ -66,24 +31,11 @@ void on_login_success(struct hub_info* hub, struct hub_user* u)
|
||||
user_set_state(u, state_normal);
|
||||
uman_add(hub, u);
|
||||
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
plugin_log_user_login_success(hub, u);
|
||||
#else
|
||||
/* Print log message */
|
||||
log_user_login(u);
|
||||
#endif
|
||||
|
||||
/* Announce new user to all connected users */
|
||||
if (user_is_logged_in(u))
|
||||
route_info_message(hub, u);
|
||||
|
||||
/* Send message of the day (if any) */
|
||||
if (user_is_logged_in(u)) /* Previous send() can fail! */
|
||||
hub_send_motd(hub, u);
|
||||
|
||||
/* Send message of the day (if any) */
|
||||
if (user_is_logged_in(u)) /* Previous send() can fail! */
|
||||
hub_send_rules(hub, u);
|
||||
plugin_log_user_login_success(hub, u);
|
||||
|
||||
/* reset timeout */
|
||||
net_con_clear_timeout(u->connection);
|
||||
@@ -91,22 +43,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)
|
||||
{
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
plugin_log_user_login_error(hub, u, hub_get_status_message_log(hub, msg));
|
||||
#else
|
||||
log_user_login_error(u, msg);
|
||||
#endif
|
||||
hub_send_status(hub, u, msg, status_level_fatal);
|
||||
hub_disconnect_user(hub, u, quit_logon_error);
|
||||
}
|
||||
|
||||
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);
|
||||
#endif
|
||||
hub_send_status(hub, u, msg, status_level_fatal);
|
||||
hub_disconnect_user(hub, u, quit_update_error);
|
||||
}
|
||||
@@ -115,11 +59,7 @@ void on_nick_change(struct hub_info* hub, struct hub_user* u, const char* nick)
|
||||
{
|
||||
if (user_is_logged_in(u))
|
||||
{
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
plugin_log_user_nick_change(hub, u, nick);
|
||||
#else
|
||||
log_user_nick_change(u, nick);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,12 +67,7 @@ void on_logout_user(struct hub_info* hub, struct hub_user* user)
|
||||
{
|
||||
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);
|
||||
#endif
|
||||
|
||||
hub_logout_log(hub, user);
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ void hub_recvq_destroy(struct hub_recvq* q)
|
||||
|
||||
size_t hub_recvq_get(struct hub_recvq* q, void* buf, size_t bufsize)
|
||||
{
|
||||
assert(bufsize >= q->size);
|
||||
uhub_assert(bufsize >= q->size);
|
||||
if (q->size)
|
||||
{
|
||||
size_t n = q->size;
|
||||
@@ -126,7 +126,7 @@ void hub_sendq_add(struct hub_sendq* q, struct adc_message* msg_)
|
||||
#ifdef DEBUG_SENDQ
|
||||
debug_msg("hub_sendq_add", msg);
|
||||
#endif
|
||||
assert(msg->cache && *msg->cache);
|
||||
uhub_assert(msg->cache && *msg->cache);
|
||||
list_append(q->queue, msg);
|
||||
q->size += msg->length;
|
||||
}
|
||||
@@ -147,7 +147,7 @@ int hub_sendq_send(struct hub_sendq* q, struct hub_user* user)
|
||||
int ret;
|
||||
struct adc_message* msg = list_get_first(q->queue);
|
||||
if (!msg) return 0;
|
||||
assert(msg->cache && *msg->cache);
|
||||
uhub_assert(msg->cache && *msg->cache);
|
||||
ret = net_con_send(user->connection, msg->cache + q->offset, msg->length - q->offset);
|
||||
|
||||
if (ret > 0)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* 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
|
||||
@@ -226,9 +226,7 @@ static int check_network(struct hub_info* hub, struct hub_user* user, struct adc
|
||||
static void strip_network(struct hub_user* user, struct adc_message* cmd)
|
||||
{
|
||||
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV6_ADDR);
|
||||
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV6_UDP_PORT);
|
||||
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV4_ADDR);
|
||||
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV4_UDP_PORT);
|
||||
}
|
||||
|
||||
static int nick_length_ok(const char* nick)
|
||||
@@ -546,6 +544,7 @@ static int set_credentials(struct hub_info* hub, struct hub_user* user, struct a
|
||||
{
|
||||
user->credentials = auth_cred_guest;
|
||||
}
|
||||
hub_free(info);
|
||||
|
||||
switch (user->credentials)
|
||||
{
|
||||
|
||||
@@ -176,16 +176,18 @@ void net_on_accept(struct net_connection* con, int event, void *arg)
|
||||
struct hub_probe* probe = 0;
|
||||
struct ip_addr_encap ipaddr;
|
||||
int server_fd = net_con_get_sd(con);
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
plugin_st status;
|
||||
#endif
|
||||
|
||||
for (;;)
|
||||
{
|
||||
int fd = net_accept(server_fd, &ipaddr);
|
||||
if (fd == -1)
|
||||
{
|
||||
#ifdef WINSOCK
|
||||
if (net_error() == WSAEWOULDBLOCK)
|
||||
#else
|
||||
if (net_error() == EWOULDBLOCK)
|
||||
#endif
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -196,7 +198,6 @@ void net_on_accept(struct net_connection* con, int event, void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
status = plugin_check_ip_early(hub, &ipaddr);
|
||||
if (status == st_deny)
|
||||
{
|
||||
@@ -206,7 +207,6 @@ void net_on_accept(struct net_connection* con, int event, void *arg)
|
||||
}
|
||||
|
||||
plugin_log_connection_accepted(hub, &ipaddr);
|
||||
#endif
|
||||
|
||||
probe = probe_create(hub, fd, &ipaddr);
|
||||
if (!probe)
|
||||
|
||||
@@ -18,20 +18,38 @@
|
||||
*/
|
||||
|
||||
#include "uhub.h"
|
||||
#include "plugin_api/command_api.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;
|
||||
return get_internals(plugin)->callback_data;
|
||||
}
|
||||
|
||||
static int plugin_command_dispatch(struct command_base* cbase, struct hub_user* user, struct hub_command* cmd)
|
||||
{
|
||||
struct plugin_handle* plugin = (struct plugin_handle*) cmd->ptr;
|
||||
struct plugin_callback_data* data = get_callback_data(plugin);
|
||||
struct plugin_command_handle* cmdh;
|
||||
struct plugin_user* puser = (struct plugin_user*) user; // FIXME: Use a proper conversion function instead.
|
||||
struct plugin_command* pcommand = (struct plugin_command*) cmd; // FIXME: Use a proper conversion function instead.
|
||||
|
||||
LOG_PLUGIN("plugin_command_dispatch: cmd=%s", cmd->prefix);
|
||||
|
||||
cmdh = (struct plugin_command_handle*) list_get_first(data->commands);
|
||||
while (cmdh)
|
||||
{
|
||||
if (strcmp(cmdh->prefix, cmd->prefix) == 0)
|
||||
return cmdh->handler(plugin, puser, pcommand);
|
||||
|
||||
cmdh = (struct plugin_command_handle*) list_get_next(data->commands);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
static struct hub_user* convert_user_type(struct plugin_user* user)
|
||||
{
|
||||
@@ -41,7 +59,6 @@ static struct hub_user* convert_user_type(struct plugin_user* user)
|
||||
|
||||
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);
|
||||
@@ -51,34 +68,161 @@ static int cbfunc_send_message(struct plugin_handle* plugin, struct plugin_user*
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int cbfunc_send_status(struct plugin_handle* plugin, struct plugin_user* user, int code, const char* message)
|
||||
{
|
||||
char code_str[4];
|
||||
char* buffer = adc_msg_escape(message);
|
||||
struct adc_message* command = adc_msg_construct(ADC_CMD_ISTA, strlen(buffer) + 10);
|
||||
snprintf(code_str, sizeof(code_str), "%03d", code);
|
||||
adc_msg_add_argument(command, code_str);
|
||||
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);
|
||||
struct plugin_callback_data* data = get_callback_data(plugin);
|
||||
struct command_handle* command = (struct command_handle*) hub_malloc_zero(sizeof(struct command_handle));
|
||||
|
||||
command->prefix = cmdh->prefix;
|
||||
command->length = cmdh->length;
|
||||
command->args = cmdh->args;
|
||||
command->cred = cmdh->cred;
|
||||
command->description = cmdh->description;
|
||||
command->origin = cmdh->origin;
|
||||
command->handler = plugin_command_dispatch;
|
||||
|
||||
cmdh->internal_handle = command;
|
||||
list_append(data->commands, cmdh);
|
||||
command_add(plugin_get_hub(plugin)->commands, command, (void*) plugin);
|
||||
printf("*** Add plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
|
||||
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);
|
||||
struct plugin_callback_data* data = get_callback_data(plugin);
|
||||
struct command_handle* command = (struct command_handle*) cmdh->internal_handle;
|
||||
|
||||
printf("*** Del plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
|
||||
list_remove(data->commands, cmdh);
|
||||
command_del(plugin_get_hub(plugin)->commands, command);
|
||||
hub_free(command);
|
||||
cmdh->internal_handle = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t cbfunc_command_arg_reset(struct plugin_handle* plugin, struct plugin_command* cmd)
|
||||
{
|
||||
// TODO: Use proper function for rewriting for plugin_command -> hub_command
|
||||
return hub_command_arg_reset((struct hub_command*) cmd);
|
||||
}
|
||||
|
||||
struct plugin_command_arg_data* cbfunc_command_arg_next(struct plugin_handle* plugin, struct plugin_command* cmd, enum plugin_command_arg_type t)
|
||||
{
|
||||
// TODO: Use proper function for rewriting for plugin_command -> hub_command
|
||||
return (struct plugin_command_arg_data*) hub_command_arg_next((struct hub_command*) cmd, (enum hub_command_arg_type) t);
|
||||
}
|
||||
|
||||
static char* cbfunc_get_hub_name(struct plugin_handle* plugin)
|
||||
{
|
||||
struct hub_info* hub = plugin_get_hub(plugin);
|
||||
char* str_encoded = adc_msg_get_named_argument(hub->command_info, ADC_INF_FLAG_NICK);
|
||||
char* str = adc_msg_unescape(str_encoded);
|
||||
hub_free(str_encoded);
|
||||
return str;
|
||||
}
|
||||
|
||||
static char* cbfunc_get_hub_description(struct plugin_handle* plugin)
|
||||
{
|
||||
struct hub_info* hub = plugin_get_hub(plugin);
|
||||
char* str_encoded = adc_msg_get_named_argument(hub->command_info, ADC_INF_FLAG_DESCRIPTION);
|
||||
char* str = adc_msg_unescape(str_encoded);
|
||||
hub_free(str_encoded);
|
||||
return str;
|
||||
}
|
||||
|
||||
static void cbfunc_set_hub_name(struct plugin_handle* plugin, const char* str)
|
||||
{
|
||||
struct hub_info* hub = plugin_get_hub(plugin);
|
||||
struct adc_message* command;
|
||||
char* new_str = adc_msg_escape(str ? str : hub->config->hub_name);
|
||||
|
||||
adc_msg_replace_named_argument(hub->command_info, ADC_INF_FLAG_NICK, new_str);
|
||||
|
||||
// Broadcast hub name
|
||||
command = adc_msg_construct(ADC_CMD_IINF, (strlen(new_str) + 8));
|
||||
adc_msg_add_named_argument(command, ADC_INF_FLAG_NICK, new_str);
|
||||
route_to_all(hub, command);
|
||||
|
||||
adc_msg_free(command);
|
||||
hub_free(new_str);
|
||||
}
|
||||
|
||||
static void cbfunc_set_hub_description(struct plugin_handle* plugin, const char* str)
|
||||
{
|
||||
struct hub_info* hub = plugin_get_hub(plugin);
|
||||
struct adc_message* command;
|
||||
char* new_str = adc_msg_escape(str ? str : hub->config->hub_description);
|
||||
|
||||
adc_msg_replace_named_argument(hub->command_info, ADC_INF_FLAG_DESCRIPTION, new_str);
|
||||
|
||||
// Broadcast hub description
|
||||
command = adc_msg_construct(ADC_CMD_IINF, (strlen(new_str) + 8));
|
||||
adc_msg_add_named_argument(command, ADC_INF_FLAG_DESCRIPTION, new_str);
|
||||
route_to_all(hub, command);
|
||||
|
||||
adc_msg_free(command);
|
||||
hub_free(new_str);
|
||||
}
|
||||
|
||||
void plugin_register_callback_functions(struct plugin_handle* handle)
|
||||
{
|
||||
handle->hub.send_message = cbfunc_send_message;
|
||||
handle->hub.send_status_message = cbfunc_send_status;
|
||||
handle->hub.user_disconnect = cbfunc_user_disconnect;
|
||||
handle->hub.command_add = cbfunc_command_add;
|
||||
handle->hub.command_del = cbfunc_command_del;
|
||||
handle->hub.command_arg_reset = cbfunc_command_arg_reset;
|
||||
handle->hub.command_arg_next = cbfunc_command_arg_next;
|
||||
handle->hub.get_name = cbfunc_get_hub_name;
|
||||
handle->hub.set_name = cbfunc_set_hub_name;
|
||||
handle->hub.get_description = cbfunc_get_hub_description;
|
||||
handle->hub.set_description = cbfunc_set_hub_description;
|
||||
}
|
||||
|
||||
void plugin_unregister_callback_functions(struct plugin_handle* handle)
|
||||
{
|
||||
}
|
||||
|
||||
struct plugin_callback_data* plugin_callback_data_create()
|
||||
{
|
||||
struct plugin_callback_data* data = (struct plugin_callback_data*) hub_malloc_zero(sizeof(struct plugin_callback_data));
|
||||
LOG_PLUGIN("plugin_callback_data_create()");
|
||||
data->commands = list_create();
|
||||
return data;
|
||||
}
|
||||
|
||||
void plugin_callback_data_destroy(struct plugin_handle* plugin, struct plugin_callback_data* data)
|
||||
{
|
||||
LOG_PLUGIN("plugin_callback_data_destroy()");
|
||||
if (data->commands)
|
||||
{
|
||||
// delete commands not deleted by the plugin itself:
|
||||
struct plugin_command_handle* cmd;
|
||||
while ( (cmd = list_get_first(data->commands)) )
|
||||
cbfunc_command_del(plugin, cmd);
|
||||
list_destroy(data->commands);
|
||||
}
|
||||
|
||||
hub_free(data);
|
||||
}
|
||||
|
||||
@@ -21,8 +21,12 @@
|
||||
#define HAVE_UHUB_PLUGIN_CALLBACK_H
|
||||
|
||||
struct plugin_handle;
|
||||
struct uhub_plugin;
|
||||
|
||||
extern void plugin_register_callback_functions(struct plugin_handle* handle);
|
||||
extern void plugin_unregister_callback_functions(struct plugin_handle* handle);
|
||||
extern struct plugin_callback_data* plugin_callback_data_create();
|
||||
extern void plugin_callback_data_destroy(struct plugin_handle* plugin, struct plugin_callback_data* data);
|
||||
|
||||
extern void plugin_register_callback_functions(struct plugin_handle* plugin);
|
||||
extern void plugin_unregister_callback_functions(struct plugin_handle* plugin);
|
||||
|
||||
#endif /* HAVE_UHUB_PLUGIN_CALLBACK_H */
|
||||
@@ -20,7 +20,7 @@
|
||||
#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 PLUGIN_DEBUG(hub, name) LOG_PLUGIN("Invoke %s on %d plugins", name, (int) (hub->plugins ? list_size(hub->plugins->loaded) : -1));
|
||||
|
||||
|
||||
#define INVOKE(HUB, FUNCNAME, CODE) \
|
||||
@@ -82,12 +82,13 @@ static struct plugin_user* convert_user_type(struct hub_user* user)
|
||||
|
||||
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_INVOKE_STATUS_1(hub, on_check_ip_early, addr);
|
||||
}
|
||||
|
||||
plugin_st plugin_check_ip_late(struct hub_info* hub, struct ip_addr_encap* addr)
|
||||
plugin_st plugin_check_ip_late(struct hub_info* hub, struct hub_user* who, struct ip_addr_encap* addr)
|
||||
{
|
||||
PLUGIN_INVOKE_STATUS_1(hub, login_check_ip_late, addr);
|
||||
struct plugin_user* user = convert_user_type(who);
|
||||
PLUGIN_INVOKE_STATUS_2(hub, on_check_ip_late, user, addr);
|
||||
}
|
||||
|
||||
void plugin_log_connection_accepted(struct hub_info* hub, struct ip_addr_encap* ipaddr)
|
||||
@@ -155,6 +156,13 @@ plugin_st plugin_handle_search(struct hub_info* hub, struct hub_user* from, cons
|
||||
PLUGIN_INVOKE_STATUS_2(hub, on_search, user, data);
|
||||
}
|
||||
|
||||
plugin_st plugin_handle_search_result(struct hub_info* hub, struct hub_user* from, struct hub_user* to, const char* data)
|
||||
{
|
||||
struct plugin_user* user1 = convert_user_type(from);
|
||||
struct plugin_user* user2 = convert_user_type(to);
|
||||
PLUGIN_INVOKE_STATUS_3(hub, on_search_result, user1, user2, 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);
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
#include "uhub.h"
|
||||
#include "plugin_api/handle.h"
|
||||
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
|
||||
struct hub_info;
|
||||
struct ip_addr_encap;
|
||||
|
||||
@@ -40,7 +38,7 @@ void plugin_log_chat_message(struct hub_info* hub, struct hub_user* from, const
|
||||
|
||||
/* 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);
|
||||
plugin_st plugin_check_ip_late(struct hub_info* hub, struct hub_user* user, struct ip_addr_encap* addr);
|
||||
|
||||
/* Nickname allow/deny handling */
|
||||
plugin_st plugin_check_nickname_valid(struct hub_info* hub, const char* nick);
|
||||
@@ -52,6 +50,7 @@ plugin_st plugin_handle_private_message(struct hub_info* hub, struct hub_user* f
|
||||
|
||||
/* Handle searches */
|
||||
plugin_st plugin_handle_search(struct hub_info* hub, struct hub_user* user, const char* data);
|
||||
plugin_st plugin_handle_search_result(struct hub_info* hub, struct hub_user* from, struct hub_user* to, const char* data);
|
||||
|
||||
/* Handle p2p connections */
|
||||
plugin_st plugin_handle_connect(struct hub_info* hub, struct hub_user* from, struct hub_user* to);
|
||||
@@ -63,7 +62,5 @@ 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
|
||||
|
||||
|
||||
@@ -19,56 +19,67 @@
|
||||
|
||||
#include "uhub.h"
|
||||
|
||||
#ifdef PLUGIN_SUPPORT
|
||||
#include "plugin_api/handle.h"
|
||||
|
||||
struct plugin_hub_internals
|
||||
{
|
||||
struct hub_info* hub;
|
||||
plugin_unregister_f unregister;
|
||||
};
|
||||
struct plugin_callback_data;
|
||||
|
||||
static struct plugin_hub_internals* get_internals(struct plugin_handle* handle)
|
||||
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;
|
||||
struct plugin_hub_internals* internals;
|
||||
uhub_assert(handle && handle->handle && handle->handle->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));
|
||||
struct uhub_plugin* plugin;
|
||||
LOG_PLUGIN("plugin_open: \"%s\"", filename);
|
||||
|
||||
plugin = (struct uhub_plugin*) hub_malloc_zero(sizeof(struct uhub_plugin));
|
||||
if (!plugin)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_DLOPEN
|
||||
plugin->handle = dlopen(filename, RTLD_LAZY);
|
||||
#else
|
||||
plugin->handle = LoadLibraryExA(filename, NULL, 0);
|
||||
#endif
|
||||
|
||||
if (!plugin->handle)
|
||||
{
|
||||
#ifdef HAVE_DLOPEN
|
||||
LOG_ERROR("Unable to open plugin %s: %s", filename, dlerror());
|
||||
#else
|
||||
LOG_ERROR("Unable to open plugin %s: %d", filename, GetLastError());
|
||||
#endif
|
||||
hub_free(plugin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
plugin->filename = strdup(filename);
|
||||
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);
|
||||
struct plugin_hub_internals* internals = (struct plugin_hub_internals*) plugin->internals;
|
||||
|
||||
LOG_PLUGIN("plugin_close: \"%s\"", plugin->filename);
|
||||
plugin_callback_data_destroy(plugin->handle, internals->callback_data);
|
||||
hub_free(internals);
|
||||
plugin->internals = NULL;
|
||||
|
||||
#ifdef HAVE_DLOPEN
|
||||
dlclose(plugin->handle);
|
||||
hub_free(plugin);
|
||||
#else
|
||||
FreeLibrary((HMODULE) plugin->handle);
|
||||
#endif
|
||||
hub_free(plugin->filename);
|
||||
hub_free(plugin);
|
||||
}
|
||||
|
||||
void* plugin_lookup_symbol(struct uhub_plugin* plugin, const char* symbol)
|
||||
@@ -77,7 +88,8 @@ void* plugin_lookup_symbol(struct uhub_plugin* plugin, const char* symbol)
|
||||
void* addr = dlsym(plugin->handle, symbol);
|
||||
return addr;
|
||||
#else
|
||||
return 0;
|
||||
FARPROC addr = GetProcAddress((HMODULE) plugin->handle, symbol);
|
||||
return (void*) addr;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -88,9 +100,9 @@ struct plugin_handle* plugin_load(const char* filename, const char* config, stru
|
||||
plugin_register_f register_f;
|
||||
plugin_unregister_f unregister_f;
|
||||
int ret;
|
||||
struct plugin_handle* handle = hub_malloc_zero(sizeof(struct plugin_handle));
|
||||
struct plugin_handle* handle = (struct plugin_handle*) hub_malloc_zero(sizeof(struct plugin_handle));
|
||||
struct uhub_plugin* plugin = plugin_open(filename);
|
||||
struct plugin_hub_internals* internals;
|
||||
struct plugin_hub_internals* internals = (struct plugin_hub_internals*) plugin->internals;
|
||||
|
||||
if (!plugin)
|
||||
return NULL;
|
||||
@@ -105,9 +117,13 @@ struct plugin_handle* plugin_load(const char* filename, const char* config, stru
|
||||
register_f = plugin_lookup_symbol(plugin, "plugin_register");
|
||||
unregister_f = plugin_lookup_symbol(plugin, "plugin_unregister");
|
||||
|
||||
plugin_register_callback_functions(handle);
|
||||
// register hub internals
|
||||
internals->unregister = unregister_f;
|
||||
internals->hub = hub;
|
||||
internals->callback_data = plugin_callback_data_create();
|
||||
|
||||
internals = (struct plugin_hub_internals*) plugin->internals;
|
||||
// setup callback functions, where the plugin can contact the hub.
|
||||
plugin_register_callback_functions(handle);
|
||||
|
||||
if (register_f && unregister_f)
|
||||
{
|
||||
@@ -117,12 +133,7 @@ struct plugin_handle* plugin_load(const char* filename, const char* config, stru
|
||||
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;
|
||||
|
||||
LOG_PLUGIN("Plugin API version: %d (func table size: " PRINTF_SIZE_T ")", handle->plugin_api_version, handle->plugin_funcs_size);
|
||||
return handle;
|
||||
}
|
||||
else
|
||||
@@ -144,9 +155,10 @@ struct plugin_handle* plugin_load(const char* filename, const char* config, stru
|
||||
void plugin_unload(struct plugin_handle* plugin)
|
||||
{
|
||||
struct plugin_hub_internals* internals = get_internals(plugin);
|
||||
plugin_unregister_callback_functions(plugin);
|
||||
internals->unregister(plugin);
|
||||
plugin_unregister_callback_functions(plugin);
|
||||
plugin_close(plugin->handle);
|
||||
hub_free(plugin);
|
||||
}
|
||||
|
||||
static int plugin_parse_line(char* line, int line_count, void* ptr_data)
|
||||
@@ -178,7 +190,7 @@ static int plugin_parse_line(char* line, int line_count, void* ptr_data)
|
||||
if (!params)
|
||||
params = "";
|
||||
|
||||
LOG_TRACE("Load plugin: \"%s\", params=\"%s\"", soname, params);
|
||||
LOG_PLUGIN("Load plugin: \"%s\", params=\"%s\"", soname, params);
|
||||
plugin = plugin_load(soname, params, hub);
|
||||
if (plugin)
|
||||
{
|
||||
@@ -207,8 +219,13 @@ int plugin_initialize(struct hub_config* config, struct hub_info* hub)
|
||||
|
||||
ret = file_read_lines(config->file_plugins, hub, &plugin_parse_line);
|
||||
if (ret == -1)
|
||||
{
|
||||
list_clear(hub->plugins->loaded, hub_free);
|
||||
list_destroy(hub->plugins->loaded);
|
||||
hub->plugins->loaded = 0;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -232,4 +249,3 @@ struct hub_info* plugin_get_hub(struct plugin_handle* plugin)
|
||||
return data->hub;
|
||||
}
|
||||
|
||||
#endif /* PLUGIN_SUPPORT */
|
||||
|
||||
@@ -30,8 +30,9 @@ struct plugin_handle;
|
||||
struct uhub_plugin
|
||||
{
|
||||
void* handle;
|
||||
void* internals; // Hub internal stuff
|
||||
void* callback_data; // Hub internal stuff
|
||||
plugin_unregister_f unregister;
|
||||
char* filename;
|
||||
void* internals; // Hub-internal stuff (struct plugin_hub_internals)
|
||||
};
|
||||
|
||||
struct uhub_plugins
|
||||
@@ -39,7 +40,7 @@ struct uhub_plugins
|
||||
struct linked_list* loaded;
|
||||
};
|
||||
|
||||
// High level plugin loader ode
|
||||
// High level plugin loader code
|
||||
extern struct plugin_handle* plugin_load(const char* filename, const char* config, struct hub_info* hub);
|
||||
extern void plugin_unload(struct plugin_handle* plugin);
|
||||
|
||||
@@ -53,7 +54,14 @@ extern void plugin_close(struct uhub_plugin*);
|
||||
extern void* plugin_lookup_symbol(struct uhub_plugin*, const char* symbol);
|
||||
|
||||
// Used internally only
|
||||
struct plugin_hub_internals
|
||||
{
|
||||
struct hub_info* hub;
|
||||
plugin_unregister_f unregister; /* The unregister function. */
|
||||
struct plugin_callback_data* callback_data; /* callback data that is unique for the plugin */
|
||||
};
|
||||
|
||||
extern struct plugin_hub_internals* get_internals(struct plugin_handle*);
|
||||
extern struct hub_info* plugin_get_hub(struct plugin_handle*);
|
||||
|
||||
#endif /* HAVE_UHUB_PLUGIN_LOADER_H */
|
||||
|
||||
|
||||
@@ -50,6 +50,17 @@ static void probe_net_event(struct net_connection* con, int events, void *arg)
|
||||
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
|
||||
#endif
|
||||
@@ -60,9 +71,8 @@ static void probe_net_event(struct net_connection* con, int events, void *arg)
|
||||
probe_destroy(probe);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef SSL_SUPPORT
|
||||
if (bytes >= 11 &&
|
||||
else if (bytes >= 11 &&
|
||||
probe_recvbuf[0] == 22 &&
|
||||
probe_recvbuf[1] == 3 && /* protocol major version */
|
||||
probe_recvbuf[5] == 1 && /* message type */
|
||||
@@ -82,20 +92,14 @@ static void probe_net_event(struct net_connection* con, int events, void *arg)
|
||||
{
|
||||
LOG_TRACE("Probed TLS %d.%d connection. TLS disabled in hub.", (int) probe_recvbuf[1], (int) probe_recvbuf[2]);
|
||||
}
|
||||
probe_destroy(probe);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_TRACE("Probed TLS %d.%d connection", (int) probe_recvbuf[1], (int) probe_recvbuf[2]);
|
||||
|
||||
net_con_ssl_handshake(con, net_con_ssl_mode_server, probe->hub->ssl_ctx);
|
||||
return;
|
||||
LOG_TRACE("Probed unsupported protocol: %x%x%x%x.", (int) probe_recvbuf[0], (int) probe_recvbuf[1], (int) probe_recvbuf[2], (int) probe_recvbuf[3]);
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
probe_destroy(probe);
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -107,6 +111,8 @@ struct hub_probe* probe_create(struct hub_info* hub, int sd, struct ip_addr_enca
|
||||
if (probe == NULL)
|
||||
return NULL; /* OOM */
|
||||
|
||||
LOG_TRACE("probe_create(): %p", probe);
|
||||
|
||||
probe->hub = hub;
|
||||
probe->connection = net_con_create();
|
||||
net_con_initialize(probe->connection, sd, probe_net_event, probe, NET_EVENT_READ);
|
||||
@@ -118,6 +124,7 @@ struct hub_probe* probe_create(struct hub_info* hub, int sd, struct ip_addr_enca
|
||||
|
||||
void probe_destroy(struct hub_probe* probe)
|
||||
{
|
||||
LOG_TRACE("probe_destroy(): %p (connection=%p)", probe, probe->connection);
|
||||
if (probe->connection)
|
||||
{
|
||||
net_con_close(probe->connection);
|
||||
|
||||
@@ -106,7 +106,7 @@ int route_to_user(struct hub_info* hub, struct hub_user* user, struct adc_messag
|
||||
if (!user->connection)
|
||||
return 0;
|
||||
|
||||
assert(msg->cache && *msg->cache);
|
||||
uhub_assert(msg->cache && *msg->cache);
|
||||
|
||||
if (hub_sendq_is_empty(user->send_queue) && !user_flag_get(user, flag_pipeline))
|
||||
{
|
||||
|
||||
@@ -71,6 +71,12 @@ void user_destroy(struct hub_user* user)
|
||||
hub_recvq_destroy(user->recv_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);
|
||||
user_clear_feature_cast_support(user);
|
||||
hub_free(user);
|
||||
@@ -175,6 +181,10 @@ static int convert_support_fourcc(int fourcc)
|
||||
case FOURCC('A','D','C','S'):
|
||||
return feature_adcs;
|
||||
|
||||
// ignore these extensions, they are not useful for the hub.
|
||||
case FOURCC('D','H','T','0'):
|
||||
return 0;
|
||||
|
||||
default:
|
||||
LOG_DEBUG("Unknown extension: %x", fourcc);
|
||||
return 0;
|
||||
|
||||
@@ -109,7 +109,7 @@ 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 */
|
||||
uint32_t flags; /** see enum user_features */
|
||||
uint32_t flags; /** see enum user_flags */
|
||||
struct linked_list* feature_cast; /** Features supported by feature cast */
|
||||
struct adc_message* info; /** ADC 'INF' message (broadcasted to everyone joining the hub) */
|
||||
struct hub_info* hub; /** The hub instance this user belong to */
|
||||
|
||||
@@ -162,7 +162,7 @@ int uman_remove(struct hub_info* hub, struct hub_user* user)
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(!"negative count!");
|
||||
uhub_assert(!"negative count!");
|
||||
}
|
||||
|
||||
hub->users->shared_size -= user->limits.shared_size;
|
||||
|
||||
@@ -72,7 +72,7 @@ static net_backend_init_t net_backend_init_funcs[] = {
|
||||
int net_backend_init()
|
||||
{
|
||||
size_t n;
|
||||
g_backend = hub_malloc_zero(sizeof(struct net_backend));
|
||||
g_backend = (struct net_backend*) hub_malloc_zero(sizeof(struct net_backend));
|
||||
g_backend->common.num = 0;
|
||||
g_backend->common.max = net_get_max_sockets();
|
||||
g_backend->now = time(0);
|
||||
@@ -179,6 +179,14 @@ void net_con_close(struct net_connection* 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);
|
||||
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)
|
||||
{
|
||||
net_cleanup_process(handler);
|
||||
hub_free(handler->queue);
|
||||
hub_free(handler);
|
||||
}
|
||||
@@ -213,7 +222,7 @@ void net_cleanup_process(struct net_cleanup_handler* handler)
|
||||
{
|
||||
struct net_connection* con = handler->queue[n];
|
||||
LOG_TRACE("net_cleanup_process: free: %p", con);
|
||||
hub_free(con);
|
||||
net_con_destroy(con);
|
||||
}
|
||||
handler->num = 0;
|
||||
}
|
||||
|
||||
@@ -70,7 +70,6 @@ static int handle_openssl_error(struct net_connection* con, int ret)
|
||||
con->ssl_state = tls_st_error;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -123,6 +122,11 @@ ssize_t net_con_ssl_handshake(struct net_connection* con, enum net_con_ssl_mode
|
||||
if (ssl_mode == net_con_ssl_mode_server)
|
||||
{
|
||||
ssl = SSL_new(ssl_ctx);
|
||||
if (!ssl)
|
||||
{
|
||||
LOG_ERROR("Unable to create new SSL stream\n");
|
||||
return -1;
|
||||
}
|
||||
SSL_set_fd(ssl, con->sd);
|
||||
net_con_set_ssl(con, ssl);
|
||||
return net_con_ssl_accept(con);
|
||||
@@ -137,6 +141,10 @@ ssize_t net_con_ssl_handshake(struct net_connection* con, enum net_con_ssl_mode
|
||||
}
|
||||
#endif /* SSL_SUPPORT */
|
||||
|
||||
#ifdef SSL_SUPPORT
|
||||
void net_stats_add_tx(size_t bytes);
|
||||
void net_stats_add_rx(size_t bytes);
|
||||
#endif
|
||||
|
||||
ssize_t net_con_send(struct net_connection* con, const void* buf, size_t len)
|
||||
{
|
||||
@@ -148,7 +156,13 @@ ssize_t net_con_send(struct net_connection* con, const void* buf, size_t len)
|
||||
ret = net_send(con->sd, buf, len, UHUB_SEND_SIGNAL);
|
||||
if (ret == -1)
|
||||
{
|
||||
if (net_error() == EWOULDBLOCK || net_error() == EINTR)
|
||||
if (
|
||||
#ifdef WINSOCK
|
||||
net_error() == WSAEWOULDBLOCK
|
||||
#else
|
||||
net_error() == EWOULDBLOCK
|
||||
#endif
|
||||
|| net_error() == EINTR)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
@@ -161,7 +175,11 @@ 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);
|
||||
if (ret <= 0)
|
||||
{
|
||||
return -handle_openssl_error(con, ret);
|
||||
return handle_openssl_error(con, ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
net_stats_add_tx(ret);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -178,7 +196,13 @@ ssize_t net_con_recv(struct net_connection* con, void* buf, size_t len)
|
||||
ret = net_recv(con->sd, buf, len, 0);
|
||||
if (ret == -1)
|
||||
{
|
||||
if (net_error() == EWOULDBLOCK || net_error() == EINTR)
|
||||
if (
|
||||
#ifdef WINSOCK
|
||||
net_error() == WSAEWOULDBLOCK
|
||||
#else
|
||||
net_error() == EWOULDBLOCK
|
||||
#endif
|
||||
|| net_error() == EINTR)
|
||||
return 0;
|
||||
return -net_error();
|
||||
}
|
||||
@@ -198,10 +222,11 @@ ssize_t net_con_recv(struct net_connection* con, void* buf, size_t len)
|
||||
if (ret > 0)
|
||||
{
|
||||
net_con_update(con, NET_EVENT_READ);
|
||||
net_stats_add_rx(ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
return -handle_openssl_error(con, ret);
|
||||
return handle_openssl_error(con, ret);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -213,7 +238,13 @@ ssize_t net_con_peek(struct net_connection* con, void* buf, size_t len)
|
||||
int ret = net_recv(con->sd, buf, len, MSG_PEEK);
|
||||
if (ret == -1)
|
||||
{
|
||||
if (net_error() == EWOULDBLOCK || net_error() == EINTR)
|
||||
if (
|
||||
#ifdef WINSOCK
|
||||
net_error() == WSAEWOULDBLOCK
|
||||
#else
|
||||
net_error() == EWOULDBLOCK
|
||||
#endif
|
||||
|| net_error() == EINTR)
|
||||
return 0;
|
||||
return -net_error();
|
||||
}
|
||||
@@ -251,6 +282,9 @@ void* net_con_get_ptr(struct net_connection* con)
|
||||
|
||||
void net_con_destroy(struct net_connection* con)
|
||||
{
|
||||
#ifdef SSL_SUPPORT
|
||||
SSL_free(con->ssl);
|
||||
#endif
|
||||
hub_free(con);
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,6 @@ int net_initialize()
|
||||
LOG_TRACE("Initializing OpenSSL...");
|
||||
SSL_library_init();
|
||||
SSL_load_error_strings();
|
||||
OpenSSL_add_all_algorithms();
|
||||
#endif /* SSL_SUPPORT */
|
||||
|
||||
net_initialized = 1;
|
||||
@@ -101,7 +100,9 @@ int net_destroy()
|
||||
net_backend_shutdown();
|
||||
|
||||
#ifdef SSL_SUPPORT
|
||||
/* FIXME: Shutdown OpenSSL here. */
|
||||
ERR_free_strings();
|
||||
EVP_cleanup();
|
||||
CRYPTO_cleanup_all_ex_data();
|
||||
#endif
|
||||
|
||||
#ifdef WINSOCK
|
||||
@@ -113,13 +114,6 @@ int net_destroy()
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef USE_LIBEVENT
|
||||
struct event_base* net_get_evbase()
|
||||
{
|
||||
return net_evbase;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void net_error_out(int fd, const char* func)
|
||||
{
|
||||
int err = net_error();
|
||||
@@ -371,8 +365,13 @@ int net_accept(int fd, struct ip_addr_encap* ipaddr)
|
||||
case EOPNOTSUPP:
|
||||
errno = EWOULDBLOCK;
|
||||
#endif
|
||||
#ifdef WINSOCK
|
||||
case WSAEWOULDBLOCK:
|
||||
break;
|
||||
#else
|
||||
case EWOULDBLOCK:
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
net_error_out(fd, "net_accept");
|
||||
net_stats_add_error();
|
||||
@@ -418,7 +417,11 @@ int net_connect(int fd, const struct sockaddr *serv_addr, socklen_t addrlen)
|
||||
int ret = connect(fd, serv_addr, addrlen);
|
||||
if (ret == -1)
|
||||
{
|
||||
#ifdef WINSOCK
|
||||
if (net_error() != WSAEINPROGRESS)
|
||||
#else
|
||||
if (net_error() != EINPROGRESS)
|
||||
#endif
|
||||
{
|
||||
net_error_out(fd, "net_connect");
|
||||
net_stats_add_error();
|
||||
@@ -521,6 +524,7 @@ const char* net_address_to_string(int af, const void* src, char* dst, socklen_t
|
||||
sin6.sin6_family = AF_INET6;
|
||||
sin6.sin6_port = 0;
|
||||
sin6.sin6_addr = *addr6;
|
||||
sin6.sin6_scope_id = 0;
|
||||
size = sizeof(sin6);
|
||||
addr = (LPSOCKADDR) &sin6;
|
||||
break;
|
||||
@@ -684,7 +688,11 @@ ssize_t net_recv(int fd, void* buf, size_t len, int flags)
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef WINSOCK
|
||||
if (net_error() != WSAEWOULDBLOCK)
|
||||
#else
|
||||
if (net_error() != EWOULDBLOCK)
|
||||
#endif
|
||||
{
|
||||
/* net_error_out(fd, "net_recv"); */
|
||||
net_stats_add_error();
|
||||
@@ -703,7 +711,11 @@ ssize_t net_send(int fd, const void* buf, size_t len, int flags)
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef WINSOCK
|
||||
if (net_error() != WSAEWOULDBLOCK)
|
||||
#else
|
||||
if (net_error() != EWOULDBLOCK)
|
||||
#endif
|
||||
{
|
||||
/* net_error_out(fd, "net_send"); */
|
||||
net_stats_add_error();
|
||||
|
||||
@@ -51,8 +51,6 @@ extern int net_initialize();
|
||||
*/
|
||||
extern int net_destroy();
|
||||
|
||||
extern struct event_base* net_get_evbase();
|
||||
|
||||
/**
|
||||
* @return the number of sockets currrently being monitored.
|
||||
*/
|
||||
@@ -254,46 +252,4 @@ extern void net_stats_add_close();
|
||||
extern int net_stats_timeout();
|
||||
extern void net_stats_get(struct net_statistics** intermediate, struct net_statistics** total);
|
||||
|
||||
|
||||
#if defined(WINSOCK) && !defined(__CYGWIN__) && !defined(_MSC_VER)
|
||||
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EINPROGRESS WSAEINPROGRESS
|
||||
#define EALREADY WSAEALREADY
|
||||
#define ENOTSOCK WSAENOTSOCK
|
||||
#define EDESTADDRREQ WSAEDESTADDRREQ
|
||||
#define EMSGSIZE WSAEMSGSIZE
|
||||
#define EPROTOTYPE WSAEPROTOTYPE
|
||||
#define ENOPROTOOPT WSAENOPROTOOPT
|
||||
#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
|
||||
#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
|
||||
#define EOPNOTSUPP WSAEOPNOTSUPP
|
||||
#define EPFNOSUPPORT WSAEPFNOSUPPORT
|
||||
#define EAFNOSUPPORT WSAEAFNOSUPPORT
|
||||
#define EADDRINUSE WSAEADDRINUSE
|
||||
#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
|
||||
#define ENETDOWN WSAENETDOWN
|
||||
#define ENETUNREACH WSAENETUNREACH
|
||||
#define ENETRESET WSAENETRESET
|
||||
#define ECONNABORTED WSAECONNABORTED
|
||||
#define ECONNRESET WSAECONNRESET
|
||||
#define ENOBUFS WSAENOBUFS
|
||||
#define EISCONN WSAEISCONN
|
||||
#define ENOTCONN WSAENOTCONN
|
||||
#define ESHUTDOWN WSAESHUTDOWN
|
||||
#define ETOOMANYREFS WSAETOOMANYREFS
|
||||
#define ETIMEDOUT WSAETIMEDOUT
|
||||
#define ECONNREFUSED WSAECONNREFUSED
|
||||
#define ELOOP WSAELOOP
|
||||
#define EHOSTDOWN WSAEHOSTDOWN
|
||||
#define EHOSTUNREACH WSAEHOSTUNREACH
|
||||
#define EPROCLIM WSAEPROCLIM
|
||||
#define EUSERS WSAEUSERS
|
||||
#define EDQUOT WSAEDQUOT
|
||||
#define ESTALE WSAESTALE
|
||||
#define EREMOTE WSAEREMOTE
|
||||
|
||||
#endif /* WINSOCK && !__CYGWIN__ */
|
||||
|
||||
|
||||
#endif /* HAVE_UHUB_NETWORK_H */
|
||||
|
||||
@@ -55,7 +55,7 @@ int net_backend_poll_select(struct net_backend* data, int ms)
|
||||
struct net_backend_select* backend = (struct net_backend_select*) data;
|
||||
|
||||
tval.tv_sec = ms / 1000;
|
||||
tval.tv_usec = ((ms % 1000) * 1000); // FIXME: correct?
|
||||
tval.tv_usec = (ms % 1000) * 1000;
|
||||
|
||||
FD_ZERO(&backend->rfds);
|
||||
FD_ZERO(&backend->wfds);
|
||||
@@ -78,10 +78,11 @@ int net_backend_poll_select(struct net_backend* data, int ms)
|
||||
res = select(backend->maxfd, &backend->rfds, &backend->wfds, &backend->xfds, &tval);
|
||||
if (res == -1)
|
||||
{
|
||||
if (net_error() == EINTR)
|
||||
return 0;
|
||||
|
||||
printf("Error: %d\n", net_error());
|
||||
}
|
||||
if (res == -1 && net_error() == EINTR)
|
||||
return 0;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -31,11 +31,23 @@
|
||||
struct plugin_command
|
||||
{
|
||||
const char* message;
|
||||
char* prefix;
|
||||
size_t prefix_len;
|
||||
const char* prefix;
|
||||
struct linked_list* args;
|
||||
};
|
||||
|
||||
struct plugin_command_arg_data
|
||||
{
|
||||
enum plugin_command_arg_type type;
|
||||
union {
|
||||
int integer;
|
||||
char* string;
|
||||
struct plugin_user* user;
|
||||
struct ip_addr_encap* address;
|
||||
struct ip_range* range;
|
||||
enum auth_credentials credentials;
|
||||
} data;
|
||||
};
|
||||
|
||||
typedef int (*plugin_command_handler)(struct plugin_handle*, struct plugin_user* to, struct plugin_command*);
|
||||
|
||||
struct plugin_command_handle
|
||||
@@ -48,6 +60,7 @@ struct plugin_command_handle
|
||||
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" */
|
||||
const char* origin; /**<<< "Name of plugin where the command originated." */
|
||||
};
|
||||
|
||||
#define PLUGIN_COMMAND_INITIALIZE(PTR, HANDLE, PREFIX, ARGS, CRED, CALLBACK, DESC) \
|
||||
@@ -62,18 +75,5 @@ struct plugin_command_handle
|
||||
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 */
|
||||
|
||||
@@ -29,12 +29,6 @@
|
||||
#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*);
|
||||
|
||||
@@ -45,12 +39,23 @@ typedef void (*on_user_nick_change_t)(struct plugin_handle*, struct plugin_user*
|
||||
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 void (*on_hub_started_t)(struct plugin_handle*, struct plugin_hub_info*);
|
||||
typedef void (*on_hub_reloaded_t)(struct plugin_handle*, struct plugin_hub_info*);
|
||||
typedef void (*on_hub_shutdown_t)(struct plugin_handle*, struct plugin_hub_info*);
|
||||
typedef void (*on_hub_error_t)(struct plugin_handle*, struct plugin_hub_info*, const char* message);
|
||||
|
||||
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_check_ip_late_t)(struct plugin_handle*, struct plugin_user*, 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 (*on_change_nick_t)(struct plugin_handle*, struct plugin_user*, const char* new_nick);
|
||||
|
||||
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_search_result_t)(struct plugin_handle*, struct plugin_user* from, struct plugin_user* to, 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 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);
|
||||
@@ -59,6 +64,7 @@ typedef plugin_st (*auth_delete_user_t)(struct plugin_handle*, struct auth_info*
|
||||
|
||||
/**
|
||||
* These are callbacks used for the hub to invoke functions in plugins.
|
||||
* The marked ones are not being called yet.
|
||||
*/
|
||||
struct plugin_funcs
|
||||
{
|
||||
@@ -70,14 +76,24 @@ struct plugin_funcs
|
||||
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_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 */
|
||||
|
||||
// Log hub events
|
||||
/* ! */ on_hub_started_t on_hub_started; /* Triggered just after plugins are loaded and the hub is started. */
|
||||
/* ! */ on_hub_reloaded_t on_hub_reloaded; /* Triggered immediately after hub configuration is reloaded. */
|
||||
/* ! */ on_hub_shutdown_t on_hub_shutdown; /* Triggered just before the hub is being shut down and before plugins are unloaded. */
|
||||
/* ! */ on_hub_error_t on_hub_error; /* Triggered for log-worthy error messages */
|
||||
|
||||
// Activity events (can be intercepted and refused/accepted by a plugin)
|
||||
on_check_ip_early_t on_check_ip_early; /* A user has just connected (can be intercepted) */
|
||||
/* ! */ on_check_ip_late_t on_check_ip_late; /* A user has logged in (can be intercepted) */
|
||||
/* ! */ on_change_nick_t on_change_nick; /* A user wants to change his nick (can be intercepted) */
|
||||
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_search_result_t on_search_result; /* A search result 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) */
|
||||
|
||||
@@ -87,18 +103,26 @@ struct plugin_funcs
|
||||
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;
|
||||
struct plugin_command;
|
||||
struct plugin_command_arg_data;
|
||||
|
||||
typedef int (*hfunc_send_message)(struct plugin_handle*, struct plugin_user* user, const char* message);
|
||||
typedef int (*hfunc_send_status)(struct plugin_handle*, struct plugin_user* to, int code, 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*);
|
||||
|
||||
typedef size_t (*hfunc_command_arg_reset)(struct plugin_handle*, struct plugin_command*);
|
||||
typedef struct plugin_command_arg_data* (*hfunc_command_arg_next)(struct plugin_handle*, struct plugin_command*, enum plugin_command_arg_type);
|
||||
|
||||
typedef char* (*hfunc_get_hub_name)(struct plugin_handle*);
|
||||
typedef void (*hfunc_set_hub_name)(struct plugin_handle*, const char*);
|
||||
typedef char* (*hfunc_get_hub_description)(struct plugin_handle*);
|
||||
typedef void (*hfunc_set_hub_description)(struct plugin_handle*, const char*);
|
||||
|
||||
/**
|
||||
* These are functions created and initialized by the hub and which can be used
|
||||
* by plugins to access functionality internal to the hub.
|
||||
@@ -106,12 +130,18 @@ typedef int (*hfunc_command_del)(struct plugin_handle*, struct plugin_command_ha
|
||||
struct plugin_hub_funcs
|
||||
{
|
||||
hfunc_send_message send_message;
|
||||
hfunc_send_status send_status_message;
|
||||
hfunc_user_disconnect user_disconnect;
|
||||
hfunc_command_add command_add;
|
||||
hfunc_command_del command_del;
|
||||
hfunc_command_arg_reset command_arg_reset;
|
||||
hfunc_command_arg_next command_arg_next;
|
||||
hfunc_get_hub_name get_name;
|
||||
hfunc_set_hub_name set_name;
|
||||
hfunc_get_hub_description get_description;
|
||||
hfunc_set_hub_description set_description;
|
||||
};
|
||||
|
||||
|
||||
struct plugin_handle
|
||||
{
|
||||
struct uhub_plugin* handle; /* Must NOT be modified by the plugin */
|
||||
@@ -146,12 +176,12 @@ struct plugin_handle
|
||||
* @param config A configuration string
|
||||
* @return 0 on success, -1 on error.
|
||||
*/
|
||||
extern int plugin_register(struct plugin_handle* handle, const char* config);
|
||||
PLUGIN_API int plugin_register(struct plugin_handle* handle, const char* config);
|
||||
|
||||
/**
|
||||
* @return 0 on success, -1 on error.
|
||||
*/
|
||||
extern int plugin_unregister(struct plugin_handle*);
|
||||
PLUGIN_API 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*);
|
||||
|
||||
@@ -26,4 +26,9 @@
|
||||
*/
|
||||
extern int plugin_send_message(struct plugin_handle*, struct plugin_user* to, const char* message);
|
||||
|
||||
/**
|
||||
* Send a status message to a user.
|
||||
*/
|
||||
extern int plugin_send_status(struct plugin_handle* struct plugin_user* to, int code, const char* message);
|
||||
|
||||
#endif /* HAVE_UHUB_PLUGIN_API_H */
|
||||
|
||||
@@ -55,6 +55,11 @@ struct plugin_user
|
||||
enum auth_credentials credentials;
|
||||
};
|
||||
|
||||
struct plugin_hub_info
|
||||
{
|
||||
const char* description;
|
||||
};
|
||||
|
||||
enum plugin_status
|
||||
{
|
||||
st_default = 0, /* Use default */
|
||||
@@ -88,4 +93,15 @@ struct ban_info
|
||||
time_t expiry; /* Time when the ban record expires */
|
||||
};
|
||||
|
||||
enum plugin_command_arg_type
|
||||
{
|
||||
plugin_cmd_arg_type_integer,
|
||||
plugin_cmd_arg_type_string,
|
||||
plugin_cmd_arg_type_user,
|
||||
plugin_cmd_arg_type_address,
|
||||
plugin_cmd_arg_type_range,
|
||||
plugin_cmd_arg_type_credentials,
|
||||
};
|
||||
|
||||
|
||||
#endif /* HAVE_UHUB_PLUGIN_TYPES_H */
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2011, Jan Vidar Krey
|
||||
* 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 "plugin_api/handle.h"
|
||||
@@ -203,7 +217,7 @@ static plugin_st delete_user(struct plugin_handle* plugin, struct auth_info* use
|
||||
return st_default;
|
||||
}
|
||||
|
||||
int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||
PLUGIN_API 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.");
|
||||
|
||||
@@ -219,7 +233,7 @@ int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int plugin_unregister(struct plugin_handle* plugin)
|
||||
PLUGIN_API int plugin_unregister(struct plugin_handle* plugin)
|
||||
{
|
||||
set_error_message(plugin, 0);
|
||||
unload_acl(plugin->ptr);
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2012, 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 "plugin_api/handle.h"
|
||||
@@ -12,8 +26,7 @@
|
||||
#include "util/log.h"
|
||||
#include "util/config_token.h"
|
||||
|
||||
#define DEBUG_SQL
|
||||
|
||||
// #define DEBUG_SQL
|
||||
|
||||
static void set_error_message(struct plugin_handle* plugin, const char* msg)
|
||||
{
|
||||
@@ -26,6 +39,37 @@ struct sql_data
|
||||
sqlite3* db;
|
||||
};
|
||||
|
||||
static int null_callback(void* ptr, int argc, char **argv, char **colName) { return 0; }
|
||||
|
||||
static int sql_execute(struct sql_data* sql, int (*callback)(void* ptr, int argc, char **argv, char **colName), void* ptr, const char* sql_fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
char query[1024];
|
||||
char* errMsg;
|
||||
int rc;
|
||||
|
||||
va_start(args, sql_fmt);
|
||||
vsnprintf(query, sizeof(query), sql_fmt, args);
|
||||
|
||||
#ifdef DEBUG_SQL
|
||||
printf("SQL: %s\n", query);
|
||||
#endif
|
||||
|
||||
rc = sqlite3_exec(sql->db, query, callback, ptr, &errMsg);
|
||||
if (rc != SQLITE_OK)
|
||||
{
|
||||
#ifdef DEBUG_SQL
|
||||
fprintf(stderr, "ERROR: %s\n", errMsg);
|
||||
#endif
|
||||
sqlite3_free(errMsg);
|
||||
return -rc;
|
||||
}
|
||||
|
||||
rc = sqlite3_changes(sql->db);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
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));
|
||||
@@ -165,17 +209,42 @@ static plugin_st get_user(struct plugin_handle* plugin, const char* nickname, st
|
||||
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)
|
||||
char* nick = strdup(sql_escape_string(user->nickname));
|
||||
char* pass = strdup(sql_escape_string(user->password));
|
||||
const char* cred = auth_cred_to_string(user->credentials);
|
||||
int rc = sql_execute(sql, null_callback, NULL, "INSERT INTO users (nickname, password, credentials) VALUES('%s', '%s', '%s');", nick, pass, cred);
|
||||
|
||||
free(nick);
|
||||
free(pass);
|
||||
|
||||
if (rc <= 0)
|
||||
{
|
||||
fprintf(stderr, "Unable to add user \"%s\"\n", user->nickname);
|
||||
return st_deny;
|
||||
return st_default;
|
||||
}
|
||||
return st_allow;
|
||||
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
char* nick = strdup(sql_escape_string(user->nickname));
|
||||
char* pass = strdup(sql_escape_string(user->password));
|
||||
const char* cred = auth_cred_to_string(user->credentials);
|
||||
int rc = sql_execute(sql, null_callback, NULL, "INSERT INTO users (nickname, password, credentials) VALUES('%s', '%s', '%s');", nick, pass, cred);
|
||||
|
||||
free(nick);
|
||||
free(pass);
|
||||
|
||||
if (rc <= 0)
|
||||
{
|
||||
fprintf(stderr, "Unable to add user \"%s\"\n", user->nickname);
|
||||
return st_deny;
|
||||
return st_default;
|
||||
}
|
||||
return st_allow;
|
||||
|
||||
}
|
||||
|
||||
static plugin_st delete_user(struct plugin_handle* plugin, struct auth_info* user)
|
||||
@@ -188,7 +257,7 @@ static plugin_st delete_user(struct plugin_handle* plugin, struct auth_info* use
|
||||
|
||||
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.");
|
||||
PLUGIN_INITIALIZE(plugin, "SQLite authentication plugin", "1.0", "Authenticate users based on a SQLite database.");
|
||||
|
||||
// Authentication actions.
|
||||
plugin->funcs.auth_get_user = get_user;
|
||||
@@ -204,8 +273,9 @@ int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||
|
||||
int plugin_unregister(struct plugin_handle* plugin)
|
||||
{
|
||||
struct sql_data* sql;
|
||||
set_error_message(plugin, 0);
|
||||
struct sql_data* sql = (struct sql_data*) plugin->ptr;
|
||||
sql = (struct sql_data*) plugin->ptr;
|
||||
sqlite3_close(sql->db);
|
||||
hub_free(sql);
|
||||
return 0;
|
||||
|
||||
246
src/plugins/mod_chat_history.c
Normal file
246
src/plugins/mod_chat_history.c
Normal file
@@ -0,0 +1,246 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, 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 "plugin_api/handle.h"
|
||||
#include "plugin_api/command_api.h"
|
||||
#include "util/config_token.h"
|
||||
#include "util/memory.h"
|
||||
#include "util/misc.h"
|
||||
#include "util/list.h"
|
||||
#include "util/cbuffer.h"
|
||||
|
||||
#define MAX_HISTORY_SIZE 16384
|
||||
|
||||
struct chat_history_data
|
||||
{
|
||||
size_t history_max; ///<<< "the maximum number of chat messages kept in history."
|
||||
size_t history_default; ///<<< "the default number of chat messages returned if no limit was provided"
|
||||
size_t history_connect; ///<<< "the number of chat messages provided when users connect to the hub."
|
||||
struct linked_list* chat_history; ///<<< "The chat history storage."
|
||||
struct plugin_command_handle* command_history_handle; ///<<< "A handle to the !history command."
|
||||
};
|
||||
|
||||
/**
|
||||
* Add a chat message to history.
|
||||
*/
|
||||
static void history_add(struct plugin_handle* plugin, struct plugin_user* from, const char* message, int flags)
|
||||
{
|
||||
size_t loglen = strlen(message) + strlen(from->nick) + 13;
|
||||
struct chat_history_data* data = (struct chat_history_data*) plugin->ptr;
|
||||
char* log = hub_malloc(loglen + 1);
|
||||
|
||||
snprintf(log, loglen, "%s <%s> %s\n", get_timestamp(time(NULL)), from->nick, message);
|
||||
log[loglen] = '\0';
|
||||
list_append(data->chat_history, log);
|
||||
while (list_size(data->chat_history) > data->history_max)
|
||||
{
|
||||
char* msg = list_get_first(data->chat_history);
|
||||
list_remove(data->chat_history, msg);
|
||||
hub_free(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain 'num' messages from the chat history and append them to outbuf.
|
||||
*
|
||||
* @return the number of messages added to the buffer.
|
||||
*/
|
||||
static size_t get_messages(struct chat_history_data* data, size_t num, struct cbuffer* outbuf)
|
||||
{
|
||||
struct linked_list* messages = data->chat_history;
|
||||
char* message;
|
||||
int skiplines = 0;
|
||||
size_t lines = 0;
|
||||
int total = list_size(messages);
|
||||
|
||||
if (total == 0)
|
||||
return 0;
|
||||
|
||||
if (num <= 0 || num > total)
|
||||
num = total;
|
||||
|
||||
if (num != total)
|
||||
skiplines = total - num;
|
||||
|
||||
cbuf_append(outbuf, "\n");
|
||||
message = (char*) list_get_first(messages);
|
||||
while (message)
|
||||
{
|
||||
if (--skiplines < 0)
|
||||
{
|
||||
cbuf_append(outbuf, message);
|
||||
lines++;
|
||||
}
|
||||
message = (char*) list_get_next(messages);
|
||||
}
|
||||
cbuf_append(outbuf, "\n");
|
||||
return lines;
|
||||
}
|
||||
|
||||
void user_login(struct plugin_handle* plugin, struct plugin_user* user)
|
||||
{
|
||||
struct chat_history_data* data = (struct chat_history_data*) plugin->ptr;
|
||||
struct cbuffer* buf = NULL;
|
||||
// size_t messages = 0;
|
||||
|
||||
if (data->history_connect > 0 && list_size(data->chat_history) > 0)
|
||||
{
|
||||
buf = cbuf_create(MAX_HISTORY_SIZE);
|
||||
cbuf_append(buf, "Chat history:\n");
|
||||
get_messages(data, data->history_connect, buf);
|
||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
||||
cbuf_destroy(buf);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a status message back to the user who issued the !history command.
|
||||
*/
|
||||
static int command_status(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd, struct cbuffer* buf)
|
||||
{
|
||||
struct cbuffer* msg = cbuf_create(cbuf_size(buf) + strlen(cmd->prefix) + 8);
|
||||
cbuf_append_format(msg, "*** %s: %s", cmd->prefix, cbuf_get(buf));
|
||||
plugin->hub.send_message(plugin, user, cbuf_get(msg));
|
||||
cbuf_destroy(msg);
|
||||
cbuf_destroy(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* The callback function for handling the !history command.
|
||||
*/
|
||||
static int command_history(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
||||
{
|
||||
struct cbuffer* buf;
|
||||
struct chat_history_data* data = (struct chat_history_data*) plugin->ptr;
|
||||
struct plugin_command_arg_data* arg = plugin->hub.command_arg_next(plugin, cmd, plugin_cmd_arg_type_integer);
|
||||
int maxlines;
|
||||
|
||||
if (!list_size(data->chat_history))
|
||||
return command_status(plugin, user, cmd, cbuf_create_const("No messages."));
|
||||
|
||||
if (arg)
|
||||
maxlines = arg->data.integer;
|
||||
else
|
||||
maxlines = data->history_default;
|
||||
|
||||
buf = cbuf_create(MAX_HISTORY_SIZE);
|
||||
cbuf_append_format(buf, "*** %s: Chat History:\n", cmd->prefix);
|
||||
get_messages(data, maxlines, buf);
|
||||
|
||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
||||
cbuf_destroy(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_error_message(struct plugin_handle* plugin, const char* msg)
|
||||
{
|
||||
plugin->error_msg = msg;
|
||||
}
|
||||
|
||||
static struct chat_history_data* parse_config(const char* line, struct plugin_handle* plugin)
|
||||
{
|
||||
struct chat_history_data* data = (struct chat_history_data*) hub_malloc_zero(sizeof(struct chat_history_data));
|
||||
struct cfg_tokens* tokens = cfg_tokenize(line);
|
||||
char* token = cfg_token_get_first(tokens);
|
||||
|
||||
uhub_assert(data != NULL);
|
||||
|
||||
data->history_max = 200;
|
||||
data->history_default = 25;
|
||||
data->history_connect = 5;
|
||||
data->chat_history = list_create();
|
||||
|
||||
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), "history_max") == 0)
|
||||
{
|
||||
data->history_max = (size_t) uhub_atoi(cfg_settings_get_value(setting));
|
||||
}
|
||||
else if (strcmp(cfg_settings_get_key(setting), "history_default") == 0)
|
||||
{
|
||||
data->history_default = (size_t) uhub_atoi(cfg_settings_get_value(setting));
|
||||
}
|
||||
else if (strcmp(cfg_settings_get_key(setting), "history_connect") == 0)
|
||||
{
|
||||
data->history_connect = (size_t) uhub_atoi(cfg_settings_get_value(setting));
|
||||
}
|
||||
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);
|
||||
return data;
|
||||
}
|
||||
|
||||
int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||
{
|
||||
struct chat_history_data* data;
|
||||
PLUGIN_INITIALIZE(plugin, "Chat history plugin", "1.0", "Provide a global chat history log.");
|
||||
|
||||
plugin->funcs.on_user_chat_message = history_add;
|
||||
plugin->funcs.on_user_login = user_login;
|
||||
data = parse_config(config, plugin);
|
||||
if (!data)
|
||||
return -1;
|
||||
|
||||
plugin->ptr = data;
|
||||
|
||||
data->command_history_handle = (struct plugin_command_handle*) hub_malloc(sizeof(struct plugin_command_handle));
|
||||
PLUGIN_COMMAND_INITIALIZE(data->command_history_handle, plugin, "history", "?N", auth_cred_guest, &command_history, "Show chat message history.");
|
||||
plugin->hub.command_add(plugin, data->command_history_handle);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int plugin_unregister(struct plugin_handle* plugin)
|
||||
{
|
||||
struct chat_history_data* data = (struct chat_history_data*) plugin->ptr;
|
||||
|
||||
if (data)
|
||||
{
|
||||
list_clear(data->chat_history, &hub_free);
|
||||
list_destroy(data->chat_history);
|
||||
|
||||
plugin->hub.command_del(plugin, data->command_history_handle);
|
||||
hub_free(data->command_history_handle);
|
||||
hub_free(data);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
163
src/plugins/mod_chat_only.c
Normal file
163
src/plugins/mod_chat_only.c
Normal file
@@ -0,0 +1,163 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, 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 "plugin_api/handle.h"
|
||||
#include "util/memory.h"
|
||||
|
||||
enum Warnings
|
||||
{
|
||||
WARN_SEARCH = 0x01, ///<<< "Warn about searching."
|
||||
WARN_CONNECT = 0x02, ///<<< "Warn about connecting to a user"
|
||||
WARN_EXTRA = 0x08, ///<<< "Warn about unknown protocol data."
|
||||
};
|
||||
|
||||
struct user_info
|
||||
{
|
||||
sid_t sid; // The SID of the user
|
||||
int warnings; // The number of denies (used to track wether or not a warning should be sent). @see enum Warnings.
|
||||
};
|
||||
|
||||
struct chat_only_data
|
||||
{
|
||||
size_t num_users; // number of users tracked.
|
||||
size_t max_users; // max users (hard limit max 1M users due to limitations in the SID (20 bits)).
|
||||
struct user_info* users; // array of max_users
|
||||
int operator_override; // operators are allowed to override these limitations.
|
||||
};
|
||||
|
||||
static struct chat_only_data* co_initialize()
|
||||
{
|
||||
struct chat_only_data* data = (struct chat_only_data*) hub_malloc(sizeof(struct chat_only_data));
|
||||
data->num_users = 0;
|
||||
data->max_users = 512;
|
||||
data->users = hub_malloc_zero(sizeof(struct user_info) * data->max_users);
|
||||
return data;
|
||||
}
|
||||
|
||||
static void co_shutdown(struct chat_only_data* data)
|
||||
{
|
||||
if (data)
|
||||
{
|
||||
hub_free(data->users);
|
||||
hub_free(data);
|
||||
}
|
||||
}
|
||||
|
||||
static struct user_info* get_user_info(struct chat_only_data* data, sid_t sid)
|
||||
{
|
||||
struct user_info* u;
|
||||
|
||||
// resize buffer if needed.
|
||||
if (sid > data->max_users) // FIXME: >= ?
|
||||
{
|
||||
u = hub_malloc_zero(sizeof(struct user_info) * (sid + 1));
|
||||
memcpy(u, data->users, data->max_users);
|
||||
hub_free(data->users);
|
||||
data->users = u;
|
||||
data->max_users = sid;
|
||||
u = NULL;
|
||||
}
|
||||
|
||||
u = &data->users[sid];
|
||||
|
||||
// reset counters if the user was not previously known.
|
||||
if (!u->sid)
|
||||
{
|
||||
u->sid = sid;
|
||||
u->warnings = 0;
|
||||
data->num_users++;
|
||||
}
|
||||
return u;
|
||||
}
|
||||
|
||||
static plugin_st on_search_result(struct plugin_handle* plugin, struct plugin_user* from, struct plugin_user* to, const char* search_data)
|
||||
{
|
||||
return st_deny;
|
||||
}
|
||||
|
||||
static plugin_st on_search(struct plugin_handle* plugin, struct plugin_user* user, const char* search_data)
|
||||
{
|
||||
struct chat_only_data* data = (struct chat_only_data*) plugin->ptr;
|
||||
struct user_info* info = get_user_info(data, user->sid);
|
||||
|
||||
if (user->credentials >= auth_cred_operator && data->operator_override)
|
||||
return st_allow;
|
||||
|
||||
if (!(info->warnings & WARN_SEARCH))
|
||||
{
|
||||
plugin->hub.send_status_message(plugin, user, 000, "Searching is disabled. This is a chat only hub.");
|
||||
info->warnings |= WARN_SEARCH;
|
||||
}
|
||||
return st_deny;
|
||||
}
|
||||
|
||||
static plugin_st on_p2p_connect(struct plugin_handle* plugin, struct plugin_user* from, struct plugin_user* to)
|
||||
{
|
||||
struct chat_only_data* data = (struct chat_only_data*) plugin->ptr;
|
||||
struct user_info* info = get_user_info(data, from->sid);
|
||||
|
||||
if (from->credentials >= auth_cred_operator && data->operator_override)
|
||||
return st_allow;
|
||||
|
||||
if (!(info->warnings & WARN_CONNECT))
|
||||
{
|
||||
plugin->hub.send_status_message(plugin, from, 000, "Connection setup denied. This is a chat only hub.");
|
||||
info->warnings |= WARN_CONNECT;
|
||||
}
|
||||
return st_deny;
|
||||
}
|
||||
|
||||
static void on_user_login(struct plugin_handle* plugin, struct plugin_user* user)
|
||||
{
|
||||
struct chat_only_data* data = (struct chat_only_data*) plugin->ptr;
|
||||
/*struct user_info* info = */
|
||||
get_user_info(data, user->sid);
|
||||
}
|
||||
|
||||
static void on_user_logout(struct plugin_handle* plugin, struct plugin_user* user, const char* reason)
|
||||
{
|
||||
struct chat_only_data* data = (struct chat_only_data*) plugin->ptr;
|
||||
struct user_info* info = get_user_info(data, user->sid);
|
||||
if (info->sid)
|
||||
data->num_users--;
|
||||
info->warnings = 0;
|
||||
info->sid = 0;
|
||||
}
|
||||
|
||||
int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||
{
|
||||
PLUGIN_INITIALIZE(plugin, "Chat only hub", "1.0", "Disables connection setup, search and results.");
|
||||
plugin->ptr = co_initialize();
|
||||
|
||||
plugin->funcs.on_search = on_search;
|
||||
plugin->funcs.on_search_result = on_search_result;
|
||||
plugin->funcs.on_p2p_connect = on_p2p_connect;
|
||||
plugin->funcs.on_p2p_revconnect = on_p2p_connect;
|
||||
plugin->funcs.on_user_login = on_user_login;
|
||||
plugin->funcs.on_user_logout = on_user_logout;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int plugin_unregister(struct plugin_handle* plugin)
|
||||
{
|
||||
co_shutdown((struct chat_only_data*) plugin->ptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,18 +1,67 @@
|
||||
/**
|
||||
* This is a minimal example plugin for uhub.
|
||||
/*
|
||||
* 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 "plugin_api/handle.h"
|
||||
#include "plugin_api/command_api.h"
|
||||
#include "util/memory.h"
|
||||
|
||||
struct example_plugin_data
|
||||
{
|
||||
struct plugin_command_handle* example;
|
||||
};
|
||||
|
||||
static int example_command_handler(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
||||
{
|
||||
plugin->hub.send_message(plugin, user, "Hello from mod_example.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void command_register(struct plugin_handle* plugin)
|
||||
{
|
||||
struct example_plugin_data* data = (struct example_plugin_data*) hub_malloc(sizeof(struct example_plugin_data));
|
||||
data->example = hub_malloc_zero(sizeof(struct plugin_command_handle));
|
||||
PLUGIN_COMMAND_INITIALIZE(data->example, (void*) data, "example", "", auth_cred_guest, example_command_handler, "This is an example command that is added dynamically by loading the mod_example plug-in.");
|
||||
plugin->hub.command_add(plugin, data->example);
|
||||
plugin->ptr = data;
|
||||
}
|
||||
|
||||
static void command_unregister(struct plugin_handle* plugin)
|
||||
{
|
||||
struct example_plugin_data* data = (struct example_plugin_data*) plugin->ptr;
|
||||
|
||||
plugin->hub.command_del(plugin, data->example);
|
||||
hub_free(data->example);
|
||||
|
||||
hub_free(data);
|
||||
plugin->ptr = NULL;
|
||||
}
|
||||
|
||||
int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||
{
|
||||
PLUGIN_INITIALIZE(plugin, "Example plugin", "1.0", "A simple example plugin");
|
||||
command_register(plugin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int plugin_unregister(struct plugin_handle* plugin)
|
||||
{
|
||||
/* No need to do anything! */
|
||||
command_unregister(plugin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
/**
|
||||
* This is a minimal example plugin for uhub.
|
||||
/*
|
||||
* 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 "system.h"
|
||||
@@ -9,40 +24,141 @@
|
||||
#include "util/ipcalc.h"
|
||||
#include "plugin_api/handle.h"
|
||||
|
||||
#include "util/misc.h"
|
||||
#include "util/config_token.h"
|
||||
#include <syslog.h>
|
||||
|
||||
struct ip_addr_encap;
|
||||
|
||||
struct log_data
|
||||
{
|
||||
enum {
|
||||
mode_file,
|
||||
mode_syslog
|
||||
} logmode;
|
||||
char* logfile;
|
||||
int fd;
|
||||
};
|
||||
|
||||
static void reset(struct log_data* data)
|
||||
{
|
||||
/* set defaults */
|
||||
data->logmode = mode_file;
|
||||
data->logfile = NULL;
|
||||
data->fd = -1;
|
||||
}
|
||||
|
||||
static void set_error_message(struct plugin_handle* plugin, const char* msg)
|
||||
{
|
||||
plugin->error_msg = msg;
|
||||
}
|
||||
|
||||
static int log_open_file(struct plugin_handle* plugin, struct log_data* data)
|
||||
{
|
||||
int flags = O_CREAT | O_APPEND | O_WRONLY;
|
||||
data->fd = open(data->logfile, flags, 0664);
|
||||
return (data->fd != -1);
|
||||
}
|
||||
|
||||
static struct log_data* log_open(struct plugin_handle* plugin, const char* config)
|
||||
static int log_open_syslog(struct plugin_handle* plugin)
|
||||
{
|
||||
openlog("uhub", 0, LOG_USER);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct log_data* parse_config(const char* line, struct plugin_handle* plugin)
|
||||
{
|
||||
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)
|
||||
struct cfg_tokens* tokens = cfg_tokenize(line);
|
||||
char* token = cfg_token_get_first(tokens);
|
||||
|
||||
if (!data)
|
||||
return 0;
|
||||
|
||||
reset(data);
|
||||
|
||||
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)
|
||||
{
|
||||
data->logfile = strdup(cfg_settings_get_value(setting));
|
||||
data->logmode = mode_file;
|
||||
}
|
||||
else if (strcmp(cfg_settings_get_key(setting), "syslog") == 0)
|
||||
{
|
||||
int use_syslog = 0;
|
||||
if (!string_to_boolean(cfg_settings_get_value(setting), &use_syslog))
|
||||
{
|
||||
data->logmode = (use_syslog) ? mode_syslog : mode_file;
|
||||
}
|
||||
}
|
||||
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->logmode == mode_file)
|
||||
{
|
||||
if ((data->logmode == mode_file && !data->logfile))
|
||||
{
|
||||
set_error_message(plugin, "No log file is given, use file=<path>");
|
||||
hub_free(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!log_open_file(plugin, data))
|
||||
{
|
||||
set_error_message(plugin, "Unable to open log file!");
|
||||
hub_free(data->logfile);
|
||||
hub_free(data);
|
||||
return NULL;
|
||||
set_error_message(plugin, "Unable to open log file");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!log_open_syslog(plugin))
|
||||
{
|
||||
hub_free(data->logfile);
|
||||
hub_free(data);
|
||||
set_error_message(plugin, "Unable to open syslog");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static void log_close(struct log_data* data)
|
||||
{
|
||||
if (data->logmode == mode_file)
|
||||
{
|
||||
hub_free(data->logfile);
|
||||
close(data->fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
closelog();
|
||||
}
|
||||
hub_free(data);
|
||||
}
|
||||
|
||||
@@ -54,6 +170,8 @@ static void log_message(struct log_data* data, const char *format, ...)
|
||||
va_list args;
|
||||
ssize_t size = 0;
|
||||
|
||||
if (data->logmode == mode_file)
|
||||
{
|
||||
t = time(NULL);
|
||||
tmp = localtime(&t);
|
||||
strftime(logmsg, 32, "%Y-%m-%d %H:%M:%S ", tmp);
|
||||
@@ -62,8 +180,25 @@ static void log_message(struct log_data* data, const char *format, ...)
|
||||
size = vsnprintf(logmsg + 20, 1004, format, args);
|
||||
va_end(args);
|
||||
|
||||
write(data->fd, logmsg, size + 20);
|
||||
if (write(data->fd, logmsg, size + 20) < (size+20))
|
||||
{
|
||||
fprintf(stderr, "Unable to write full log. Error=%d: %s\n", errno, strerror(errno));
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined _POSIX_SYNCHRONIZED_IO && _POSIX_SYNCHRONIZED_IO > 0
|
||||
fdatasync(data->fd);
|
||||
#else
|
||||
fsync(data->fd);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
va_start(args, format);
|
||||
vsyslog(LOG_INFO, format, args);
|
||||
va_end(args);
|
||||
}
|
||||
}
|
||||
|
||||
static void log_user_login(struct plugin_handle* plugin, struct plugin_user* user)
|
||||
@@ -101,7 +236,7 @@ int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||
plugin->funcs.on_user_logout = log_user_logout;
|
||||
plugin->funcs.on_user_nick_change = log_change_nick;
|
||||
|
||||
plugin->ptr = log_open(plugin, config);
|
||||
plugin->ptr = parse_config(config, plugin);
|
||||
if (!plugin->ptr)
|
||||
return -1;
|
||||
return 0;
|
||||
|
||||
102
src/plugins/mod_topic.c
Normal file
102
src/plugins/mod_topic.c
Normal file
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, 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 "plugin_api/handle.h"
|
||||
#include "plugin_api/command_api.h"
|
||||
#include "util/memory.h"
|
||||
#include "util/cbuffer.h"
|
||||
|
||||
struct topic_plugin_data
|
||||
{
|
||||
struct plugin_command_handle* topic;
|
||||
struct plugin_command_handle* cleartopic;
|
||||
struct plugin_command_handle* showtopic;
|
||||
};
|
||||
|
||||
static int command_topic_handler(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
||||
{
|
||||
struct cbuffer* buf = cbuf_create(128);
|
||||
struct plugin_command_arg_data* arg = plugin->hub.command_arg_next(plugin, cmd, plugin_cmd_arg_type_string);
|
||||
|
||||
plugin->hub.set_description(plugin, arg ? arg->data.string : NULL);
|
||||
cbuf_append_format(buf, "*** %s: Topic set to \"%s\"", cmd->prefix, arg->data.string);
|
||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
||||
cbuf_destroy(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int command_cleartopic_handler(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
||||
{
|
||||
struct cbuffer* buf = cbuf_create(128);
|
||||
plugin->hub.set_description(plugin, NULL);
|
||||
cbuf_append_format(buf, "*** %s: Topic cleared.", cmd->prefix);
|
||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
||||
cbuf_destroy(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int command_showtopic_handler(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
||||
{
|
||||
struct cbuffer* buf = cbuf_create(128);
|
||||
char* topic = plugin->hub.get_description(plugin);
|
||||
cbuf_append_format(buf, "*** %s: Current topic is: \"%s\"", cmd->prefix, topic);
|
||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
||||
cbuf_destroy(buf);
|
||||
hub_free(topic);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||
{
|
||||
struct topic_plugin_data* data = (struct topic_plugin_data*) hub_malloc(sizeof(struct topic_plugin_data));
|
||||
|
||||
data->topic = (struct plugin_command_handle*) hub_malloc_zero(sizeof(struct plugin_command_handle));
|
||||
data->cleartopic = (struct plugin_command_handle*) hub_malloc_zero(sizeof(struct plugin_command_handle));
|
||||
data->showtopic = (struct plugin_command_handle*) hub_malloc_zero(sizeof(struct plugin_command_handle));
|
||||
|
||||
PLUGIN_INITIALIZE(plugin, "Topic plugin", "1.0", "Add commands for changing the hub topic (description)");
|
||||
|
||||
PLUGIN_COMMAND_INITIALIZE(data->topic, (void*) data, "topic", "+m", auth_cred_operator, command_topic_handler, "Set new topic");
|
||||
PLUGIN_COMMAND_INITIALIZE(data->cleartopic, (void*) data, "cleartopic", "", auth_cred_operator, command_cleartopic_handler, "Clear the current topic");
|
||||
PLUGIN_COMMAND_INITIALIZE(data->showtopic, (void*) data, "showtopic", "", auth_cred_guest, command_showtopic_handler, "Shows the current topic");
|
||||
|
||||
plugin->hub.command_add(plugin, data->topic);
|
||||
plugin->hub.command_add(plugin, data->cleartopic);
|
||||
plugin->hub.command_add(plugin, data->showtopic);
|
||||
plugin->ptr = data;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int plugin_unregister(struct plugin_handle* plugin)
|
||||
{
|
||||
struct topic_plugin_data* data = (struct topic_plugin_data*) plugin->ptr;
|
||||
|
||||
plugin->hub.command_del(plugin, data->topic);
|
||||
plugin->hub.command_del(plugin, data->cleartopic);
|
||||
plugin->hub.command_del(plugin, data->showtopic);
|
||||
hub_free(data->topic);
|
||||
hub_free(data->cleartopic);
|
||||
hub_free(data->showtopic);
|
||||
hub_free(data);
|
||||
plugin->ptr = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
304
src/plugins/mod_welcome.c
Normal file
304
src/plugins/mod_welcome.c
Normal file
@@ -0,0 +1,304 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, 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 "system.h"
|
||||
#include "adc/adcconst.h"
|
||||
#include "adc/sid.h"
|
||||
#include "util/cbuffer.h"
|
||||
#include "util/memory.h"
|
||||
#include "util/ipcalc.h"
|
||||
#include "plugin_api/handle.h"
|
||||
#include "plugin_api/command_api.h"
|
||||
|
||||
#include "util/misc.h"
|
||||
#include "util/config_token.h"
|
||||
#include <syslog.h>
|
||||
|
||||
#define MAX_WELCOME_SIZE 16384
|
||||
|
||||
struct welcome_data
|
||||
{
|
||||
char* motd_file;
|
||||
char* motd;
|
||||
char* rules_file;
|
||||
char* rules;
|
||||
struct plugin_command_handle* cmd_motd;
|
||||
struct plugin_command_handle* cmd_rules;
|
||||
};
|
||||
|
||||
static int command_handler_motd(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd);
|
||||
static int command_handler_rules(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd);
|
||||
|
||||
static char* read_file(const char* filename)
|
||||
{
|
||||
char* str;
|
||||
char buf[MAX_WELCOME_SIZE];
|
||||
int fd = open(filename, O_RDONLY);
|
||||
int ret;
|
||||
|
||||
if (fd == -1)
|
||||
return NULL;
|
||||
|
||||
ret = read(fd, buf, MAX_WELCOME_SIZE);
|
||||
close(fd);
|
||||
|
||||
buf[ret > 0 ? ret : 0] = 0;
|
||||
str = strdup(buf);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
int read_motd(struct welcome_data* data)
|
||||
{
|
||||
data->motd = read_file(data->motd_file);
|
||||
return !!data->motd;
|
||||
}
|
||||
|
||||
int read_rules(struct welcome_data* data)
|
||||
{
|
||||
data->rules = read_file(data->rules_file);
|
||||
return !!data->rules;
|
||||
}
|
||||
|
||||
static void free_welcome_data(struct welcome_data* data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
hub_free(data->cmd_motd);
|
||||
hub_free(data->motd_file);
|
||||
hub_free(data->motd);
|
||||
hub_free(data->cmd_rules);
|
||||
hub_free(data->rules_file);
|
||||
hub_free(data->rules);
|
||||
hub_free(data);
|
||||
}
|
||||
|
||||
|
||||
static void set_error_message(struct plugin_handle* plugin, const char* msg)
|
||||
{
|
||||
plugin->error_msg = msg;
|
||||
}
|
||||
|
||||
static struct welcome_data* parse_config(const char* line, struct plugin_handle* plugin)
|
||||
{
|
||||
struct welcome_data* data = (struct welcome_data*) hub_malloc_zero(sizeof(struct welcome_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");
|
||||
goto cleanup_parse_error;
|
||||
}
|
||||
|
||||
if (strcmp(cfg_settings_get_key(setting), "motd") == 0)
|
||||
{
|
||||
data->motd_file = strdup(cfg_settings_get_value(setting));
|
||||
if (!read_motd(data))
|
||||
{
|
||||
set_error_message(plugin, "Unable to read motd file.");
|
||||
cfg_settings_free(setting);
|
||||
goto cleanup_parse_error;
|
||||
}
|
||||
|
||||
data->cmd_motd = hub_malloc_zero(sizeof(struct plugin_command_handle));
|
||||
PLUGIN_COMMAND_INITIALIZE(data->cmd_motd, (void*) data, "motd", "", auth_cred_guest, command_handler_motd, "Show the message of the day.");
|
||||
}
|
||||
else if (strcmp(cfg_settings_get_key(setting), "rules") == 0)
|
||||
{
|
||||
data->rules_file = strdup(cfg_settings_get_value(setting));
|
||||
if (!read_rules(data))
|
||||
{
|
||||
set_error_message(plugin, "Unable to read rules file.");
|
||||
cfg_settings_free(setting);
|
||||
goto cleanup_parse_error;
|
||||
}
|
||||
|
||||
data->cmd_rules = hub_malloc_zero(sizeof(struct plugin_command_handle));
|
||||
PLUGIN_COMMAND_INITIALIZE(data->cmd_rules, (void*) data, "rules", "", auth_cred_guest, command_handler_rules, "Show the hub rules.");
|
||||
}
|
||||
else
|
||||
{
|
||||
set_error_message(plugin, "Unknown startup parameters given");
|
||||
cfg_settings_free(setting);
|
||||
goto cleanup_parse_error;
|
||||
}
|
||||
|
||||
cfg_settings_free(setting);
|
||||
token = cfg_token_get_next(tokens);
|
||||
}
|
||||
|
||||
cfg_tokens_free(tokens);
|
||||
return data;
|
||||
|
||||
cleanup_parse_error:
|
||||
cfg_tokens_free(tokens);
|
||||
free_welcome_data(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static struct cbuffer* parse_message(struct plugin_user* user, const char* msg)
|
||||
{
|
||||
struct cbuffer* buf = cbuf_create(strlen(msg));
|
||||
const char* start = msg;
|
||||
const char* offset = NULL;
|
||||
time_t timestamp = time(NULL);
|
||||
struct tm* now = localtime(×tamp);
|
||||
|
||||
while ((offset = strchr(start, '%')))
|
||||
{
|
||||
cbuf_append_bytes(buf, start, (offset - start));
|
||||
|
||||
offset++;
|
||||
switch (offset[0])
|
||||
{
|
||||
case 'n':
|
||||
cbuf_append(buf, user->nick);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
cbuf_append(buf, ip_convert_to_string(&user->addr));
|
||||
break;
|
||||
case 'c':
|
||||
cbuf_append(buf, auth_cred_to_string(user->credentials));
|
||||
break;
|
||||
|
||||
case '%':
|
||||
cbuf_append(buf, "%");
|
||||
break;
|
||||
|
||||
case 'H':
|
||||
cbuf_append_strftime(buf, "%H", now);
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
cbuf_append_strftime(buf, "%I", now);
|
||||
break;
|
||||
|
||||
case 'P':
|
||||
cbuf_append_strftime(buf, "%P", now);
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
cbuf_append_strftime(buf, "%p", now);
|
||||
break;
|
||||
|
||||
case 'M':
|
||||
cbuf_append_strftime(buf, "%M", now);
|
||||
break;
|
||||
|
||||
case 'S':
|
||||
cbuf_append_strftime(buf, "%S", now);
|
||||
break;
|
||||
}
|
||||
|
||||
start = offset + 1;
|
||||
}
|
||||
|
||||
if (*start)
|
||||
cbuf_append(buf, start);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void send_motd(struct plugin_handle* plugin, struct plugin_user* user)
|
||||
{
|
||||
struct welcome_data* data = (struct welcome_data*) plugin->ptr;
|
||||
struct cbuffer* buf = NULL;
|
||||
if (data->motd)
|
||||
{
|
||||
buf = parse_message(user, data->motd);
|
||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
||||
cbuf_destroy(buf);
|
||||
}
|
||||
}
|
||||
|
||||
static void send_rules(struct plugin_handle* plugin, struct plugin_user* user)
|
||||
{
|
||||
struct welcome_data* data = (struct welcome_data*) plugin->ptr;
|
||||
struct cbuffer* buf = NULL;
|
||||
if (data->rules)
|
||||
{
|
||||
buf = parse_message(user, data->rules);
|
||||
plugin->hub.send_message(plugin, user, cbuf_get(buf));
|
||||
cbuf_destroy(buf);
|
||||
}
|
||||
}
|
||||
|
||||
static void on_user_login(struct plugin_handle* plugin, struct plugin_user* user)
|
||||
{
|
||||
send_motd(plugin, user);
|
||||
}
|
||||
|
||||
static int command_handler_motd(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
||||
{
|
||||
send_motd(plugin, user);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int command_handler_rules(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_command* cmd)
|
||||
{
|
||||
send_rules(plugin, user);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int plugin_register(struct plugin_handle* plugin, const char* config)
|
||||
{
|
||||
struct welcome_data* data;
|
||||
PLUGIN_INITIALIZE(plugin, "Welcome plugin", "0.1", "Sends a welcome message to users when they log into the hub.");
|
||||
data = parse_config(config, plugin);
|
||||
|
||||
if (!data)
|
||||
return -1;
|
||||
|
||||
plugin->ptr = data;
|
||||
plugin->funcs.on_user_login = on_user_login;
|
||||
|
||||
if (data->cmd_motd)
|
||||
plugin->hub.command_add(plugin, data->cmd_motd);
|
||||
|
||||
if (data->cmd_rules)
|
||||
plugin->hub.command_add(plugin, data->cmd_rules);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int plugin_unregister(struct plugin_handle* plugin)
|
||||
{
|
||||
struct welcome_data* data = (struct welcome_data*) plugin->ptr;
|
||||
|
||||
if (data->cmd_motd)
|
||||
plugin->hub.command_del(plugin, data->cmd_motd);
|
||||
|
||||
if (data->cmd_rules)
|
||||
plugin->hub.command_del(plugin, data->cmd_rules);
|
||||
|
||||
free_welcome_data(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
30
src/system.h
30
src/system.h
@@ -26,7 +26,7 @@
|
||||
#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__)) || defined(__FreeBSD_kernel__)
|
||||
#define BSD_LIKE
|
||||
#endif
|
||||
|
||||
@@ -36,6 +36,11 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__CYGWIN__) || defined(__MINGW32__)
|
||||
#define HAVE_SSIZE_T
|
||||
#define NEED_GETOPT
|
||||
#endif
|
||||
|
||||
#ifdef WINSOCK
|
||||
#ifndef FD_SETSIZE
|
||||
#define FD_SETSIZE 4096
|
||||
@@ -68,6 +73,7 @@
|
||||
#include <time.h>
|
||||
|
||||
#if !defined(WIN32)
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
#include <grp.h>
|
||||
#include <pwd.h>
|
||||
@@ -83,12 +89,13 @@
|
||||
#define HAVE_GETRLIMIT
|
||||
#endif
|
||||
|
||||
/* printf and size_t support */
|
||||
/* printf support for size_t and uint64_t */
|
||||
#if defined(WIN32)
|
||||
/* Windows uses %Iu for size_t */
|
||||
#define PRINTF_SIZE_T "%Iu"
|
||||
#define PRINTF_UINT64_T "%I64u"
|
||||
#else
|
||||
#define PRINTF_SIZE_T "%zu"
|
||||
#define PRINTF_UINT64_T ("%" PRIu64)
|
||||
#endif
|
||||
|
||||
#ifdef SSL_SUPPORT
|
||||
@@ -106,8 +113,10 @@
|
||||
#endif
|
||||
|
||||
#ifdef BSD_LIKE
|
||||
/*
|
||||
#define USE_KQUEUE
|
||||
#include <sys/event.h>
|
||||
*/
|
||||
#endif
|
||||
|
||||
#define USE_SELECT
|
||||
@@ -140,7 +149,7 @@
|
||||
#define OPSYS "MacOSX"
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#define OPSYS "FreeBSD"
|
||||
#endif
|
||||
|
||||
@@ -164,6 +173,10 @@
|
||||
#define OPSYS "Haiku"
|
||||
#endif
|
||||
|
||||
#if defined(__GNU__)
|
||||
#define OPSYS "Hurd"
|
||||
#endif
|
||||
|
||||
/* Detect CPUs */
|
||||
#if defined(__alpha__) || defined(__alpha)
|
||||
#define CPUINFO "Alpha"
|
||||
@@ -209,6 +222,10 @@
|
||||
#define CPUINFO "SuperH"
|
||||
#endif
|
||||
|
||||
#if defined(__s390__) || defined(__s390x__)
|
||||
#define CPUINFO "s390"
|
||||
#endif
|
||||
|
||||
/* Misc */
|
||||
#ifdef MSG_NOSIGNAL
|
||||
#define UHUB_SEND_SIGNAL MSG_NOSIGNAL
|
||||
@@ -256,4 +273,9 @@ typedef unsigned __int64 uint64_t;
|
||||
#define NEED_GETOPT
|
||||
#endif
|
||||
|
||||
#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(_MSC_VER)
|
||||
#define PLUGIN_API __declspec(dllexport)
|
||||
#else
|
||||
#define PLUGIN_API
|
||||
#endif
|
||||
#endif /* HAVE_UHUB_SYSTEM_H */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2009, Jan Vidar Krey
|
||||
* 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
|
||||
@@ -23,10 +23,14 @@
|
||||
#define ADC_CID_SIZE 39
|
||||
#define BIG_BUFSIZE 32768
|
||||
#define TIGERSIZE 24
|
||||
// #define ADCC_DEBUG
|
||||
|
||||
static ssize_t ADC_client_recv(struct ADC_client* client);
|
||||
static void ADC_client_send_info(struct ADC_client* client);
|
||||
static void ADC_client_on_connected(struct ADC_client* client);
|
||||
#ifdef SSL_SUPPORT
|
||||
static void ADC_client_on_connected_ssl(struct ADC_client* client);
|
||||
#endif
|
||||
static void ADC_client_on_disconnected(struct ADC_client* client);
|
||||
static void ADC_client_on_login(struct ADC_client* client);
|
||||
static int ADC_client_parse_address(struct ADC_client* client, const char* arg);
|
||||
@@ -42,14 +46,42 @@ static void ADC_client_debug(struct ADC_client* client, const char* format, ...)
|
||||
fprintf(stdout, "* [%p] %s\n", client, logmsg);
|
||||
}
|
||||
|
||||
#ifdef ADCC_DEBUG
|
||||
#define ADC_TRACE fprintf(stderr, "TRACE: %s\n", __PRETTY_FUNCTION__)
|
||||
#else
|
||||
#define ADC_TRACE do { } while(0)
|
||||
#endif
|
||||
|
||||
#ifdef ADCC_DEBUG
|
||||
static const char* ADC_client_state_string[] =
|
||||
{
|
||||
"ps_none",
|
||||
"ps_conn",
|
||||
"ps_conn_ssl",
|
||||
"ps_protocol",
|
||||
"ps_identify",
|
||||
"ps_verify",
|
||||
"ps_normal",
|
||||
0
|
||||
};
|
||||
#endif
|
||||
|
||||
static void ADC_client_set_state(struct ADC_client* client, enum ADC_client_state state)
|
||||
{
|
||||
ADC_TRACE;
|
||||
if (client->state != state)
|
||||
{
|
||||
#ifdef ADCC_DEBUG
|
||||
ADC_client_debug(client, "Set state %s (was %s)", ADC_client_state_string[(int) state], ADC_client_state_string[(int) client->state]);
|
||||
#endif
|
||||
client->state = state;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void adc_cid_pid(struct ADC_client* client)
|
||||
{
|
||||
ADC_TRACE;
|
||||
char seed[64];
|
||||
char pid[64];
|
||||
char cid[64];
|
||||
@@ -73,17 +105,35 @@ static void adc_cid_pid(struct ADC_client* client)
|
||||
|
||||
static void event_callback(struct net_connection* con, int events, void *arg)
|
||||
{
|
||||
ADC_TRACE;
|
||||
struct ADC_client* client = (struct ADC_client*) net_con_get_ptr(con);
|
||||
|
||||
switch (client->state)
|
||||
{
|
||||
case ps_conn:
|
||||
if (events == NET_EVENT_TIMEOUT)
|
||||
{
|
||||
if (client->state == ps_conn)
|
||||
{
|
||||
client->callback(client, ADC_CLIENT_DISCONNECTED, 0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (events & NET_EVENT_WRITE)
|
||||
ADC_client_connect(client, 0);
|
||||
break;
|
||||
|
||||
#ifdef SSL_SUPPORT
|
||||
case ps_conn_ssl:
|
||||
if (events == NET_EVENT_TIMEOUT)
|
||||
{
|
||||
client->callback(client, ADC_CLIENT_DISCONNECTED, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
ADC_client_on_connected_ssl(client);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
if (events & NET_EVENT_READ)
|
||||
{
|
||||
if (ADC_client_recv(client) == -1)
|
||||
@@ -93,12 +143,6 @@ static void event_callback(struct net_connection* con, int events, void *arg)
|
||||
}
|
||||
|
||||
if (events & NET_EVENT_WRITE)
|
||||
{
|
||||
if (client->state == ps_conn)
|
||||
{
|
||||
ADC_client_connect(client, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* FIXME: Call send again */
|
||||
}
|
||||
@@ -127,6 +171,7 @@ static void event_callback(struct net_connection* con, int events, void *arg)
|
||||
|
||||
static void ADC_client_on_recv_line(struct ADC_client* client, const char* line, size_t length)
|
||||
{
|
||||
ADC_TRACE;
|
||||
#ifdef ADC_CLIENT_DEBUG_PROTO
|
||||
ADC_client_debug(client, "- LINE: '%s'", start);
|
||||
#endif
|
||||
@@ -213,6 +258,7 @@ static void ADC_client_on_recv_line(struct ADC_client* client, const char* line,
|
||||
if (adc_msg_has_named_argument(msg, "ID"))
|
||||
{
|
||||
struct ADC_user user;
|
||||
user.sid = msg->source;
|
||||
EXTRACT_NAMED_ARG(msg, "NI", user.name);
|
||||
EXTRACT_NAMED_ARG(msg, "DE", user.description);
|
||||
EXTRACT_NAMED_ARG(msg, "VE", user.version);
|
||||
@@ -250,6 +296,7 @@ static void ADC_client_on_recv_line(struct ADC_client* client, const char* line,
|
||||
|
||||
static ssize_t ADC_client_recv(struct ADC_client* client)
|
||||
{
|
||||
ADC_TRACE;
|
||||
ssize_t size = net_con_recv(client->con, &client->recvbuf[client->r_offset], ADC_BUFSIZE - client->r_offset);
|
||||
if (size <= 0)
|
||||
return size;
|
||||
@@ -285,6 +332,7 @@ static ssize_t ADC_client_recv(struct ADC_client* client)
|
||||
|
||||
void ADC_client_send(struct ADC_client* client, char* msg)
|
||||
{
|
||||
ADC_TRACE;
|
||||
int ret = net_con_send(client->con, msg, strlen(msg));
|
||||
|
||||
#ifdef ADC_CLIENT_DEBUG_PROTO
|
||||
@@ -311,6 +359,7 @@ void ADC_client_send(struct ADC_client* client, char* msg)
|
||||
|
||||
void ADC_client_send_info(struct ADC_client* client)
|
||||
{
|
||||
ADC_TRACE;
|
||||
char binf[11];
|
||||
snprintf(binf, 11, "BINF %s\n", sid_to_string(client->sid));
|
||||
client->info = adc_msg_create(binf);
|
||||
@@ -330,6 +379,7 @@ void ADC_client_send_info(struct ADC_client* client)
|
||||
|
||||
int ADC_client_create(struct ADC_client* client, const char* nickname, const char* description)
|
||||
{
|
||||
ADC_TRACE;
|
||||
memset(client, 0, sizeof(struct ADC_client));
|
||||
|
||||
int sd = net_socket_create(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
@@ -355,6 +405,7 @@ int ADC_client_create(struct ADC_client* client, const char* nickname, const cha
|
||||
|
||||
void ADC_client_destroy(struct ADC_client* client)
|
||||
{
|
||||
ADC_TRACE;
|
||||
ADC_client_disconnect(client);
|
||||
#if 0
|
||||
/* FIXME */
|
||||
@@ -369,6 +420,7 @@ void ADC_client_destroy(struct ADC_client* client)
|
||||
|
||||
int ADC_client_connect(struct ADC_client* client, const char* address)
|
||||
{
|
||||
ADC_TRACE;
|
||||
if (!client->hub_address)
|
||||
{
|
||||
if (!ADC_client_parse_address(client, address))
|
||||
@@ -383,13 +435,10 @@ int ADC_client_connect(struct ADC_client* client, const char* address)
|
||||
ADC_client_on_connected(client);
|
||||
}
|
||||
else if (ret == -1 && (net_error() == EALREADY || net_error() == EINPROGRESS || net_error() == EWOULDBLOCK || net_error() == EINTR))
|
||||
{
|
||||
if (client->state != ps_conn)
|
||||
{
|
||||
net_con_update(client->con, NET_EVENT_READ | NET_EVENT_WRITE);
|
||||
ADC_client_set_state(client, ps_conn);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ADC_client_on_disconnected(client);
|
||||
@@ -399,15 +448,39 @@ int ADC_client_connect(struct ADC_client* client, const char* address)
|
||||
}
|
||||
|
||||
static void ADC_client_on_connected(struct ADC_client* client)
|
||||
{
|
||||
ADC_TRACE;
|
||||
#ifdef SSL_SUPPORT
|
||||
if (client->ssl_enabled)
|
||||
{
|
||||
net_con_update(client->con, NET_EVENT_READ | NET_EVENT_WRITE);
|
||||
client->callback(client, ADC_CLIENT_SSL_HANDSHAKE, 0);
|
||||
ADC_client_set_state(client, ps_conn_ssl);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
net_con_update(client->con, NET_EVENT_READ);
|
||||
client->callback(client, ADC_CLIENT_CONNECTED, 0);
|
||||
ADC_client_send(client, ADC_HANDSHAKE);
|
||||
ADC_client_set_state(client, ps_protocol);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SSL_SUPPORT
|
||||
static void ADC_client_on_connected_ssl(struct ADC_client* client)
|
||||
{
|
||||
ADC_TRACE;
|
||||
net_con_update(client->con, NET_EVENT_READ);
|
||||
client->callback(client, ADC_CLIENT_CONNECTED, 0);
|
||||
ADC_client_send(client, ADC_HANDSHAKE);
|
||||
ADC_client_set_state(client, ps_protocol);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void ADC_client_on_disconnected(struct ADC_client* client)
|
||||
{
|
||||
ADC_TRACE;
|
||||
net_con_close(client->con);
|
||||
client->con = 0;
|
||||
ADC_client_set_state(client, ps_none);
|
||||
@@ -415,12 +488,14 @@ static void ADC_client_on_disconnected(struct ADC_client* client)
|
||||
|
||||
static void ADC_client_on_login(struct ADC_client* client)
|
||||
{
|
||||
ADC_TRACE;
|
||||
ADC_client_set_state(client, ps_normal);
|
||||
client->callback(client, ADC_CLIENT_LOGGED_IN, 0);
|
||||
}
|
||||
|
||||
void ADC_client_disconnect(struct ADC_client* client)
|
||||
{
|
||||
ADC_TRACE;
|
||||
if (client->con && net_con_get_sd(client->con) != -1)
|
||||
{
|
||||
net_con_close(client->con);
|
||||
@@ -430,6 +505,7 @@ void ADC_client_disconnect(struct ADC_client* client)
|
||||
|
||||
static int ADC_client_parse_address(struct ADC_client* client, const char* arg)
|
||||
{
|
||||
ADC_TRACE;
|
||||
char* split;
|
||||
int ssl = 0;
|
||||
struct hostent* dns;
|
||||
@@ -446,9 +522,12 @@ static int ADC_client_parse_address(struct ADC_client* client, const char* arg)
|
||||
|
||||
/* Check for ADC or ADCS */
|
||||
if (!strncmp(arg, "adc://", 6))
|
||||
ssl = 0;
|
||||
client->ssl_enabled = 0;
|
||||
else if (!strncmp(arg, "adcs://", 7))
|
||||
{
|
||||
client->ssl_enabled = 1;
|
||||
ssl = 1;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
|
||||
@@ -481,5 +560,6 @@ static int ADC_client_parse_address(struct ADC_client* client, const char* arg)
|
||||
|
||||
void ADC_client_set_callback(struct ADC_client* client, adc_client_cb cb)
|
||||
{
|
||||
ADC_TRACE;
|
||||
client->callback = cb;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* 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
|
||||
@@ -26,12 +26,13 @@
|
||||
|
||||
enum ADC_client_state
|
||||
{
|
||||
ps_none = 0x00, /* Not connected */
|
||||
ps_conn = 0x01, /* Connecting... */
|
||||
ps_protocol = 0x02, /* Have sent HSUP */
|
||||
ps_identify = 0x04, /* Have sent BINF */
|
||||
ps_verify = 0x08, /* Have sent HPAS */
|
||||
ps_normal = 0x10, /* Are fully logged in */
|
||||
ps_none, /* Not connected */
|
||||
ps_conn, /* Connecting... */
|
||||
ps_conn_ssl, /* SSL handshake */
|
||||
ps_protocol, /* Have sent HSUP */
|
||||
ps_identify, /* Have sent BINF */
|
||||
ps_verify, /* Have sent HPAS */
|
||||
ps_normal, /* Are fully logged in */
|
||||
};
|
||||
|
||||
struct ADC_client;
|
||||
@@ -41,6 +42,8 @@ enum ADC_client_callback_type
|
||||
ADC_CLIENT_CONNECTING = 1001,
|
||||
ADC_CLIENT_CONNECTED = 1002,
|
||||
ADC_CLIENT_DISCONNECTED = 1003,
|
||||
ADC_CLIENT_SSL_HANDSHAKE = 1101,
|
||||
ADC_CLIENT_SSL_OK = 1102,
|
||||
|
||||
ADC_CLIENT_LOGGING_IN = 2001,
|
||||
ADC_CLIENT_PASSWORD_REQ = 2002,
|
||||
@@ -115,6 +118,11 @@ struct ADC_client
|
||||
char* hub_address;
|
||||
char* nick;
|
||||
char* desc;
|
||||
int ssl_enabled;
|
||||
#ifdef SSL_SUPPORT
|
||||
const SSL_METHOD* ssl_method;
|
||||
SSL_CTX* ssl_ctx;
|
||||
#endif /* SSL_SUPPORT */
|
||||
};
|
||||
|
||||
int ADC_client_create(struct ADC_client* client, const char* nickname, const char* description);
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
/**
|
||||
* An ADC client emulator.
|
||||
/*
|
||||
* 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 "adcclient.h"
|
||||
@@ -23,7 +38,6 @@ static int cfg_level = 1; /* activity level (0..3) */
|
||||
static int cfg_chat = 0; /* chat mode, allow sending chat messages */
|
||||
static int cfg_quiet = 0; /* quiet mode (no output) */
|
||||
static int cfg_clients = ADC_CLIENTS_DEFAULT; /* number of clients */
|
||||
static int running = 1;
|
||||
|
||||
#define MAX_CHAT_MSGS 35
|
||||
const char* chat_messages[MAX_CHAT_MSGS] = {
|
||||
@@ -328,9 +342,8 @@ void runloop(size_t clients)
|
||||
ADC_client_connect(c, cfg_uri);
|
||||
}
|
||||
|
||||
while (running)
|
||||
while (net_backend_process())
|
||||
{
|
||||
net_backend_process();
|
||||
}
|
||||
|
||||
for (n = 0; n < clients; n++)
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
/**
|
||||
* A remote uhub admin client.
|
||||
/*
|
||||
* 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 "adcclient.h"
|
||||
@@ -20,6 +35,10 @@ static int handle(struct ADC_client* client, enum ADC_client_callback_type type,
|
||||
puts("*** Disconnected.");
|
||||
break;
|
||||
|
||||
case ADC_CLIENT_SSL_HANDSHAKE:
|
||||
puts("*** SSL handshake.");
|
||||
break;
|
||||
|
||||
case ADC_CLIENT_LOGGING_IN:
|
||||
puts("*** Logging in...");
|
||||
break;
|
||||
@@ -41,7 +60,7 @@ static int handle(struct ADC_client* client, enum ADC_client_callback_type type,
|
||||
break;
|
||||
|
||||
case ADC_CLIENT_USER_JOIN:
|
||||
printf(" JOIN: %s\n", data->user->name);
|
||||
printf(" JOIN: %s %s\n", sid_to_string(data->user->sid), data->user->name);
|
||||
break;
|
||||
|
||||
case ADC_CLIENT_USER_QUIT:
|
||||
|
||||
@@ -1,3 +1,22 @@
|
||||
/*
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
enum commandMode
|
||||
{
|
||||
cm_bcast = 0x01, /* B - broadcast */
|
||||
|
||||
395
src/tools/uhub-passwd.c
Normal file
395
src/tools/uhub-passwd.c
Normal file
@@ -0,0 +1,395 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, 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 "util/misc.h"
|
||||
#include <sqlite3.h>
|
||||
|
||||
// #define DEBUG_SQL
|
||||
|
||||
static sqlite3* db = NULL;
|
||||
static const char* command = NULL;
|
||||
static const char* filename = NULL;
|
||||
static const char* binary = NULL;
|
||||
|
||||
typedef int (*command_func_t)(size_t, const char**);
|
||||
|
||||
static int create(size_t argc, const char** argv);
|
||||
static int list(size_t argc, const char** argv);
|
||||
static int pass(size_t argc, const char** argv);
|
||||
static int add(size_t argc, const char** argv);
|
||||
static int del(size_t argc, const char** argv);
|
||||
static int mod(size_t argc, const char** argv);
|
||||
|
||||
static struct commands
|
||||
{
|
||||
command_func_t handle;
|
||||
const char* command;
|
||||
const char* usage;
|
||||
} COMMANDS[6] = {
|
||||
{ &create, "create", "" },
|
||||
{ &list, "list", "" },
|
||||
{ &add, "add", "username password [credentials = user]" },
|
||||
{ &del, "del", "username" },
|
||||
{ &mod, "mod", "username credentials" },
|
||||
{ &pass, "pass", "username password" },
|
||||
};
|
||||
|
||||
static void print_usage(const char* str)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s filename %s %s\n", binary, command, str);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Escape an SQL statement and return a pointer to the string.
|
||||
* NOTE: The returned value needs to be free'd.
|
||||
*
|
||||
* @return an escaped string.
|
||||
*/
|
||||
static char* sql_escape_string(const char* str)
|
||||
{
|
||||
size_t i, n, size;
|
||||
char* buf;
|
||||
|
||||
for (n = 0, size = strlen(str); n < strlen(str); n++)
|
||||
if (str[n] == '\'')
|
||||
size++;
|
||||
|
||||
buf = malloc(size+1);
|
||||
for (n = 0, i = 0; n < strlen(str); n++)
|
||||
{
|
||||
if (str[n] == '\'')
|
||||
buf[i++] = '\'';
|
||||
buf[i++] = str[n];
|
||||
}
|
||||
buf[i++] = '\0';
|
||||
return buf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate credentials.
|
||||
*/
|
||||
static const char* validate_cred(const char* cred_str)
|
||||
{
|
||||
if (!strcmp(cred_str, "admin"))
|
||||
return "admin";
|
||||
|
||||
if (!strcmp(cred_str, "super"))
|
||||
return "super";
|
||||
|
||||
if (!strcmp(cred_str, "op"))
|
||||
return "op";
|
||||
|
||||
if (!strcmp(cred_str, "user"))
|
||||
return "user";
|
||||
|
||||
fprintf(stderr, "Invalid user credentials. Must be one of: 'admin', 'super', 'op' or 'user'\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static const char* validate_username(const char* username)
|
||||
{
|
||||
const char* tmp;
|
||||
|
||||
// verify length
|
||||
if (strlen(username) > MAX_NICK_LEN)
|
||||
{
|
||||
fprintf(stderr, "User name is too long.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Nick must not start with a space */
|
||||
if (is_white_space(username[0]))
|
||||
{
|
||||
fprintf(stderr, "User name cannot start with white space.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Check for ASCII values below 32 */
|
||||
for (tmp = username; *tmp; tmp++)
|
||||
if ((*tmp < 32) && (*tmp > 0))
|
||||
{
|
||||
fprintf(stderr, "User name contains illegal characters.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!is_valid_utf8(username))
|
||||
{
|
||||
fprintf(stderr, "User name must be utf-8 encoded.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return username;
|
||||
}
|
||||
|
||||
|
||||
static const char* validate_password(const char* password)
|
||||
{
|
||||
// verify length
|
||||
if (strlen(password) > MAX_PASS_LEN)
|
||||
{
|
||||
fprintf(stderr, "Password is too long.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!is_valid_utf8(password))
|
||||
{
|
||||
fprintf(stderr, "Password must be utf-8 encoded.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return password;
|
||||
}
|
||||
|
||||
static void open_database()
|
||||
{
|
||||
int res = sqlite3_open(filename, &db);
|
||||
|
||||
if (res)
|
||||
{
|
||||
fprintf(stderr, "Unable to open database: %s (result=%d)\n", filename, res);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static int sql_callback(void* ptr, int argc, char **argv, char **colName) { return 0; }
|
||||
|
||||
static int sql_execute(const char* sql, ...)
|
||||
{
|
||||
va_list args;
|
||||
char query[1024];
|
||||
char* errMsg;
|
||||
int rc;
|
||||
|
||||
va_start(args, sql);
|
||||
vsnprintf(query, sizeof(query), sql, args);
|
||||
|
||||
#ifdef DEBUG_SQL
|
||||
printf("SQL: %s\n", query);
|
||||
#endif
|
||||
|
||||
open_database();
|
||||
|
||||
rc = sqlite3_exec(db, query, sql_callback, NULL, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
fprintf(stderr, "ERROR: %s\n", errMsg);
|
||||
sqlite3_free(errMsg);
|
||||
}
|
||||
|
||||
rc = sqlite3_changes(db);
|
||||
sqlite3_close(db);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int create(size_t argc, const char** argv)
|
||||
{
|
||||
const char* sql = "CREATE TABLE users"
|
||||
"("
|
||||
"nickname CHAR NOT NULL UNIQUE,"
|
||||
"password CHAR NOT NULL,"
|
||||
"credentials CHAR NOT NULL DEFAULT 'user',"
|
||||
"created TIMESTAMP DEFAULT (DATETIME('NOW')),"
|
||||
"activity TIMESTAMP DEFAULT (DATETIME('NOW'))"
|
||||
");";
|
||||
|
||||
sql_execute(sql);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int sql_callback_list(void* ptr, int argc, char **argv, char **colName)
|
||||
{
|
||||
int* found = (int*) ptr;
|
||||
uhub_assert(strcmp(colName[0], "nickname") == 0 && strcmp(colName[2], "credentials") == 0);
|
||||
printf("%s\t%s\n", argv[2], argv[0]);
|
||||
(*found)++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int list(size_t argc, const char** argv)
|
||||
{
|
||||
char* errMsg;
|
||||
int found = 0;
|
||||
int rc;
|
||||
|
||||
open_database();
|
||||
|
||||
rc = sqlite3_exec(db, "SELECT * FROM users;", sql_callback_list, &found, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
#ifdef DEBUG_SQL
|
||||
fprintf(stderr, "SQL: ERROR: %s (%d)\n", errMsg, rc);
|
||||
#endif
|
||||
sqlite3_free(errMsg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
sqlite3_close(db);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int add(size_t argc, const char** argv)
|
||||
{
|
||||
char* user = NULL;
|
||||
char* pass = NULL;
|
||||
const char* cred = NULL;
|
||||
int rc;
|
||||
|
||||
if (argc < 2)
|
||||
print_usage("username password [credentials = user]");
|
||||
|
||||
user = sql_escape_string(validate_username(argv[0]));
|
||||
pass = sql_escape_string(validate_password(argv[1]));
|
||||
cred = validate_cred(argv[2] ? argv[2] : "user");
|
||||
|
||||
rc = sql_execute("INSERT INTO users (nickname, password, credentials) VALUES('%s', '%s', '%s');", user, pass, cred);
|
||||
|
||||
free(user);
|
||||
free(pass);
|
||||
|
||||
if (rc != 1)
|
||||
{
|
||||
fprintf(stderr, "Unable to add user \"%s\"\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mod(size_t argc, const char** argv)
|
||||
{
|
||||
char* user = NULL;
|
||||
const char* cred = NULL;
|
||||
int rc;
|
||||
|
||||
if (argc < 2)
|
||||
print_usage("username credentials");
|
||||
|
||||
user = sql_escape_string(argv[0]);
|
||||
cred = validate_cred(argv[1]);
|
||||
|
||||
rc = sql_execute("UPDATE users SET credentials = '%s' WHERE nickname = '%s';", cred, user);
|
||||
|
||||
free(user);
|
||||
|
||||
if (rc != 1)
|
||||
{
|
||||
fprintf(stderr, "Unable to set credentials for user \"%s\"\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pass(size_t argc, const char** argv)
|
||||
{
|
||||
char* user = NULL;
|
||||
char* pass = NULL;
|
||||
int rc;
|
||||
|
||||
if (argc < 2)
|
||||
print_usage("username password");
|
||||
|
||||
user = sql_escape_string(argv[0]);
|
||||
pass = sql_escape_string(validate_password(argv[1]));
|
||||
|
||||
rc = sql_execute("UPDATE users SET password = '%s' WHERE nickname = '%s';", pass, user);
|
||||
|
||||
free(user);
|
||||
free(pass);
|
||||
|
||||
if (rc != 1)
|
||||
{
|
||||
fprintf(stderr, "Unable to change password for user \"%s\"\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int del(size_t argc, const char** argv)
|
||||
{
|
||||
char* user = NULL;
|
||||
int rc;
|
||||
|
||||
if (argc < 1)
|
||||
print_usage("username");
|
||||
|
||||
user = sql_escape_string(argv[0]);
|
||||
|
||||
rc = sql_execute("DELETE FROM users WHERE nickname = '%s';", user);
|
||||
free(user);
|
||||
|
||||
if (rc != 1)
|
||||
{
|
||||
fprintf(stderr, "Unable to delete user \"%s\".\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void main_usage(const char* binary)
|
||||
{
|
||||
printf(
|
||||
"Usage: %s filename command [...]\n"
|
||||
"\n"
|
||||
"Command syntax:\n"
|
||||
" create\n"
|
||||
" add username password [credentials = user]\n"
|
||||
" del username\n"
|
||||
" mod username credentials\n"
|
||||
" pass username password\n"
|
||||
" list\n"
|
||||
"\n"
|
||||
"Parameters:\n"
|
||||
" 'filename' is a database file\n"
|
||||
" 'username' is a nickname (UTF-8, up to %i bytes)\n"
|
||||
" 'password' is a password (UTF-8, up to %i bytes)\n"
|
||||
" 'credentials' is one of 'admin', 'super', 'op', 'user'\n"
|
||||
"\n"
|
||||
, binary, MAX_NICK_LEN, MAX_PASS_LEN);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
size_t n = 0;
|
||||
binary = argv[0];
|
||||
filename = argv[1];
|
||||
command = argv[2];
|
||||
|
||||
if (argc < 3)
|
||||
{
|
||||
main_usage(argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (; n < sizeof(COMMANDS) / sizeof(COMMANDS[0]); n++)
|
||||
{
|
||||
if (!strcmp(command, COMMANDS[n].command))
|
||||
return COMMANDS[n].handle(argc - 3, (const char**) &argv[3]);
|
||||
}
|
||||
|
||||
// Unknown command!
|
||||
main_usage(argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,8 +25,6 @@
|
||||
/* #define MEMORY_DEBUG */
|
||||
/* #define DEBUG_SENDQ 1 */
|
||||
|
||||
#define PLUGIN_SUPPORT
|
||||
|
||||
#include "system.h"
|
||||
|
||||
#ifndef WIN32
|
||||
@@ -60,6 +58,7 @@ extern "C" {
|
||||
|
||||
#include "adc/adcconst.h"
|
||||
|
||||
#include "util/cbuffer.h"
|
||||
#include "util/config_token.h"
|
||||
#include "util/credentials.h"
|
||||
#include "util/floodctl.h"
|
||||
@@ -89,8 +88,8 @@ extern "C" {
|
||||
#include "core/route.h"
|
||||
#include "core/pluginloader.h"
|
||||
#include "core/hub.h"
|
||||
#include "core/command_parser.h"
|
||||
#include "core/commands.h"
|
||||
#include "core/commands_builtin.h"
|
||||
#include "core/inf.h"
|
||||
#include "core/hubevent.h"
|
||||
#include "core/plugincallback.h"
|
||||
|
||||
115
src/util/cbuffer.c
Normal file
115
src/util/cbuffer.c
Normal file
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* 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"
|
||||
|
||||
#define CBUF_FLAG_CONST_BUFFER 0x01
|
||||
|
||||
struct cbuffer
|
||||
{
|
||||
size_t capacity;
|
||||
size_t size;
|
||||
size_t flags;
|
||||
char* buf;
|
||||
};
|
||||
|
||||
extern struct cbuffer* cbuf_create(size_t capacity)
|
||||
{
|
||||
struct cbuffer* buf = hub_malloc(sizeof(struct cbuffer));
|
||||
buf->capacity = capacity;
|
||||
buf->size = 0;
|
||||
buf->flags = 0;
|
||||
buf->buf = hub_malloc(capacity + 1);
|
||||
return buf;
|
||||
}
|
||||
|
||||
struct cbuffer* cbuf_create_const(const char* buffer)
|
||||
{
|
||||
struct cbuffer* buf = hub_malloc(sizeof(struct cbuffer));
|
||||
buf->capacity = 0;
|
||||
buf->size = strlen(buffer);
|
||||
buf->flags = CBUF_FLAG_CONST_BUFFER;
|
||||
buf->buf = (char*) buffer;
|
||||
return buf;
|
||||
}
|
||||
|
||||
void cbuf_destroy(struct cbuffer* buf)
|
||||
{
|
||||
if (!(buf->flags & CBUF_FLAG_CONST_BUFFER))
|
||||
{
|
||||
hub_free(buf->buf);
|
||||
}
|
||||
hub_free(buf);
|
||||
}
|
||||
|
||||
void cbuf_resize(struct cbuffer* buf, size_t capacity)
|
||||
{
|
||||
uhub_assert(buf->flags == 0);
|
||||
buf->capacity = capacity;
|
||||
buf->buf = hub_realloc(buf->buf, capacity + 1);
|
||||
}
|
||||
|
||||
void cbuf_append_bytes(struct cbuffer* buf, const char* msg, size_t len)
|
||||
{
|
||||
uhub_assert(buf->flags == 0);
|
||||
if (buf->size + len >= buf->capacity)
|
||||
cbuf_resize(buf, buf->size + len);
|
||||
|
||||
memcpy(buf->buf + buf->size, msg, len);
|
||||
buf->size += len;
|
||||
buf->buf[buf->size] = '\0';
|
||||
}
|
||||
|
||||
void cbuf_append(struct cbuffer* buf, const char* msg)
|
||||
{
|
||||
size_t len = strlen(msg);
|
||||
uhub_assert(buf->flags == 0);
|
||||
cbuf_append_bytes(buf, msg, len);
|
||||
}
|
||||
|
||||
void cbuf_append_format(struct cbuffer* buf, const char* format, ...)
|
||||
{
|
||||
static char tmp[1024];
|
||||
va_list args;
|
||||
int bytes;
|
||||
uhub_assert(buf->flags == 0);
|
||||
va_start(args, format);
|
||||
bytes = vsnprintf(tmp, 1024, format, args);
|
||||
va_end(args);
|
||||
cbuf_append_bytes(buf, tmp, bytes);
|
||||
}
|
||||
|
||||
void cbuf_append_strftime(struct cbuffer* buf, const char* format, const struct tm* tm)
|
||||
{
|
||||
static char tmp[1024];
|
||||
int bytes;
|
||||
uhub_assert(buf->flags == 0);
|
||||
bytes = strftime(tmp, sizeof(tmp), format, tm);
|
||||
cbuf_append_bytes(buf, tmp, bytes);
|
||||
}
|
||||
|
||||
const char* cbuf_get(struct cbuffer* buf)
|
||||
{
|
||||
return buf->buf;
|
||||
}
|
||||
|
||||
size_t cbuf_size(struct cbuffer* buf)
|
||||
{
|
||||
return buf->size;
|
||||
}
|
||||
38
src/util/cbuffer.h
Normal file
38
src/util/cbuffer.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* 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_UTIL_CBUFFER_H
|
||||
#define HAVE_UTIL_CBUFFER_H
|
||||
|
||||
struct cbuffer;
|
||||
|
||||
extern struct cbuffer* cbuf_create(size_t capacity);
|
||||
extern struct cbuffer* cbuf_create_const(const char* buffer);
|
||||
extern void cbuf_destroy(struct cbuffer* buf);
|
||||
extern void cbuf_resize(struct cbuffer* buf, size_t capacity);
|
||||
extern void cbuf_append_bytes(struct cbuffer* buf, const char* msg, size_t len);
|
||||
extern void cbuf_append(struct cbuffer* buf, const char* msg);
|
||||
extern void cbuf_append_format(struct cbuffer* buf, const char* format, ...);
|
||||
extern void cbuf_append_strftime(struct cbuffer* buf, const char* format, const struct tm* tm);
|
||||
|
||||
extern const char* cbuf_get(struct cbuffer* buf);
|
||||
extern size_t cbuf_size(struct cbuffer* buf);
|
||||
|
||||
|
||||
#endif /* HAVE_UTIL_CBUFFER_H */
|
||||
@@ -30,7 +30,7 @@ struct cfg_tokens
|
||||
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* buffer = (char*) hub_malloc_zero(strlen(line) + 1);
|
||||
char* out = buffer;
|
||||
const char* p = line;
|
||||
int backslash = 0;
|
||||
@@ -68,14 +68,15 @@ struct cfg_tokens* cfg_tokenize(const char* line)
|
||||
else
|
||||
{
|
||||
RESET_TOKEN;
|
||||
hub_free(buffer);
|
||||
return tokens;
|
||||
}
|
||||
break;
|
||||
|
||||
case '\"':
|
||||
case '"':
|
||||
if (backslash)
|
||||
{
|
||||
ADD_CHAR('\"');
|
||||
ADD_CHAR('"');
|
||||
backslash = 0;
|
||||
}
|
||||
else if (quote)
|
||||
@@ -115,15 +116,19 @@ struct cfg_tokens* cfg_tokenize(const char* line)
|
||||
}
|
||||
|
||||
RESET_TOKEN;
|
||||
hub_free(buffer);
|
||||
return tokens;
|
||||
}
|
||||
|
||||
void cfg_tokens_free(struct cfg_tokens* tokens)
|
||||
{
|
||||
if (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)
|
||||
{
|
||||
|
||||
@@ -26,4 +26,5 @@ extern int optind;
|
||||
|
||||
extern int getopt(int argc, char* const argv[], const char *optstring);
|
||||
|
||||
#endif
|
||||
#endif /* NEED_GETOPT */
|
||||
|
||||
|
||||
@@ -203,7 +203,6 @@ int ip_mask_create_left(int af, int bits, struct ip_addr_encap* result)
|
||||
fill = (128-bits) / 8;
|
||||
remain_bits = (128-bits) % 8;
|
||||
mask = (0xff << (8 - remain_bits));
|
||||
n = 0;
|
||||
|
||||
for (n = 0; n < fill; n++)
|
||||
((uint8_t*) &result->internal_ip_data.in6)[n] = (uint8_t) 0xff;
|
||||
@@ -252,7 +251,6 @@ int ip_mask_create_right(int af, int bits, struct ip_addr_encap* result)
|
||||
fill = (128-bits) / 8;
|
||||
remain_bits = (128-bits) % 8;
|
||||
mask8 = (0xff >> (8 - remain_bits));
|
||||
n = 0;
|
||||
start = 16-fill;
|
||||
|
||||
for (n = 0; n < start; n++)
|
||||
|
||||
@@ -32,8 +32,13 @@ struct linked_list* list_create()
|
||||
void list_destroy(struct linked_list* list)
|
||||
{
|
||||
if (list)
|
||||
{
|
||||
uhub_assert(list->size == 0);
|
||||
uhub_assert(list->first == NULL);
|
||||
uhub_assert(list->last == NULL);
|
||||
hub_free(list);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void list_clear(struct linked_list* list, void (*free_handle)(void* ptr))
|
||||
@@ -79,7 +84,7 @@ void list_append(struct linked_list* list, void* data_ptr)
|
||||
void list_remove(struct linked_list* list, void* data_ptr)
|
||||
{
|
||||
struct node* node = list->first;
|
||||
assert(data_ptr);
|
||||
uhub_assert(data_ptr);
|
||||
|
||||
list->iterator = NULL;
|
||||
|
||||
@@ -102,7 +107,7 @@ void list_remove(struct linked_list* list, void* data_ptr)
|
||||
hub_free(node);
|
||||
|
||||
list->size--;
|
||||
break;
|
||||
return;
|
||||
}
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ static const char* prefixes[] =
|
||||
"DUMP",
|
||||
"MEM",
|
||||
"PROTO",
|
||||
"PLUGIN",
|
||||
0
|
||||
};
|
||||
|
||||
@@ -185,12 +186,12 @@ void hub_log(int log_verbosity, const char *format, ...)
|
||||
|
||||
if (logfile)
|
||||
{
|
||||
fprintf(logfile, "%s %5s: %s\n", timestamp, prefixes[log_verbosity], logmsg);
|
||||
fprintf(logfile, "%s %6s: %s\n", timestamp, prefixes[log_verbosity], logmsg);
|
||||
fflush(logfile);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "%s %5s: %s\n", timestamp, prefixes[log_verbosity], logmsg);
|
||||
fprintf(stderr, "%s %6s: %s\n", timestamp, prefixes[log_verbosity], logmsg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ enum log_verbosity {
|
||||
log_dump = 7,
|
||||
log_memory = 8,
|
||||
log_protocol = 9,
|
||||
log_plugin = 10,
|
||||
};
|
||||
|
||||
#define LOG_FATAL(format, ...) hub_log(log_fatal, format, ## __VA_ARGS__)
|
||||
@@ -42,9 +43,11 @@ enum log_verbosity {
|
||||
#ifdef DEBUG
|
||||
# define LOG_DEBUG(format, ...) hub_log(log_debug, format, ## __VA_ARGS__)
|
||||
# define LOG_TRACE(format, ...) hub_log(log_trace, format, ## __VA_ARGS__)
|
||||
# define LOG_PLUGIN(format, ...) hub_log(log_plugin, format, ## __VA_ARGS__)
|
||||
#else
|
||||
# define LOG_DEBUG(format, ...) do { } while(0)
|
||||
# define LOG_TRACE(format, ...) do { } while(0)
|
||||
# define LOG_PLUGIN(format, ...) do { } while(0)
|
||||
#endif
|
||||
|
||||
#ifdef LOWLEVEL_DEBUG
|
||||
|
||||
@@ -35,9 +35,11 @@ extern char* debug_mem_strndup(const char* s, size_t n);
|
||||
|
||||
#define hub_malloc malloc
|
||||
#define hub_free free
|
||||
#define hub_realloc realloc
|
||||
#define hub_strdup strdup
|
||||
#define hub_strndup strndup
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
extern void* hub_malloc_zero(size_t size);
|
||||
|
||||
@@ -244,7 +244,7 @@ int file_read_lines(const char* file, void* data, file_line_handler_t handler)
|
||||
return -2;
|
||||
}
|
||||
|
||||
ret = read(fd, buf, MAX_RECV_BUF);
|
||||
ret = read(fd, buf, MAX_RECV_BUF-1);
|
||||
close(fd);
|
||||
|
||||
if (ret < 0)
|
||||
@@ -258,7 +258,9 @@ int file_read_lines(const char* file, void* data, file_line_handler_t handler)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Parse configuaration */
|
||||
buf[ret] = 0;
|
||||
|
||||
/* Parse configuration */
|
||||
split_data.handler = handler;
|
||||
split_data.data = data;
|
||||
|
||||
@@ -281,46 +283,41 @@ int uhub_atoi(const char* value) {
|
||||
return value[0] == '-' ? -val : val;
|
||||
}
|
||||
|
||||
int is_number(const char* value, int* num)
|
||||
{
|
||||
int len = strlen(value);
|
||||
int offset = (value[0] == '-') ? 1 : 0;
|
||||
int val = 0;
|
||||
int i = offset;
|
||||
|
||||
if (!*(value + offset))
|
||||
return 0;
|
||||
|
||||
for (; i < len; i++)
|
||||
if (value[i] > '9' || value[i] < '0')
|
||||
return 0;
|
||||
|
||||
for (i = offset; i< len; i++)
|
||||
val = val*10 + (value[i] - '0');
|
||||
*num = value[0] == '-' ? -val : val;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FIXME: -INTMIN is wrong!
|
||||
*/
|
||||
const char* uhub_itoa(int val)
|
||||
{
|
||||
size_t i;
|
||||
int value;
|
||||
static char buf[22];
|
||||
memset(buf, 0, sizeof(buf));
|
||||
if (!val)
|
||||
{
|
||||
strcat(buf, "0");
|
||||
return buf;
|
||||
}
|
||||
i = sizeof(buf) - 1;
|
||||
for (value = abs(val); value && i > 0; value /= 10)
|
||||
buf[--i] = "0123456789"[value % 10];
|
||||
|
||||
if (val < 0 && i > 0)
|
||||
buf[--i] = '-';
|
||||
return buf+i;
|
||||
return snprintf(buf, sizeof(buf), "%d", val) < 0 ? NULL : buf;
|
||||
}
|
||||
|
||||
|
||||
const char* uhub_ulltoa(uint64_t val)
|
||||
{
|
||||
size_t i;
|
||||
static char buf[22] = { 0, };
|
||||
memset(buf, 0, sizeof(buf));
|
||||
static char buf[22];
|
||||
|
||||
if (!val)
|
||||
{
|
||||
strcat(buf, "0");
|
||||
return buf;
|
||||
}
|
||||
i = sizeof(buf) - 1;
|
||||
for (; val && i > 0; val /= 10)
|
||||
buf[--i] = "0123456789"[val % 10];
|
||||
return buf+i;
|
||||
return snprintf(buf, sizeof(buf), PRINTF_UINT64_T, val) < 0 ? NULL : buf;
|
||||
}
|
||||
|
||||
|
||||
@@ -399,7 +396,7 @@ const char* get_timestamp(time_t now)
|
||||
{
|
||||
static char ts[32] = {0, };
|
||||
struct tm* t = localtime(&now);
|
||||
sprintf(ts, "[%02d:%02d]", t->tm_hour, t->tm_min);
|
||||
snprintf(ts, sizeof(ts), "[%02d:%02d]", t->tm_hour, t->tm_min);
|
||||
return ts;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,12 @@ extern char* strip_white_space(char* string);
|
||||
extern void strip_off_ini_line_comments(char* line, int line_count);
|
||||
extern char* strip_off_quotes(char* line);
|
||||
|
||||
/**
|
||||
* Convert number in str to integer and store it in num.
|
||||
* @return 1 on success, or 0 on error.
|
||||
*/
|
||||
extern int is_number(const char* str, int* num);
|
||||
|
||||
extern int file_read_lines(const char* file, void* data, file_line_handler_t handler);
|
||||
|
||||
/**
|
||||
@@ -47,7 +53,11 @@ extern int file_read_lines(const char* file, void* data, file_line_handler_t han
|
||||
*/
|
||||
extern int string_to_boolean(const char* str, int* boolean);
|
||||
|
||||
|
||||
/**
|
||||
* Convert number to string.
|
||||
* Note: these functions are neither thread-safe nor reentrant.
|
||||
* @return pointer to the resulting string, NULL on error
|
||||
*/
|
||||
extern const char* uhub_itoa(int val);
|
||||
extern const char* uhub_ulltoa(uint64_t val);
|
||||
|
||||
|
||||
1
thirdparty/sqlite
vendored
Submodule
1
thirdparty/sqlite
vendored
Submodule
Submodule thirdparty/sqlite added at 666798c388
@@ -1,42 +1,18 @@
|
||||
#!/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";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Usage:
|
||||
# cat /etc/uhub/users.conf | tools/convert_to_sqlite.pl | sqlite3 users.db
|
||||
|
||||
print <<_;
|
||||
CREATE TABLE users(
|
||||
nickname CHAR(64) UNIQUE,
|
||||
password CHAR(64),
|
||||
credentials CHAR(5),
|
||||
created TIMESTAMP DEFAULT (DATETIME('NOW')),
|
||||
activity TIMESTAMP DEFAULT (DATETIME('NOW'))
|
||||
);
|
||||
_
|
||||
sub e($) { (my $v = shift) =~ s/'/\\'/g; $v }
|
||||
s{^\s*user_(op|admin|super|reg)\s+([^#\s]+):([^#\s]+)}{
|
||||
printf "INSERT INTO users (nickname, password, credentials) VALUES('%s','%s','%s');\n", e $2, e $3, $1
|
||||
}eg while(<>);
|
||||
|
||||
12
version.h
12
version.h
@@ -1,4 +1,6 @@
|
||||
#if !defined(_MSC_VER)
|
||||
#include "revision.h"
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT
|
||||
#define PRODUCT "uhub"
|
||||
@@ -12,14 +14,10 @@
|
||||
#define REVISION ""
|
||||
#define PRODUCT_STRING PRODUCT "/" VERSION
|
||||
#else
|
||||
#define REVISION "(git: " GIT_REVISION ")"
|
||||
#ifdef GIT_VERSION
|
||||
#define PRODUCT_STRING PRODUCT "/" GIT_VERSION
|
||||
#else
|
||||
#define PRODUCT_STRING PRODUCT "/" VERSION " " REVISION
|
||||
#endif
|
||||
#define REVISION "git-" GIT_REVISION
|
||||
#define PRODUCT_STRING PRODUCT "/" VERSION "-" REVISION
|
||||
#endif
|
||||
|
||||
#ifndef COPYRIGHT
|
||||
#define COPYRIGHT "Copyright (c) 2007-2010, Jan Vidar Krey <janvidar@extatic.org>"
|
||||
#define COPYRIGHT "Copyright (c) 2007-2012, Jan Vidar Krey <janvidar@extatic.org>"
|
||||
#endif
|
||||
|
||||
7
vs2010/.gitignore
vendored
Normal file
7
vs2010/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
*.vcproj.user
|
||||
*.vcproj.filters
|
||||
*.ncb
|
||||
*.aps
|
||||
*.suo
|
||||
Debug
|
||||
Release
|
||||
73
vs2010/plugins/mod_auth_simple/mod_auth_simple.vcxproj
Normal file
73
vs2010/plugins/mod_auth_simple/mod_auth_simple.vcxproj
Normal file
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}</ProjectGuid>
|
||||
<RootNamespace>mod_auth_simple</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\src\plugins\mod_auth_simple.c" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
75
vs2010/plugins/mod_auth_sqlite/mod_auth_sqlite.vcxproj
Normal file
75
vs2010/plugins/mod_auth_sqlite/mod_auth_sqlite.vcxproj
Normal file
@@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{0EF03E84-2720-4616-A5BE-4D5737F68445}</ProjectGuid>
|
||||
<RootNamespace>mod_auth_sqlite</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<IncludePath>$(SolutionDir)..\src;$(IncludePath);$(SolutionDir)..\thirdparty\sqlite</IncludePath>
|
||||
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;$(SolutionDir)\$(Configuration)\sqlite.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<DelayLoadDLLs>
|
||||
</DelayLoadDLLs>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\src\plugins\mod_auth_sqlite.c" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
85
vs2010/plugins/mod_example/mod_example.vcxproj
Normal file
85
vs2010/plugins/mod_example/mod_example.vcxproj
Normal file
@@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>mod_example</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXAMPLE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXAMPLE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\src\plugins\mod_example.c" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
85
vs2010/plugins/mod_topic/mod_topic.vcxproj
Normal file
85
vs2010/plugins/mod_topic/mod_topic.vcxproj
Normal file
@@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>mod_topic</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXAMPLE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXAMPLE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\src\plugins\mod_topic.c" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
78
vs2010/thirdparty/sqlite/sqlite.vcxproj
vendored
Normal file
78
vs2010/thirdparty/sqlite/sqlite.vcxproj
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\..\thirdparty\sqlite\shell.c" />
|
||||
<ClCompile Include="..\..\..\thirdparty\sqlite\sqlite3.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\..\thirdparty\sqlite\sqlite3.h" />
|
||||
<ClInclude Include="..\..\..\thirdparty\sqlite\sqlite3ext.h" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{A4FC9D62-D544-4D2A-88d7-A58529C3460B}</ProjectGuid>
|
||||
<RootNamespace>sqlite</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
85
vs2010/uhub-passwd/uhub-passwd.vcxproj
Normal file
85
vs2010/uhub-passwd/uhub-passwd.vcxproj
Normal file
@@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>uhubpasswd</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<LibraryPath>$(SolutionDir)vs2010\$(Configuration);$(LibraryPath)</LibraryPath>
|
||||
<IncludePath>$(SolutionDir)..\src;$(IncludePath);$(SolutionDir)..\thirdparty\sqlite</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>$(SolutionDir)\$(Configuration)\uhub_utils.lib;$(SolutionDir)\$(Configuration)\sqlite.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\src\tools\uhub-passwd.c" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
83
vs2010/uhub.sln
Normal file
83
vs2010/uhub.sln
Normal file
@@ -0,0 +1,83 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual C++ Express 2010
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uhub", "uhub.vcxproj", "{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uhub_utils", "uhub_utils\uhub_utils.vcxproj", "{0A3C1519-D877-47D9-A82E-40AC1BC79D75}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_auth_simple", "plugins\mod_auth_simple\mod_auth_simple.vcxproj", "{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_example", "plugins\mod_example\mod_example.vcxproj", "{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_auth_sqlite", "plugins\mod_auth_sqlite\mod_auth_sqlite.vcxproj", "{0EF03E84-2720-4616-A5BE-4D5737F68445}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
|
||||
{A4FC9D62-D544-4D2A-88D7-A58529C3460B} = {A4FC9D62-D544-4D2A-88D7-A58529C3460B}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite", "thirdparty\sqlite\sqlite.vcxproj", "{A4FC9D62-D544-4D2A-88D7-A58529C3460B}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uhub-passwd", "uhub-passwd\uhub-passwd.vcxproj", "{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
|
||||
{A4FC9D62-D544-4D2A-88D7-A58529C3460B} = {A4FC9D62-D544-4D2A-88D7-A58529C3460B}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_topic", "plugins\mod_topic\mod_topic.vcxproj", "{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75} = {0A3C1519-D877-47D9-A82E-40AC1BC79D75}
|
||||
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E} = {98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}.Release|Win32.Build.0 = Release|Win32
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{0A3C1519-D877-47D9-A82E-40AC1BC79D75}.Release|Win32.Build.0 = Release|Win32
|
||||
{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{A6674BB3-1B23-4E99-AF9B-1CCDB4EB049A}.Release|Win32.Build.0 = Release|Win32
|
||||
{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{9BBAEFDA-8E0E-4E7F-B8B6-0050432FC45B}.Release|Win32.Build.0 = Release|Win32
|
||||
{0EF03E84-2720-4616-A5BE-4D5737F68445}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{0EF03E84-2720-4616-A5BE-4D5737F68445}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{0EF03E84-2720-4616-A5BE-4D5737F68445}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{0EF03E84-2720-4616-A5BE-4D5737F68445}.Release|Win32.Build.0 = Release|Win32
|
||||
{A4FC9D62-D544-4D2A-88D7-A58529C3460B}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{A4FC9D62-D544-4D2A-88D7-A58529C3460B}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{A4FC9D62-D544-4D2A-88D7-A58529C3460B}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{A4FC9D62-D544-4D2A-88D7-A58529C3460B}.Release|Win32.Build.0 = Release|Win32
|
||||
{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{E92EB860-AE9E-4532-A75F-0929A7BCF6D0}.Release|Win32.Build.0 = Release|Win32
|
||||
{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{9BBAEFDA-8E0E-4E7F-B8B6-00A3432FC45B}.Release|Win32.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
151
vs2010/uhub.vcxproj
Normal file
151
vs2010/uhub.vcxproj
Normal file
@@ -0,0 +1,151 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{98D8BFE9-DACD-40E1-B7BE-C9079ABF832E}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>uhub</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(SolutionDir)\$(Configuration);$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(projectDir)..\src\</AdditionalIncludeDirectories>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
<CompileAsManaged>false</CompileAsManaged>
|
||||
<CompileAs>CompileAsC</CompileAs>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);ws2_32.lib;uhub_utils.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\src\adc\message.c" />
|
||||
<ClCompile Include="..\src\adc\sid.c" />
|
||||
<ClCompile Include="..\src\core\auth.c" />
|
||||
<ClCompile Include="..\src\core\commands.c" />
|
||||
<ClCompile Include="..\src\core\command_parser.c" />
|
||||
<ClCompile Include="..\src\core\config.c" />
|
||||
<ClCompile Include="..\src\core\eventqueue.c" />
|
||||
<ClCompile Include="..\src\core\hub.c" />
|
||||
<ClCompile Include="..\src\core\hubevent.c" />
|
||||
<ClCompile Include="..\src\core\hubio.c" />
|
||||
<ClCompile Include="..\src\core\inf.c" />
|
||||
<ClCompile Include="..\src\core\main.c" />
|
||||
<ClCompile Include="..\src\core\netevent.c" />
|
||||
<ClCompile Include="..\src\core\plugincallback.c" />
|
||||
<ClCompile Include="..\src\core\plugininvoke.c" />
|
||||
<ClCompile Include="..\src\core\pluginloader.c" />
|
||||
<ClCompile Include="..\src\core\probe.c" />
|
||||
<ClCompile Include="..\src\core\route.c" />
|
||||
<ClCompile Include="..\src\core\user.c" />
|
||||
<ClCompile Include="..\src\core\usermanager.c" />
|
||||
<ClCompile Include="..\src\network\backend.c" />
|
||||
<ClCompile Include="..\src\network\connection.c" />
|
||||
<ClCompile Include="..\src\network\epoll.c" />
|
||||
<ClCompile Include="..\src\network\kqueue.c" />
|
||||
<ClCompile Include="..\src\network\network.c" />
|
||||
<ClCompile Include="..\src\network\select.c" />
|
||||
<ClCompile Include="..\src\network\timeout.c" />
|
||||
<ClCompile Include="..\src\network\timer.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\src\adc\adcconst.h" />
|
||||
<ClInclude Include="..\src\adc\message.h" />
|
||||
<ClInclude Include="..\src\adc\sid.h" />
|
||||
<ClInclude Include="..\src\core\auth.h" />
|
||||
<ClInclude Include="..\src\core\commands.h" />
|
||||
<ClInclude Include="..\src\core\commands_builtin.h" />
|
||||
<ClInclude Include="..\src\core\command_parser.h" />
|
||||
<ClInclude Include="..\src\core\config.h" />
|
||||
<ClInclude Include="..\src\core\eventid.h" />
|
||||
<ClInclude Include="..\src\core\eventqueue.h" />
|
||||
<ClInclude Include="..\src\core\gen_config.h" />
|
||||
<ClInclude Include="..\src\core\hub.h" />
|
||||
<ClInclude Include="..\src\core\hubevent.h" />
|
||||
<ClInclude Include="..\src\core\hubio.h" />
|
||||
<ClInclude Include="..\src\core\inf.h" />
|
||||
<ClInclude Include="..\src\core\netevent.h" />
|
||||
<ClInclude Include="..\src\core\plugincallback.h" />
|
||||
<ClInclude Include="..\src\core\plugininvoke.h" />
|
||||
<ClInclude Include="..\src\core\pluginloader.h" />
|
||||
<ClInclude Include="..\src\core\probe.h" />
|
||||
<ClInclude Include="..\src\core\route.h" />
|
||||
<ClInclude Include="..\src\core\user.h" />
|
||||
<ClInclude Include="..\src\core\usermanager.h" />
|
||||
<ClInclude Include="..\src\network\backend.h" />
|
||||
<ClInclude Include="..\src\network\common.h" />
|
||||
<ClInclude Include="..\src\network\connection.h" />
|
||||
<ClInclude Include="..\src\network\network.h" />
|
||||
<ClInclude Include="..\src\network\timeout.h" />
|
||||
<ClInclude Include="..\src\plugin_api\command_api.h" />
|
||||
<ClInclude Include="..\src\plugin_api\handle.h" />
|
||||
<ClInclude Include="..\src\system.h" />
|
||||
<ClInclude Include="..\src\uhub.h" />
|
||||
<ClInclude Include="..\version.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
98
vs2010/uhub_utils/uhub_utils.vcxproj
Normal file
98
vs2010/uhub_utils/uhub_utils.vcxproj
Normal file
@@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{0A3C1519-D877-47D9-A82E-40AC1BC79D75}</ProjectGuid>
|
||||
<RootNamespace>uhub_utils</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<IncludePath>$(SolutionDir)..\src;$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>
|
||||
</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\src\util\cbuffer.c" />
|
||||
<ClCompile Include="..\..\src\util\config_token.c" />
|
||||
<ClCompile Include="..\..\src\util\credentials.c" />
|
||||
<ClCompile Include="..\..\src\util\floodctl.c" />
|
||||
<ClCompile Include="..\..\src\util\getopt.c" />
|
||||
<ClCompile Include="..\..\src\util\ipcalc.c" />
|
||||
<ClCompile Include="..\..\src\util\list.c" />
|
||||
<ClCompile Include="..\..\src\util\log.c" />
|
||||
<ClCompile Include="..\..\src\util\memory.c" />
|
||||
<ClCompile Include="..\..\src\util\misc.c" />
|
||||
<ClCompile Include="..\..\src\util\rbtree.c" />
|
||||
<ClCompile Include="..\..\src\util\tiger.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\src\util\cbuffer.h" />
|
||||
<ClInclude Include="..\..\src\util\config_token.h" />
|
||||
<ClInclude Include="..\..\src\util\credentials.h" />
|
||||
<ClInclude Include="..\..\src\util\floodctl.h" />
|
||||
<ClInclude Include="..\..\src\util\getopt.h" />
|
||||
<ClInclude Include="..\..\src\util\ipcalc.h" />
|
||||
<ClInclude Include="..\..\src\util\list.h" />
|
||||
<ClInclude Include="..\..\src\util\log.h" />
|
||||
<ClInclude Include="..\..\src\util\memory.h" />
|
||||
<ClInclude Include="..\..\src\util\misc.h" />
|
||||
<ClInclude Include="..\..\src\util\rbtree.h" />
|
||||
<ClInclude Include="..\..\src\util\tiger.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
Reference in New Issue
Block a user