X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/67b90240c4f15588f944de99391b2f98bc9cb0f7..afd4834b500ef6f53c3f70f44c73637e26dc94c1:/src/channel.c?ds=sidebyside diff --git a/src/channel.c b/src/channel.c index 1f0c9c1..1e35f3d 100644 --- a/src/channel.c +++ b/src/channel.c @@ -41,6 +41,7 @@ #include "s_conf.h" /* ConfigFileEntry, ConfigChannel */ #include "s_newconf.h" #include "logger.h" +#include "packet.h" struct config_channel_entry ConfigChannel; rb_dlink_list global_channel_list; @@ -903,6 +904,32 @@ find_bannickchange_channel(struct Client *client_p) return NULL; } +/* find_nonickchange_channel() + * Input: client to check + * Output: channel preventing nick change + */ +struct Channel * +find_nonickchange_channel(struct Client *client_p) +{ + struct Channel *chptr; + struct membership *msptr; + rb_dlink_node *ptr; + + if (!MyClient(client_p)) + return NULL; + + RB_DLINK_FOREACH(ptr, client_p->user->channel.head) + { + msptr = ptr->data; + chptr = msptr->chptr; + if (is_chanop_voiced(msptr)) + continue; + if (chptr->mode.mode & MODE_NONICK) + return chptr; + } + return NULL; +} + /* void check_spambot_warning(struct Client *source_p) * Input: Client to check, channel name or NULL if this is a part. * Output: none @@ -1401,7 +1428,80 @@ check_forward(struct Client *source_p, struct Channel *chptr, return NULL; } -void user_join(struct Client * source_p, char * channels, char * keys) +/* + * do_join_0 + * + * inputs - pointer to client doing join 0 + * output - NONE + * side effects - Use has decided to join 0. This is legacy + * from the days when channels were numbers not names. *sigh* + */ +void +do_join_0(struct Client *client_p, struct Client *source_p) +{ + struct membership *msptr; + struct Channel *chptr = NULL; + rb_dlink_node *ptr; + + /* Finish the flood grace period... */ + if(MyClient(source_p) && !IsFloodDone(source_p)) + flood_endgrace(source_p); + + sendto_server(client_p, NULL, CAP_TS6, NOCAPS, ":%s JOIN 0", use_id(source_p)); + + while((ptr = source_p->user->channel.head)) + { + if(source_p->user->channel.head && MyConnect(source_p) && + !IsOper(source_p) && !IsExemptSpambot(source_p)) + check_spambot_warning(source_p, NULL); + + msptr = ptr->data; + chptr = msptr->chptr; + sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%s@%s PART %s", + source_p->name, + source_p->username, source_p->host, chptr->chname); + remove_user_from_channel(msptr); + } +} + +int +check_channel_name_loc(struct Client *source_p, const char *name) +{ + const char *p; + + s_assert(name != NULL); + if(EmptyString(name)) + return 0; + + if(ConfigFileEntry.disable_fake_channels && !IsOper(source_p)) + { + for(p = name; *p; ++p) + { + if(!IsChanChar(*p) || IsFakeChanChar(*p)) + return 0; + } + } + else + { + for(p = name; *p; ++p) + { + if(!IsChanChar(*p)) + return 0; + } + } + + if(ConfigChannel.only_ascii_channels) + { + for(p = name; *p; ++p) + if(*p < 33 || *p > 126) + return 0; + } + + + return 1; +} + +void user_join(struct Client * client_p, struct Client * source_p, const char * channels, const char * keys) { static char jbuf[BUFSIZE]; struct Channel *chptr = NULL; @@ -1413,7 +1513,6 @@ void user_join(struct Client * source_p, char * channels, char * keys) char *p = NULL, *p2 = NULL; char *chanlist; char *mykey; - int successful_join_count = 0; /* Number of channels successfully joined */ jbuf[0] = '\0'; @@ -1547,14 +1646,9 @@ void user_join(struct Client * source_p, char * channels, char * keys) { sendto_one(source_p, form_str(ERR_TOOMANYCHANNELS), me.name, source_p->name, name); - if(successful_join_count) - source_p->localClient->last_join_time = rb_current_time(); return; } - if(flags == 0) /* if channel doesn't exist, don't penalize */ - successful_join_count++; - if(chptr == NULL) /* If I already have a chptr, no point doing this */ { chptr = get_or_create_channel(source_p, name, NULL); @@ -1563,15 +1657,10 @@ void user_join(struct Client * source_p, char * channels, char * keys) { sendto_one(source_p, form_str(ERR_UNAVAILRESOURCE), me.name, source_p->name, name); - if(successful_join_count > 0) - successful_join_count--; continue; } } - if(!IsOper(source_p) && !IsExemptSpambot(source_p)) - check_spambot_warning(source_p, name); - /* can_join checks for +i key, bans etc */ if((i = can_join(source_p, chptr, key))) { @@ -1585,13 +1674,15 @@ void user_join(struct Client * source_p, char * channels, char * keys) if(i != ERR_CUSTOM) sendto_one(source_p, form_str(i), me.name, source_p->name, name); - if(successful_join_count > 0) - successful_join_count--; continue; } sendto_one_numeric(source_p, ERR_LINKCHANNEL, form_str(ERR_LINKCHANNEL), name, chptr->chname); } + + if(flags == 0 && + !IsOper(source_p) && !IsExemptSpambot(source_p)) + check_spambot_warning(source_p, name); /* add the user to the channel */ add_user_to_channel(chptr, source_p, flags); @@ -1648,9 +1739,6 @@ void user_join(struct Client * source_p, char * channels, char * keys) channel_member_names(chptr, source_p, 1); - if(successful_join_count) - source_p->localClient->last_join_time = rb_current_time(); - hook_info.client = source_p; hook_info.chptr = chptr; hook_info.key = key;