]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Implement WEBIRC command
authorAlexander Barton <alex@barton.de>
Wed, 10 Feb 2010 23:01:53 +0000 (00:01 +0100)
committerAlexander Barton <alex@barton.de>
Wed, 10 Feb 2010 23:01:53 +0000 (00:01 +0100)
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 <password> <username> <hostname> <ip-address>

The <password> must be set using the new configuration variable "WebircPassword" in the [Global] section of ngircd.conf.

Please note that the <ip-address> is currently not used by ngIRCd (we don't store it in the CLIENT structure, only the resolved hostname).

doc/sample-ngircd.conf
man/ngircd.conf.5.tmpl
src/ngircd/conf.c
src/ngircd/conf.h
src/ngircd/conn.c
src/ngircd/irc-login.c
src/ngircd/irc-login.h
src/ngircd/parse.c

index b945224efdec1bc6e5d1d55b2cd7067639fdcd40..db326c98c47d15dfc4e2fc707873f7e9f573bab8 100644 (file)
        # LINKS requests for example.
        Info = Server Info Text
 
        # 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 = 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!
        ;AdminInfo1 = Description
        # Information about the server and the administrator, used by the
        # ADMIN command. Not required by server but by RFC!
        ;AdminInfo1 = Description
index 4d55592d148f9f34294a251bc3d43d78c1ae6cc5..46e0308a3f3e9fce27cd18f652dc0b2a1606648f 100644 (file)
@@ -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
 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.
 \fBAdminInfo1\fR, \fBAdminInfo2\fR, \fBAdminEMail\fR
 Information about the server and the administrator, used by the ADMIN
 command.
index fae2a28c453efc943e419526fd72fecbb864d789..694b5d469bfa47d00b5da0075e199ff41186aad5 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
 /*
  * 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
  *
  * 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]" );
        }
 
        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);
        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;
        }
                        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 ));
        if( strcasecmp( Var, "AdminInfo1" ) == 0 ) {
                /* Administrative info #1 */
                len = strlcpy( Conf_ServerAdmin1, Arg, sizeof( Conf_ServerAdmin1 ));
index 0180515569dcbf5515211437776a3a25a460fca3..5764d0f3556249441387bff87e452918b1049e2a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
 /*
  * 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
  *
  * 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,6 +188,9 @@ GLOBAL bool Conf_AddServer PARAMS(( const char *Name, UINT16 Port, const char *H
 
 GLOBAL bool Conf_IsService PARAMS((int ConfServer, const char *Nick));
 
 
 GLOBAL bool Conf_IsService PARAMS((int ConfServer, const char *Nick));
 
+/* Password required by WEBIRC command */
+GLOBAL char Conf_WebircPwd[CLIENT_PASS_LEN];
+
 
 #endif
 
 
 #endif
 
index 1e4ba0abd7604397e3ad8fa2d2a8ba1b84343be8..cd350a8d619700a2ca89034b5a05b132df6cba36 100644 (file)
@@ -1999,10 +1999,14 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
        c = Conn_GetClient( i );
        assert( c != NULL );
 
        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) {
 #ifdef IDENTAUTH
                ++identptr;
                if (*identptr) {
index 7b73d40f99f285a5e9da7951ccc6b88be96061cb..2de4bd584bec73e4a081d284a67c5d52332b5392 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
 /*
  * 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
  *
  * 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,6 +557,31 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req)
 } /* IRC_SERVICE */
 
 
 } /* IRC_SERVICE */
 
 
+/**
+ * Handler for the IRC command "WEBIRC".
+ * Syntax: WEBIRC <password> <username> <real-hostname> <real-IP-address>
+ */
+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 )
 {
 GLOBAL bool
 IRC_QUIT( CLIENT *Client, REQUEST *Req )
 {
index 0b920380ae919808acfae0f81cdd5620c1b9e5cd..1504e0b7317a0d48e32c991bf57dd11fa622ca7b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
 /*
  * 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
  *
  * 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 *Req));
 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_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));
 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));
index 2c28a309a0bebf39076b06450a98ac0d5fdc1265..3710d70c494d07972d3198245a00e0dd445bb719 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
 /*
  * 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
  *
  * 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 },
        { "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 },
        { "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 },