diff -ur irc-cvs/common/struct_def.h irc-cvs.xline/common/struct_def.h --- irc-cvs/common/struct_def.h 2004-04-07 19:02:37.000000000 +0200 +++ irc-cvs.xline/common/struct_def.h 2004-05-10 01:33:32.000000000 +0200 @@ -180,7 +180,9 @@ #define FLAGS_RESTRICT 0x0010 /* restricted user */ #define FLAGS_AWAY 0x0020 /* user is away */ #define FLAGS_EXEMPT 0x0040 /* user is exempted from k-lines */ - +#ifdef XLINE +#define FLAGS_XLINED 0x0100 /* X-lined client */ +#endif #define SEND_UMODES (FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY) #define ALL_UMODES (SEND_UMODES|FLAGS_LOCOP|FLAGS_RESTRICT) @@ -323,6 +325,9 @@ #define CONF_BOUNCE 0x040000 #define CONF_OTHERKILL 0x080000 #define CONF_DENY 0x100000 +#ifdef XLINE +#define CONF_XLINE 0x200000 +#endif #define CONF_OPS (CONF_OPERATOR | CONF_LOCOP) #define CONF_SERVER_MASK (CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\ @@ -349,6 +354,13 @@ #define PFLAG_DELAYED 0x00001 #define PFLAG_SERVERONLY 0x00002 +#ifdef XLINE +#define XFLAG_WHOLE 0x00001 +#define IsConfXlineWhole(x) ((x)->flags & XFLAG_WHOLE) +#define IsXlined(x) ((x)->user && (x)->user->flags & FLAGS_XLINED) +#define SetXlined(x) ((x)->user->flags |= FLAGS_XLINED) +#endif + #define IsConfDelayed(x) ((x)->flags & PFLAG_DELAYED) #define IsConfServeronly(x) ((x)->flags & PFLAG_SERVERONLY) @@ -916,6 +928,9 @@ #define EXITC_AREFQ 'u' /* Unauthorized by iauth, be quiet */ #define EXITC_VIRUS 'v' /* joined a channel used by PrettyPark virus */ #define EXITC_YLINEMAX 'Y' /* Y:line max clients limit */ +#ifdef XLINE +#define EXITC_XLINE 'X' /* Forbidden GECOS */ +#endif /* eXternal authentication slave OPTions */ #define XOPT_REQUIRED 0x01 /* require authentication be done by iauth */ Only in irc-cvs.xline: i686-pc-linux-gnu diff -ur irc-cvs/ircd/chkconf.c irc-cvs.xline/ircd/chkconf.c --- irc-cvs/ircd/chkconf.c 2004-03-05 23:06:10.000000000 +0100 +++ irc-cvs.xline/ircd/chkconf.c 2004-05-08 20:10:25.000000000 +0200 @@ -355,6 +355,11 @@ case 'y': aconf->status = CONF_CLASS; break; +#ifdef XLINE + case 'X': + aconf->status = CONF_XLINE; + break; +#endif default: (void)fprintf(stderr, "%s:%d\tWARNING: unknown conf line letter (%c)\n", filelist->filename, nr - filelist->min, *tmp); diff -ur irc-cvs/ircd/s_conf.c irc-cvs.xline/ircd/s_conf.c --- irc-cvs/ircd/s_conf.c 2004-05-07 22:02:51.000000000 +0200 +++ irc-cvs.xline/ircd/s_conf.c 2004-05-10 02:09:09.000000000 +0200 @@ -212,6 +212,36 @@ *s++ = '\0'; return pfsbuf; } +#ifdef XLINE +char *xline_flags_to_string(long flags) +{ + static char xfsbuf[BUFSIZE]; + char *s; + + s = xfsbuf; + + if (flags & XFLAG_WHOLE) + { + *s++ = 'W'; + } + if (s == xfsbuf) + { + *s++ = '-'; + } + *s++ = '\0'; + return xfsbuf; +} +long xline_flags_parse(char *string) +{ + long tmp = 0; + if (index(string, 'W')) + { + tmp |= XFLAG_WHOLE; + } + return tmp; +} + +#endif /* * remove all conf entries from the client except those which match * the status field mask. @@ -1399,6 +1429,11 @@ case 'y': aconf->status = CONF_CLASS; break; +#ifdef XLINE + case 'X': + aconf->status = CONF_XLINE; + break; +#endif default: Debug((DEBUG_ERROR, "Error in config file: %s", line)); break; @@ -1535,7 +1570,12 @@ } } } - +#ifdef XLINE + if (aconf->status & CONF_XLINE && tmp3) + { + aconf->flags = xline_flags_parse(tmp3); + } +#endif if (aconf->status & CONF_SERVICE) aconf->port &= SERVICE_MASK_ALL; if (aconf->status & (CONF_SERVER_MASK|CONF_SERVICE)) diff -ur irc-cvs/ircd/s_conf_ext.h irc-cvs.xline/ircd/s_conf_ext.h --- irc-cvs/ircd/s_conf_ext.h 2004-03-20 22:14:33.000000000 +0100 +++ irc-cvs.xline/ircd/s_conf_ext.h 2004-05-09 23:10:52.000000000 +0200 @@ -73,6 +73,10 @@ EXTERN long iline_flags_parse(char *string); EXTERN char *pline_flags_to_string(long flags); EXTERN long pline_flags_parse(char *string); +#ifdef XLINE +EXTERN char *xline_flags_to_string(long flags); +EXTERN long xline_flags_parse(char *string); +#endif # ifdef INET6 EXTERN char *ipv6_convert (char *orig); # endif diff -ur irc-cvs/ircd/s_serv.c irc-cvs.xline/ircd/s_serv.c --- irc-cvs/ircd/s_serv.c 2004-04-07 19:02:38.000000000 +0200 +++ irc-cvs.xline/ircd/s_serv.c 2004-05-10 00:54:46.000000000 +0200 @@ -1858,6 +1858,23 @@ { 0, 0, 0} }; +#ifdef XLINE +static void report_x_lines(aClient *sptr, char *to) +{ + aConfItem *tmp; + + for (tmp = conf; tmp; tmp = tmp->next) + { + if (tmp->status != CONF_XLINE) + continue; + + sendto_one(sptr,":%s %d %s %s :%s ", ME, RPL_STATSDEBUG, to, + xline_flags_to_string(tmp->flags), + tmp->host); + } +} +#endif + static void report_configured_links(aClient *sptr, char *to, int mask) { static char null[] = ""; @@ -2187,11 +2204,17 @@ case 'V' : case 'v' : /* V conf lines */ report_configured_links(cptr, parv[0], CONF_VER); break; -#ifdef DEBUGMODE case 'X' : case 'x' : /* lists */ +#ifdef DEBUGMODE send_listinfo(cptr, parv[0]); - break; #endif +#ifdef XLINE + if (IsAnOper(sptr)) + { + report_x_lines(sptr, parv[0]); + } +#endif + break; case 'Y' : case 'y' : /* Y lines */ report_classes(cptr, parv[0]); break; diff -ur irc-cvs/ircd/s_user.c irc-cvs.xline/ircd/s_user.c --- irc-cvs/ircd/s_user.c 2004-03-29 20:49:28.000000000 +0200 +++ irc-cvs.xline/ircd/s_user.c 2004-05-10 00:43:57.000000000 +0200 @@ -603,6 +603,14 @@ return exit_client(cptr, sptr, &me, (reason) ? buf : "K-lined"); } +#ifdef XLINE + if (!IsKlineExempt(sptr) && IsXlined(sptr)) + { + sptr->exitc = EXITC_XLINE; + return exit_client(cptr, sptr, &me, + XLINE_EXIT_REASON); + } +#endif sp = user->servp; } else @@ -2457,6 +2465,36 @@ #ifndef NO_DEFAULT_INVISIBLE SetInvisible(sptr); #endif +#ifdef XLINE + if (MyConnect(sptr)) + { + aConfItem *tmp; + char xbuf[BUFSIZE]; + sprintf(xbuf, "%s %s %s %s", username, host, server, realname); + + for (tmp = conf; tmp; tmp = tmp->next) + { + if (tmp->status != CONF_XLINE) + continue; + + if (IsConfXlineWhole(tmp)) + { + if (tmp->host && !match(tmp->host, xbuf)) + { + SetXlined(sptr); + } + } + else + { + if (tmp->host && !match(tmp->host, realname)) + { + SetXlined(sptr); + } + } + } + } +#endif + /* parse desired user modes sent in USER */ /* old behaviour - bits */ if ((i = atoi(host)))