Reduce clean_nick() code duplication further.
Side effect: hurt and monitor now allow nicks starting with a digit.
This commit is contained in:
parent
e1fda0d81e
commit
2d28539c68
7 changed files with 42 additions and 91 deletions
|
@ -311,7 +311,7 @@ mo_heal(struct Client *client_p, struct Client *source_p,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_valid_nick(parv[1]))
|
if (clean_nick(parv[1], 0))
|
||||||
{
|
{
|
||||||
target_p = find_named_person(parv[1]);
|
target_p = find_named_person(parv[1]);
|
||||||
if (target_p == NULL)
|
if (target_p == NULL)
|
||||||
|
@ -363,7 +363,7 @@ me_heal(struct Client *client_p, struct Client *source_p,
|
||||||
if (parc < 2)
|
if (parc < 2)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (is_valid_nick(parv[1]))
|
if (clean_nick(parv[1], 0))
|
||||||
{
|
{
|
||||||
target_p = find_person(parv[1]);
|
target_p = find_person(parv[1]);
|
||||||
if (target_p != NULL && MyConnect(target_p))
|
if (target_p != NULL && MyConnect(target_p))
|
||||||
|
|
|
@ -592,6 +592,8 @@ extern void error_exit_client(struct Client *, int);
|
||||||
extern void count_local_client_memory(size_t * count, size_t * memory);
|
extern void count_local_client_memory(size_t * count, size_t * memory);
|
||||||
extern void count_remote_client_memory(size_t * count, size_t * memory);
|
extern void count_remote_client_memory(size_t * count, size_t * memory);
|
||||||
|
|
||||||
|
extern int clean_nick(const char *, int loc_client);
|
||||||
|
|
||||||
extern struct Client *find_chasing(struct Client *, const char *, int *);
|
extern struct Client *find_chasing(struct Client *, const char *, int *);
|
||||||
extern struct Client *find_person(const char *);
|
extern struct Client *find_person(const char *);
|
||||||
extern struct Client *find_named_person(const char *);
|
extern struct Client *find_named_person(const char *);
|
||||||
|
@ -616,25 +618,4 @@ extern char *generate_uid(void);
|
||||||
void allocate_away(struct Client *);
|
void allocate_away(struct Client *);
|
||||||
void free_away(struct Client *);
|
void free_away(struct Client *);
|
||||||
|
|
||||||
static inline int
|
|
||||||
is_valid_nick(const char *nick)
|
|
||||||
{
|
|
||||||
int len = 0;
|
|
||||||
|
|
||||||
if(EmptyString(nick) || *nick == '-' || IsDigit(*nick))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for(; *nick; nick++)
|
|
||||||
{
|
|
||||||
len++;
|
|
||||||
if(!IsNickChar(*nick))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(len >= NICKLEN)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* INCLUDED_client_h */
|
#endif /* INCLUDED_client_h */
|
||||||
|
|
|
@ -92,7 +92,6 @@ DECLARE_MODULE_AV1(nick, NULL, NULL, nick_clist, NULL, NULL, "$Revision: 3518 $"
|
||||||
static int change_remote_nick(struct Client *, struct Client *, time_t,
|
static int change_remote_nick(struct Client *, struct Client *, time_t,
|
||||||
const char *, int);
|
const char *, int);
|
||||||
|
|
||||||
static int clean_nick(const char *, int loc_client);
|
|
||||||
static int clean_username(const char *);
|
static int clean_username(const char *);
|
||||||
static int clean_host(const char *);
|
static int clean_host(const char *);
|
||||||
static int clean_uid(const char *uid, const char *sid);
|
static int clean_uid(const char *uid, const char *sid);
|
||||||
|
@ -525,38 +524,6 @@ ms_save(struct Client *client_p, struct Client *source_p, int parc, const char *
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clean_nick()
|
|
||||||
*
|
|
||||||
* input - nickname to check
|
|
||||||
* output - 0 if erroneous, else 1
|
|
||||||
* side effects -
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
clean_nick(const char *nick, int loc_client)
|
|
||||||
{
|
|
||||||
int len = 0;
|
|
||||||
|
|
||||||
/* nicks cant start with a digit or -, and must have a length */
|
|
||||||
if(*nick == '-' || *nick == '\0')
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if(loc_client && IsDigit(*nick))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for(; *nick; nick++)
|
|
||||||
{
|
|
||||||
len++;
|
|
||||||
if(!IsNickChar(*nick))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* nicklen is +1 */
|
|
||||||
if(len >= NICKLEN && (unsigned int)len >= ConfigFileEntry.nicklen)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clean_username()
|
/* clean_username()
|
||||||
*
|
*
|
||||||
* input - username to check
|
* input - username to check
|
||||||
|
|
|
@ -114,7 +114,7 @@ add_monitor(struct Client *client_p, const char *nicks)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_valid_nick(name))
|
if (!clean_nick(name, 0))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
monptr = find_monitor(name, 1);
|
monptr = find_monitor(name, 1);
|
||||||
|
|
|
@ -176,7 +176,7 @@ me_rsfnc(struct Client *client_p, struct Client *source_p,
|
||||||
if(!MyClient(target_p))
|
if(!MyClient(target_p))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(!is_valid_nick(parv[2]))
|
if(!clean_nick(parv[2], 0) || IsDigit(parv[2][0]))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
curts = atol(parv[4]);
|
curts = atol(parv[4]);
|
||||||
|
|
|
@ -75,35 +75,6 @@ DECLARE_MODULE_AV1(signon, NULL, NULL, signon_clist, NULL, NULL, "$Revision: 119
|
||||||
#define USER_VALID 2
|
#define USER_VALID 2
|
||||||
#define HOST_VALID 4
|
#define HOST_VALID 4
|
||||||
|
|
||||||
static int
|
|
||||||
clean_nick(const char *nick)
|
|
||||||
{
|
|
||||||
int len = 0;
|
|
||||||
|
|
||||||
if(*nick == '-')
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* This is used to check logins, which are often
|
|
||||||
* numeric. Don't check for leading digits, if
|
|
||||||
* services wants to set someone's nick to something
|
|
||||||
* starting with a number, let it try.
|
|
||||||
* --gxti
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (; *nick; nick++)
|
|
||||||
{
|
|
||||||
len++;
|
|
||||||
if(!IsNickChar(*nick))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* nicklen is +1 */
|
|
||||||
if(len >= NICKLEN)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
clean_username(const char *username)
|
clean_username(const char *username)
|
||||||
{
|
{
|
||||||
|
@ -164,7 +135,7 @@ me_svslogin(struct Client *client_p, struct Client *source_p,
|
||||||
if(!MyClient(target_p) && !IsUnknown(target_p))
|
if(!MyClient(target_p) && !IsUnknown(target_p))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(clean_nick(parv[2]))
|
if(clean_nick(parv[2], 0))
|
||||||
{
|
{
|
||||||
rb_strlcpy(nick, parv[2], NICKLEN + 1);
|
rb_strlcpy(nick, parv[2], NICKLEN + 1);
|
||||||
valid |= NICK_VALID;
|
valid |= NICK_VALID;
|
||||||
|
@ -203,7 +174,7 @@ me_svslogin(struct Client *client_p, struct Client *source_p,
|
||||||
rb_strlcpy(login, parv[5], NICKLEN + 1);
|
rb_strlcpy(login, parv[5], NICKLEN + 1);
|
||||||
|
|
||||||
/* Login (mostly) follows nick rules. */
|
/* Login (mostly) follows nick rules. */
|
||||||
if(*login && !clean_nick(login))
|
if(*login && !clean_nick(login, 0))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if((exist_p = find_person(nick)) && target_p != exist_p)
|
if((exist_p = find_person(nick)) && target_p != exist_p)
|
||||||
|
@ -280,7 +251,7 @@ ms_signon(struct Client *client_p, struct Client *source_p,
|
||||||
int newts, sameuser;
|
int newts, sameuser;
|
||||||
char login[NICKLEN+1];
|
char login[NICKLEN+1];
|
||||||
|
|
||||||
if(!clean_nick(parv[1]))
|
if(!clean_nick(parv[1], 0))
|
||||||
{
|
{
|
||||||
ServerStats.is_kill++;
|
ServerStats.is_kill++;
|
||||||
sendto_realops_snomask(SNO_DEBUG, L_ALL,
|
sendto_realops_snomask(SNO_DEBUG, L_ALL,
|
||||||
|
@ -322,7 +293,7 @@ ms_signon(struct Client *client_p, struct Client *source_p,
|
||||||
login[0] = '\0';
|
login[0] = '\0';
|
||||||
else if(*parv[5] != '*')
|
else if(*parv[5] != '*')
|
||||||
{
|
{
|
||||||
if (clean_nick(parv[5]))
|
if (clean_nick(parv[5], 0))
|
||||||
rb_strlcpy(login, parv[5], NICKLEN + 1);
|
rb_strlcpy(login, parv[5], NICKLEN + 1);
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
32
src/client.c
32
src/client.c
|
@ -787,6 +787,38 @@ remove_client_from_list(struct Client *client_p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* clean_nick()
|
||||||
|
*
|
||||||
|
* input - nickname to check, flag for nick from local client
|
||||||
|
* output - 0 if erroneous, else 1
|
||||||
|
* side effects -
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
clean_nick(const char *nick, int loc_client)
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
/* nicks cant start with a digit or -, and must have a length */
|
||||||
|
if(*nick == '-' || *nick == '\0')
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if(loc_client && IsDigit(*nick))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for(; *nick; nick++)
|
||||||
|
{
|
||||||
|
len++;
|
||||||
|
if(!IsNickChar(*nick))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* nicklen is +1 */
|
||||||
|
if(len >= NICKLEN && (unsigned int)len >= ConfigFileEntry.nicklen)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* find_person - find person by (nick)name.
|
* find_person - find person by (nick)name.
|
||||||
* inputs - pointer to name
|
* inputs - pointer to name
|
||||||
|
|
Loading…
Reference in a new issue