0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-07-06 02:28:38 +02:00

ircd: Improve/rename channel name check related.

This commit is contained in:
Jason Volk 2016-08-18 16:53:12 -07:00
parent 7d44e271f7
commit 125e3b21f2
14 changed files with 44 additions and 46 deletions

View file

@ -59,7 +59,7 @@ mo_omode(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
} }
/* Now, try to find the channel in question */ /* Now, try to find the channel in question */
if(!rfc1459::is_chan_prefix(parv[1][0]) || !chan::check_channel_name(parv[1])) if(!rfc1459::is_chan_prefix(parv[1][0]) || !chan::valid_name(parv[1]))
{ {
sendto_one_numeric(source_p, ERR_BADCHANNAME, sendto_one_numeric(source_p, ERR_BADCHANNAME,
form_str(ERR_BADCHANNAME), parv[1]); form_str(ERR_BADCHANNAME), parv[1]);

View file

@ -105,6 +105,11 @@ bool can_send_banned(const membership &);
bool can_send_banned(const membership *const &); bool can_send_banned(const membership *const &);
const char *find_status(const membership *const &msptr, const int &combine); const char *find_status(const membership *const &msptr, const int &combine);
bool has_prefix(const char *const &name);
bool has_prefix(const std::string &name);
bool valid_name(const char *const &name);
bool valid_name(const std::string &name);
struct chan struct chan
{ {
std::string name; std::string name;
@ -140,8 +145,6 @@ struct chan
~chan() noexcept; ~chan() noexcept;
}; };
bool is_name(const char *const &name);
bool is_secret(const chan &); bool is_secret(const chan &);
bool is_secret(const chan *const &); bool is_secret(const chan *const &);
bool is_hidden(const chan &); bool is_hidden(const chan &);
@ -170,7 +173,6 @@ void remove_user_from_channel(membership *);
void remove_user_from_channels(client *); void remove_user_from_channels(client *);
void invalidate_bancache_user(client *); void invalidate_bancache_user(client *);
void free_channel_list(rb_dlink_list *); void free_channel_list(rb_dlink_list *);
bool check_channel_name(const char *name);
void channel_member_names(chan *, client *, int show_eon); void channel_member_names(chan *, client *, int show_eon);
void del_invite(chan *, client *who); void del_invite(chan *, client *who);
const char *channel_modes(chan *, client *who); const char *channel_modes(chan *, client *who);
@ -263,9 +265,27 @@ can_show(const chan *const &c, const client *const &client)
} }
inline bool inline bool
is_name(const char *const &name) has_prefix(const char *const &name)
{ {
return name && (*name == '#' || *name == '&'); return name && rfc1459::is_chan_prefix(name[0]);
}
inline bool
has_prefix(const std::string &name)
{
return !name.empty() && rfc1459::is_chan_prefix(name[0]);
}
inline bool
valid_name(const char *const &name)
{
return name && name[0] && std::all_of(name, name + strlen(name), rfc1459::is_chan);
}
inline bool
valid_name(const std::string &name)
{
return !name.empty() && std::all_of(begin(name), end(name), rfc1459::is_chan);
} }
inline bool inline bool

View file

@ -182,7 +182,7 @@ bandb_handle_ban(char *parv[], int parc)
break; break;
case 'R': case 'R':
if(chan::is_name(aconf->host)) if(chan::has_prefix(aconf->host))
aconf->status = CONF_RESV_CHANNEL; aconf->status = CONF_RESV_CHANNEL;
else else
aconf->status = CONF_RESV_NICK; aconf->status = CONF_RESV_NICK;

View file

@ -345,28 +345,6 @@ chan::invalidate_bancache_user(client *client_p)
} }
} }
/* check_channel_name()
*
* input - channel name
* output - true if valid channel name, else false
* side effects -
*/
bool
chan::check_channel_name(const char *name)
{
s_assert(name != NULL);
if(name == NULL)
return false;
for (; *name; ++name)
{
if(!rfc1459::is_chan(*name))
return false;
}
return true;
}
/* free_channel_list() /* free_channel_list()
* *
* input - rb_dlink list to free * input - rb_dlink list to free

View file

@ -511,7 +511,7 @@ check_forward(struct Client *source_p, chan::chan *chptr,
chan::chan *targptr = NULL; chan::chan *targptr = NULL;
chan::membership *msptr; chan::membership *msptr;
if(!chan::check_channel_name(forward) || if(!chan::valid_name(forward) ||
(MyClient(source_p) && (strlen(forward) > LOC_CHANNELLEN || hash_find_resv(forward)))) (MyClient(source_p) && (strlen(forward) > LOC_CHANNELLEN || hash_find_resv(forward))))
{ {
sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), forward); sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), forward);

View file

@ -94,7 +94,7 @@ ms_ban(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
stype = "X-Line"; stype = "X-Line";
break; break;
case 'R': case 'R':
ntype = chan::is_name(parv[3]) ? CONF_RESV_CHANNEL : ntype = chan::has_prefix(parv[3]) ? CONF_RESV_CHANNEL :
CONF_RESV_NICK; CONF_RESV_NICK;
stype = "RESV"; stype = "RESV";
break; break;

View file

@ -165,7 +165,7 @@ m_join(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
} }
/* check it begins with # or &, and local chans are disabled */ /* check it begins with # or &, and local chans are disabled */
else if(!chan::is_name(name) || else if(!chan::has_prefix(name) ||
( ConfigChannel.disable_local_channels && name[0] == '&')) ( ConfigChannel.disable_local_channels && name[0] == '&'))
{ {
sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL, sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
@ -404,7 +404,7 @@ ms_join(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
if(parc < 4) if(parc < 4)
return; return;
if(!chan::is_name(parv[2]) || !chan::check_channel_name(parv[2])) if(!chan::has_prefix(parv[2]) || !chan::valid_name(parv[2]))
return; return;
/* joins for local channels cant happen. */ /* joins for local channels cant happen. */
@ -529,7 +529,7 @@ ms_sjoin(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
if(parc < 5) if(parc < 5)
return; return;
if(!chan::is_name(parv[2]) || !chan::check_channel_name(parv[2])) if(!chan::has_prefix(parv[2]) || !chan::valid_name(parv[2]))
return; return;
/* SJOIN's for local channels can't happen. */ /* SJOIN's for local channels can't happen. */

View file

@ -90,7 +90,7 @@ m_mode(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
return; return;
} }
if(!chan::check_channel_name(dest)) if(!chan::valid_name(dest))
{ {
sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), parv[1]); sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), parv[1]);
return; return;
@ -157,7 +157,7 @@ ms_tmode(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
chan::membership *msptr; chan::membership *msptr;
/* Now, try to find the channel in question */ /* Now, try to find the channel in question */
if(!rfc1459::is_chan_prefix(parv[2][0]) || !chan::check_channel_name(parv[2])) if(!rfc1459::is_chan_prefix(parv[2][0]) || !chan::valid_name(parv[2]))
{ {
sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), parv[2]); sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), parv[2]);
return; return;
@ -194,7 +194,7 @@ ms_mlock(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
chan::chan *chptr = NULL; chan::chan *chptr = NULL;
/* Now, try to find the channel in question */ /* Now, try to find the channel in question */
if(!rfc1459::is_chan_prefix(parv[2][0]) || !chan::check_channel_name(parv[2])) if(!rfc1459::is_chan_prefix(parv[2][0]) || !chan::valid_name(parv[2]))
{ {
sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), parv[2]); sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), parv[2]);
return; return;
@ -271,7 +271,7 @@ ms_bmask(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
int mems; int mems;
struct Client *fakesource_p; struct Client *fakesource_p;
if(!rfc1459::is_chan_prefix(parv[2][0]) || !chan::check_channel_name(parv[2])) if(!rfc1459::is_chan_prefix(parv[2][0]) || !chan::valid_name(parv[2]))
return; return;
if((chptr = find_channel(parv[2])) == NULL) if((chptr = find_channel(parv[2])) == NULL)

View file

@ -77,7 +77,7 @@ m_invite(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
return; return;
} }
if(chan::check_channel_name(parv[2]) == 0) if(chan::valid_name(parv[2]) == 0)
{ {
sendto_one_numeric(source_p, ERR_BADCHANNAME, sendto_one_numeric(source_p, ERR_BADCHANNAME,
form_str(ERR_BADCHANNAME), form_str(ERR_BADCHANNAME),

View file

@ -124,7 +124,7 @@ m_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
return; return;
} }
if (parc < 2 || chan::is_name(parv[1])) if (parc < 2 || chan::has_prefix(parv[1]))
{ {
/* pace this due to the sheer traffic involved */ /* pace this due to the sheer traffic involved */
if (((last_used + ConfigFileEntry.pace_wait) > rb_current_time())) if (((last_used + ConfigFileEntry.pace_wait) > rb_current_time()))
@ -172,7 +172,7 @@ mo_list(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
} }
/* Single channel. */ /* Single channel. */
if (args && chan::is_name(args)) if (args && chan::has_prefix(args))
{ {
safelist_channel_named(source_p, args, operspy); safelist_channel_named(source_p, args, operspy);
return; return;

View file

@ -60,7 +60,7 @@ m_names(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
if((s = strchr(p, ','))) if((s = strchr(p, ',')))
*s = '\0'; *s = '\0';
if(!chan::check_channel_name(p)) if(!chan::valid_name(p))
{ {
sendto_one_numeric(source_p, ERR_BADCHANNAME, sendto_one_numeric(source_p, ERR_BADCHANNAME,
form_str(ERR_BADCHANNAME), form_str(ERR_BADCHANNAME),

View file

@ -184,7 +184,7 @@ parse_resv(struct Client *source_p, const char *name, const char *reason, int te
(temp_time > 0) ? SHARED_TRESV : SHARED_PRESV)) (temp_time > 0) ? SHARED_TRESV : SHARED_PRESV))
return; return;
if(chan::is_name(name)) if(chan::has_prefix(name))
{ {
if(hash_find_resv(name)) if(hash_find_resv(name))
{ {
@ -490,7 +490,7 @@ remove_resv(struct Client *source_p, const char *name, int propagated)
rb_dlink_node *ptr; rb_dlink_node *ptr;
time_t now; time_t now;
if(chan::is_name(name)) if(chan::has_prefix(name))
{ {
if((aconf = hash_find_resv(name)) == NULL) if((aconf = hash_find_resv(name)) == NULL)
{ {

View file

@ -68,7 +68,7 @@ mo_testline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou
mask = LOCAL_COPY(parv[1]); mask = LOCAL_COPY(parv[1]);
if (chan::is_name(mask)) if (chan::has_prefix(mask))
{ {
resv_p = hash_find_resv(mask); resv_p = hash_find_resv(mask);
if (resv_p != NULL) if (resv_p != NULL)

View file

@ -169,7 +169,7 @@ m_who(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p,
} }
/* '/who #some_channel' */ /* '/who #some_channel' */
if(chan::is_name(mask)) if(chan::has_prefix(mask))
{ {
/* List all users on a given channel */ /* List all users on a given channel */
chptr = find_channel(parv[1] + operspy); chptr = find_channel(parv[1] + operspy);