X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/e0b0e08d25fd777407a6c5a38cd3171c66c626d1..a26bd77404b4e587409c8b84939fa255ae261dda:/src/chmode.c diff --git a/src/chmode.c b/src/chmode.c index b1b1d45..d5fa3a3 100644 --- a/src/chmode.c +++ b/src/chmode.c @@ -43,6 +43,7 @@ #include "chmode.h" #include "irc_dictionary.h" + /* bitmasks for error returns, so we send once per call */ #define SM_ERR_NOTS 0x00000001 /* No TS on channel */ #define SM_ERR_NOOPS 0x00000002 /* No chan ops */ @@ -69,6 +70,7 @@ static int no_override_deop; char cflagsbuf[256]; char cflagsmyinfo[256]; +char cflagsparaminfo[256]; int chmode_flags[256]; @@ -120,14 +122,17 @@ construct_cflags_strings(void) break; default: - if(chmode_flags[i] != 0) + if(chmode_flags[i] != 0 && !(chmode_table[i].set_func == chm_orphaned)) { *ptr++ = (char) i; } } /* Should we leave orphaned check here? -- dwr */ - if(!(chmode_table[i].set_func == chm_nosuch) && !(chmode_table[i].set_func == chm_orphaned)) + if( !(chmode_table[i].set_func == chm_nosuch) && + !(chmode_table[i].set_func == chm_orphaned) && + !(chmode_table[i].set_func == chm_admin && !ConfigChannel.use_admin) && + !(chmode_table[i].set_func == chm_halfop && !ConfigChannel.use_halfop)) { *ptr2++ = (char) i; } @@ -137,6 +142,21 @@ construct_cflags_strings(void) *ptr2++ = '\0'; } +void +construct_cflag_param_string(void) +{ + + *cflagsparaminfo = '\0'; + rb_snprintf(cflagsparaminfo, sizeof cflagsparaminfo, "%sb%s%s%s%sklov%s%s", + ConfigChannel.use_admin ? "a" : "", + ConfigChannel.use_except ? "e" : "", + ConfigChannel.use_forward ? "f" : "", + ConfigChannel.use_halfop ? "h" : "", + strcasecmp(ConfigChannel.disabledmodes, "j") ? "" : "j", + strcasecmp(ConfigChannel.disabledmodes, "q") ? "" : "q", + ConfigChannel.use_invex ? "I" : ""); +} + /* * find_umode_slot * @@ -585,7 +605,10 @@ chm_orphaned(struct Client *source_p, struct Channel *chptr, const char **parv, int *errors, int dir, char c, long mode_type) { if(MyClient(source_p)) + { + sendto_one_numeric(source_p, 469, "Mode %c is disabled.", c); return; + } if((dir == MODE_ADD) && !(chptr->mode.mode & mode_type)) { @@ -637,6 +660,7 @@ chm_hidden(struct Client *source_p, struct Channel *chptr, if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE)) return; + /* setting + */ if((dir == MODE_ADD) && !(chptr->mode.mode & mode_type)) { @@ -650,6 +674,19 @@ chm_hidden(struct Client *source_p, struct Channel *chptr, mode_changes[mode_count].mems = ONLY_OPERS; mode_changes[mode_count].override = 0; mode_changes[mode_count++].arg = NULL; + + /* A little ugly */ + sendto_wallops_flags(UMODE_WALLOP, &me, + "+%c set on [%s] by %s!%s@%s", + c, chptr->chname, source_p->name, source_p->username, source_p->host); + ilog(L_MAIN, "+%c set on [%s] by %s", + c, chptr->chname, get_oper_name(source_p)); + + if(*chptr->chname != '&') + sendto_server(NULL, NULL, NOCAPS, NOCAPS, + ":%s WALLOPS :+%c set on [%s] by %s!%s@%s", + me.name, c, chptr->chname, source_p->name, source_p->username, + source_p->host); } else if((dir == MODE_DEL) && (chptr->mode.mode & mode_type)) { @@ -663,6 +700,19 @@ chm_hidden(struct Client *source_p, struct Channel *chptr, mode_changes[mode_count].id = NULL; mode_changes[mode_count].override = 0; mode_changes[mode_count++].arg = NULL; + + /* A little ugly */ + sendto_wallops_flags(UMODE_WALLOP, &me, + "+%c unset from [%s] by %s!%s@%s", + c, chptr->chname, source_p->name, source_p->username, source_p->host); + ilog(L_MAIN, "+%c unset from [%s] by %s", + c, chptr->chname, get_oper_name(source_p)); + + if(*chptr->chname != '&') + sendto_server(NULL, NULL, NOCAPS, NOCAPS, + ":%s WALLOPS :+%c unset from [%s] by %s!%s@%s", + me.name, c, chptr->chname, source_p->name, source_p->username, + source_p->host); } } @@ -1711,52 +1761,6 @@ chm_key(struct Client *source_p, struct Channel *chptr, } } -void -chm_regonly(struct Client *source_p, struct Channel *chptr, - int alevel, int parc, int *parn, - const char **parv, int *errors, int dir, char c, long mode_type) -{ - int override = 0; - - if(alevel != CHFL_CHANOP && alevel != CHFL_ADMIN && alevel != CHFL_HALFOP) - { - if(IsOverride(source_p)) - override = 1; - else - { - if(!(*errors & SM_ERR_NOOPS)) - sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED), - me.name, source_p->name, chptr->chname); - *errors |= SM_ERR_NOOPS; - return; - } - } - - if(dir == MODE_QUERY) - return; - - if(((dir == MODE_ADD) && (chptr->mode.mode & mode_type)) || - ((dir == MODE_DEL) && !(chptr->mode.mode & mode_type))) - return; - - if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE)) - return; - - if(dir == MODE_ADD) - chptr->mode.mode |= mode_type; - else - chptr->mode.mode &= ~mode_type; - - mode_changes[mode_count].letter = c; - mode_changes[mode_count].dir = dir; - mode_changes[mode_count].caps = CAP_SERVICE; - mode_changes[mode_count].nocaps = 0; - mode_changes[mode_count].mems = ALL_MEMBERS; - mode_changes[mode_count].id = NULL; - mode_changes[mode_count].override = override; - mode_changes[mode_count++].arg = NULL; -} - /* *INDENT-OFF* */ struct ChannelMode chmode_table[256] = { @@ -1875,7 +1879,7 @@ struct ChannelMode chmode_table[256] = {chm_op, 0 }, /* o */ {chm_simple, MODE_PRIVATE }, /* p */ {chm_ban, CHFL_QUIET }, /* q */ - {chm_regonly, MODE_REGONLY }, /* r */ + {chm_simple, MODE_REGONLY }, /* r */ {chm_simple, MODE_SECRET }, /* s */ {chm_simple, MODE_TOPICLIMIT }, /* t */ {chm_nosuch, 0 }, /* u */