From 33e8c2480649193799d88d003b9257873aaf2b31 Mon Sep 17 00:00:00 2001 From: Gabor Adam Toth Date: Mon, 20 Dec 2010 02:01:25 +0100 Subject: quit on HTTP commands: GET & POST --- src/ngircd/irc-login.c | 8 ++++++++ src/ngircd/irc-login.h | 1 + src/ngircd/parse.c | 2 ++ 3 files changed, 11 insertions(+) (limited to 'src') diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index f76a6270..3c4eb189 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -692,6 +692,14 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) * @param Req Request structure with prefix and all parameters. * @returns CONNECTED or DISCONNECTED. */ +GLOBAL bool +IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) +{ + Req->argc = 0; + return IRC_QUIT(Client, Req); +} + + GLOBAL bool IRC_PING(CLIENT *Client, REQUEST *Req) { diff --git a/src/ngircd/irc-login.h b/src/ngircd/irc-login.h index 7ba53571..f3138f6e 100644 --- a/src/ngircd/irc-login.h +++ b/src/ngircd/irc-login.h @@ -25,6 +25,7 @@ GLOBAL bool IRC_WEBIRC PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req)); +GLOBAL bool IRC_QUIT_HTTP PARAMS((CLIENT *Client, REQUEST *Req)); #endif diff --git a/src/ngircd/parse.c b/src/ngircd/parse.c index 7c56a03d..51149da5 100644 --- a/src/ngircd/parse.c +++ b/src/ngircd/parse.c @@ -85,6 +85,8 @@ static COMMAND My_Commands[] = { "PONG", IRC_PONG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, { "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, { "QUIT", IRC_QUIT, 0xFFFF, 0, 0, 0 }, + { "GET", IRC_QUIT_HTTP, 0xFFFF, 0, 0, 0 }, + { "POST", IRC_QUIT_HTTP, 0xFFFF, 0, 0, 0 }, { "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0 }, { "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0 }, { "SERVER", IRC_SERVER, 0xFFFF, 0, 0, 0 }, -- cgit 1.4.1 From 77cff9e47c33d1b1bc22d1fba09607e347e55e8a Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Wed, 16 Mar 2011 23:56:27 +0100 Subject: Move IRC_QUIT_HTTP() below IRC_QUIT() --- src/ngircd/irc-login.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index 3c4eb189..518c9f1d 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -683,6 +683,14 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) } /* IRC_QUIT */ +GLOBAL bool +IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) +{ + Req->argc = 0; + return IRC_QUIT(Client, Req); +} /* IRC_QUIT_HTTP */ + + /** * Handler for the IRC "PING" command. * @@ -692,14 +700,6 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) * @param Req Request structure with prefix and all parameters. * @returns CONNECTED or DISCONNECTED. */ -GLOBAL bool -IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) -{ - Req->argc = 0; - return IRC_QUIT(Client, Req); -} - - GLOBAL bool IRC_PING(CLIENT *Client, REQUEST *Req) { -- cgit 1.4.1 From dbb66695c938a7c13e0d399937f191456c7b1119 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Wed, 16 Mar 2011 23:58:01 +0100 Subject: IRC_QUIT_HTTP(): enhance error message --- src/ngircd/irc-login.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index 518c9f1d..7e752179 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -686,7 +686,8 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) GLOBAL bool IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) { - Req->argc = 0; + Req->argc = 1; + Req->argv[0] = "Oops, HTTP request received? This is IRC!"; return IRC_QUIT(Client, Req); } /* IRC_QUIT_HTTP */ -- cgit 1.4.1 From 38747b40dcadd320220bb050974d5e5860a8ecbb Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Wed, 16 Mar 2011 23:58:39 +0100 Subject: Don't use IRC_QUIT_HTTP() if STRICT_RFC is #define'd --- src/ngircd/irc-login.c | 14 ++++++++++++++ src/ngircd/parse.c | 6 ++++-- 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index 7e752179..92d54ab1 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -683,6 +683,18 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) } /* IRC_QUIT */ +#ifndef STRICT_RFC + +/** + * Handler for HTTP command, e.g. GET and POST + * + * We handle these commands here to avoid the quite long timeout when + * some user tries to access this IRC daemon using an web browser ... + * + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @returns CONNECTED or DISCONNECTED. + */ GLOBAL bool IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) { @@ -691,6 +703,8 @@ IRC_QUIT_HTTP( CLIENT *Client, REQUEST *Req ) return IRC_QUIT(Client, Req); } /* IRC_QUIT_HTTP */ +#endif + /** * Handler for the IRC "PING" command. diff --git a/src/ngircd/parse.c b/src/ngircd/parse.c index 51149da5..11bb3d11 100644 --- a/src/ngircd/parse.c +++ b/src/ngircd/parse.c @@ -85,8 +85,6 @@ static COMMAND My_Commands[] = { "PONG", IRC_PONG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, { "PRIVMSG", IRC_PRIVMSG, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, { "QUIT", IRC_QUIT, 0xFFFF, 0, 0, 0 }, - { "GET", IRC_QUIT_HTTP, 0xFFFF, 0, 0, 0 }, - { "POST", IRC_QUIT_HTTP, 0xFFFF, 0, 0, 0 }, { "REHASH", IRC_REHASH, CLIENT_USER, 0, 0, 0 }, { "RESTART", IRC_RESTART, CLIENT_USER, 0, 0, 0 }, { "SERVER", IRC_SERVER, 0xFFFF, 0, 0, 0 }, @@ -110,6 +108,10 @@ static COMMAND My_Commands[] = { "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, #ifdef IRCPLUS { "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, 0, 0 }, +#endif +#ifndef STRICT_RFC + { "GET", IRC_QUIT_HTTP, 0xFFFF, 0, 0, 0 }, + { "POST", IRC_QUIT_HTTP, 0xFFFF, 0, 0, 0 }, #endif { NULL, NULL, 0x0, 0, 0, 0 } /* Ende-Marke */ }; -- cgit 1.4.1 From b19f7d73cb3759630072d28d1db5219dc656348b Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Thu, 17 Mar 2011 00:03:10 +0100 Subject: Only "handle" HTTP commands on unregistered connections --- src/ngircd/parse.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/ngircd/parse.c b/src/ngircd/parse.c index 11bb3d11..8203dd0e 100644 --- a/src/ngircd/parse.c +++ b/src/ngircd/parse.c @@ -110,8 +110,8 @@ static COMMAND My_Commands[] = { "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, 0, 0 }, #endif #ifndef STRICT_RFC - { "GET", IRC_QUIT_HTTP, 0xFFFF, 0, 0, 0 }, - { "POST", IRC_QUIT_HTTP, 0xFFFF, 0, 0, 0 }, + { "GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 }, + { "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 }, #endif { NULL, NULL, 0x0, 0, 0, 0 } /* Ende-Marke */ }; -- cgit 1.4.1 From ff2a425ab899a782145186d4e9a829ea9950fb47 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Mon, 18 Feb 2008 15:24:01 +0100 Subject: Add support for up to 3 targets in WHOIS queries. also allow up to one wildcard query from local hosts. Follows ircd 2.10 implementation rather than RFC 2812. At most 10 entries are returned per wildcard expansion. WHOIS test cases by Dana Dahlstrom. --- src/ngircd/irc-info.c | 245 ++++++++++++++++++++++++++++++---------------- src/testsuite/Makefile.am | 7 +- 2 files changed, 169 insertions(+), 83 deletions(-) (limited to 'src') diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c index 46e34271..22c65aa2 100644 --- a/src/ngircd/irc-info.c +++ b/src/ngircd/irc-info.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2010 Alexander Barton + * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors. * * 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 @@ -917,56 +917,20 @@ IRC_WHO( CLIENT *Client, REQUEST *Req ) /** - * Handler for the IRC "WHOIS" command. - * - * See RFC 2812, 3.6.2 "Whois query". + * Generate WHOIS reply of one actual client. * * @param Client The client from which this command has been received. - * @param Req Request structure with prefix and all parameters. - * @return CONNECTED or DISCONNECTED. + * @param from The client requesting the information ("originator"). + * @param c The client of which information should be returned. + * @returns CONNECTED or DISCONNECTED. */ -GLOBAL bool -IRC_WHOIS( CLIENT *Client, REQUEST *Req ) +static bool +IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c) { - CLIENT *from, *target, *c; char str[LINE_LEN + 1]; CL2CHAN *cl2chan; CHANNEL *chan; - assert( Client != NULL ); - assert( Req != NULL ); - - /* Bad number of parameters? */ - if (Req->argc < 1 || Req->argc > 2) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); - - /* Search client */ - c = Client_Search(Req->argv[Req->argc - 1]); - if (!c || (Client_Type(c) != CLIENT_USER - && Client_Type(c) != CLIENT_SERVICE)) - return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, - Client_ID(Client), - Req->argv[Req->argc - 1]); - - /* Search sender of the WHOIS */ - if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); - else from = Client; - if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); - - /* Forward to other server? */ - if( Req->argc > 1 ) - { - /* Search target server (can be specified as nick of that server!) */ - target = Client_Search( Req->argv[0] ); - if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[0] ); - } - else target = Client_ThisServer( ); - - assert( target != NULL ); - - if(( Client_NextHop( target ) != Client_ThisServer( )) && ( Client_Type( Client_NextHop( target )) == CLIENT_SERVER )) return IRC_WriteStrClientPrefix( target, from, "WHOIS %s :%s", Req->argv[0], Req->argv[1] ); - /* Nick, user, hostname and client info */ if (!IRC_WriteStrClient(from, RPL_WHOISUSER_MSG, Client_ID(from), Client_ID(c), Client_User(c), @@ -974,18 +938,21 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) return DISCONNECTED; /* Server */ - if( ! IRC_WriteStrClient( from, RPL_WHOISSERVER_MSG, Client_ID( from ), Client_ID( c ), Client_ID( Client_Introducer( c )), Client_Info( Client_Introducer( c )))) return DISCONNECTED; + if (!IRC_WriteStrClient(from, RPL_WHOISSERVER_MSG, Client_ID(from), + Client_ID(c), Client_ID(Client_Introducer(c)), + Client_Info(Client_Introducer(c)))) + return DISCONNECTED; /* Channels */ - snprintf( str, sizeof( str ), RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); - cl2chan = Channel_FirstChannelOf( c ); - while( cl2chan ) - { - chan = Channel_GetChannel( cl2chan ); - assert( chan != NULL ); + snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG, + Client_ID(from), Client_ID(c)); + cl2chan = Channel_FirstChannelOf(c); + while (cl2chan) { + chan = Channel_GetChannel(cl2chan); + assert(chan != NULL); /* next */ - cl2chan = Channel_NextChannelOf( c, cl2chan ); + cl2chan = Channel_NextChannelOf(c, cl2chan); /* Secret channel? */ if (strchr(Channel_Modes(chan), 's') @@ -998,54 +965,168 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) continue; /* Concatenate channel names */ - if( str[strlen( str ) - 1] != ':' ) strlcat( str, " ", sizeof( str )); - if( strchr( Channel_UserModes( chan, c ), 'o' )) strlcat( str, "@", sizeof( str )); - else if( strchr( Channel_UserModes( chan, c ), 'v' )) strlcat( str, "+", sizeof( str )); - strlcat( str, Channel_Name( chan ), sizeof( str )); + if (str[strlen(str) - 1] != ':') + strlcat(str, " ", sizeof(str)); - if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 )) - { + strlcat(str, who_flags_qualifier(Channel_UserModes(chan, c)), + sizeof(str)); + strlcat(str, Channel_Name(chan), sizeof(str)); + + if (strlen(str) > (LINE_LEN - CHANNEL_NAME_LEN - 4)) { /* Line becomes too long: send it! */ - if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; - snprintf( str, sizeof( str ), RPL_WHOISCHANNELS_MSG, Client_ID( from ), Client_ID( c )); + if (!IRC_WriteStrClient(Client, "%s", str)) + return DISCONNECTED; + snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG, + Client_ID(from), Client_ID(c)); } } - if( str[strlen( str ) - 1] != ':') - { + if(str[strlen(str) - 1] != ':') { /* There is data left to send: */ - if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED; + if (!IRC_WriteStrClient(Client, "%s", str)) + return DISCONNECTED; } /* IRC-Operator? */ - if( Client_HasMode( c, 'o' )) - { - if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED; - } + if (Client_HasMode(c, 'o') && + !IRC_WriteStrClient(from, RPL_WHOISOPERATOR_MSG, + Client_ID(from), Client_ID(c))) + return DISCONNECTED; /* Connected using SSL? */ - if (Conn_UsesSSL(Client_Conn(c))) { - if (!IRC_WriteStrClient - (from, RPL_WHOISSSL_MSG, Client_ID(from), Client_ID(c))) + if (Conn_UsesSSL(Client_Conn(c)) && + !IRC_WriteStrClient(from, RPL_WHOISSSL_MSG, + Client_ID(from), Client_ID(c))) return DISCONNECTED; - } /* Idle and signon time (local clients only!) */ - if (Client_Conn(c) > NONE ) { - if (! IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG, - Client_ID(from), Client_ID(c), - (unsigned long)Conn_GetIdle(Client_Conn(c)), - (unsigned long)Conn_GetSignon(Client_Conn(c)))) - return DISCONNECTED; - } + if (Client_Conn(c) > NONE && + !IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG, + Client_ID(from), Client_ID(c), + (unsigned long)Conn_GetIdle(Client_Conn(c)), + (unsigned long)Conn_GetSignon(Client_Conn(c)))) + return DISCONNECTED; /* Away? */ - if( Client_HasMode( c, 'a' )) - { - if( ! IRC_WriteStrClient( from, RPL_AWAY_MSG, Client_ID( from ), Client_ID( c ), Client_Away( c ))) return DISCONNECTED; + if (Client_HasMode(c, 'a') && + !IRC_WriteStrClient(from, RPL_AWAY_MSG, + Client_ID(from), Client_ID(c), + Client_Away(c))) + return DISCONNECTED; + + return IRC_WriteStrClient(from, RPL_ENDOFWHOIS_MSG, + Client_ID(from), Client_ID(c)); +} /* IRC_WHOIS_SendReply */ + + +/** + * Handler for the IRC "WHOIS" command. + * + * See RFC 2812, 3.6.2 "Whois query". + * + * @param Client The client from which this command has been received. + * @param Req Request structure with prefix and all parameters. + * @return CONNECTED or DISCONNECTED. + */ +GLOBAL bool +IRC_WHOIS( CLIENT *Client, REQUEST *Req ) +{ + CLIENT *from, *target, *c; + unsigned int match_count = 0, found = 0; + bool has_wildcards, is_remote; + bool got_wildcard = false; + const char *query; + + assert( Client != NULL ); + assert( Req != NULL ); + + /* Bad number of parameters? */ + if (Req->argc < 1 || Req->argc > 2) + return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, + Client_ID(Client), Req->command); + + /* Search sender of the WHOIS */ + if (Client_Type(Client) == CLIENT_SERVER) { + from = Client_Search(Req->prefix); + } else { + IRC_SetPenalty(Client, 1); + from = Client; } + if (!from) + return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, + Client_ID(Client), Req->prefix); + + /* Get target server for this command */ + if (Req->argc > 1) { + /* Search the target server, which can be specified as a + * nick name on that server as well: */ + target = Client_Search(Req->argv[0]); + if (!target) + return IRC_WriteStrClient(from, ERR_NOSUCHSERVER_MSG, + Client_ID(from), Req->argv[0]); + } else + target = Client_ThisServer(); + assert(target != NULL); + + /* Forward to other server? */ + if (Client_NextHop(target) != Client_ThisServer() && + Client_Type(Client_NextHop(target)) == CLIENT_SERVER) + return IRC_WriteStrClientPrefix(target, from, + "WHOIS %s :%s", + Req->argv[0], Req->argv[1]); + + is_remote = Client_Conn(from) < 0; + for (query = strtok(Req->argv[Req->argc - 1], ","); + query && found < 3; + query = strtok(NULL, ","), found++) + { + has_wildcards = query[strcspn(query, "*?")] != 0; + /* + * follows ircd 2.10 implementation: + * - handle up to 3 targets + * - no wildcards for remote clients + * - only one wildcard target per local client + * + * also, at most ten matches are returned. + */ + if (!has_wildcards || is_remote) { + c = Client_Search(query); + if (c) { + if (!IRC_WHOIS_SendReply(Client, from, c)) + return DISCONNECTED; + } else { + if (!IRC_WriteStrClient(Client, + ERR_NOSUCHNICK_MSG, + Client_ID(Client), + query)) + return DISCONNECTED; + } + continue; + } + if (got_wildcard) { + /* we already handled one wildcard query */ + if (!IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, + Client_ID(Client), query)) + return DISCONNECTED; + continue; + } + got_wildcard = true; + IRC_SetPenalty(Client, 3); - /* End of Whois */ - return IRC_WriteStrClient( from, RPL_ENDOFWHOIS_MSG, Client_ID( from ), Client_ID( c )); + for (c = Client_First(); c && match_count < 10; c = Client_Next(c)) { + if (Client_Type(c) != CLIENT_USER) + continue; + if (!MatchCaseInsensitive(query, Client_ID(c))) + continue; + if (!IRC_WHOIS_SendReply(Client, from, c)) + return DISCONNECTED; + match_count++; + } + + if (match_count == 0) + return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, + Client_ID(Client), Req->argv[Req->argc - 1]); + } + return CONNECTED; } /* IRC_WHOIS */ diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am index f72453f1..52cc31a6 100644 --- a/src/testsuite/Makefile.am +++ b/src/testsuite/Makefile.am @@ -1,6 +1,6 @@ # # ngIRCd -- The Next Generation IRC Daemon -# Copyright (c)2001-2008 Alexander Barton (alex@barton.de) +# Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors. # # Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen # der GNU General Public License (GPL), wie von der Free Software Foundation @@ -85,6 +85,10 @@ who-test: tests.sh rm -f who-test ln -s $(srcdir)/tests.sh who-test +whois-test: tests.sh + rm -f whois-test + ln -s $(srcdir)/tests.sh whois-test + TESTS = start-server1 \ connect-test \ start-server2 \ @@ -97,6 +101,7 @@ TESTS = start-server1 \ mode-test \ opless-channel-test \ who-test \ + whois-test \ server-link-test \ stop-server2 \ stress-server.sh \ -- cgit 1.4.1 From d1f604ab89f34412cbe44aaf323b450b800a49d9 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Sat, 19 Mar 2011 14:52:07 +0100 Subject: Add "whois-test" to testsuite and distribution archive Test script proposed by Dana Dahlstrom, 2008-02-17. See ... --- src/testsuite/.gitignore | 1 + src/testsuite/Makefile.am | 2 +- src/testsuite/whois-test.e | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/testsuite/whois-test.e (limited to 'src') diff --git a/src/testsuite/.gitignore b/src/testsuite/.gitignore index fd628e3d..5884a486 100644 --- a/src/testsuite/.gitignore +++ b/src/testsuite/.gitignore @@ -11,6 +11,7 @@ mode-test opless-channel-test server-link-test who-test +whois-test ngircd-test1.log ngircd-test2.log ngircd-test1.motd diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am index 52cc31a6..9dc76a7d 100644 --- a/src/testsuite/Makefile.am +++ b/src/testsuite/Makefile.am @@ -20,7 +20,7 @@ EXTRA_DIST = \ test-loop.sh wait-tests.sh \ channel-test.e connect-test.e check-idle.e invite-test.e \ join-test.e kick-test.e message-test.e misc-test.e mode-test.e \ - opless-channel-test.e server-link-test.e who-test.e \ + opless-channel-test.e server-link-test.e who-test.e whois-test.e \ stress-A.e stress-B.e \ start-server1 stop-server1 ngircd-test1.conf \ start-server2 stop-server2 ngircd-test2.conf diff --git a/src/testsuite/whois-test.e b/src/testsuite/whois-test.e new file mode 100644 index 00000000..7024d5ff --- /dev/null +++ b/src/testsuite/whois-test.e @@ -0,0 +1,53 @@ +# ngIRCd test suite +# WHOIS test + +spawn telnet localhost 6789 +expect { + timeout { exit 1 } + "Connected" +} + +send "nick nick\r" +send "user user . . :Real Name\r" +expect { + timeout { exit 1 } + "376" +} + +send "whois nick\r" +expect { + timeout { exit 1 } + "311 nick nick ~user localhost \* :Real Name\r" +} + +send "whois *\r" +expect { + timeout { exit 1 } + "311 nick nick ~user localhost \* :Real Name\r" +} + +send "whois n*\r" +expect { + timeout { exit 1 } + "311 nick nick ~user localhost \* :Real Name\r" +} + +send "whois ?ick\r" +expect { + timeout { exit 1 } + "311 nick nick ~user localhost \* :Real Name\r" +} + +send "whois ????,n?*k\r" +expect { + timeout { exit 1 } + "311 nick nick ~user localhost \* :Real Name\r" +} + +send "quit\r" +expect { + timeout { exit 1 } + "ERROR" +} + +# -eof- -- cgit 1.4.1