mirror of
https://github.com/matrix-construct/construct
synced 2025-03-13 21:10:32 +01:00
ircd: Improve/rename channel name check related.
This commit is contained in:
parent
7d44e271f7
commit
125e3b21f2
14 changed files with 44 additions and 46 deletions
|
@ -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 */
|
||||
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,
|
||||
form_str(ERR_BADCHANNAME), parv[1]);
|
||||
|
|
|
@ -105,6 +105,11 @@ bool can_send_banned(const membership &);
|
|||
bool can_send_banned(const membership *const &);
|
||||
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
|
||||
{
|
||||
std::string name;
|
||||
|
@ -140,8 +145,6 @@ struct chan
|
|||
~chan() noexcept;
|
||||
};
|
||||
|
||||
bool is_name(const char *const &name);
|
||||
|
||||
bool is_secret(const chan &);
|
||||
bool is_secret(const chan *const &);
|
||||
bool is_hidden(const chan &);
|
||||
|
@ -170,7 +173,6 @@ void remove_user_from_channel(membership *);
|
|||
void remove_user_from_channels(client *);
|
||||
void invalidate_bancache_user(client *);
|
||||
void free_channel_list(rb_dlink_list *);
|
||||
bool check_channel_name(const char *name);
|
||||
void channel_member_names(chan *, client *, int show_eon);
|
||||
void del_invite(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
|
||||
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
|
||||
|
|
|
@ -182,7 +182,7 @@ bandb_handle_ban(char *parv[], int parc)
|
|||
break;
|
||||
|
||||
case 'R':
|
||||
if(chan::is_name(aconf->host))
|
||||
if(chan::has_prefix(aconf->host))
|
||||
aconf->status = CONF_RESV_CHANNEL;
|
||||
else
|
||||
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()
|
||||
*
|
||||
* input - rb_dlink list to free
|
||||
|
|
|
@ -511,7 +511,7 @@ check_forward(struct Client *source_p, chan::chan *chptr,
|
|||
chan::chan *targptr = NULL;
|
||||
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))))
|
||||
{
|
||||
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";
|
||||
break;
|
||||
case 'R':
|
||||
ntype = chan::is_name(parv[3]) ? CONF_RESV_CHANNEL :
|
||||
ntype = chan::has_prefix(parv[3]) ? CONF_RESV_CHANNEL :
|
||||
CONF_RESV_NICK;
|
||||
stype = "RESV";
|
||||
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 */
|
||||
else if(!chan::is_name(name) ||
|
||||
else if(!chan::has_prefix(name) ||
|
||||
( ConfigChannel.disable_local_channels && name[0] == '&'))
|
||||
{
|
||||
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)
|
||||
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;
|
||||
|
||||
/* 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)
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
if(!chan::check_channel_name(dest))
|
||||
if(!chan::valid_name(dest))
|
||||
{
|
||||
sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), parv[1]);
|
||||
return;
|
||||
|
@ -157,7 +157,7 @@ ms_tmode(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
chan::membership *msptr;
|
||||
|
||||
/* 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]);
|
||||
return;
|
||||
|
@ -194,7 +194,7 @@ ms_mlock(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
chan::chan *chptr = NULL;
|
||||
|
||||
/* 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]);
|
||||
return;
|
||||
|
@ -271,7 +271,7 @@ ms_bmask(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
int mems;
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if(chan::check_channel_name(parv[2]) == 0)
|
||||
if(chan::valid_name(parv[2]) == 0)
|
||||
{
|
||||
sendto_one_numeric(source_p, 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;
|
||||
}
|
||||
|
||||
if (parc < 2 || chan::is_name(parv[1]))
|
||||
if (parc < 2 || chan::has_prefix(parv[1]))
|
||||
{
|
||||
/* pace this due to the sheer traffic involved */
|
||||
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. */
|
||||
if (args && chan::is_name(args))
|
||||
if (args && chan::has_prefix(args))
|
||||
{
|
||||
safelist_channel_named(source_p, args, operspy);
|
||||
return;
|
||||
|
|
|
@ -60,7 +60,7 @@ m_names(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
|
|||
if((s = strchr(p, ',')))
|
||||
*s = '\0';
|
||||
|
||||
if(!chan::check_channel_name(p))
|
||||
if(!chan::valid_name(p))
|
||||
{
|
||||
sendto_one_numeric(source_p, 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))
|
||||
return;
|
||||
|
||||
if(chan::is_name(name))
|
||||
if(chan::has_prefix(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;
|
||||
time_t now;
|
||||
|
||||
if(chan::is_name(name))
|
||||
if(chan::has_prefix(name))
|
||||
{
|
||||
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]);
|
||||
|
||||
if (chan::is_name(mask))
|
||||
if (chan::has_prefix(mask))
|
||||
{
|
||||
resv_p = hash_find_resv(mask);
|
||||
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' */
|
||||
if(chan::is_name(mask))
|
||||
if(chan::has_prefix(mask))
|
||||
{
|
||||
/* List all users on a given channel */
|
||||
chptr = find_channel(parv[1] + operspy);
|
||||
|
|
Loading…
Add table
Reference in a new issue