X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/45f5f151f80c1f8ef7f16e9729921d502944fbac..715b28fefd0e9b923fd816ef130ab88f92aba47d:/modules/core/m_join.c diff --git a/modules/core/m_join.c b/modules/core/m_join.c index 23f0fef..911439b 100644 --- a/modules/core/m_join.c +++ b/modules/core/m_join.c @@ -55,7 +55,7 @@ struct Message join_msgtab = { struct Message sjoin_msgtab = { "SJOIN", 0, 0, 0, MFLG_SLOW, - {mg_unreg, mg_ignore, mg_ignore, {ms_sjoin, 0}, mg_ignore, mg_ignore} + {mg_unreg, mg_ignore, mg_ignore, {ms_sjoin, 4}, mg_ignore, mg_ignore} }; mapi_clist_av1 join_clist[] = { &join_msgtab, &sjoin_msgtab, NULL }; @@ -75,7 +75,7 @@ static void set_final_mode(struct Mode *mode, struct Mode *oldmode); static void remove_our_modes(struct Channel *chptr, struct Client *source_p); static void remove_ban_list(struct Channel *chptr, struct Client *source_p, - rb_dlink_list * list, char c, int cap, int mems); + rb_dlink_list * list, char c, int mems); static char modebuf[MODEBUFLEN]; static char parabuf[MODEBUFLEN]; @@ -528,7 +528,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char int keep_new_modes = 1; int fl; int isnew; - int mlen_nick, mlen_uid; + int mlen_uid; int len_nick; int len_uid; int len; @@ -564,48 +564,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char { switch (*(s++)) { - case 'i': - mode.mode |= MODE_INVITEONLY; - break; - case 'n': - mode.mode |= MODE_NOPRIVMSGS; - break; - case 'p': - mode.mode |= MODE_PRIVATE; - break; - case 's': - mode.mode |= MODE_SECRET; - break; - case 'm': - mode.mode |= MODE_MODERATED; - break; - case 't': - mode.mode |= MODE_TOPICLIMIT; - break; - case 'r': - mode.mode |= MODE_REGONLY; - break; - case 'L': - mode.mode |= MODE_EXLIMIT; - break; - case 'P': - mode.mode |= MODE_PERMANENT; - break; - case 'c': - mode.mode |= MODE_NOCOLOR; - break; - case 'g': - mode.mode |= MODE_FREEINVITE; - break; - case 'z': - mode.mode |= MODE_OPMODERATE; - break; - case 'F': - mode.mode |= MODE_FREETARGET; - break; - case 'Q': - mode.mode |= MODE_DISFORWARD; - break; case 'f': rb_strlcpy(mode.forward, parv[4 + args], sizeof(mode.forward)); args++; @@ -632,6 +590,11 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char if(parc < 5 + args) return 0; break; + default: + if(chmode_flags[(int) *s] != 0) + { + mode.mode |= chmode_flags[(int) *s]; + } } } @@ -697,10 +660,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char struct membership *msptr; struct Client *who; int l = rb_dlink_list_length(&chptr->members); - int b = rb_dlink_list_length(&chptr->banlist) + - rb_dlink_list_length(&chptr->exceptlist) + - rb_dlink_list_length(&chptr->invexlist) + - rb_dlink_list_length(&chptr->quietlist); RB_DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->locmembers.head) { @@ -723,14 +682,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char if((chptr = get_or_create_channel(source_p, parv[2], &isnew)) == NULL) return 0; /* oops! */ - /* If the source does not do TS6, - * nontimestamped bans have been sent to it, - * but we have just lost those here. Let's - * warn the channel about this. Because - * of the kicks, any users on the channel - * will be at client_p. -- jilles */ - if (!has_id(source_p) && b > 0) - sendto_one(client_p, ":%s NOTICE %s :*** Notice -- possible ban desync on %s, please remove any bans just added by servers", get_id(&me, client_p), parv[2], parv[2]); oldmode = &chptr->mode; } } @@ -777,6 +728,20 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char { del_invite(chptr, ptr->data); } + + if(rb_dlink_list_length(&chptr->banlist) > 0) + remove_ban_list(chptr, fakesource_p, &chptr->banlist, 'b', ALL_MEMBERS); + if(rb_dlink_list_length(&chptr->exceptlist) > 0) + remove_ban_list(chptr, fakesource_p, &chptr->exceptlist, + 'e', ONLY_CHANOPS); + if(rb_dlink_list_length(&chptr->invexlist) > 0) + remove_ban_list(chptr, fakesource_p, &chptr->invexlist, + 'I', ONLY_CHANOPS); + if(rb_dlink_list_length(&chptr->quietlist) > 0) + remove_ban_list(chptr, fakesource_p, &chptr->quietlist, + 'q', ALL_MEMBERS); + chptr->bants++; + sendto_channel_local(ALL_MEMBERS, chptr, ":%s NOTICE %s :*** Notice -- TS for %s changed from %ld to %ld", me.name, chptr->chname, chptr->chname, @@ -982,30 +947,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char sendto_server(client_p->from, NULL, CAP_TS6, NOCAPS, "%s", buf_uid); - /* if the source does TS6 we have to remove our bans. Its now safe - * to issue -b's to the non-ts6 servers, as the sjoin we've just - * sent will kill any ops they have. - */ - if(!keep_our_modes && source_p->id[0] != '\0') - { - if(rb_dlink_list_length(&chptr->banlist) > 0) - remove_ban_list(chptr, fakesource_p, &chptr->banlist, 'b', NOCAPS, ALL_MEMBERS); - - if(rb_dlink_list_length(&chptr->exceptlist) > 0) - remove_ban_list(chptr, fakesource_p, &chptr->exceptlist, - 'e', CAP_EX, ONLY_CHANOPS); - - if(rb_dlink_list_length(&chptr->invexlist) > 0) - remove_ban_list(chptr, fakesource_p, &chptr->invexlist, - 'I', CAP_IE, ONLY_CHANOPS); - - if(rb_dlink_list_length(&chptr->quietlist) > 0) - remove_ban_list(chptr, fakesource_p, &chptr->quietlist, - 'q', NOCAPS, ALL_MEMBERS); - - chptr->bants++; - } - return 0; } @@ -1083,30 +1024,30 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode) int i; /* ok, first get a list of modes we need to add */ - for (i = 0; chmode_flags[i].letter; i++) + for (i = 0; i < 256; i++) { - if((mode->mode & chmode_flags[i].mode) && !(oldmode->mode & chmode_flags[i].mode)) + if((mode->mode & chmode_flags[i]) && !(oldmode->mode & chmode_flags[i])) { if(dir != MODE_ADD) { *mbuf++ = '+'; dir = MODE_ADD; } - *mbuf++ = chmode_flags[i].letter; + *mbuf++ = i; } } /* now the ones we need to remove. */ - for (i = 0; chmode_flags[i].letter; i++) + for (i = 0; i < 256; i++) { - if((oldmode->mode & chmode_flags[i].mode) && !(mode->mode & chmode_flags[i].mode)) + if((oldmode->mode & chmode_flags[i]) && !(mode->mode & chmode_flags[i])) { if(dir != MODE_DEL) { *mbuf++ = '-'; dir = MODE_DEL; } - *mbuf++ = chmode_flags[i].letter; + *mbuf++ = i; } } @@ -1298,11 +1239,10 @@ remove_our_modes(struct Channel *chptr, struct Client *source_p) * inputs - channel, source, list to remove, char of mode, caps needed * outputs - * side effects - given list is removed, with modes issued to local clients - * and non-TS6 servers. */ static void remove_ban_list(struct Channel *chptr, struct Client *source_p, - rb_dlink_list * list, char c, int cap, int mems) + rb_dlink_list * list, char c, int mems) { static char lmodebuf[BUFSIZE]; static char lparabuf[BUFSIZE]; @@ -1332,11 +1272,6 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p, *(pbuf - 1) = '\0'; sendto_channel_local(mems, chptr, "%s %s", lmodebuf, lparabuf); - /* Tricky tricky. If we changed source_p to &me - * in ms_sjoin(), this still won't send stuff - * where it should not be sent, because the - * real source_p does TS6 -- jilles */ - sendto_server(source_p, chptr, cap, CAP_TS6, "%s %s", lmodebuf, lparabuf); cur_len = mlen; mbuf = lmodebuf + mlen; @@ -1355,7 +1290,6 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p, *mbuf = '\0'; *(pbuf - 1) = '\0'; sendto_channel_local(mems, chptr, "%s %s", lmodebuf, lparabuf); - sendto_server(source_p, chptr, cap, CAP_TS6, "%s %s", lmodebuf, lparabuf); list->head = list->tail = NULL; list->length = 0;