From 34aca16d4ae46487493c3cf0e0147625ef48da52 Mon Sep 17 00:00:00 2001 From: James Booth Date: Fri, 15 May 2015 00:58:34 +0100 Subject: [PATCH] Set auth properties on XMPPClient --- src/server/parser.c | 2 +- src/server/parser.h | 5 +++-- src/server/server.c | 15 +++++++++++---- src/server/stanza.c | 24 ++++++++++++++++++++++++ src/server/stanza.h | 1 + src/server/xmppclient.c | 8 ++++++-- src/server/xmppclient.h | 4 +++- 7 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/server/parser.c b/src/server/parser.c index f660880..e1ab683 100644 --- a/src/server/parser.c +++ b/src/server/parser.c @@ -59,7 +59,7 @@ end_element(void *data, const char *element) depth--; if (stanza_get_child_by_ns(curr_stanza, "jabber:iq:auth")) { - auth_cb(xmppclient); + auth_cb(curr_stanza, xmppclient); } if (depth > 0) { diff --git a/src/server/parser.h b/src/server/parser.h index e43bec9..962f9ea 100644 --- a/src/server/parser.h +++ b/src/server/parser.h @@ -1,10 +1,11 @@ #ifndef __H_PARSER #define __H_PARSER +#include "server/stanza.h" #include "server/xmppclient.h" -typedef void (*stream_start_func)(void * const userdata); -typedef void (*auth_func)(void * const userdata); +typedef void (*stream_start_func)(XMPPClient *client); +typedef void (*auth_func)(XMPPStanza *stanza, XMPPClient *client); void parser_init(XMPPClient *client, stream_start_func startcb, auth_func authcb); int parser_feed(char *chunk, int len); diff --git a/src/server/server.c b/src/server/server.c index 0bc9d6e..69b8c2c 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -119,10 +119,9 @@ listen_to(XMPPClient *client) } void -stream_start_callback(void *userdata) +stream_start_callback(XMPPClient *client) { printf("\n--> Stream start callback fired\n"); - XMPPClient *client = (XMPPClient*)userdata; send_to(client, XML_START); send_to(client, STREAM_RESP); send_to(client, FEATURES); @@ -130,10 +129,18 @@ stream_start_callback(void *userdata) } void -auth_callback(void *userdata) +auth_callback(XMPPStanza *stanza, XMPPClient *client) { printf("\n--> Auth callback fired\n"); - XMPPClient *client = (XMPPClient*)userdata; + XMPPStanza *query = stanza_get_child_by_ns(stanza, "jabber:iq:auth"); + XMPPStanza *username = stanza_get_child_by_name(query, "username"); + XMPPStanza *password = stanza_get_child_by_name(query, "password"); + XMPPStanza *resource = stanza_get_child_by_name(query, "resource"); + + client->username = strdup(username->content->str); + client->password = strdup(password->content->str); + client->resource = strdup(resource->content->str); + send_to(client, AUTH_RESP); printf("RECV: "); } diff --git a/src/server/stanza.c b/src/server/stanza.c index cd0869f..d2d9bd0 100644 --- a/src/server/stanza.c +++ b/src/server/stanza.c @@ -91,3 +91,27 @@ stanza_get_child_by_ns(XMPPStanza *stanza, char *ns) return NULL; } + +XMPPStanza* +stanza_get_child_by_name(XMPPStanza *stanza, char *name) +{ + if (!stanza) { + return NULL; + } + + if (!stanza->children) { + return NULL; + } + + GList *curr_child = stanza->children; + while (curr_child) { + XMPPStanza *child = curr_child->data; + if (g_strcmp0(child->name, name) == 0) { + return child; + } + + curr_child = g_list_next(curr_child); + } + + return NULL; +} diff --git a/src/server/stanza.h b/src/server/stanza.h index f145ff6..82fba73 100644 --- a/src/server/stanza.h +++ b/src/server/stanza.h @@ -19,5 +19,6 @@ void stanza_show_all(void); void stanza_add(XMPPStanza *stanza); void stanza_add_child(XMPPStanza *parent, XMPPStanza *child); XMPPStanza* stanza_get_child_by_ns(XMPPStanza *stanza, char *ns); +XMPPStanza* stanza_get_child_by_name(XMPPStanza *stanza, char *name); #endif diff --git a/src/server/xmppclient.c b/src/server/xmppclient.c index 56a9c25..9f24018 100644 --- a/src/server/xmppclient.c +++ b/src/server/xmppclient.c @@ -16,7 +16,9 @@ xmppclient_new(struct sockaddr_in client_addr, int socket) client->ip = strdup(inet_ntoa(client_addr.sin_addr)); client->port = ntohs(client_addr.sin_port); client->sock = socket; - client->nickname = NULL; + client->username = NULL; + client->password = NULL; + client->resource = NULL; return client; } @@ -29,6 +31,8 @@ xmppclient_end_session(XMPPClient *client) close(client->sock); free(client->ip); - free(client->nickname); + free(client->username); + free(client->password); + free(client->resource); free(client); } diff --git a/src/server/xmppclient.h b/src/server/xmppclient.h index 9056540..d8b1ac4 100644 --- a/src/server/xmppclient.h +++ b/src/server/xmppclient.h @@ -7,7 +7,9 @@ typedef struct xmpp_client_t { char *ip; int port; int sock; - char *nickname; + char *username; + char *password; + char *resource; } XMPPClient; XMPPClient* xmppclient_new(struct sockaddr_in client_addr, int socket);