}
/* 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;
(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;
}
/* 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);
IsIPSpoof(source_p) ? "0" : 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, '@');
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('.' == *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;
}
/*
}
}
+static void
+show_other_user_mode(struct Client *source_p, struct Client *target_p)
+{
+ int i;
+ char buf[BUFSIZE];
+ char *m;
+
+ m = buf;
+ *m++ = '+';
+
+ for (i = 0; i < 128; i++) /* >= 127 is extended ascii */
+ if (target_p->umodes & user_modes[i])
+ *m++ = (char) i;
+ *m = '\0';
+
+ if (MyConnect(target_p) && target_p->snomask != 0)
+ sendto_one_notice(source_p, ":Modes for %s are %s %s",
+ target_p->name, buf,
+ construct_snobuf(target_p->snomask));
+ else
+ sendto_one_notice(source_p, ":Modes for %s are %s",
+ target_p->name, buf);
+}
+
/*
* 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
*/
if(source_p != target_p)
{
- sendto_one(source_p, form_str(ERR_USERSDONTMATCH), me.name, source_p->name);
+ if (MyOper(source_p) && parc < 3)
+ show_other_user_mode(source_p, target_p);
+ else
+ sendto_one(source_p, form_str(ERR_USERSDONTMATCH), me.name, source_p->name);
return 0;
}
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;
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);
}
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);
}