commit - f58c8b94d9f4052c280a776797cd02e199e34f7e
commit + ecad9f32c82f50312010ab41f7702d1329bc511e
blob - af0f06681568289512438c91d868507fda2840d5
blob + 010be3520d42b42f366e3bdabde946334cc48957
--- src/ngircd/irc-channel.c
+++ src/ngircd/irc-channel.c
}
+/**
+ * Check weather a local client is allowed to join an already existing
+ * channel or not.
+ * @param Client Client that sent the JOIN command
+ * @param chan Channel to check
+ * @param channame Name of the channel
+ * @param key Provided channel key (or NULL if none has been provided)
+ * @return true if client is allowed to join channel, false otherwise
+ */
static bool
-join_allowed(CLIENT *Client, CLIENT *target, CHANNEL *chan,
- const char *channame, const char *key)
+join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame,
+ const char *key)
{
bool is_invited, is_banned;
const char *channel_modes;
if (strchr(Client_Modes(Client), 'o'))
return true;
- is_banned = Lists_Check(Channel_GetListBans(chan), target);
- is_invited = Lists_Check(Channel_GetListInvites(chan), target);
+ is_banned = Lists_Check(Channel_GetListBans(chan), Client);
+ is_invited = Lists_Check(Channel_GetListInvites(chan), Client);
if (is_banned && !is_invited) {
- IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG, Client_ID(Client), channame);
+ /* Client is banned from channel (and not on invite list) */
+ IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG,
+ Client_ID(Client), channame);
return false;
}
channel_modes = Channel_Modes(chan);
if ((strchr(channel_modes, 'i')) && !is_invited) {
- /* Channel is "invite-only" (and Client wasn't invited) */
- IRC_WriteStrClient(Client, ERR_INVITEONLYCHAN_MSG, Client_ID(Client), channame);
+ /* Channel is "invite-only" and client is not on invite list */
+ IRC_WriteStrClient(Client, ERR_INVITEONLYCHAN_MSG,
+ Client_ID(Client), channame);
return false;
}
- /* Is the channel protected by a key? */
- if (!Channel_CheckKey(chan, target, key ? key : "")) {
+ if (!Channel_CheckKey(chan, Client, key ? key : "")) {
+ /* Channel is protected by a channel key and the client
+ * didn't specify the correct one */
IRC_WriteStrClient(Client, ERR_BADCHANNELKEY_MSG,
Client_ID(Client), channame);
return false;
}
- /* Are there already too many members? */
- if ((strchr(channel_modes, 'l')) && (Channel_MaxUsers(chan) <= Channel_MemberCount(chan))) {
- IRC_WriteStrClient(Client, ERR_CHANNELISFULL_MSG, Client_ID(Client), channame);
+
+ if ((strchr(channel_modes, 'l')) &&
+ (Channel_MaxUsers(chan) <= Channel_MemberCount(chan))) {
+ /* There are more clints joined to this channel than allowed */
+ IRC_WriteStrClient(Client, ERR_CHANNELISFULL_MSG,
+ Client_ID(Client), channame);
return false;
}
+
return true;
}
/* Local client? */
if (Client_Type(Client) == CLIENT_USER) {
- /* Test if the user has reached his maximum channel count */
- if ((Conf_MaxJoins > 0) && (Channel_CountForUser(Client) >= Conf_MaxJoins))
- return IRC_WriteStrClient(Client, ERR_TOOMANYCHANNELS_MSG,
- Client_ID(Client), channame);
- if (!chan) {
- /*
- * New Channel: first user will be channel operator
- * unless this is a modeless channel.
- */
+ /* Test if the user has reached the channel limit */
+ if ((Conf_MaxJoins > 0) &&
+ (Channel_CountForUser(Client) >= Conf_MaxJoins))
+ return IRC_WriteStrClient(Client,
+ ERR_TOOMANYCHANNELS_MSG,
+ Client_ID(Client), channame);
+ if (chan) {
+ /* Already existing channel: check if the
+ * client is allowed to join */
+ if (!join_allowed(Client, chan, channame, key))
+ break;
+ } else {
+ /* New channel: first user will become channel
+ * operator unless this is a modeless channel */
if (*channame != '+')
flags = "o";
- } else
- if (!join_allowed(Client, target, chan, channame, key))
- break;
+ }
/* Local client: update idle time */
Conn_UpdateIdle(Client_Conn(Client));
* that the "one shot" entries (generated by INVITE
* commands) in this list become deleted when a user
* joins a channel this way. */
- if (chan) (void)Lists_Check(Channel_GetListInvites(chan), target);
+ if (chan)
+ (void)Lists_Check(Channel_GetListInvites(chan),
+ target);
}
/* Join channel (and create channel if it doesn't exist) */