#include "blacklist.h"
#include "substitution.h"
#include "chmode.h"
+#include "s_assert.h"
static void report_and_set_user_flags(struct Client *, struct ConfItem *);
void user_welcome(struct Client *source_p);
if((rb_dlink_list_length(&lclient_list) + rb_dlink_list_length(&serv_list)) >
(unsigned long)MaxConnectionCount)
- MaxConnectionCount = rb_dlink_list_length(&lclient_list) +
+ MaxConnectionCount = rb_dlink_list_length(&lclient_list) +
rb_dlink_list_length(&serv_list);
sendto_one_numeric(source_p, RPL_LUSERCLIENT, form_str(RPL_LUSERCLIENT),
(Count.total - Count.invisi),
- Count.invisi, rb_dlink_list_length(&global_serv_list));
+ Count.invisi,
+ (int)rb_dlink_list_length(&global_serv_list));
if(rb_dlink_list_length(&oper_list) > 0)
- sendto_one_numeric(source_p, RPL_LUSEROP,
- form_str(RPL_LUSEROP), rb_dlink_list_length(&oper_list));
+ sendto_one_numeric(source_p, RPL_LUSEROP,
+ form_str(RPL_LUSEROP),
+ (int)rb_dlink_list_length(&oper_list));
if(rb_dlink_list_length(&unknown_list) > 0)
- sendto_one_numeric(source_p, RPL_LUSERUNKNOWN,
+ sendto_one_numeric(source_p, RPL_LUSERUNKNOWN,
form_str(RPL_LUSERUNKNOWN),
- rb_dlink_list_length(&unknown_list));
+ (int)rb_dlink_list_length(&unknown_list));
if(rb_dlink_list_length(&global_channel_list) > 0)
- sendto_one_numeric(source_p, RPL_LUSERCHANNELS,
+ sendto_one_numeric(source_p, RPL_LUSERCHANNELS,
form_str(RPL_LUSERCHANNELS),
rb_dlink_list_length(&global_channel_list));
sendto_one_numeric(source_p, RPL_LUSERME, form_str(RPL_LUSERME),
- rb_dlink_list_length(&lclient_list),
- rb_dlink_list_length(&serv_list));
+ (int)rb_dlink_list_length(&lclient_list),
+ (int)rb_dlink_list_length(&serv_list));
- sendto_one_numeric(source_p, RPL_LOCALUSERS,
+ sendto_one_numeric(source_p, RPL_LOCALUSERS,
form_str(RPL_LOCALUSERS),
- rb_dlink_list_length(&lclient_list),
+ (int)rb_dlink_list_length(&lclient_list),
Count.max_loc,
- rb_dlink_list_length(&lclient_list),
+ (int)rb_dlink_list_length(&lclient_list),
Count.max_loc);
sendto_one_numeric(source_p, RPL_GLOBALUSERS, form_str(RPL_GLOBALUSERS),
sendto_one_numeric(source_p, RPL_STATSCONN,
form_str(RPL_STATSCONN),
- MaxConnectionCount, MaxClientCount,
+ MaxConnectionCount, MaxClientCount,
Count.totalrestartcount);
return 0;
return -1;
client_p->localClient->last = rb_current_time();
- /* Straight up the maximum rate of flooding... */
- source_p->localClient->allow_read = MAX_FLOOD_BURST;
/* XXX - fixme. we shouldnt have to build a users buffer twice.. */
if(!IsGotId(source_p) && (strchr(username, '[') != NULL))
rb_strlcpy(source_p->host, source_p->sockhost, sizeof(source_p->host));
}
-
+
aconf = source_p->localClient->att_conf;
}
/* dont replace username if its supposed to be spoofed --fl */
- if(!IsConfDoSpoofIp(aconf) || !strchr(aconf->name, '@'))
+ if(!IsConfDoSpoofIp(aconf) || !strchr(aconf->info.name, '@'))
{
p = username;
else
encr = source_p->localClient->passwd;
- if(strcmp(encr, aconf->passwd))
+ if(encr == NULL || strcmp(encr, aconf->passwd))
{
ServerStats.is_ref++;
sendto_one(source_p, form_str(ERR_PASSWDMISMATCH), me.name, source_p->name);
(xconf = find_xline(source_p->info, 1)) != NULL)
{
ServerStats.is_ref++;
- add_reject(source_p, xconf->name, NULL);
+ add_reject(source_p, xconf->host, NULL);
exit_client(client_p, source_p, &me, "Bad user info");
return CLIENT_EXITED;
}
source_p->sockhost, source_p->preClient->dnsbl_listed->host);
else
{
+ sendto_realops_snomask(SNO_REJ, L_NETWIDE,
+ "Listed on DNSBL %s: %s (%s@%s) [%s] [%s]",
+ source_p->preClient->dnsbl_listed->host,
+ source_p->name,
+ source_p->username, source_p->host,
+ IsIPSpoof(source_p) ? "255.255.255.255" : source_p->sockhost,
+ source_p->info);
+
rb_dlink_list varlist = { NULL, NULL, 0 };
substitution_append_var(&varlist, "nick", source_p->name);
if(++Count.total > Count.max_tot)
Count.max_tot = Count.total;
- source_p->localClient->allow_read = MAX_FLOOD_BURST;
-
Count.totalrestartcount++;
s_assert(source_p->localClient != NULL);
/* they get a reduced limit */
if(find_tgchange(source_p->sockhost))
- USED_TARGETS(source_p) = 6;
+ source_p->localClient->targets_free = TGCHANGE_INITIAL_LOW;
+ else
+ source_p->localClient->targets_free = TGCHANGE_INITIAL;
monitor_signon(source_p);
user_welcome(source_p);
int
introduce_client(struct Client *client_p, struct Client *source_p, struct User *user, const char *nick, int use_euid)
{
- static char ubuf[12];
+ char ubuf[BUFSIZE];
struct Client *identifyservice_p;
char *p;
hook_data_umode_changed hdata;
hook_data_client hdata2;
- char sockhost[HOSTLEN];
if(MyClient(source_p))
send_umode(source_p, source_p, 0, 0, ubuf);
s_assert(has_id(source_p));
- if(source_p->sockhost[0] == ':')
- {
- sockhost[0] = '0';
- sockhost[1] = '\0';
- rb_strlcat(sockhost, source_p->sockhost, sizeof(sockhost));
- } else
- strcpy(sockhost, source_p->sockhost);
-
if (use_euid)
sendto_server(client_p, NULL, CAP_EUID | CAP_TS6, NOCAPS,
":%s EUID %s %d %ld %s %s %s %s %s %s %s :%s",
source_p->hopcount + 1,
(long) source_p->tsinfo, ubuf,
source_p->username, source_p->host,
- IsIPSpoof(source_p) ? "0" : sockhost,
+ IsIPSpoof(source_p) ? "0" : source_p->sockhost,
source_p->id,
IsDynSpoof(source_p) ? source_p->orighost : "*",
EmptyString(source_p->user->suser) ? "*" : source_p->user->suser,
source_p->hopcount + 1,
(long) source_p->tsinfo, ubuf,
source_p->username, source_p->host,
- IsIPSpoof(source_p) ? "0" : sockhost,
+ IsIPSpoof(source_p) ? "0" : source_p->sockhost,
source_p->id, source_p->info);
+ if(!EmptyString(source_p->certfp))
+ sendto_server(client_p, NULL, CAP_TS6, NOCAPS,
+ ":%s ENCAP * CERTFP :%s",
+ use_id(source_p), source_p->certfp);
+
if (IsDynSpoof(source_p))
{
sendto_server(client_p, NULL, CAP_TS6, use_euid ? CAP_EUID : NOCAPS, ":%s ENCAP * REALHOST %s",
if(MyConnect(source_p) && source_p->localClient->passwd)
{
- if (ConfigFileEntry.identifyservice[0] != '\0' &&
- ConfigFileEntry.identifycommand[0] != '\0')
+ if (!EmptyString(ConfigFileEntry.identifyservice) &&
+ !EmptyString(ConfigFileEntry.identifycommand))
{
/* use user@server */
p = strchr(ConfigFileEntry.identifyservice, '@');
return 0;
}
-/*
+/*
* valid_hostname - check hostname for validity
*
* Inputs - pointer to user
int
valid_hostname(const char *hostname)
{
- const char *p = hostname;
+ const char *p = hostname, *last_slash = 0;
int found_sep = 0;
s_assert(NULL != p);
if(hostname == NULL)
return NO;
- if('.' == *p || ':' == *p)
+ if(!strcmp(hostname, "localhost"))
+ return YES;
+
+ if('.' == *p || ':' == *p || '/' == *p)
return NO;
while (*p)
return NO;
if(*p == '.' || *p == ':')
found_sep++;
+ else if(*p == '/')
+ {
+ found_sep++;
+ last_slash = p;
+ }
p++;
}
if(found_sep == 0)
- return(NO);
+ return NO;
- return (YES);
+ if(last_slash && IsDigit(last_slash[1]))
+ return NO;
+
+ return YES;
}
-/*
+/*
* valid_username - check username for validity
*
* Inputs - pointer to user
* Output - YES if valid, NO if not
* Side effects - NONE
- *
+ *
* Absolutely always reject any '*' '!' '?' '@' in an user name
* reject any odd control characters names.
* Allow '.' in username to allow for "first.last"
* user_mode - set get current users mode
*
* m_umode() added 15/10/91 By Darren Reed.
- * parv[0] - sender
* parv[1] - username to change mode for
* parv[2] - modes to change
*/
else
{
/* Only decrement the oper counts if an oper to begin with
- * found by Pat Szuta, Perly , perly@xnet.com
+ * found by Pat Szuta, Perly , perly@xnet.com
*/
if(!IsOper(source_p))
}
/* FALLTHROUGH */
default:
- if (MyConnect(source_p) && *pm == 'Q' && !ConfigChannel.use_forward) {
+ if (MyConnect(source_p) && *pm == 'Q' && !ConfigChannel.use_forward)
+ {
badflag = YES;
break;
}
*
* inputs -
* output - NONE
- * side effects -
+ * side effects -
*/
void
send_umode_out(struct Client *client_p, struct Client *source_p, int old)
if((target_p != client_p) && (target_p != source_p) && (*buf))
{
sendto_one(target_p, ":%s MODE %s :%s",
- get_id(source_p, target_p),
+ get_id(source_p, target_p),
get_id(source_p, target_p), buf);
}
}
send_umode(client_p, source_p, old, 0, buf);
}
-/*
+/*
* user_welcome
*
* inputs - client pointer to client to welcome
sendto_one_notice(source_p, ":*** Notice -- motd was last changed at %s", user_motd_changed);
sendto_one_notice(source_p, ":*** Notice -- Please read the motd if you haven't read it");
- sendto_one(source_p, form_str(RPL_MOTDSTART),
+ sendto_one(source_p, form_str(RPL_MOTDSTART),
me.name, source_p->name, me.name);
sendto_one(source_p, form_str(RPL_MOTD),
call_hook(h_umode_changed, &hdata);
sendto_realops_snomask(SNO_GENERAL, L_ALL,
- "%s (%s@%s) is now an operator", source_p->name,
+ "%s (%s!%s@%s) is now an operator", oper_p->name, source_p->name,
source_p->username, source_p->host);
if(!(old & UMODE_INVISIBLE) && IsInvisible(source_p))
++Count.invisi;
va_list ap;
modeval[0] = '\0';
-
+
if(changed)
{
target_p->tsinfo = newts;
vsnprintf(reason, 255, format, ap);
va_end(ap);
- sendto_common_channels_local_butone(target_p, ":%s!%s@%s QUIT :%s",
+ sendto_common_channels_local_butone(target_p, NOCAPS, ":%s!%s@%s QUIT :%s",
target_p->name, target_p->username, target_p->host,
reason);
*mptr = '\0';
- sendto_channel_local_butone(target_p, ALL_MEMBERS, chptr, ":%s!%s@%s JOIN :%s",
- nick, user, host, chptr->chname);
+ sendto_channel_local_with_capability_butone(target_p, ALL_MEMBERS, NOCAPS, CLICAP_EXTENDED_JOIN, chptr,
+ ":%s!%s@%s JOIN %s", nick, user, host, chptr->chname);
+ sendto_channel_local_with_capability_butone(target_p, ALL_MEMBERS, CLICAP_EXTENDED_JOIN, NOCAPS, chptr,
+ ":%s!%s@%s JOIN %s %s :%s", nick, user, host, chptr->chname,
+ EmptyString(target_p->user->suser) ? "*" : target_p->user->suser,
+ target_p->info);
+
if(*mode)
sendto_channel_local_butone(target_p, ALL_MEMBERS, chptr,
":%s MODE %s +%s %s",
*modeval = '\0';
}
+ /* Resend away message to away-notify enabled clients. */
+ if (target_p->user->away)
+ sendto_common_channels_local_butone(target_p, CLICAP_AWAY_NOTIFY, ":%s!%s@%s AWAY :%s",
+ target_p->name, target_p->username, target_p->host,
+ target_p->user->away);
+
if(MyClient(target_p) && changed_case)
sendto_one(target_p, ":%s!%s@%s NICK %s",
target_p->name, target_p->username, target_p->host, nick);
+
+ /* TODO: send some snotes to SNO_NCHANGE/SNO_CCONN/SNO_CCONNEXT? */
}
else if(changed_case)
{
- sendto_common_channels_local(target_p, ":%s!%s@%s NICK :%s",
+ sendto_common_channels_local(target_p, NOCAPS, ":%s!%s@%s NICK :%s",
target_p->name, target_p->username,
target_p->host, nick);
+
+ if(MyConnect(target_p))
+ sendto_realops_snomask(SNO_NCHANGE, L_ALL,
+ "Nick change: From %s to %s [%s@%s]",
+ target_p->name, nick,
+ target_p->username, target_p->host);
}
rb_strlcpy(target_p->username, user, sizeof target_p->username);