X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-mode.c;h=765de394483b8880b0bdc149e6ef28e46d963991;hb=f206fda8ae14e9c76e3dca6aa67412d5ae9ee9f7;hp=c7d02c9101e224fe14d787ff2938e4cf165c0853;hpb=c9d166747d4ea161c55c765edc23e2cd3bd7dec4;p=ngircd-alex.git diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index c7d02c91..765de394 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -154,7 +154,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) /* Mode request: let's answer it :-) */ if (Req->argc == 1) return IRC_WriteStrClient(Origin, RPL_UMODEIS_MSG, - Client_ID(Origin), + Client_ID(Target), Client_Modes(Target)); mode_arg = 1; @@ -215,6 +215,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) /* Validate modes */ x[0] = '\0'; switch (*mode_ptr) { + case 'b': /* Block private msgs */ case 'C': /* Only messages from clients sharing a channel */ case 'i': /* Invisible */ case 's': /* Server messages */ @@ -365,11 +366,17 @@ 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)); } + + if (send_RPL_HOSTHIDDEN_MSG && Client_Conn(Target) > NONE) { + /* A new (cloaked) hostname must be annoucned */ + IRC_WriteStrClientPrefix(Target, Origin, + RPL_HOSTHIDDEN_MSG, + Client_ID(Target), + Client_HostnameDisplayed(Target)); + + } + LogDebug("%s \"%s\": Mode change, now \"%s\".", Client_TypeText(Target), Client_Mask(Target), Client_Modes(Target)); @@ -543,7 +550,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) if (arg_arg >= Req->argc) arg_arg = -1; - if(!is_machine) { + if(!is_machine && !is_oper) { o_mode_ptr = Channel_UserModes(Channel, Client); while( *o_mode_ptr ) { if ( *o_mode_ptr == 'q') @@ -621,9 +628,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Req->argv[arg_arg][0] = '\0'; arg_arg++; } else { +#ifdef STRICT_RFC + /* Only send error message in "strict" mode, + * this is how ircd2.11 and others behave ... */ connected = IRC_WriteStrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); +#endif goto chan_exit; } break; @@ -661,9 +672,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Req->argv[arg_arg][0] = '\0'; arg_arg++; } else { +#ifdef STRICT_RFC + /* Only send error message in "strict" mode, + * this is how ircd2.11 and others behave ... */ connected = IRC_WriteStrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); +#endif goto chan_exit; } break; @@ -754,9 +769,17 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Req->argv[arg_arg][0] = '\0'; arg_arg++; } else { +#ifdef STRICT_RFC + /* Report an error to the client, when a user + * mode should be changed but no nickname is + * given. But don't do it when not in "strict" + * mode, because most other servers don't do + * it as well and some clients send "wired" + * MODE commands like "MODE #chan -ooo nick". */ connected = IRC_WriteStrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); +#endif goto chan_exit; } break; @@ -957,7 +980,7 @@ static bool Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Pattern) { - const char *mask; + char mask[MASK_LEN]; struct list_head *list = NULL; long int current_count; @@ -966,7 +989,7 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, assert(Pattern != NULL); assert(what == 'I' || what == 'b' || what == 'e'); - mask = Lists_MakeMask(Pattern); + Lists_MakeMask(Pattern, mask, sizeof(mask)); current_count = Lists_Count(Channel_GetListInvites(Channel)) + Lists_Count(Channel_GetListExcepts(Channel)) + Lists_Count(Channel_GetListBans(Channel)); @@ -1024,7 +1047,7 @@ static bool Del_From_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Pattern) { - const char *mask; + char mask[MASK_LEN]; struct list_head *list = NULL; assert(Client != NULL); @@ -1032,7 +1055,7 @@ Del_From_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, assert(Pattern != NULL); assert(what == 'I' || what == 'b' || what == 'e'); - mask = Lists_MakeMask(Pattern); + Lists_MakeMask(Pattern, mask, sizeof(mask)); switch (what) { case 'I':