]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-mode.c
Allow user mode +x only when "CloakHostModeX" is set
[ngircd-alex.git] / src / ngircd / irc-mode.c
index 3679531d6963909502bf1895c2ea3dc6a0801052..90f638d811219282b34af51c8cf8369e7548e4f7 100644 (file)
@@ -138,6 +138,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
 {
        char the_modes[COMMAND_LEN], x[2], *mode_ptr;
        bool ok, set;
+       bool send_RPL_HOSTHIDDEN_MSG = false;
        int mode_arg;
        size_t len;
 
@@ -229,6 +230,14 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                                                        ERR_NOPRIVILEGES_MSG,
                                                        Client_ID(Origin));
                        break;
+               case 'B': /* Bot */
+                       if (Client_HasMode(Client, 'r'))
+                               ok = IRC_WriteStrClient(Origin,
+                                                       ERR_RESTRICTED_MSG,
+                                                       Client_ID(Origin));
+                       else
+                               x[0] = 'B';
+                       break;
                case 'c': /* Receive connect notices
                           * (only settable by IRC operators!) */
                        if (!set || Client_Type(Client) == CLIENT_SERVER
@@ -256,13 +265,28 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                                                        ERR_RESTRICTED_MSG,
                                                        Client_ID(Origin));
                        break;
+               case 'R': /* Registered (not [un]settable by clients) */
+                       if (Client_Type(Client) == CLIENT_SERVER)
+                               x[0] = 'R';
+                       else
+                               ok = IRC_WriteStrClient(Origin,
+                                                       ERR_NICKREGISTER_MSG,
+                                                       Client_ID(Origin));
+                       break;
                case 'x': /* Cloak hostname */
                        if (Client_HasMode(Client, 'r'))
                                ok = IRC_WriteStrClient(Origin,
                                                        ERR_RESTRICTED_MSG,
                                                        Client_ID(Origin));
-                       else
+                       else if (!set || Conf_CloakHostModeX[0]
+                                || Client_Type(Client) == CLIENT_SERVER
+                                || Client_OperByMe(Client)) {
                                x[0] = 'x';
+                               send_RPL_HOSTHIDDEN_MSG = true;
+                       } else
+                               ok = IRC_WriteStrClient(Origin,
+                                                       ERR_NOPRIVILEGES_MSG,
+                                                       Client_ID(Origin));
                        break;
                default:
                        if (Client_Type(Client) != CLIENT_SERVER) {
@@ -332,6 +356,10 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                                                  "MODE %s :%s",
                                                  Client_ID(Target),
                                                  the_modes);
+                       if (send_RPL_HOSTHIDDEN_MSG)
+                               IRC_WriteStrClient(Client, RPL_HOSTHIDDEN_MSG,
+                                                  Client_ID(Client),
+                                                  Client_HostnameCloaked(Client));
                }
                LogDebug("%s \"%s\": Mode change, now \"%s\".",
                         Client_TypeText(Target), Client_Mask(Target),
@@ -419,7 +447,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
        if(Client_OperByMe(Client) && Conf_OperCanMode) {
                is_oper = true;
        }
-       
+
        /* Check if client is a server/service */
        if(Client_Type(Client) == CLIENT_SERVER ||
           Client_Type(Client) == CLIENT_SERVICE) {
@@ -505,7 +533,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                /* Are there arguments left? */
                if (arg_arg >= Req->argc)
                        arg_arg = -1;
-        
+
                if(!is_machine) {
                        o_mode_ptr = Channel_UserModes(Channel, Client);
                        while( *o_mode_ptr ) {
@@ -538,6 +566,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                                goto chan_exit;
                        }
                case 'i': /* Invite only */
+               case 'M': /* Only identified nicks can write */
                case 'm': /* Moderated */
                case 'n': /* Only members can write */
                case 't': /* Topic locked */