X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-channel.c;h=6ddad88b1a9f3817d28a6c3962f03064348eaf3a;hb=edab86e0f843dc07815477e25a0a6184d7500120;hp=66b3eeb24ed9677d4950709ac5fc06afe6c42b50;hpb=605b6a67bc7f41432d25ab646c232e347fd7a33f;p=ngircd-alex.git diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index 66b3eeb2..6ddad88b 100644 --- a/src/ngircd/irc-channel.c +++ b/src/ngircd/irc-channel.c @@ -137,6 +137,13 @@ join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame, return false; } + if (strchr(channel_modes, 'R') && !strchr(Client_Modes(Client), 'R')) { + /* Only registered users are allowed! */ + IRC_WriteStrClient(Client, ERR_REGONLYCHANNEL_MSG, + Client_ID(Client), channame); + return false; + } + return true; } /* join_allowed */ @@ -237,7 +244,7 @@ join_forward(CLIENT *Client, CLIENT *target, CHANNEL *chan, IRC_WriteStrChannelPrefix(Client, chan, target, false, "JOIN :%s", channame); - /* syncronize channel modes */ + /* synchronize channel modes */ if (modes[1]) { IRC_WriteStrChannelPrefix(Client, chan, target, false, "MODE %s +%s %s", channame, @@ -294,9 +301,9 @@ join_send_topic(CLIENT *Client, CLIENT *target, CHANNEL *chan, * * See RFC 2812, 3.2.1 "Join message"; RFC 2813, 4.2.1 "Join message". * - * @param Client The client from which this command has been received - * @param Req Request structure with prefix and all parameters - * @returns CONNECTED or DISCONNECTED + * @param Client The client from which this command has been received + * @param Req Request structure with prefix and all parameters + * @returns CONNECTED or DISCONNECTED */ GLOBAL bool IRC_JOIN( CLIENT *Client, REQUEST *Req ) @@ -305,8 +312,8 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) CLIENT *target; CHANNEL *chan; - assert( Client != NULL ); - assert( Req != NULL ); + assert (Client != NULL); + assert (Req != NULL); /* Bad number of arguments? */ if (Req->argc < 1 || Req->argc > 2) @@ -320,7 +327,8 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) target = Client; if (!target) - return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix); + return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, + Client_ID(Client), Req->prefix); /* Is argument "0"? */ if (Req->argc == 1 && !strncmp("0", Req->argv[0], 2)) @@ -352,8 +360,9 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) chan = Channel_Search(channame); if (!chan && Conf_PredefChannelsOnly) { - /* channel must be created, but server does not allow this */ - IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG, Client_ID(Client), channame); + /* channel must be created, but forbidden by config */ + IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG, + Client_ID(Client), channame); break; } @@ -392,7 +401,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) /* Join channel (and create channel if it doesn't exist) */ if (!Channel_Join(target, channame)) - break; + goto join_next; if (!chan) { /* channel is new; it has been created above */ chan = Channel_Search(channame); @@ -411,6 +420,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req ) if (!join_send_topic(Client, target, chan, channame)) break; /* write error */ + join_next: /* next channel? */ channame = strtok_r(NULL, ",", &lastchan); if (channame && key)