mirror of
https://github.com/matrix-construct/construct
synced 2024-07-10 12:38:36 +02:00
ircd: Improve/rename channel name check related.
This commit is contained in:
parent
7d44e271f7
commit
125e3b21f2
|
@ -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]);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue