diff --git a/.gitignore b/.gitignore index 54af62b..2daab66 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,4 @@ src/client/stabber.lo src/server/log.lo config.cache configure.lineno +src/server/prime.lo diff --git a/Makefile.am b/Makefile.am index edb7e34..e1f4bc0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,6 +6,7 @@ sources = \ src/server/parser.c src/server/parser.h \ src/server/stanza.c src/server/stanza.h \ src/server/log.c src/server/log.h \ + src/server/prime.c src/server/prime.h \ src/client/stabber.c src/client/stabber.h libstabber_la_LDFLAGS = -export-symbols-regex '^stbbr_' diff --git a/configure.ac b/configure.ac index 4626edb..b4828c0 100644 --- a/configure.ac +++ b/configure.ac @@ -17,6 +17,9 @@ PKG_CHECK_MODULES([glib], [glib-2.0 >= 2.26], [], PKG_CHECK_MODULES([expat], [expat >= 2.0.0], [], [AC_MSG_ERROR([expat 2.0.0 or higher is required])]) +AC_CHECK_LIB([pthread], [main], [], + [AC_MSG_ERROR([pthread is required])]) + AM_CFLAGS="-Wall -Wno-deprecated-declarations" AM_CFLAGS="$AM_CFLAGS -Wunused -Werror" AM_CPPFLAGS="$AM_CPPFLAGS $glib_CFLAGS $expat_CFLAGS" diff --git a/runstabber.c b/runstabber.c index abfa2ba..edc18aa 100644 --- a/runstabber.c +++ b/runstabber.c @@ -37,5 +37,5 @@ main(int argc , char *argv[]) port = atoi(argv[1]); } - return stbbr_start(port); + return stbbr_main(port); } diff --git a/src/client/stabber.c b/src/client/stabber.c index a8ee03a..4f71f31 100644 --- a/src/client/stabber.c +++ b/src/client/stabber.c @@ -1,7 +1,48 @@ +#include +#include +#include + #include "server/server.h" +#include "server/prime.h" + +typedef struct server_args_t { + int port; +} StabberArgs; + +static void* +_start_server_cb(void *data) +{ + StabberArgs *args = (StabberArgs*)data; + server_run(args->port); + + return NULL; +} + +int +stbbr_main(int port) +{ + return server_run(port); +} int stbbr_start(int port) { - return server_run(port); + StabberArgs *args = malloc(sizeof(StabberArgs)); + args->port = port; + + pthread_t server_thread; + int res = pthread_create(&server_thread, NULL, _start_server_cb, (void*)args); + if (res != 0) { + return 0; + } + pthread_detach(server_thread); + + return 1; +} + +int +stbbr_auth_passwd(char *password) +{ + prime_required_passwd(password); + return 1; } diff --git a/src/server/prime.c b/src/server/prime.c new file mode 100644 index 0000000..e8552bf --- /dev/null +++ b/src/server/prime.c @@ -0,0 +1,15 @@ +#include + +static char *required_passwd = NULL; + +void +prime_required_passwd(char *password) +{ + required_passwd = strdup(password); +} + +char * +prime_get_passwd(void) +{ + return required_passwd; +} diff --git a/src/server/prime.h b/src/server/prime.h new file mode 100644 index 0000000..a88a443 --- /dev/null +++ b/src/server/prime.h @@ -0,0 +1,7 @@ +#ifndef __H_PRIME +#define __H_PRIME + +void prime_required_passwd(char *password); +char* prime_get_passwd(void); + +#endif diff --git a/src/server/server.c b/src/server/server.c index ae5f082..db903e4 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -7,6 +7,7 @@ #include "server/xmppclient.h" #include "server/parser.h" +#include "server/prime.h" #include "server/stanza.h" #include "server/server.h" #include "server/log.h" @@ -17,9 +18,15 @@ #define FEATURES "" #define AUTH_RESP "" +#define AUTH_FAIL "" #define STREAM_END "" +static XMPPClient *client; + +static void _shutdown(void); +static int listen_socket; + int listen_for_xmlstart(XMPPClient *client) { @@ -149,6 +156,12 @@ auth_callback(XMPPStanza *stanza, XMPPClient *client) client->password = strdup(password->content->str); client->resource = strdup(resource->content->str); + if (g_strcmp0(client->password, prime_get_passwd()) != 0) { + send_to(client, AUTH_FAIL); + send_to(client, STREAM_END); + exit(0); + } + send_to(client, AUTH_RESP); log_print("RECV: "); } @@ -159,11 +172,13 @@ server_run(int port) log_init(); log_println("Starting on port: %d...", port); + atexit(_shutdown); + struct sockaddr_in server_addr, client_addr; // create socket errno = 0; - int listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); // ipv4, tcp, ip + listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); // ipv4, tcp, ip if (listen_socket == -1) { char *errmsg = strerror(errno); log_println("Could not create socket: %s", errmsg); @@ -208,7 +223,7 @@ server_run(int port) return 0; } - XMPPClient *client = xmppclient_new(client_addr, client_socket); + client = xmppclient_new(client_addr, client_socket); parser_init(client, stream_start_callback, auth_callback); log_print("RECV: "); int res = listen_for_xmlstart(client); @@ -218,11 +233,14 @@ server_run(int port) log_print("RECV: "); listen_to(client); + return 1; +} +static void +_shutdown(void) +{ stanza_show_all(); - xmppclient_end_session(client); - parser_close(); while (recv(listen_socket, NULL, 1, 0) > 0) {} @@ -230,6 +248,4 @@ server_run(int port) close(listen_socket); log_close(); - - return 1; } diff --git a/src/server/xmppclient.c b/src/server/xmppclient.c index 9f24018..22a1b9c 100644 --- a/src/server/xmppclient.c +++ b/src/server/xmppclient.c @@ -26,13 +26,16 @@ xmppclient_new(struct sockaddr_in client_addr, int socket) void xmppclient_end_session(XMPPClient *client) { - while (recv(client->sock, NULL, 1, 0) > 0) {} - shutdown(client->sock, 2); - close(client->sock); - - free(client->ip); - free(client->username); - free(client->password); - free(client->resource); - free(client); + if (client) { + if (client->sock) { + while (recv(client->sock, NULL, 1, 0) > 0) {} + shutdown(client->sock, 2); + close(client->sock); + } + free(client->ip); + free(client->username); + free(client->password); + free(client->resource); + free(client); + } } diff --git a/stabber.h b/stabber.h index 37a2ce9..0a50760 100644 --- a/stabber.h +++ b/stabber.h @@ -1,6 +1,9 @@ #ifndef __H_STABBER #define __H_STABBER +int stbbr_main(int port); int stbbr_start(int port); +int stbbr_auth_passwd(char *password); + #endif