commit 6e8cf51bb216f956e7a6fdb5c61b0f2799bf8d2d from: Alexander Barton date: Wed Feb 10 23:01:53 2010 UTC Implement WEBIRC command The WEBIRC command is used by some Web-to-IRC gateways to set the correct user name and host name of users instead of their own. Syntax: WEBIRC The must be set using the new configuration variable "WebircPassword" in the [Global] section of ngircd.conf. Please note that the is currently not used by ngIRCd (we don't store it in the CLIENT structure, only the resolved hostname). commit - 53fc0ebff6fe09bb6a3ae3b134647b3499fc6618 commit + 6e8cf51bb216f956e7a6fdb5c61b0f2799bf8d2d blob - b945224efdec1bc6e5d1d55b2cd7067639fdcd40 blob + db326c98c47d15dfc4e2fc707873f7e9f573bab8 --- doc/sample-ngircd.conf +++ doc/sample-ngircd.conf @@ -28,8 +28,14 @@ # LINKS requests for example. Info = Server Info Text - # Global password for all users needed to connect to the server + # Global password for all users needed to connect to the server. + # (Default: not set) ;Password = abc + + # Password required for using the WEBIRC command used by some + # Web-to-IRC gateways. If not set/empty, the WEBIRC command can't + # be used. (Default: not set) + ;WebircPassword = xyz # Information about the server and the administrator, used by the # ADMIN command. Not required by server but by RFC! blob - 4d55592d148f9f34294a251bc3d43d78c1ae6cc5 blob + 46e0308a3f3e9fce27cd18f652dc0b2a1606648f --- man/ngircd.conf.5.tmpl +++ man/ngircd.conf.5.tmpl @@ -73,6 +73,11 @@ example. Global password for all users needed to connect to the server. The default is empty, so no password is required. .TP +\fBWebircPassword\fR +Password required for using the WEBIRC command used by some Web-to-IRC +gateways. If not set or empty, the WEBIRC command can't be used. +Default: not set. +.TP \fBAdminInfo1\fR, \fBAdminInfo2\fR, \fBAdminEMail\fR Information about the server and the administrator, used by the ADMIN command. blob - fae2a28c453efc943e419526fd72fecbb864d789 blob + 694b5d469bfa47d00b5da0075e199ff41186aad5 --- src/ngircd/conf.c +++ src/ngircd/conf.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2009 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2010 Alexander Barton (alex@barton.de) * * 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 @@ -291,16 +291,17 @@ Conf_Test( void ) } puts( "[GLOBAL]" ); - printf( " Name = %s\n", Conf_ServerName ); - printf( " Info = %s\n", Conf_ServerInfo ); - printf( " Password = %s\n", Conf_ServerPwd ); - printf( " AdminInfo1 = %s\n", Conf_ServerAdmin1 ); - printf( " AdminInfo2 = %s\n", Conf_ServerAdmin2 ); - printf( " AdminEMail = %s\n", Conf_ServerAdminMail ); - printf( " MotdFile = %s\n", Conf_MotdFile ); - printf( " MotdPhrase = %s\n", Conf_MotdPhrase ); - printf( " ChrootDir = %s\n", Conf_Chroot ); - printf( " PidFile = %s\n", Conf_PidFile); + printf(" Name = %s\n", Conf_ServerName); + printf(" Info = %s\n", Conf_ServerInfo); + printf(" Password = %s\n", Conf_ServerPwd); + printf(" WebircPassword = %s\n", Conf_WebircPwd); + printf(" AdminInfo1 = %s\n", Conf_ServerAdmin1); + printf(" AdminInfo2 = %s\n", Conf_ServerAdmin2); + printf(" AdminEMail = %s\n", Conf_ServerAdminMail); + printf(" MotdFile = %s\n", Conf_MotdFile); + printf(" MotdPhrase = %s\n", Conf_MotdPhrase); + printf(" ChrootDir = %s\n", Conf_Chroot); + printf(" PidFile = %s\n", Conf_PidFile); printf(" Listen = %s\n", Conf_ListenAddress); fputs(" Ports = ", stdout); ports_puts(&Conf_ListenPorts); @@ -845,6 +846,13 @@ Handle_GLOBAL( int Line, char *Var, char *Arg ) Config_Error_TooLong( Line, Var ); return; } + if (strcasecmp(Var, "WebircPassword") == 0) { + /* Password required for WEBIRC command */ + len = strlcpy(Conf_WebircPwd, Arg, sizeof(Conf_WebircPwd)); + if (len >= sizeof(Conf_WebircPwd)) + Config_Error_TooLong(Line, Var); + return; + } if( strcasecmp( Var, "AdminInfo1" ) == 0 ) { /* Administrative info #1 */ len = strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 )); blob - 0180515569dcbf5515211437776a3a25a460fca3 blob + 5764d0f3556249441387bff87e452918b1049e2a --- src/ngircd/conf.h +++ src/ngircd/conf.h @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2008 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2010 Alexander Barton (alex@barton.de) * * 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 @@ -188,7 +188,10 @@ GLOBAL bool Conf_AddServer PARAMS(( const char *Name, GLOBAL bool Conf_IsService PARAMS((int ConfServer, const char *Nick)); +/* Password required by WEBIRC command */ +GLOBAL char Conf_WebircPwd[CLIENT_PASS_LEN]; + #endif blob - 1e4ba0abd7604397e3ad8fa2d2a8ba1b84343be8 blob + cd350a8d619700a2ca89034b5a05b132df6cba36 --- src/ngircd/conn.c +++ src/ngircd/conn.c @@ -1999,10 +1999,14 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events c = Conn_GetClient( i ); assert( c != NULL ); - /* Only update client information of unregistered clients */ - if( Client_Type( c ) == CLIENT_UNKNOWN ) { - strlcpy(My_Connections[i].host, readbuf, sizeof( My_Connections[i].host)); - Client_SetHostname( c, readbuf); + /* Only update client information of unregistered clients. + * Note: user commands (e. g. WEBIRC) are always read _after_ reading + * the resolver results, so we don't have to worry to override settings + * from these commands here. */ + if(Client_Type(c) == CLIENT_UNKNOWN) { + strlcpy(My_Connections[i].host, readbuf, + sizeof(My_Connections[i].host)); + Client_SetHostname(c, readbuf); #ifdef IDENTAUTH ++identptr; if (*identptr) { blob - 7b73d40f99f285a5e9da7951ccc6b88be96061cb blob + 2de4bd584bec73e4a081d284a67c5d52332b5392 --- src/ngircd/irc-login.c +++ src/ngircd/irc-login.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2008 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2010 Alexander Barton (alex@barton.de) * * 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 @@ -557,7 +557,32 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req) } /* IRC_SERVICE */ +/** + * Handler for the IRC command "WEBIRC". + * Syntax: WEBIRC + */ GLOBAL bool +IRC_WEBIRC(CLIENT *Client, REQUEST *Req) +{ + /* Exactly 4 parameters are requited */ + if (Req->argc != 4) + return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, + Client_ID(Client), Req->command); + + if (!Conf_WebircPwd[0] || strcmp(Req->argv[0], Conf_WebircPwd) != 0) + return IRC_WriteStrClient(Client, ERR_PASSWDMISMATCH_MSG, + Client_ID(Client)); + + LogDebug("Connection %d: got valid WEBIRC command: user=%s, host=%s, ip=%s", + Client_Conn(Client), Req->argv[1], Req->argv[2], Req->argv[3]); + + Client_SetUser(Client, Req->argv[1], true); + Client_SetHostname(Client, Req->argv[2]); + return CONNECTED; +} /* IRC_WEBIRC */ + + +GLOBAL bool IRC_QUIT( CLIENT *Client, REQUEST *Req ) { CLIENT *target; blob - 0b920380ae919808acfae0f81cdd5620c1b9e5cd blob + 1504e0b7317a0d48e32c991bf57dd11fa622ca7b --- src/ngircd/irc-login.h +++ src/ngircd/irc-login.h @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2008 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2010 Alexander Barton (alex@barton.de) * * 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 @@ -19,6 +19,7 @@ GLOBAL bool IRC_PASS PARAMS((CLIENT *Client, REQUEST * GLOBAL bool IRC_NICK PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_USER PARAMS((CLIENT *Client, REQUEST *Req)); GLOBAL bool IRC_SERVICE PARAMS((CLIENT *Client, REQUEST *Req)); +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)); blob - 2c28a309a0bebf39076b06450a98ac0d5fdc1265 blob + 3710d70c494d07972d3198245a00e0dd445bb719 --- src/ngircd/parse.c +++ src/ngircd/parse.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2008 Alexander Barton (alex@barton.de) + * Copyright (c)2001-2010 Alexander Barton (alex@barton.de) * * 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 @@ -103,6 +103,7 @@ static COMMAND My_Commands[] = { "USERS", IRC_USERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, { "VERSION", IRC_VERSION, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, { "WALLOPS", IRC_WALLOPS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, + { "WEBIRC", IRC_WEBIRC, CLIENT_UNKNOWN, 0, 0, 0 }, { "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 }, { "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 }, { "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },