]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-channel.c
Display correct error message when "Server{UID|GID}" is invalid
[ngircd-alex.git] / src / ngircd / irc-channel.c
index 66b3eeb24ed9677d4950709ac5fc06afe6c42b50..6ddad88b1a9f3817d28a6c3962f03064348eaf3a 100644 (file)
@@ -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)