1 /* UserClient.c - TransparentIRC 0.1
2 * Copyright (C) 2011-2012 Philipp Kreil (pk910)
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #include "UserClient.h"
18 #include "IOHandler.h"
19 #include "ServerSocket.h"
20 #include "UserSession.h"
23 static void userclient_callback(struct IOEvent *event);
25 static struct UserClient *userclients = NULL;
27 void userclient_accepted(struct ServerSocket *server, int sockfd) {
28 struct UserClient *client;
29 struct IODescriptor *iofd = iohandler_add(sockfd, IOTYPE_CLIENT, userclient_callback);
31 iofd->state = IO_CONNECTED;
33 iohandler_update(iofd);
34 client = calloc(1, sizeof(*client));
37 client->server = server;
38 server->clientcount++;
40 struct UserLogin *login = calloc(1, sizeof(*login));
42 login->client = client;
45 //add UserClient to the list
47 client->next = userclients;
49 userclients->prev = client;
52 //let's say hello to the client
53 iohandler_printf(iofd, "NOTICE AUTH :*** [TransparentIRC] TransparentIRC v" TRANSIRC_VERSION " (use /quote transirc for more information)");
56 void userclient_close(struct UserClient *client) {
57 if(client->flags & USERCLIENT_LOGGED_IN) {
58 usersession_client_close(client->user);
60 struct UserLogin *login = client->user;
61 if(client->flags & USERCLIENT_LOGIN_PROCESSING) {
62 usersession_login_abort(login);
65 free(login->username);
67 free(login->password);
70 if(login->reject_reason)
71 free(login->reject_reason);
72 if(login->session_class)
73 free(login->session_class);
76 iohandler_close(client->iofd);
77 client->server->clientcount--;
79 client->prev->next = client->next;
81 userclients = client->next;
83 client->next->prev = client->prev;
88 void userclient_close_server(struct ServerSocket *server, int keep_clients) {
89 struct UserClient *client, *next_client;
90 for(client = userclients; client; client = next_client) {
91 next_client = client->next;
92 if(client->server == server) {
94 client->server = NULL;
96 userclient_close(client);
101 static void userclient_recv(struct UserClient *client, char *line) {
102 if(!stricmplen(line, "TRANSIRC ", 9)) {
104 char *argv[MAXNUMPARAMS];
105 int argc = parse_line(line, argv, 1);
108 } else if(!(client->flags & USERCLIENT_LOGGED_IN)) {
109 struct UserLogin *login = client->user;
110 char *argv[MAXNUMPARAMS];
111 int argc = parse_line(line, argv, 1);
113 if(!stricmp(argv[1], "PASS")) {
114 char *delimiter = strchr(argv[2], ':');
116 free(login->password);
121 free(login->username);
122 login->username = strdup(argv[2]);
123 login->password = strdup(delimiter);
125 login->password = strdup(argv[2]);
126 } else if(!stricmp(argv[1], "USER")) {
128 login->username = strdup(argv[2]);
129 } else if(!stricmp(argv[1], "NICK")) {
132 login->nick = strdup(argv[2]);
133 if(!login->password) {
134 iohandler_printf(client->iofd, "NOTICE AUTH :*** [TransparentIRC] You need to send your LOC data. Try /quote PASS <username>:<password>");
137 if(login->username && login->password && login->nick && !(client->flags & USERCLIENT_LOGIN_PROCESSING)) {
139 iohandler_printf(client->iofd, "NOTICE AUTH :*** [TransparentIRC] Checking login...");
140 usersession_login(login);
147 void userclient_login_failed(struct UserLogin *login, char *reason) {
148 iohandler_printf(login->client->iofd, "NOTICE AUTH :*** [TransparentIRC] Login rejected");
149 userclient_close(login->client);
152 void userclient_login_successful(struct UserLogin *login, struct UserSession *session, int recover) {
153 struct UserClient *client = login->client;
154 iohandler_printf(client->iofd, "NOTICE AUTH :*** [TransparentIRC] Login accepted.");
156 free(login->username);
158 free(login->password);
162 client->user = session;
164 iohandler_printf(client->iofd, "NOTICE AUTH :*** [TransparentIRC] Recovering previous link (Nick: %s).", session->nick);
170 static void userclient_callback(struct IOEvent *event) {
171 struct UserClient *client = event->iofd->data;
172 switch(event->type) {
174 userclient_recv(client, event->data.recv_str);
177 userclient_close(client);