From fc3df376babe61fd8b725fb8c48c189eaebeec50 Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 21 Jul 2014 00:04:42 +0200 Subject: [PATCH] added some files --- src/Makefile.am | 3 ++ src/ircd_auth.c | 84 +++++++++++++++++++++++++++++++ src/{ircd_nicks.c => ircd_auth.h} | 18 +++---- src/ircd_client.c | 13 ++--- src/ircd_client.h | 1 + src/ircd_parse.c | 4 +- src/struct_auth.h | 26 +++++++--- src/struct_user.h | 8 +-- 8 files changed, 125 insertions(+), 32 deletions(-) create mode 100644 src/ircd_auth.c rename src/{ircd_nicks.c => ircd_auth.h} (74%) diff --git a/src/Makefile.am b/src/Makefile.am index e258ea2..e27e2a1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -20,5 +20,8 @@ nextircd_SOURCES = \ ircd_config.c \ ircd_sock.c \ ircd_client.c \ + ircd_parse.c \ + ircd_auth.c \ + ircd_users.c \ main.c diff --git a/src/ircd_auth.c b/src/ircd_auth.c new file mode 100644 index 0000000..0478f9b --- /dev/null +++ b/src/ircd_auth.c @@ -0,0 +1,84 @@ +/* ircd_auth.c - NextIRCd + * Copyright (C) 2012-2013 Philipp Kreil (pk910) + * + * 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 . + */ +#include "struct_auth.h" +#include "struct_connection.h" +#include "ircd_client.h" +#include "IOHandler/IOSockets.h" +#include "IOHandler/IODNSLookup.h" +#include "version.h" + +static IODNS_CALLBACK(auth_dns_callback); + +static struct Auth *authlist_first = NULL; +static struct Auth *authlist_last = NULL; + +struct Auth *auth_new(struct Connection *conn) { + struct Auth *auth = calloc(1, sizeof(*auth)); + client_printf(conn, "NOTICE AUTH :*** NextIRCd v%d.%d (%s)", VERSION_NUMBER, patchlevel, revision); + + auth->conn = conn; + time(&auth->startup_time); + + auth->prev = authlist_last; + auth->next = NULL; + if(!authlist_last) + authlist_first = auth + authlist_last = auth; + + return auth; +} + +void auth_start_dnsreverse(struct Auth *auth) { + client_printf(auth->conn, "NOTICE AUTH :*** Looking up your hostname"); + + struct IODNSAddress *sockaddr; + sockaddr = iosocket_get_remote_addr(auth->conn->socket); + if(sockaddr) { + auth->dnslookup = iodns_getnameinfo(sockaddr->address, sockaddr->addresslen, auth_dns_callback, auth); + } else { + // critical error! + } +} + +static IODNS_CALLBACK(auth_dns_callback) { + struct Auth *auth = event->query->data; + struct IODNSResult *dnsresult = event->result; + + if(event->type == IODNSEVENT_SUCCESS) { + strncpy(auth->host, dnsresult->result.host, HOSTLEN); + client_printf(auth->conn, "NOTICE AUTH :*** Found your hostname (%s)", auth->host); + } else { + struct IODNSAddress *sockaddr = iosocket_get_remote_addr(auth->conn->socket); + if(sockaddr->addresslen == sizeof(struct sockaddr_in)) { + //ipv4 + inet_ntop(AF_INET, (void *)(&((struct sockaddr_in *)sockaddr->address)->sin_addr), auth->host, HOSTLEN); + } else { + //ipv6 + inet_ntop(AF_INET6, (void *)(&((struct sockaddr_in6 *)sockaddr->address)->sin6_addr), auth->host, HOSTLEN); + } + client_printf(auth->conn, "NOTICE AUTH :*** Couldn't look up your hostname. Using your IP instead (%s)", auth->host); + } + if(dnsresult) + iodns_free_result(dnsresult); + + auth_try_finish(auth); +} + + +void auth_try_finish(struct Auth *auth) { + +} diff --git a/src/ircd_nicks.c b/src/ircd_auth.h similarity index 74% rename from src/ircd_nicks.c rename to src/ircd_auth.h index 5b64ad2..fde02c4 100644 --- a/src/ircd_nicks.c +++ b/src/ircd_auth.h @@ -1,4 +1,4 @@ -/* ircd_nicks.c - NextIRCd +/* ircd_auth.h - NextIRCd * Copyright (C) 2012-2013 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -14,16 +14,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "struct_user.h" - -struct UserDictEntry { - struct User *user; - struct UserDict *next, *prev; -}; - -struct UserDict { - struct UserDictEntry *users[65536]; // 2^16 (first 16 bit of nickhash as identifier) -}; +#ifndef _ircd_auth_h +#define _ircd_auth_h +struct Auth *auth_new(struct Connection *conn); +void auth_start_dnsreverse(struct Auth *auth); +void auth_try_finish(struct Auth *auth); +#endif diff --git a/src/ircd_client.c b/src/ircd_client.c index 28d650b..5af6f1d 100644 --- a/src/ircd_client.c +++ b/src/ircd_client.c @@ -20,14 +20,13 @@ #include "struct_connection.h" #include "struct_auth.h" #include "ircd_config.h" -#include "version.h" #include #include #include #define CLIENT_MAXLEN 512 -static void client_printf(struct Connection *conn, const char *text, ...) { +void client_printf(struct Connection *conn, const char *text, ...) { va_list arg_list; char sendBuf[CLIENT_MAXLEN]; int pos; @@ -42,13 +41,9 @@ static void client_printf(struct Connection *conn, const char *text, ...) { } void client_connected(struct Connection *conn) { - client_printf(conn, "NOTICE AUTH :*** NextIRCd v%d.%d (%s)", VERSION_NUMBER, patchlevel, revision); - - struct Auth *auth = calloc(1, sizeof(*auth)); - auth->conn = conn; - conn->data.auth = auth; - - /* maybe do some stuff here? */ + struct Auth *auth = auth_new(conn); + + auth_start_dnsreverse(auth); } void client_disconnected(struct Connection *conn) { diff --git a/src/ircd_client.h b/src/ircd_client.h index f113ae3..c4a68a0 100644 --- a/src/ircd_client.h +++ b/src/ircd_client.h @@ -25,5 +25,6 @@ void client_connected(struct Connection *conn); void client_disconnected(struct Connection *conn); /* -- */ +void client_printf(struct Connection *conn, const char *text, ...); #endif diff --git a/src/ircd_parse.c b/src/ircd_parse.c index 21197b1..12dc6de 100644 --- a/src/ircd_parse.c +++ b/src/ircd_parse.c @@ -66,8 +66,8 @@ struct { {NULL, 0, 1, 0} /* Server */ }, {{"NICK", "N"}, /* Nick Command */ - {cmd_nick_cli, 0, 1, 0}, /* Client */ - {cmd_nick_auth, 0, 1, 0}, /* Unauthed */ + {cmd_nick_cli, 1, 1, 0}, /* Client */ + {cmd_nick_auth, 1, 1, 0}, /* Unauthed */ {NULL, 0, 1, 0} /* Server */ }, {{"USER", "U"}, /* User Command */ diff --git a/src/struct_auth.h b/src/struct_auth.h index 69a452a..335917e 100644 --- a/src/struct_auth.h +++ b/src/struct_auth.h @@ -17,22 +17,36 @@ #ifndef _struct_auth_h #define _struct_auth_h +#include "struct_user.h" +#include + +#define PASSLEN 50 + +struct IODNSQuery; struct Auth { struct Connection *conn; - char *nick; - char *ident; - char *realname; - char *passwd; - - unsigned int ping_number; + char nick[NICKLEN+1]; + char ident[IDENTLEN+1]; + char realname[REALLEN+1]; + char host[HOSTLEN+1]; + char passwd[PASSLEN+1]; + + unsigned int ping_probe; + time_t startup_time; + + struct IODNSQuery *dnslookup; unsigned int server : 1; unsigned int have_nick : 1; unsigned int have_user : 1; unsigned int have_pass : 1; + unsigned int have_dnsresolv : 1; + unsigned int have_pong : 1; + + struct Auth *prev, *next; }; #endif diff --git a/src/struct_user.h b/src/struct_user.h index 47f722d..9fc65c3 100644 --- a/src/struct_user.h +++ b/src/struct_user.h @@ -19,10 +19,10 @@ #define _struct_user_h #include "crypto_md5.h" -#define NICKLEN 30 -#define IDENTLEN 15 -#define HOSTLEN 63 -#define REALLEN 50 +#define NICKLEN 30 +#define IDENTLEN 15 +#define HOSTLEN 63 +#define REALLEN 50 struct User { unsigned int usernum; -- 2.20.1